一、背景

本文记录的是SQL学习过程中,简单查询、汇总分析、复杂查询、多表查询等知识点的复习和求职面试题的的总结

二、SQL解决问题的步骤和SQL运行顺序




sql server 在函数 IF 不包含 bgint sql条件 不包含 多个值_sql出现列名无效的原因


sql server 在函数 IF 不包含 bgint sql条件 不包含 多个值_sql 比较两个时间_02


三、练习面试题后总结的重要知识点

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子句限制返回的数据行数