1.分组函数
分组函数的结果是对记录集进行分组,每一组返回一行。
常用的分组函数:AVG,MAX,MIN,COUNT,SUM。
2.
2.分组查询
SELECT [column,] group_function(column),...
FROM table_name
[WHERE condition]
[GROUP BY column]
[HAVING condition]
[ORDER BY column];
分组查询中对null值得考虑:
分组函数会忽略包含null值得行,使用NVL函数解决此问题
GROUP BY子句的语法:
SELECT子句中没有出现在分组函数中的列或表达式必须也包含在GROUP BY子句中。
GROUP BY子句中的列,不一定要出现在SELECT子句中。
GROUP BY子句可以包含多列(表达式)。
在WHERE子句中使用分组函数要使用HAVING子句来替换。
WHERE子句的作用?
那些行参加分组。
GROUP BY子句的作用?
如何进行分组。
HAVING子句的作用?
那些分组被显示。
3.连接查询
目标:使用等值连接或非等值连接从多表中检索数据,使用外连接检索不满足等值条件的数据行,使用自连接讲一个表和自身进行连接。
笛卡尔积:列数相加,行数相乘。
--危害:产生n1*n2*...*nn行结果。
--产生的原因:没有指定连接,连接无效,第一个表中的每一行都和另外一个表的每一行进行了连接。
--解决方法:使用WHERE子句避免笛卡尔积。
连接类型:
--等值连接
--非等值连接
--外连接
--自连接
等值连接:
SELECT table1.column,table2.column
FROM table1,table2
WHERE table1.column1 = table2.column2;
--如果多张表中有同名列,则:
--使用表前缀来明确多个表中同名的列
--使用表前缀可以提高性能
--使用列别名来区分多个表中同名得列
--如果有n个表需要进行等值连接,至少需要n-1个连接条件
非等值连接:
--使用IN,BETWEEN AND,<,>,...
外连接:
--使用外连接将那些不匹配的行也显示出来
--外连接的操作符是(+),(+)放在缺失值的那一边
--左外连接
SELECT A.a,B.b FROM A LEFT JOIN B ON B.b=A.b
等价于
SELECT A.a,B.b FROM A,B WHERE A.b = B.b(+)
--右外连接
SELECT A.a,B.b FROM A RIGHT JOIN B ON B.b=A.b
等价于
SELECT A.a,B.b FROM A,B WHERE A.b(+) = B.b
自连接:
--必须使用别名