子查询是我在刷题过程中最为头疼的部分,子查询根据用途不同又可分为子查询、标量子查询、关联子查询,现在把知识点系统地捋一遍。

子查询

是什么:一次性的视图,临时表

运行顺序:先子查询,后外部查询

in,any,all的使用

  • In (SELECT XX from……)
  • Any:比较运算符+any:>any(子查询),只要大于子查询中其中1个值,就返回结果
  • All:>all(子查询):大于all中所有值

注意事项

  • 子查询前不能进行数学运算
  • A/3 > all(b) 对
  • A > 3*all(b) 错
  • 避免使用多层嵌套子查询,难以看懂
  • 子查询名称最好不要省略

标量子查询

是什么:只能返回一行一列的查询结果,单一值

使用场景:可以和比较运算符一起使用,任何使用单一值的场景均可使用,不能返回多行

关联子查询

关联子查询是之前我尤其疑惑的,不明白为什么子查询里的条件会对外部查询起作用,这次去查了下发现,虽然关联条件写在子查询里,但对外部查询也起作用,相当于分组后每组的数据运行一次,原理详见:




MPJBaseService子查询构造_sql 子查询


参考:

使用场景:在每个组里进行比较时使用关联子查询

常用函数汇总

基本函数

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


MPJBaseService子查询构造_sql子查询_02

world表格


思路:子查询筛选出俄罗斯人口。外部查询筛选出大于俄罗斯人口的国家


MPJBaseService子查询构造_sql join 子查询_03


思路:子查询筛选出英国人均gdp。外部查询用where和标量子查询筛选人均gdp和欧洲


MPJBaseService子查询构造_MPJBaseService子查询构造_04


思路:考察子查询中in的用法


MPJBaseService子查询构造_sql子查询_05


思路:考察标量子查询的用法,和比较运算符相结合


MPJBaseService子查询构造_sql子查询_06


思路:考察标量子查询在select子句中的使用,以及concat,round函数


MPJBaseService子查询构造_sql递归查询所有子节点_07


思路:运用子查询中的all,同时注意存在null值时需要对数据进行筛选,因为null不参与计算


MPJBaseService子查询构造_sql递归查询所有子节点_08


思路:运用关联子查询和all


MPJBaseService子查询构造_sql递归查询所有子节点_09


思路:关联子查询,比较name的先后用<=all


MPJBaseService子查询构造_sql子查询_10


思路:排除拥有大于25000000人口国家的洲


MPJBaseService子查询构造_sql递归查询所有子节点_11


思路:运用子查询中的all,关联子查询同时注意排除自身


MPJBaseService子查询构造_sql递归查询所有子节点_12