百度一面只问了这10个问题,我被录取了!
作者:互联网
最近看到网上的一份百度面经,里边的题目都很经典。虽然是测开实习面试题,但是很多都和和社招是一样的,甚至和百度、美团、阿里的面试题重合度也都很高。
希望能帮到最近在找工作或者有跳槽想法的同学。全文共8000字,一次性没时间看完的话,强烈建议收藏起来!
好了话不多说,开始正题。
面试题截图:
百度4.26一面(电话面试)答案
【题目1】自我介绍
【题目2】了解数据库吗,怎么登录数据库 ?
终端命令行访问数据库:
-
Windows下的终端工具有:cmd、powershell 等;
-
Linux(没有安装图形界面的系统)本身就是命令行交互界面,可直接敲击命令;
-
MacOS下的终端工具有:终端、iTerm2 等;
终端下连接数据库的命令:
mysql -h {数据库主机ip地址} -P {数据库端口号} -u{用户名} -p{密码}
-
-h:数据库主机ip地址
-
-P:数据库端口号
-
-u:用户名
-
-p 密码
示例:
数据库管理工具访问数据库
常用的数据库管理工具有:Navicate、sqlyog、workbench、phpMyAdmin 等等。
利用代码访问数据库
Java:jdbc连接;
Python:pymysql、MySQLdb等;
【题目3】怎么查询数据库的前五条数据、更新数据表中的一条数据、删除一个数据库 ?
1、查询数据库的前五条数据:
// 语法:SELECT * FROM {table_name} LIMIT {n};
示例:获取a_table表中前5条数据
mysql> SELECT * FROM test_db.a_table LIMIT 5;
+------+----------+--------+
| a_id | a_name | a_desc |
+------+----------+--------+
| 1 | ZhangSan | 111111 |
| 2 | LiSi | 222222 |
| 3 | WangWu | 333333 |
| 4 | ZhaoLiu | 444444 |
| 5 | SunZi | 555555 |
+------+----------+--------+
5 rows in set (0.00 sec)
2、更新数据表中的一条数据:
// 语法:
UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
示例:将 a_table 表中 LiSi 改名成:LiSiGou
# 更新语句
mysql> UPDATE test_db.a_table SET a_name='LiSiGou' WHERE a_id=2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
# 查询已经更改
mysql> SELECT * FROM test_db.a_table;
+------+----------+--------+
| a_id | a_name | a_desc |
+------+----------+--------+
| 1 | ZhangSan | 111111 |
| 2 | LiSiGou | 222222 |
| 3 | WangWu | 333333 |
| 4 | ZhaoLiu | 444444 |
| 5 | SunZi | 555555 |
| 6 | GuoBa | 888888 |
| 7 | SongJiu | 999999 |
+------+----------+--------+
7 rows in set (0.00 sec)
3、删除一个数据库:
SQL DROP DATABASE 语句用于删除现存的数据库。
# 语法
DROP DATABASE DatabaseName;
无论任何时候,RDBMS 中数据库的名字都应该是唯一的。
示例:
如果你想要删除数据库 ,那么 DROP DATABASE 语句应该这么写:
SQL> DROP DATABASE testDB;
注意:执行数据库删除操作应当十分谨慎,因为数据库一旦删除,存储的所有数据都会丢失。
删除任何数据库之前,请确保你有管理员权限。数据库删除之后,你可以在数据库列表中看到变化:
SQL> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| AMROOD |
| TUTORIALSPOINT |
| mysql |
| orig |
| test |
+--------------------+
6 rows in set (0.00 sec)
【题目4】两个表之间的查询有哪些方式,说一下外连接 。
1、两个表之间的查询有哪些方式:
连接查询主要分为三种:
内连接:join,inner join
外连接:left join,left outer join,right join,right outer join,union
交叉连接:cross join
2、外连接:
LEFT JOIN 语法:
LEFT JOIN 等价于 LEFT OUTER JOIN
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
或
SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;
RIGHT JOIN 语法:
RIGHT JOIN 等价于 RIGHT OUTER JOIN
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;
或:
SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name=table2.column_name;
UNION 语法:
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
UNION 内部的每个 SELECT 语句必须拥有相同数量的列。
列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
UNION:结果显示不重复
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
UNION ALL:结果显示允许重复
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;
【题目5】说一下你对数据库索引的了解(回答了五种索引、B+树实现索引的优点、聚集索引与非聚集索引);又问了索引的作用、应用场景,在什么情况下需要给一个字段添加索引 。
1、对数据库索引的了解:
索引是帮助MySQL高效获取数据的数据结构。就好比看一本书,我们想查找某一页的内容,最快的方式就是通过目录去查找,索引也是如此,可以提高数据库的查询效率。
MySQL数据库的索引类型大致可以分为以下几种:
-
普通索引:仅加速查询
-
唯一索引:加速查询 + 列值唯一(可以有null)
-主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
-
组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
-
全文索引:对文本的内容进行分词,进行搜索
而索引方法有以下几种:
1. FULLTEXT
即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。
全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。
2. HASH
由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。
HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。
3. BTREE BTREE索引
就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。
4. RTREE RTREE
在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。
相对于BTREE,RTREE的优势在于范围查找。
2、索引的作用:
索引是一种数据结构,作用就是发挥这种数据结构的作用,加快查询的效率。例如:InnoDB存储引擎中使用的是就是B+树这种数据结构来组织索引。
3、索引的应用场景:
适合创建索引的场景:
-
在经常需要搜索的列上,可以加快搜索的速度。
-
在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构。
-
在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度。
-
在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的。
-
在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。
-
在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
不适合创建索引的场景:
-
对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
-
对于那些只有很少数据值(唯一性差)的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
-
对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
-
当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
4、在什么情况下需要给一个字段添加索引:
数据库建立索引常用的规则如下:
1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析,尽量考虑用单字段索引代替:
【题目6】Linux命令,怎么监听一个文件的变化(没答上来) 。
可采用watch和tail命令:
tail:
tail本身的功能是显示文件的后多少行。
# 显示filename后几行(默认是10行)
tail filename
# 显示filename后n行
tail -n filename
# 动态显示文件末尾
tail -f filename
watch:
而且watch的原理就是重复的执行后面的命令,默认的时间间隔是2秒.
如:
watch -d -n 10 cat /etc/syslog.conf
每10秒打印一下/etc/syslog.conf文件, -d 表示高亮变化的部分。
这两个命令在监控日志文件的时候相当有用。
【题目7】怎么查看一个端口是否启动(netstat)?怎么查一个进程是否存在(ps)?怎么查看一个文件里的内容(回答了cat、more、less、head、tail) ?
1、查看一个端口是否启动(netstat):
linux查看端口状况的命令:netstat
netstat --tunlp
netstat -aon
但是Mac系统这个命令不能用,
可以使用lsof
lsof -nP -i:8000
lsof -i tcp:8000
2、查一个进程是否存在(ps):
ps 命令查找与进程相关的PID号:
ps a 显示现行终端机下的所有程序,包括其他用户的程序。
ps -A 显示所有程序。
ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
ps -e 此参数的效果和指定”A”参数相同。
ps e 列出程序时,显示每个程序所使用的环境变量。
ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
ps -H 显示树状结构,表示程序间的相互关系。
ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。
ps s 采用程序信号的格式显示程序状况。
ps S 列出程序时,包括已中断的子程序资料。
ps -t<终端机编号> 指定终端机编号,并列出属于该终端机的程序的状况。
ps u 以用户为主的格式来显示程序状况。
ps x 显示所有程序,不以终端机来区分。
# 常用的方法是ps aux,然后再通过管道使用grep命令过滤查找特定的进程,然后再对特定的进程进行操作。
ps aux | grep program_filter_word,ps -ef |grep tomcat
# 显示出所有的java进程,去处掉当前的grep进程。
ps -ef|grep java|grep -v grep
linux下查看文件内容有多种方法,常用的命令有 cat、more、less、vi(vim)、head 和 tail。
- cat:打印文件内容。
- more:可以分页显示文件内容。
- less:也可以分页显示文件内容,但功能比more要更丰富。
- vi(vim):文本编辑工具,可以修改文件内容,也可以创建并编辑文件。
- head:查看文件开头内容。
- tail:查看文件结尾内容。
总结:
- 若要编辑文件,当然是用vim了;不要用vim打开大文件,那样会特别慢;
- 若只是查看文件内容,more和less是不错的选择。特别对于大文件,打开速度非常快。less命令的好处是能够提供查找高亮;
- 如果用于从文件中提取内容,首选cat。使用重定向,按照某种固定的规则将文件内容输出到指定文件中。如果文件特别大,也可考虑head和tail,只输出最早或者最近的几行。特别值得一提的是tail -f [文件名],可以实时监控文件的内容。
【题目8】用linux去连接另一台机器,怎么测试两台机器是否连通(回答了ping)
一般常用五种方式:
ping:最常用的网络探测命令,通过发送网络心跳包,来简单验证服务器之间是否网络互通,但是假如说服务器禁ping,则无法通过ping来验证网络是否互通。
# 用法:
ping {host或ip}
telnet:telnet为用户提供了在本地计算机上完成远程主机工作的能力,因此可以通过telnet来测试端口的连通性。
# 用法:
telnet ip port
wget:wget是一个从网络上自动下载文件的自由工具,支持通过HTTP、HTTPS、FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理。
# 用法:
wget ip:port
ssh:SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议,在linux上可以通过ssh命令来测试端口的连通性。同时这个命令也常常作为本地终端访问远端服务器的连接命令。
# 用法
ssh -v -p port username@ip
curl:curl是利用URL语法在命令行方式下工作的开源文件传输工具。也可以用来测试端口的连通性。
curl ip:port
【题目9】了解git吗,说一下它是干嘛的,怎么将代码从远程拉到本地,以及将本地代码提交上去?
git是一个开源的分布式版本控制系统,可以有效、高速地处理项目版本管理,常常用于企业代码托管。
1、git将代码从远程拉到本地:
git clone 代码仓库地址
2、提交代码
# 提交到本地暂存区
git add .
# 提交到本地仓库,并创建commit信息
git commit -m "提交修改"
# 提交到远程仓库
git push
【题目10】浏览器从输入url到返回页面经过了什么过程?怎么看返回页面的参数、接口?(开发者工具)
- DNS 解析:将域名解析成 IP 地址
-TCP 连接:TCP 三次握手
-
发送 HTTP 请求
-
服务器处理请求并返回 HTTP 报文
-
浏览器解析渲染页面
-
断开连接:TCP 四次挥手
【题目11】http请求的方法有哪些?(只回答了get和post。。)说一下get和post的区别。
http常用请求方法:
GET和POST的区别:
- GET请求的含义是请求从服务器获取资源(可以是静态的文本、页面、图片视频等),POST请求的含义是向服务器提交数据,表示向服务器申请创建新的资源或对已有的资源进行修改。
- GET请求将请求参数拼接到URL上进行参数传递,而POST则是将请求参包装到HTTP报文的请求体(body)中。
- 从请求的大小看,GET请求的长度受限于浏览器和服务器对URL长度的限制,
- 按照REST规范,GET请求是幂等的,即读取同一个资源,总是得到相同的数据,而POST请求不是幂等的,因为每次请求对资源的改变并不是相同的;进一步讲,GET请求一般不会改变服务器上的资源,而POST请求会对服务器资源进行改变。
- GET请求因为是读取资源,是幂等的,就可以对GET请求的数据做缓存。而POST请求是向服务器申请创建新的资源或对已有的资源进行修改,不是幂等的,因此也就不能做缓存。以下订单场景为例,如果POST请求可被浏览器缓存,那么当下单这个操作就可以不向服务器发请求,而直接返回本地缓存的“下单成功界面”,却又没有真的在服务器进行下单,这是不合逻辑的。
【题目12】算法题:单链表查找倒数第N个节点
可以参考下面
链接????:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/solution/mian-shi-ti-22-lian-biao-zhong-dao-shu-di-kge-j-11/
【题目13】说一下测试方法有哪些
测试方法主要可分为黑盒测试和白盒测试。
黑盒测试的测试方法主要包括:
等价划分类、边界值法、因果图法、判定表法、场景法、正交实验设计法、错误推断法、功能图分析法等。
白盒测试的测试方法主要包括:
语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖、路径覆盖等。
【题目14】如果一个项目明天要上线了,但是你今天没测试完,你会怎么做。
(一开始我回答我会加班处理,面试官又问如果加班也是解决不完的呢,我回答我会申请能不能推迟一下上线时间,为我的工作尽可能争取时间,面试官又追问,然后呢,那如果还是完不成呢,我弱弱的回答,我可能会向项目组其他同事寻求帮助,来商量对策,面试官终于停止了追问。。)
【题目15】测试百度搜索框,举一些测试点的例子
可以参考下面
链接????:
【题目16】最后你有什么问题要问我吗?
一面部分到此结束
总之,学习如逆水行舟,不进则退。想要多高的薪资,就要付出多大的努力。
也祝大家可以顺利找到心仪的工作!
推荐阅读
高薪程序员也躲不过35岁这一关…当能力与年龄脱节,我们该如何自救
从工地实习月薪3K到一线企业年薪30W,我追上了那个曾经被赋予厚望的自己
标签:ps,name,10,column,数据库,录取,索引,SELECT,百度 来源: https://blog.51cto.com/u_15090928/3035310