1. 程式人生 > >PL/SQL入門——基礎的增刪改查

PL/SQL入門——基礎的增刪改查

--查詢經過計算的列,可以起別名(AS可省略)
SELECT Sname,2004-Sage BIRTHDAY FROM Student;


--可以查詢字串常量和函式
SELECT Sname NAME , 'Year of Birth:' BIRTH , 2004-Sage BIRTHDAY , LOWER(Sdept) DEPARTMENT FROM Student;


--消除取值重複的行,預設為ALL
SELECT DISTINCT Sno FROM SC;
 
--比較大小,>=、<=、!=、<>、!>、!<
SELECT DISTINCT Sno FROM SC WHERE Grade >= 90;


--確定範圍,between 下限 and 上限,相對的是 NOT between 下限 and 上限
SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23;


--確定集合,關鍵詞 IN,相對的是NOT IN
SELECT Sname,Ssex FROM Student WHERE Sdept  IN ('IS','MA','CS');


--字元匹配,[NOT] LIKE '匹配字串' [ESCAPE '換嗎字元']
UPDATE Student SET Sname = '李勇%' WHERE Sname = '李勇';
SELECT * FROM Student WHERE Sname LIKE '%\%%'ESCAPE '\';  --反斜槓後的%被轉義,%不在具有萬用字元的含義
UPDATE Student SET Sname = '李勇' WHERE Sname = '李勇%';


--涉及空值查詢,IS [NOT] NULL
SELECT * FROM Course WHERE Cpno IS NULL;


--多重條件查詢 AND OR
SELECT * FROM Student WHERE Sdept = 'IS' OR Sdept = 'CS' OR Sdept = 'MA';


--ORDER BY 子句,ASC  DESC
SELECT * FROM Student ORDER BY Sdept,Sage DESC;
SELECT * FROM Course ORDER BY Cname;  --ORDER BY 字元欄位


--聚集函式 COUNT(),MAX(),MIN(),AVG(),SUM(),注意:聚集函式不能作為WHERE的條件表示式
SELECT COUNT(Cpno) FROM Course;
SELECT COUNT(*) FROM Course;
SELECT AVG(Grade) FROM SC WHERE Cno = 2;


--GROUP BY 字句
SELECT Cno , COUNT(Sno) NUM FROM SC GROUP BY Cno;
SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(Cno) >= 2;  --HAVING作用於GROUP BY的分組,WHERE作用於基本表或試圖,聚集函式可以作用於HAVING


--等值與非等值連線查詢
SELECT a.*,b.* FROM Student a , SC b WHERE a.Sno = b.Sno;  --等值連線
SELECT Student.* FROM Student , SC WHERE Student.Sno = SC.Sno AND Cno = '2' AND Grade > 70;
SELECT a.* , b.* ,c.* FROM Student a , SC b , Course c WHERE a.sno = b.sno AND b.cno = c.cno;
SELECT a.* , b.* FROM Student a INNER JOIN SC b ON a.Sno = b.Sno; --內連線


--自身連線
SELECT a.Cno , b.Cpno 間接先修課 FROM Course a , Course b WHERE a.Cpno = b.Cno ORDER BY a.Cno;


--外連線
SELECT a.* , b.* FROM Student a LEFT JOIN SC b ON a.Sno = b.Sno;
SELECT a.* , b.* FROM Student a RIGHT JOIN SC b ON a.Sno = b.Sno;
SELECT a.* , b.* FROM Student a FULL JOIN SC b ON a.Sno = b.Sno;


--巢狀查詢,注意:子查詢SELECT不允許用ORDER BY子句
SELECT * FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno = '2');
SELECT * FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname = '劉晨'); --不相關子查詢,子查詢的查詢條件不依賴於父查詢
SELECT * FROM Student WHERE Sdept = (SELECT Sdept FROM Student WHERE Sname = '劉晨');  --子查詢結果是單值,所以可以用等號。注意只有當子查詢是單值時才可以用比較運算子
SELECT * FROM Student WHERE  (SELECT Sdept FROM Student WHERE Sname = '劉晨') = Sdept ;
SELECT a.* FROM Student a , Student b WHERE b.Sname = '劉晨' AND a.Sdept = b.Sdept; --和上面三條等價
SELECT DISTINCT a.Sno , Sname FROM Student a , SC b WHERE a.Sno IN (SELECT Sno FROM SC , Course WHERE SC.Cno = Course.Cno AND Cname = '資訊系統');
SELECT DISTINCT Sno , Sname FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno IN (SELECT Cno FROM Course WHERE Cname = '資訊系統'));
SELECT DISTINCT a.Sno , Sname FROM Student a , SC b , Course c WHERE Cname = '資訊系統' AND c.Cno = b.Cno AND b.Sno = a.Sno; --和上面兩條等價
SELECT a.* , Cno FROM Student a , SC b WHERE Grade > (SELECT AVG(Grade) FROM SC WHERE  a.Sno = b.Sno); -- 相關子查詢
SELECT Sno , Cno FROM SC a WHERE Grade > (SELECT AVG(Grade) FROM SC b WHERE a.Sno = b.Sno); -- 相關子查詢


--帶ANY(SOME) , ALL 謂詞的子查詢,
SELECT Sname , Sage FROM Student WHERE Sage < ANY (SELECT Sage FROM Student WHERE Sdept = 'CS') AND Sdept != 'CS'; --ANY 也可以用 SOME 代替
SELECT Sname , Sage FROM Student WHERE Sage <  (SELECT MAX(Sage) FROM Student WHERE Sdept = 'CS') AND Sdept != 'CS';--和上面一條等價,注意:用聚集函式查詢比用ANY或ALL效率高
SELECT Sname , Sage FROM Student WHERE Sage < ALL (SELECT Sage FROM Student WHERE Sdept = 'CS') AND Sdept != 'CS';
SELECT Sname , Sage FROM Student WHERE Sage <  (SELECT MIN(Sage) FROM Student WHERE Sdept = 'CS') AND Sdept != 'CS'; --和上面一條等價


--帶有EXISTS 或 NOT EXISTS 謂詞的子查詢,不返回任何資料只產生 TRUE 或者 FALSE ,注意:某些帶 [NOT] EXISTS不能被其他姓氏子查詢代替,但所有帶IN ,比較運算子,ANY或ALL的子查詢都能被EXISTS查詢代替
SELECT Sname FROM Student  WHERE EXISTS (SELECT * FROM SC WHERE SC.Sno = Student.Sno AND Cno = '1'); --由EXISTS 引出的查詢通常都用 *
SELECT Sname FROM Student a , SC b WHERE a.Sno = b.Sno AND b.Cno = '1'; --和上面一條等價
SELECT Sname FROM Student  WHERE NOT EXISTS (SELECT * FROM SC WHERE SC.Sno = Student.Sno AND Cno = '1');
SELECT * FROM Student S1 WHERE  EXISTS (SELECT * FROM Student S2 WHERE S1.Sdept = S2.Sdept AND Sname = '劉晨'); --和 139 行等價
SELECT * FROM Student WHERE NOT EXISTS (SELECT * FROM Course WHERE NOT EXISTS (SELECT * FROM SC WHERE Student.Sno = Sno AND Course.Cno = Cno)); --查詢選修了全部課程的學生,NOT EXISTS相當於 任意
SELECT * FROM Student x WHERE NOT EXISTS (SELECT Cno FROM SC y WHERE Sno = '200215122' AND NOT EXISTS (SELECT * FROM SC z WHERE y.Cno = z.Cno AND x.Sno = z.Sno)); 


--集合查詢,並UNION ,交INTERSECT ,差 MINUS ,注意:參加集合操作的查詢結果列數必須相同,對應項型別也必須相同
SELECT * FROM Student WHERE Sdept = 'CS' UNION SELECT * FROM Student WHERE Sage <= 19; --並集,UNION會自動去掉重複行,保留要用UNION ALL
SELECT * FROM Student WHERE Sdept = 'CS' INTERSECT SELECT * FROM Student WHERE Sage <= 19; --交集
SELECT * FROM Student WHERE Sdept = 'CS' AND Sage <= 19; --和上面一條等價
SELECT * FROM Student WHERE Sdept = 'CS' MINUS SELECT * FROM Student WHERE Sage <= 19; --差集
SELECT Sno FROM  SC WHERE Cno = '1' UNION SELECT Sno FROM SC WHERE Cno = '2';