分组查询仍然是SQL的重要内容之一
分组查询要用好字段前的选项DISTINCT和ALL,ALL一般省略,DISTINCT用来屏蔽某字段重复内容出现的纪录。
SQL>select
STDNAME, distinct LEADER 2from
STUFF; STDNAME LEAD -------- ---- 張妃 7902 関玉 7698 江三講 7839 李斯硼 7698 鄧笑平 7839 孫権 7839 周語 7566 劉倍 7698 曹草 7698 諸閣亮 7788 穆帰営 7566 花牧蘭 7782 魯素
分组函数AVG(expr)、COUNT(expr)分别可以求出合计值、满足条件的记录数。此外,还有分组函数STDEV()、VARIANCE()可以求出加权平均值、方差值。
SQL>select
avg(SALARY) 2from
STUFF; AVG(SALARY) ----------- 3159.61538
SQL> select count(*), count(SALARY), count(COMMISSION) 2 from STUFF; COUNT(*) COUNT(SALARY) COUNT(COMMISSION) ---------- ------------- ----------------- 13 13 4
SQL> select count(DEPID), count(distinct DEPID) 2 from STUFF; COUNT(DEPID) COUNT(DISTINCTDEPID) ------------ -------------------- 13 3
分组函数MAX(expr)、MIN(expr)分别可以求出最大值、最小值。
SQL> select max(SALARY), max(DEPID), max(YMD), min(SALARY), min(DEPID), min(YMD) 2 from STUFF; MAX(SALARY) MA MAX(YMD) MIN(SALARY) MI MIN(YMD) ----------- -- ---------- ----------- -- ---------- 9000 30 87.06.13 1800 10 80.12.17
自己结合是结合的一种特殊情况,即两个表实际上是同一个表,这时一定 要使用表的别名。注意:两个表中字段名完全相同,因此,字段前的表名一定 不能省略。
SQL>select
部下.STDID, 部下.STDNAME, 部下.LEADER, 2 上司.STDID, 上司.STDNAME 3from
STUFF 部下, STUFF 上司 4where
部下.LEADER = 上司.STDID; STDI STDNAME LEAD STDI STDNAME ---- -------- ---- ---- -------- 7360 张妃 7902 7902 穆归营 7566 江叁讲 7839 7839 鲁素 9698 邓笑评 7839 7839 鲁素 7782 孙荃 7839 7839 鲁素 7788 周语 7566 7566 江叁讲 7876 诸葛靓 7788 7788 周语 7902 穆归营 7566 7566 江叁讲 7934 花牧岚 7782 7782 孙荃 已选择8行。
表与表之间有主从关系,即1对多的关系。下例中的条件部分也可以 写成:where B.DEPID(+) = A.DEPID。但写成where A.DEPID(+) = B.DEPID, 则意义完全不一样了。
本章是SQL的重点,而本小节又是本章的重点,必须反复联系,彻底理解 方能通过。否则,容易与分组、子查询等概念混淆。
SQL>select
A.DEPID, A.DEPNAME, A.DEPADDR, B.STDID, B.STDNAME 2from
DEPARTMENT A, STUFF B 3where
A.DEPID = B.DEPID(+); DE DEPNAME DEPADDR STDI STDNAME -- ---------- -------------------------- ---- -------- 10 会计 上海 7782 孙荃 10 会计 上海 7839 鲁素 10 会计 上海 7934 花牧岚 20 开发 南京 7360 张妃 20 开发 南京 7876 诸葛靓 20 开发 南京 7788 周语 20 开发 南京 7566 江叁讲 20 开发 南京 7902 穆归营 30 销售 北京 7499 关玉 30 销售 北京 9698 邓笑评 30 销售 北京 7654 李斯硼 30 销售 北京 7844 曹草 30 销售 北京 7521 刘蓓 40 管理 南京 已选择14行。
SQL> select A.DEPID, B.STDNAME, B.SALARY, C.LVLID 2 from DEPARTMENT A, STUFF B, SALRLEVEL C 3 where A.DEPID = B.DEPID and 4 B.SALARY between C.MINSALR and C.MAXSALR; DE STDNAME SALARY LVLID -- -------- ---------- ---------- 30 刘蓓 2250 2 30 李斯硼 2250 2 30 曹草 2500 2 20 诸葛靓 2100 2 10 花牧岚 2300 2 30 关玉 2600 3 20 江叁讲 2975 3 20 周语 3000 3 20 穆归营 3000 3 10 孙荃 3450 4 30 邓笑评 3850 5 10 鲁素 9000 5 20 张妃 1800 1 已选择13行。