刪除重複記錄
我們可以用一些有意思的子句來執行去重操作。
這是原先的表:
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行。