子查询是我在刷题过程中最为头疼的部分,子查询根据用途不同又可分为子查询、标量子查询、关联子查询,现在把知识点系统地捋一遍。
子查询
是什么:一次性的视图,临时表
运行顺序:先子查询,后外部查询
in,any,all的使用
-
- In (SELECT XX from……)
- Any:比较运算符+any:>any(子查询),只要大于子查询中其中1个值,就返回结果
- All:>all(子查询):大于all中所有值
注意事项
-
- 子查询前不能进行数学运算
- A/3 > all(b) 对
- A > 3*all(b) 错
- 避免使用多层嵌套子查询,难以看懂
- 子查询名称最好不要省略
- 子查询前不能进行数学运算
标量子查询
是什么:只能返回一行一列的查询结果,单一值
使用场景:可以和比较运算符一起使用,任何使用单一值的场景均可使用,不能返回多行
关联子查询
关联子查询是之前我尤其疑惑的,不明白为什么子查询里的条件会对外部查询起作用,这次去查了下发现,虽然关联条件写在子查询里,但对外部查询也起作用,相当于分组后每组的数据运行一次,原理详见:

参考:https://www.cnblogs.com/heenhui2016/p/10574695.html
使用场景:在每个组里进行比较时使用关联子查询
常用函数汇总
基本函数count,sum,avg,min,max
算术函数-
-
- 四舍五入:round(数值,保留小数位数)
- 绝对值:abs(数值)
- 求余数:mod(被除数,除数)
-
-
-
- 字符串长度:length(字符串)
- 大小写转换:lower(),upper()
- 字符串拼接:concat(字符串1,字符串2)
- 字符串替换:replace(字符串,被替换字符串,用什么字符串替换)
- 字符串截取:substring(字符串,截取起始位置,截取长度)
-
-
-
- 当前日期:current_date
- 当前时间:current_time
- 当前日期和时间:current_timestamp
- 获取日期的年月日:year(日期),month(日期),day(日期)
- 日期对应星期几:dayname(日期)
-
子查询练习
练习网站:sqlzoo
world表格
思路:子查询筛选出俄罗斯人口。外部查询筛选出大于俄罗斯人口的国家
思路:子查询筛选出英国人均gdp。外部查询用where和标量子查询筛选人均gdp和欧洲
思路:考察子查询中in的用法
思路:考察标量子查询的用法,和比较运算符相结合
思路:考察标量子查询在select子句中的使用,以及concat,round函数
思路:运用子查询中的all,同时注意存在null值时需要对数据进行筛选,因为null不参与计算
思路:运用关联子查询和all
思路:关联子查询,比较name的先后用<=all
思路:排除拥有大于25000000人口国家的洲
思路:运用子查询中的all,关联子查询同时注意排除自身