《SQL基础教程》第08章 分组查询


分组查询仍然是SQL的重要内容之一

过滤重复纪录

分组查询要用好字段前的选项DISTINCT和ALL,ALL一般省略,DISTINCT用来屏蔽某字段重复内容出现的纪录。

SQL> select STDNAME, distinct LEADER
  2  from   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)
  2  from   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
  3  from   STUFF 部下, STUFF 上司
  4  where  部下.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
  2  from   DEPARTMENT A, STUFF B
  3  where  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行。

3个以上表的结合

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行。