SQL查询语句和执行顺序
sql查询语句中主要包括select
、where
、order by
、join
、union
、group by
、having
、limit
等关键词。
语法顺序#
sql查询书写顺序如下所示:
select <字段名>
from <表名>
join <表名>
on <连接条件>
where <筛选条件>
group by <字段名>
having <筛选条件>
union
order by <字段名>
limit <限制行数>
select
和from
是必须的,其他的关键词可以省略。
执行顺序#
- from
首先会根据from后的表名,生成一个虚拟表table1.
- join和on
join
条件包括左连接left join
、右连接right join
、全连接full join
、内连接inner join
和交叉连接cross join
。
将join
后的表名记作table2,那么以from
产生的table1为基准,左连接就是选择table1的全部和table2满足on
条件的部分形成一张新表table3。
例如这里有两张表students和class。
postgres=# select * from students;
name | id | age
----------+----+-----
zhangsan | 1 | 10
lisi | 2 | 11
sunqi | 7 | 20
(3 rows)
postgres=# select * from class;
name | id | class
----------+----+-------
zhangsan | 1 | 1
lisi | 2 | 1
wangwu | 3 | 1
zhaoliu | 4 | 2
(4 rows)
通过左连接,得到结果如下:
postgres=# select * from students left join class on students.id = class.id;
name | id | age | name | id | class
----------+----+-----+----------+----+-------
zhangsan | 1 | 10 | zhangsan | 1 | 1
lisi | 2 | 11 | lisi | 2 | 1
sunqi | 7 | 20 | | |
(3 rows)
其他的连接方式同理,右连接就是选择table2的全部,全连接是取两张表的并集,内连接是取交集。
需要注意一下的是,交叉连接是取笛卡尔积,并且交叉连接是不能和on
同时使用的。
postgres=# select * from students cross join class;
name | id | age | name | id | class
----------+----+-----+----------+----+-------
zhangsan | 1 | 10 | zhangsan | 1 | 1
zhangsan | 1 | 10 | lisi | 2 | 1
zhangsan | 1 | 10 | wangwu | 3 | 1
zhangsan | 1 | 10 | zhaoliu | 4 | 2
lisi | 2 | 11 | zhangsan | 1 | 1
lisi | 2 | 11 | lisi | 2 | 1
lisi | 2 | 11 | wangwu | 3 | 1
lisi | 2 | 11 | zhaoliu | 4 | 2
sunqi | 7 | 20 | zhangsan | 1 | 1
sunqi | 7 | 20 | lisi | 2 | 1
sunqi | 7 | 20 | wangwu | 3 | 1
sunqi | 7 | 20 | zhaoliu | 4 | 2
(12 rows)
如果有多个join
,就把前一次生成的表作为基准,再重复执行这一流程,直到能够合并出来一张表。
- where
在执行过from
和join
后,会生成一张新的虚拟表(如果没有join
过程,就还是from
产生的表),记作table3,where
是在table3的基础上对表中的数据按照条件过滤一次,将符合条件的数据生成一张新的表,记作table4。
- group by
分组操作是在where
之后执行的,将table4的列按照语句中的列名进行分组操作,最后生成了一张新表table5。
- having
分组之后的新表table5还可以再根据having
后的条件再进行过滤,然后将符合条件的数据再生成一张新表table6。
- select
等前面的语句都执行完毕了,最后才通过select
操作对最后生成的表读取对应的列,比如读取table6中的对应列,然后将这些列再组织成一张新表table7,如果没有后续的操作的话,就会将table7返回给客户端展示了。
- union
union
操作是用来合并多个select
结果的,union
后面跟着的也是一个完整的查询语句,重复执行上述步骤,获得一个新表table7.1。然后将table7和table7.1重新合并成一个新表table8。也就说,union
连接的是两个select
查询出的表,将两张表再进行合并一次。
- order by
到这里时,就已经开始返回查询到的数据了,不再会对表中数据进行增删。order by
是排序操作,决定了如何返回表中数据(升序还是降序)。
- limit
指定返回多少行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构