mysql面试题2022,关于mysql面试题
mysql面试题2022,关于mysql面试题详细介绍
本文目录一览: 分享几道关于MySQL索引的重点面试题
前言索引是对数据库中一或多个列值的排序,帮助数据库高效获取数据的数据结构假如我们用类比的方法,数据库中的索引就相当于书籍中的目录一样,当我们想找到书中的摸个知识点,我们可以直接去目录中找而不是在书中每页的找,但是这也抛出了索引的一个缺点,在对数据库修改的时候要修改索引到导致时间变多。但MySQL 索引你真的懂吗?这几道题带你了解索引的几个重要知识点1. 什么是最左前缀原则?以下回答全部是基于MySQL的InnoDB引擎例如对于下面这一张表如果我们按照 name 字段来建立索引的话,采用B+树的结构,大概的索引结构如下如果我们要进行模糊查找,查找name 以“张"开头的所有人的ID,即 sql 语句为select ID from table where name like '张%'由于在B+树结构的索引中,索引项是按照索引定义里面出现的字段顺序排序的,索引在查找的时候,可以快速定位到 ID 为 100的张一,然后直接向右遍历所有张开头的人,直到条件不满足为止。也就是说,我们找到第一个满足条件的人之后,直接向右遍历就可以了,由于索引是有序的,所有满足条件的人都会聚集在一起。而这种定位到最左边,然后向右遍历寻找,就是我们所说的最左前缀原则。2. 为什么用 B+ 树做索引而不用哈希表做索引?1、哈希表是把索引字段映射成对应的哈希码然后再存放在对应的位置,这样的话,如果我们要进行模糊查找的话,显然哈希表这种结构是不支持的,只能遍历这个表。而B+树则可以通过最左前缀原则快速找到对应的数据。2、如果我们要进行范围查找,例如查找ID为100 ~ 400的人,哈希表同样不支持,只能遍历全表。3、索引字段通过哈希映射成哈希码,如果很多字段都刚好映射到相同值的哈希码的话,那么形成的索引结构将会是一条很长的链表,这样的话,查找的时间就会大大增加。3. 主键索引和非主键索引有什么区别?例如对于下面这个表(其实就是上面的表中增加了一个k字段),且ID是主键。主键索引和非主键索引的示意图如下:其中R代表一整行的值。从图中不难看出,主键索引和非主键索引的区别是:非主键索引的叶子节点存放的是主键的值,而主键索引的叶子节点存放的是整行数据,其中非主键索引也被称为二级索引,而主键索引也被称为聚簇索引。根据这两种结构我们来进行下查询,看看他们在查询上有什么区别。1、如果查询语句是 select * from table where ID = 100,即主键查询的方式,则只需要搜索 ID 这棵 B+树。2、如果查询语句是 select * from table where k = 1,即非主键的查询方式,则先搜索k索引树,得到ID=100,再到ID索引树搜索一次,这个过程也被称为回表。现在,知道他们的区别了吧?4. 为什么建议使用主键自增的索引?对于这颗主键索引的树如果我们插入 ID = 650 的一行数据,那么直接在最右边插入就可以了但是如果插入的是 ID = 350 的一行数据,由于 B+ 树是有序的,那么需要将下面的叶子节点进行移动,腾出位置来插入 ID = 350 的数据,这样就会比较消耗时间,如果刚好 R4 所在的数据页已经满了,需要进行页分裂操作,这样会更加糟糕。但是,如果我们的主键是自增的,每次插入的 ID 都会比前面的大,那么我们每次只需要在后面插入就行, 不需要移动位置、分裂等操作,这样可以提高性能。也就是为什么建议使用主键自增的索引。总结
面试题:谈谈如何优化MYSQL数据库查询
MySQL中数据类型有多种,如果你是一名DBA,正在按照优化的原则对数据类型进行严格的检查,但开发人员可能会选择他们认为最简单的方案,以加快编码 速度,或者选择最明显的选择,因此,你可能面临的都不是最佳的选择,如果可能的话,你应该尝试以通用准则来改变这些决定。(1)避免使用NULLNULL对于大多数数据库都需要特殊处理,MySQL也不例外,它需要更多的代码,更多的检查和特殊的索引逻辑,有些开发人员完全没有意识到,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默认值。(2)仅可能使用更小的字段 MySQL从磁盘读取数据后是存储到内存中的,然后使用cpu周期和磁盘I/O读取它,这意味着越小的数据类型占用的空间越小,从磁盘读或打包到内存的效 率都更好,但也不要太过执着减小数据类型,要是以后应用程序发生什么变化就没有空间了。修改表将需要重构,间接地可能引起代码的改变,这是很头疼的问题, 因此需要找到一个平衡点。2、小心字符集转换客户端或应用程序使用的字符集可能和表本身的字符集不一样,这需要MySQL在运行过程中隐含地进行转换,此外,要确定字符集如UTF-8是否支持多字节字符,因此它们需要更多的存储空间。3、优化count(my_col)和count(*)如果你使 用MyISAM表,在没有where子句的情况下使用count(*)速度是很快的,因为行数量的统计是非常精确的,因此MySQL不会一行一行地去找, 进而得出行数,如my_col列没有空值,那么和前面说的情况会一样,即count(my_col)速度也会很快。如果有where子句时使用count( ),基本上就无法进行更多优化了,在where子句中超出了明显的索引列,对于复杂的where子句,只有使用覆盖索引才有用。除了上面 的建议外,你还可以使用汇总表,它们让你可以对表的内容保持更新,你可以使用触发器,或者应用程序逻辑保持汇总表总是最新状态,或者定期运行一个批处理作 业保持填充最新的数据信息,如果你采用后者,你的信息将会非常接近,但不是精确的,依赖于批处理作业多久运行一次,这需要权衡应用程序对精确信息的需要, 和保持数据更新的系统开销,要在这二者之间找到一个平衡点。4、优化子查询遇到子查 询时,MySQL查询优化引擎并不是总是最有效的,这就是为什么经常将子查询转换为连接查询的原因了,优化器已经能够正确处理连接查询了,当然要注意的一 点是,确保连接表(第二个表)的连接列是有索引的,在第一个表上MySQL通常会相对于第二个表的查询子集进行一次全表扫描,这是嵌套循环算法的一部分。5、优化UNION在跨多个不同的数据库时使用UNION是一个有趣的优化方法,UNION从两个互不关联的表中返回数据,这就意味着不会出现重复的行,同时也必须对数据进行排序,我们知道排序是非常耗费资源的,特别是对大表的排序。 UNION ALL可以大大加快速度,如果你已经知道你的数据不会包括重复行,或者你不在乎是否会出现重复的行,在这两种情况下使用UNION ALL更适合。此外,还可以在应用程序逻辑中采用某些方法避免出现重复的行,这样UNION ALL和UNION返回的结果都是一样的,但UNION ALL不会进行排序。面试题:谈谈如何优化MYSQL数据库查询标签:
关于mysql面试题
1 数据表加1个字段,userid用来记录正在处理的人,进入php页面时,写入该字段。处理完成时,或未处理直接退出时,清空userid记录。其他人进入php页面时判断userid是否为空,不为空则禁止进入。
2 lock 和 unlock
mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> INSERT INTO real_table SELECT * FROM insert_table;
mysql> TRUNCATE TABLE insert_table;
mysql> UNLOCK TABLES;
3 mysql_insert_id() 得到插入的id
4 select last_insert_id()
15个 MySQL 基础面试题,DBA 们准备好了吗
1、set password 'root'@'localhost'=password("root");
2、update user set password=password("root") where user='root'
mysql数据库面试题(学生表_课程表_成绩表_教师表)
Student(Sid,Sname,Sage,Ssex)学生表
Sid:学号
Sname:学生姓名
Sage:学生年龄
Ssex:学生性别
Course(Cid,Cname,Tid)课程表
Cid:课程编号
Cname:课程名称
Tid:教师编号
SC(Sid,Cid,score)成绩表
Sid:学号
Cid:课程编号
score:成绩
Teacher(Tid,Tname)教师表
Tid:教师编号:
Tname:教师名字
1、插入数据
2、删除课程表所有数据
3、将学生表中的姓名 张三修改为张大山
或者
4、查询姓’李’的老师的个数:
5、查询所有课程成绩小于60的同学的学号、姓名:
6、查询没有学全所有课的同学的学号、姓名
7、查询平均成绩大于60分的同学的学号和平均成绩
8、查询学过“100”并且也学过编号“101”课程的同学的学号、姓名
9、查询“100”课程比“101”课程成绩高的所有学生的学号
10、查询课程编号“100”的成绩比课程编号“101”课程高的所有同学的学号、姓名
11、查询学过“鲁迅”老师所教的所有课的同学的学号、姓名
12、查询所有同学的学号、姓名、选课数、总成绩
13、查询至少有一门课与学号为“1”同学所学相同的同学的学号和姓名
14、把“SC”表中“鲁迅”老师教的课的成绩都更改为此课程的平均成绩,
错误
15、查询和“2”学号的同学学习的课程完全相同的其他同学学号和姓名
16、删除学习“鲁迅”老师课的SC表记录
17、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、002号课的平均成绩
18、查询各科成绩最高和最低的分:以如下的形式显示:课程ID,最高分,最低分
19、按各科平均成绩从低到高和及格率的百分数从高到低顺序
20、查询如下课程平均成绩和及格率的百分数(用”1行”显示): 数学(100),语文(101),英语(102)
22、查询不同老师所教不同课程平均分从高到低显示
23、查询如下课程成绩第3名到第6名的学生成绩单:数学(100),语文(101),英语(102)
23、统计下列各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ 小于60]
24、查询学生平均成绩及其名次
25、查询各科成绩前三名的记录(不考虑成绩并列情况)
26、查询每门课程被选修的学生数
27、查询出只选修一门课程的全部学生的学号和姓名
28、查询男生、女生人数
29、查询姓“张”的学生名单
30、查询同名同姓的学生名单,并统计同名人数
31、1981年出生的学生名单(注:student表中sage列的类型是datetime)
32、查询平均成绩大于85的所有学生的学号、姓名和平均成绩
33、查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列
34、查询课程名称为“英语”,且分数低于60的学生名字和分数
35、查询所有学生的选课情况
36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数
37、查询不及格的课程,并按课程号从大到小的排列
38、查询课程编号为“101”且课程成绩在80分以上的学生的学号和姓名
39、求选了课程的学生人数:
40、查询选修“鲁迅”老师所授课程的学生中,成绩最高的学生姓名及其成绩
41、检索至少选修两门课程的学生学号
42、查询全部学生都选修的课程的课程号和课程名(1.一个课程被全部的学生选修,2.所有的学生选择的所有课程)
43、查询没学过“鲁迅”老师讲授的任一门课程的学生姓名
44、查询两门以上不及格课程的同学的学号及其平均成绩
45、检索“101”课程分数小于60,按分数降序排列的同学学号
46、删除“2”同学的“101”课程的成绩
一道关于mysql的面试题,求助
select class,及格人数,不及格人数 from
(select class,count(*) 及格人数 from tb1 where score>=60 group by class) t1 join (select class, count(*) 不及格人数 from tb1 where score<60 group by class) t2 on t1.class=t2.class;
非常简单的:
SELECT `class`,
SUM(CASE WHEN score>=60 THEN 1 ELSE 0 END),
SUM(CASE WHEN score>=60 THEN 0 ELSE 1 END)
FROM tb1
GROUP BY 1
主要是考试GROUP BY分组统计,CASE WHEN THEN ELSE END分情形功能,这个是非常典型的应用,几乎所有的数据库都支持上面的语句。
腾讯面试,居然凉在MySQL上,卧薪尝胆后二次面试入职腾讯天美
爱因斯坦说过“耐心和恒心总会得到报酬的”,我也一直把这句话当做自己的座右铭,这句箴言在今年也彻底在“我”身上实现了。
每一个程序员都拥有一座大厂梦,我也不例外,去年面试腾讯,竟然被MySQL问倒了,很多相关性的问题都没有答上来,才2面就凉凉了。回去之后也潜心复习了,准备了二战,如今终于进入了腾讯,被录用。
以下展示的腾讯面试题(含答案)、学习资料、实战文档等,均可以免费分享给大家,需要的朋友,私信我【电子书】即可哦!
之前的腾讯面试题都有做总结,具体面试题内容整理成了文档,本文是针对MySQL系列的,所以下面只展示了自己第一次面试阿里时被吊打问到的一些MySQL难题, 其他专题内容(含答案)的文档资料,点击【面试】即可领取。
腾讯天美面试技术题:
面试题答案:
(1)MySQL 专题部分(先刷题)
MySQL 面试题答案:
(2)MySQL 性能优化的21个最佳实践
(3)MySQL 性能调优与架构设计
(1)Java面试手册
(2)实战文档
以实战Java虚拟机为例:
(3)Java核心知识点整理文档
由于篇幅限制,很多内容都只展示了目录和截图,这些都整理在文档里,需要这些文档资料的,均可以 免费分享 给大家,希望所有的程序员都能够学习起来,努力实现我们的大厂梦!
sql面试题(查看数据中指定几行记录)
分享一个sql数据库面试题。问题:表 table1,主键为 ID,ID为自动编号(ID可能不连续),要求查询第31-40行记录,请问SQL语句怎么写?实现代码: 代码如下:--SQL server select top 10 * from (select top 40 * from table1 order by ID) a order by ID desc --Oracle select * from (select top 40 * from t order by ID) a where rownum>30 您可能感兴趣的文章:批量执行sql语句的方法在SQL Server启动时自动执行存储过程。提高SQL的执行效率的ASP的五种做法asp在线执行sql语句的函数为什么ASP中执行动态SQL总报错误信息?提示语句语法错误mysql 显示SQL语句执行时间的代码php执行sql语句的写法高级MySQL数据库面试问题 附答案一道sql面试题附答案腾讯面试:一条SQL语句执行得很慢的原因有哪些?---不看后悔系列(推荐)
sql 面试题
我是在自己数据库里建立了书表(book《id,bookname,writer》),评论表(say《pid,say,bookid》)
建好表:考皮可以直接运行
1、 每种书被评价的次数
sql:select count(*) as 评价次数,a.bookname as 书名 from book as a,say as b where a.id = b.bookid group by b.bookid
2 被评价次数最多的书
我的数据库是mysql,所以分sql server与mysql
mysql:select ok.bid 书名 from (select count(*) as counts,a.bookname as bid from book a,say b
where a.id = b.bookid
group by bookid order by counts desc)as ok limit 0,1
sql server:select top 1 ok.bid 书名 from (select count(*) as counts,a.bookname as bid from book a,say b
where a.id = b.bookid
group by bookid order by counts desc)as ok
如若需要交流可加q:739568191
1. select s.title, count(p.id)
from 书表 s left join 评论 p on s.id=p.书表中的id
group by s.title
(注意:左外连接的作用是将评价数为0的书显示出来.count(p.id)和count(*)的区别是count(p.id)不计入p.id为null的行)
2. select top 1 s.title, count(p.id)
from 书表 s left join 评论 p on s.id=p.书表中的id
group by s.title order by 2 desc
(以第2列倒序排序,取第1行)