SQL查询语句和执行顺序
sql查询语句中主要包括select
、where
、order by
、join
、union
、group by
、having
、limit
等关键词。
语法顺序
sql查询书写顺序如下所示:
1 | select <字段名> |
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。
1 | postgres=# select * from students; |
通过左连接,得到结果如下:
1 | postgres=# select * from students left join class on students.id = class.id; |
其他的连接方式同理,右连接就是选择table2的全部,全连接是取两张表的并集,内连接是取交集。
需要注意一下的是,交叉连接是取笛卡尔积,并且交叉连接是不能和on
同时使用的。
1 | postgres=# select * from students cross join class; |
如果有多个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
指定返回多少行。