我们都知道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

)

版权声明:本文为chichi_magic原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/chichi_magic/article/details/125590688