查询
执行顺序
https://blog.jooq.org/2016/12/09/a-beginners-guide-to-the-true-order-of-sql-operations/
个人觉得这个链接的文章写得很好,建议阅读英文。关于执行顺序的描述在标题Can this ever be understood?之下。下面我只列出了自己常用的那些,而完整的执行顺序在这个链接的文章里都有。
- from
- where
- group by
- 聚集函数
- having
- select
- distinct
- union
- order by
- limit
select count(distinct Sno) from sc;
执行聚集函数的时候会先执行里面的东西,相当于执行了select distinct Sno
这里只是个人理解,只是为了想的时候方便一些,细究的话它可能是错的,但这样“想”似乎没有问题
别名
别名可用as指定,as可以省略,省略后使用空格隔开原名和别名
-
每步都可以使用表别名
-
group by 开始可以使用字段别名
where
where可以想成是一个循环,为真就选择,为假就不选
这对于理解sleep()有好处,在下面一篇里我有关于sleep()理解的简单例子https://blog.csdn.net/m0_49269559/article/details/108088717
distinct
去掉重复行
select distinct Sno from sc;
- distinct 只能放在所有字段的最前面
- 如果distinct后面有多个字段,则会把这些字段作为整体来去重
group by
分组
select Cno,count(Sno),Grade from sc group by Cno;
- 聚集函数会对每一组的象集执行操作
逻辑参考:
这里纯粹只是逻辑上的参考,未必是底层的实际操作,但这样来“想”还没有遇到过问题
设sc表如下
Sno | Cno | Grade |
---|---|---|
201215121 | 1 | 92 |
201215121 | 2 | 85 |
201215121 | 3 | 88 |
201215122 | 2 | 90 |
201215122 | 3 | 80 |
201215123 | 4 | 70 |
group by Cno:
Cno |
---|
1 |
2 |
3 |
4 |
count(Sno):
count(Sno) |
---|
1 |
2 |
2 |
1 |
新表:
Sno | Cno | Grade | count(Sno) |
---|---|---|---|
201215121 | 1 | 92 | 1 |
201215121 | 2 | 85 | 2 |
201215121 | 3 | 88 | 2 |
201215123 | 4 | 70 | 1 |
查询结果:
Cno | count(Sno) | Grade |
---|---|---|
1 | 1 | 92 |
2 | 2 | 85 |
3 | 2 | 88 |
4 | 1 | 70 |
having
选择
select Sno from sc group by Sno having count(*)>=3;
- having中可以有聚集函数
- 书写顺序:where group by having
union
并操作
- 字段数要相同
- 字段名以最前面的查询为准
- union去重
- union all不去重
order by
排序
select Sno,Grade from sc where Cno='3' order by Grade desc;
- 升序asc,降序desc;默认为升序
- 可以写order by 1
- 对于空值,排序时显示的次序由具体系统实现来决定
limit
查询bjb表n号元组开始的m行
select * from bjb limit 0,3;
版权声明:本文为m0_49269559原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。