Java学习笔记-Java基础18(SQL之复杂查询)

1.聚合函数:多行数据参与返回一行结果,又称为分组函数、多行函数、集合函数

    1)MAX()和MIN():获取最大值和最小值

    2)AVG():获取平均值

    3)SUM():获取总和

2.HAVING子句是对GROUP BY分组的结果进一步限制,不能单独存在。和WHERE的区别在于:

        --WHERE是用于第一次检索数据时过滤的

        --HAVING是用于第二次过滤数据使用的

3.查询语句的执行顺序:

    1)from子句:执行顺序为从后往前,从右到左

        --数据量较少的表尽量放在后面

    2)where子句:执行顺序为从后往前,从右到左

        --将能过滤掉大数量记录的条件放在后面

    3)group by:执行顺序为从左到右

        --在使用group by之前,最好先使用where过滤

    4)having:尽量避免使用,消耗资源对检索出的结果集进行过滤、排序等操作

    5)select:少用*号,尽量取字段名称

    6)order by:执行顺序为从左到右

4.笛卡尔积:做关联操作的每个表的每一行都和其他表的每一行做组合,假设两个表的记录条数分别为X和T,那么笛卡尔积返回X*Y条记录

5.两张表之间的连接关系:

    1)NATURAL JOIN:自然连接,两张表只有一列的名字完全相同

    2)内连接

Java学习笔记-Java基础18(SQL之复杂查询)

    3)外连接:不仅能返回满足连接条件的记录,还将返回不满足条件的记录

        --语法:SELECT table1.column,table2.column FROM table1 LEFT | RIGHT | FULL [OUTER] JOIN table2 ON table1.column1=table2.column2;

6.ROWNUM:伪列,用于返回标识行数据顺序的数字,只能从1计数,不能直接从结果集中截取

7.分页查询的步骤:

    1)排序

    2)编号

    3)取范围

    --格式基本固定,只需要更换表、排序的列、取值范围即可

    --分页的算法:page页数,pagesize一页的条数

    start---(page-1)*pagesize+1

    end----page*pagesize

Java学习笔记-Java基础18(SQL之复杂查询)

8.DECODE(expr,search1,result1,...default):匹配函数类似Java中的switch-case语句,与之相似的还有SQL种的CASE语句

Java学习笔记-Java基础18(SQL之复杂查询)

9.ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col2):根据col1分组,在组内根据col2排序,顺序编号,组内连续且唯一

        --RANK() OVER(PARTITION BY col1 ORDER BY col2):同上,但是编号在组内不连续且不唯一

        --DENSE_RANK() OVER(PARTITION BY col1 ORDER BY col2):同上,但是编号在组内连续但不唯一

10.UNION:去掉重复记录后的合并集,并对结果集排序;UNION ALL:包含重复记录的所有行,对结果集不排序;INTERSECT:获取两个结果集的交集;MINUS:只有在第一个结果集中存在,在第二个结果集中不存在的数据

Java学习笔记-Java基础18(SQL之复杂查询)

11.GROUP BY ROLLUP(a,b,c):分组方式abc,bc,c,3种

    GROUP BY CUBE(a,b,c):取值分为参与分组和不参与分组的两个值的一个维度,对于n个参数,有2的n次方分组

    GROUP BY GROUPING SETS((a,b,c),(b,c)):以指定的方式分组,比较灵活