一、背景:
本文记录的是SQL学习过程中,简单查询、汇总分析、复杂查询、多表查询等知识点的复习和求职面试题的的总结
二、SQL解决问题的步骤和SQL运行顺序
三、练习面试题后总结的重要知识点
3.1简单查询
1)SQL语句里列名一般都不用加单引号(列名里面有数字的情况除外,如'[85-70]'作为列名时)。同时,加反引号是可以的,比如在navicat里面,写联结条件时就会自动跳出
3.2汇总分析
1)当SQL语句中有group by 子句,同时又有多个限制条件时,对每一行的限制条件写在where子句里,分组后的限制条件,写在having里面
2)在where子句中不能使用汇总函数,可以尝试用标量子查询来实现汇总函数的目的
3.3复杂查询
1)子查询返回有三种结果,二维表(多行多列)、一维表(多行1列)、单一值(标量子查询)。二维表通常用在from子句后;一维表通常用在条件判断where和having中;标量子查询可以用在任意子句中。
2)当某个查询的限制条件里要用到另一个表的某个(列)查询结果时,通常就要用到子查询
3)当判断有子查询时,先将子查询写出来,再写外部查询进行组合
4)当需要在每个组里面进行比较时,就要用到关联子查询
5)top N问题的解决步骤:
第一步,查出有哪些组
第二步,先使用order by 子句按需求排序,然后使用limit子句返回top N
第三步,使用union all 将每组选出的数据合并到一起
3.4多表查询
1)当查询结果的列名,在不同表里时,就要用到多表联结
2)当查询结果的列名只在一个表,但是要用到两个表的数据。如“在A表,但是不在B表的数据”题情况,用子查询和表联结两种方法都可以实现。如“查询没有课程的学生姓名”
子查询方法:
SELECT 姓名 FROM student
where 学号 not in
(SELECT DISTINCT 学号 from score);
多表联结方法:
SELECT 姓名
from student as a LEFT JOIN score as b
on a.学号=b.学号
where b.`学号` is null;
3)当有多种情况需要条件判断时,就要用到case表达式
4)行列互换问题解决步骤:
第1步,使用常量列输出目标表的结构
第2步,使用case表达式,替换常量列为对应的值
第3步,分组,用函数取出需要的值
四、如何提高SQL查询的效率?
数据量大的情况下,不同的SQL语句,消耗的时间相差很大。提高查询效率的注意事项如下:
1)select子句中尽量避免使用:按需要选择返回的列会提高查询效率。在多表联结中用 * 更加会增加查询负担。
2)where子句比较符号左侧避免函数或算术运算:原因是会导致数据库进行全表搜索。优化方法,如“where 成绩+5>90”,可以改为“where 成绩>90-5”
3)尽量避免使用in和not in:原因是in和not in会导致数据库进行全表搜索。优化方法,如“where 学号 in (8,9)”这种情况,可以考虑换成“where 学号 between 8 and 9”
4)尽量避免使用or:原因是or会导致数据库进行全表搜索。优化方法,可以考虑将or条件拆解成两个select子句,再将两个子句的表用union合并
5)使用limit子句限制返回的数据行数