sql语句的书写顺序和执行顺序,以及不常用的语法
书写顺序:
SELECT -> FROM -> JOIN -> ON -> WHERE -> GROUP BY -> HAVING -> UNION -> ORDER BY ->LIMIT
主要记着下面这些
WHERE -> GROUP BY -> HAVING -> ORDER BY ->LIMIT
这几个语句的相对顺序,其实和下面的执行相对顺序是一致的
先用where过滤一遍所有行,再进行分组,再用having过滤一遍所有组,接着排序,最后取limit个
执行顺序:
FROM -> ON -> JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> UNION -> ORDER BY ->LIMIT
where语句的判断是针对表中的每一行进行的,遍历每一行,然后根据该行的信息判断条件true或false
子查询又分为不相关子查询和相关子查询
不相关子查询:子查询可以直接执行,不依赖父查询的信息
相关子查询:子查询需要父查询中的信息,执行过程是这样,遍历父查询中的每一行,对于这一行中的信息,交给子查询,子查询使用该信息查询的到结果后,再将结果给父查询使用
举个例子,查询每一个学生的超过其选修所有课程平均分的课程号,例子来自一篇讲得不错的知乎 https://zhuanlan.zhihu.com/p/20005249
子查询查出平均成绩,然后父查询where在遍历每一行的时候,判断该行中的成绩是否超过了子查询得到的平均成绩,然而在进行子查询时,查询到的平均成绩要和父查询遍历的那一行是同一个学生,所以子查询返回的应该是父查询where遍历到的那个学生对应的平均成绩,即需要得到父查询当前遍历的那一行学生的学号
加粗的地方就是父查询传递给子查询的当前行信息
select 学号 from 学生选课表 a where grade>=
(
select AVG(grade) from 学生选课表 b where b.学号=a.学号
)
子查询内,不能使用order by
子查询中使用any(有的系统是some) all
any,任意一个满足条件就行
all,所有的都得满足
例:查询非计算机科学系中比计算机科学系中任意一个学生年龄小的学生姓名和年龄
select Sname,Sage from Student
where Sage < any(
select Sage from Students where Sdept='CS'
)
and Sdept!='CS';
limit i,k 表示从i开始,返回k个
不等于:<>或!=
mysql like语句通配符
%对应*,任意长度>=0字符
_下划线对应?,任意一个字符
正则表达式,where子句可以使用regexp
where phonenum regexp '^1[35]\d{9}$'