我们都知道SQL执行语句会有先后顺序,所以我们在写SQL的时候也就可以顺着它的思路来写代码。
一、常见的SQL语句执行顺序
搞清楚sql的执行顺序是首要任务
执行顺序:from, on, join, where(无法使用别名和聚合), group by, agg_function, with rollup/cube, having(仅用于分组后,可以使用聚合), select, distinct, order by, limit
二、读懂需求
有时候写SQL是需要语文功底的,所以读懂需求也是非常重要的一步,并且懂得如何拆分需求,分清外层和内层查询。拆分需求后,根据SQL语句执行顺序写代码。
三、举例
现在有学生表,分数表,详细如下所示。
-学生表
CREATE TABLE `Student`(
`s_id` VARCHAR(20),
`s_name` VARCHAR(20) NOT NULL DEFAULT '',
PRIMARY KEY(`s_id`)
);
--分数表
CREATE TABLE `Score`(
`s_id` VARCHAR(20),
`c_id` VARCHAR(20),
`s_score` INT(3),
PRIMARY KEY(`s_id`,`c_id`)
);
现在需查询学过编号为“01”的课程并且也学过编号为“02”的课程的学生的学号、姓名
①根据题目可知最后我们需要的信息是“学号”和“姓名”,这两个字段在“学生表”中的,属于最外层的查询;
③ select student.s_id, student.s_name
① from student
② where s_id IN
(
???
)
②考虑内层查询。这里有“并且”两字,并列的条件属于同一个字段,所以考虑INNER JOIN来实现“且”的条件,分别查询出学过“01”的和学过“02”的学生有哪些,然后再去两个查询的交集,构造一个“新的”表,再从这个“新”表中选取s_id。
③ select student.s_id, student.s_name
① from student
② where s_id IN
(
(???)
INNER JOIN
(???)
)
③”学过的课程”在分数表中
③ select student.s_id, student.s_name
① from student
② where s_id IN
(
select a.s_id
from
(select s1.s_id,s1.c_id from Score s1 where s1.c_id='01') a
INNER JOIN
(select s2.s_id,s2.c_id from Score s2 where s2.c_id='02') b
on a.s_id=b.s_id
)