SQL堂上作業八(子查詢的擴展)

刪除重複記錄

我們可以用一些有意思的子句來執行去重操作。

這是原先的表:

SNO        SNAME
---------- ----------------------------------------
20101      張盼
20102      李偉
20103      邱同
20105      xfz
20105      alpha

我們希望用一些命令進行去重。

方法一

我們可以用ROWID來進行

DELETE FROM student
WHERE ROWID NOT IN
(SELECT MIN(ROWID) 
FROM student 
GROUP BY sno
);

這裏的ROWID,個人理解是:每生成一行,SQL就會自動給行加一個行的ID,我們可以直接讀取。

在SELECT子句中,通過GROUP BY,把所有sno相同的都化爲一類,再用min選出一個sno相同的出來,再進行排除法,就可以刪去。

輸出如下:

已刪除 1 行。

方法二

我們可以用傳統的HAVING和COUNT實現

DELETE FROM student 
WHERE (sno) IN
(SELECT sno
FROM student
GROUP BY sno
HAVING COUNT(sno) > 1);

這裏是對每一組中,相同的sno數量進行計數,如果大於1了,就將兩個都刪去,和方法一有一定的區別。

輸出如下:

已刪除2行。

找出選修了所有課程的同學的名字

我們有三個表:學生姓名——學號表,學生學號——課程表,課程表

我們通過一個三重套娃可以求解該問題

select Sname from student 
where Sno IN
(select Sno from SC
group by Sno 
having count(*) = (select count(*)from course ));

個人理解爲:用(select count(*)from course )求出有多少門課

然後在SC表中,用學生ID對數據進行分組,將選課數量夠的學生取出,構成一個子表。

然後,基於該子表取出的學生ID,在student中查詢學生姓名。

輸出如下:

SNAME
----------------------------------------
邱同

查找學號爲2011001的同學沒有選修的科目

SELECT cname FROM course
WHERE cno NOT IN
(SELECT distinct cno FROM sc
WHERE
sno = 2011001);

輸出如下:

CNAME
------------------------------------------------------------
語言學
訓詁學
計算機概論
數據庫

輸出最靠前的N個

我們可以用rownum來進行限制

Select rownum, department_id , a
from
(select department_id ,avg(salary) a
from employees
group by department_id
order by avg(salary) desc
)
where rownum <=3;

這裏相當於是,先對錶進行了排序,然後再選出表的前面若干項

輸出如下:

    ROWNUM DEPARTMENT_ID          A
---------- ------------- ----------
         1            90 19333.3333
         2           110      10150
         3            20       9500

輸出待遇最低的N個薪酬

select e.last_name, a.min_sal, e.department_id
from 
(select department_id,min(salary) min_sal
from employees group by department_id) a,
employees e
where a.min_sal=e.salary
and a.department_id=e.department_id
;

輸出如下:

LAST_NAME                                             MIN_SAL DEPARTMENT_ID
-------------------------------------------------- ---------- -------------
Kochhar                                                 17000            90
De Haan                                                 17000            90
Lorentz                                                  4200            60
Popp                                                     6900            70
Colmenares                                               2500            30
Olson                                                    2100            50
Kumar                                                    6100            80
Whalen                                                   4400            10
Fay                                                      6000            20
Mavris                                                   6500            40
Gietz                                                    8300           110

LAST_NAME                                             MIN_SAL DEPARTMENT_ID
-------------------------------------------------- ---------- -------------
Popp                                                     6900           100

已選擇12行。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章