SQL 中 where 后面可不可以跟上子查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 中 where 后面可不可以跟上子查询相关的知识,希望对你有一定的参考价值。

聚合函数应该用在having子句中。 聚合函数如果想用在where中的话,应该只能用子查询来实现(在子查询中进行聚合函数计算,然后在主查询中进行where判断)。 参考技术A 可以,只要你语句写正确就行

SQL(高级查询)

1.子查询在WHERE子句中
  在SELECT查询中,在WHERE查询条件中的限制条件不是一个确定的值,而是来自于另外一个查询的结果
  为了给查询提供数据而首先执行的查询语句叫做子查询
  子查询嵌入在其它SQL语句中的SELECT语句,大部分出现在WHERE子句中
  子查询嵌入的语句称作主查询或父查询
  主查询可以是SELECT语句,也可以是其它类型的语句比如DML或DDL语句
  根据返回结果的不同,子查询可分为单行子查询、多行子查询及多列子查询
2.子查询在WHERE子句中(续1)
  如果子查询返回多行,主查询中要使用多行比较操作符
  多行比较操作符包括IN、ALL、ANY。
3.子查询在WHERE子句中(续4)
  在子查询中需要引用到主查询的字段数据,使用EXISTS关键字
  EXIISTS后边的子查询至少返回一行数据,则整个条件返回TRUE
4.子查询在HAVING子句中
5.子查询在FROM部分
  FROM子句用来指定要查询的表
  如果要在一个子查询的结果中继续查询,则子查询出现在FROM子句中,这个子查询也称作行内视图或者匿名视图
  把子查询当作视图对待,但视图没有名字,只能在当前的SQL语句中有效
6.子查询在SELECT部分
  把子查询放在SELECT子句部分,可以认为是外连接的另一种变现形式,使用更灵活
7.ROWNUM
  被称作伪列,用于返回标识行数据顺序的数字
  只能从1计数,不能从结果集中直接截取
  利用ROWNUM截取结果集中的部分数据,需要用到行内视图
8.使用子查询进行分页
  分页策略:每次只取一页的数据。每次换页,取下一页的数据。
  在ORACLE中利用ROWNUM的功能可用来进行分页
  假设结果集中共105条,每20条为一页则:
    Page1:1至20
    Page2:21至40
    ...
    PageN:(n-1)*pageSize+1至n*pageSize
    共6页
9.分页与ORDER BY
10.DECODE函数基本语法
  DECODE(expr,search1,result1[,search2,result2...][,default]
    DECODE用于比较参数expr的值,如果匹配到哪一个search条件,就返回对应的result结果
    可以有多组search和result的对应关系,如果任何一个search条件都没有匹配到,则返回最后default的值
    default参数是可选的,如果没有提供default参数值,当没有匹配到时,将返回NULL。
  和DECODE函数功能相似的有CASE语句,实现类似于if-else的操作。
    CASE job WHEN ‘MANAGER‘ THEN sal*1.2
        WHEN ‘ANALYST‘ THEN sal*1.1
        ELSE sal END
  例1:
    SELECT DECODE(job,
        ‘ANALYST‘,‘VIP‘,
        ‘MANAGER‘,‘VIP‘,
        ‘OPERATION‘) job,
      COUNT(1) job_cnt
    FROM emp
    GROUP BY DECODE(job,
      ‘ANALYST‘,‘VIP‘,
      ‘MANAGER‘,‘VIP‘,
      ‘OPERATION‘);
  例2:
    SELECT deptno,dname,loc
    FROM dept
    ORDER BY DECODE(dname,‘OPERATIONS‘,1,‘ACCOUNTING‘,2,‘SALES‘,3);(自由定义排序规则)
11.ROW_NUMBER(排序函数)
  ROW_NUMBER() OVER( PARTITION BY col1 ORDER BY col2)
  表示根据col1分组,在分组内部根据col2排序
  此函数计算的值就表示每组内部排序后的顺序编号,组内连续且唯一
  Rownum是伪列,ROW_NUMBER功能更强大,可以直接从结果集中取出子集
  例如:
    按照部门编码分组显示,每组内按职员编码排序,并赋予组内编码
    SELECT deptno,ename,empno,ROW_NUMBER()
    OVER(PARTITION BY deptno ORDER BY empno) as emp_id
    FROM emp
12.RANK
  RANK() OVER(PARTITION BY col1 ORDER BY col2)
    表示根据col1分组,在分组内部根据col2给予等级标识
    等级标识即排名,相同的数据返回相同的排名
    跳跃排序,如果有相同数据,即排名相同,比如并列第二,则两行数据都标记为2,但是下一位将是第四名
    和ROW_NUMBER的区别是有重复值,而ROW_NUMBER没有
13.DENSE_RANK
  DENSE_RANK() OVER( PARTITION BY col1 ORDER BY col2)
    表示根据col1分组,在分组内部根据col2给予等级标识
    即排名,相同的数据返回相同排名
    连续排序,如果有并列第二,下一个排序将是三,这一点是和RANK的不同,RANK是跳跃排序
14.UNION、UNION ALL
  为了合并多个SELECT语句的结果,可以使用集合操作符,实现集合的并、交、差
  集合操作符包括UNION、UNION ALL、INTERSECT和MINUS
  多条作集合操作的SELECT语句的列的个数和数据类型必须匹配
  ORDER BY子句只能放在最后的一个查询语句中
  集合操作的语法如下:
    SELECT statement1 [UNION|UNION ALL|INTERSECT|MINUS] SELECT statement2;
  用来获取两个或两个以上结果集的并集
  UNION操作符会自动去掉合并后的重复记录
  UNION ALL返回两个结果集中的所有行,包括重复的行。
  UNION操作符对查询结果排序,UNION ALL不排序
15.INTERSECT
  获得两个结果集的交集,只有同时存在于两个结果集中的数据,才被显示输出
  使用INTERSECT操作符后的结果集会以第一列的数据作升序排列
16.MINUS
  获取两个结果集的差集
  只有在第一个结果集中存在,在第二个结果集中不存在的数据,才能够被显示出来。也就是结果集一减去结果集二的结果
17.ROLLUP
  ROLLUP、CUBE和GROUPING SETS运算符是GROUP BY子句的扩展,可以生成与使用UNION ALL来组合单个分组查询时相同的结果集,用来简化和高效的实现统计查询
    GROUP BY ROLLUP(a,b,c)
    GROUP BY CUBE(a,b,c)
    GROUP BY GROUPING SETS((a),(b))
18.ROLLUP(续)
  假设有表test,有a、b、c、d四个列
    SELECT a,b,c,sum(d) FROM test GROUP BY ROLLUP(a,b,c)
    等价于
    SELECT a,b,c,sum(d) from test GROUP BY a,b,c
      UNION ALL
    SELECT a,b,null,sum(d) from test GROUP BY a,b
      UNION ALL
    SELECT a,null,null,sum(d) from test GROUP BY a
      UNION ALL
    SELECT null,null,null,sum(d) from test
  对ROLLUP的列从右到左以一次少一列的方式进行分组直到所有列都去掉后的分组(也就是全表分组)
  对于n个参数的ROLLUP,有n+1次分组
19.GROUP BY CUBE(a,b,c)
  对cube的每个参数,都可以理解为取值为参与分组和不参与分组两个值的一个维度,所有维度取值组合的集合就是分组后的集合
  对于n个参数的cube,有2^n次方分组
  GROUP BY CUBE(a,b,c),首先对(a,b,c)进行GROUP BY,然后一次是(a,b),(a,c),(a),(b,c),(b),(c),最后对全表进行GROUP BY操作,一共是2^3=8次分组
20.GROUPING SETS
  GROUPING SETS 运算符可以生成与使用单个GROUP BY、ROLLUP或CUBE运算符生成的结果集相同的结果集
  如果不需要获得由完备的ROLLUP或CUBE运算符生成的全部分组,则可以使用GROUPING SETS仅指定所需的分组
  GROUPING SETS 列表可以包含重复的分组
  分组示例:
    使用GROUP BY GROUPING SETS(a,b,c),则对(a),(b),(c)进行GROUP BY
    使用GROUP BY GROUPING SETS((a,b),(c)),则对(a,b),(c)进行GROUP BY
    GROUP BY GROUPING SETS(a,a),则对(a)进行2次GROUP BY,GROUPING SETS的参数允许重复

以上是关于SQL 中 where 后面可不可以跟上子查询的主要内容,如果未能解决你的问题,请参考以下文章

一文讲懂SQL子查询

SQL嵌套SELECT语句的用法-

求助一条mysql 更新 语句 where 后面为查询的结果

表连接查询与where后使用子查询的性能分析。

第四章 MySQL高级查询

sql面试题_SQl优化技巧_1注意通配符中like的使用,百分号放后面_2避免在where子句中对字段进行函数操作_3在子查询当中,尽量用exists代替in_4where子句中尽量不要使用(代码片