資料庫複習
阿新 • • 發佈:2021-01-12
Student(Sno,Sname,Ssex,Sage,Sdept)
Course(Cno,Cname,Cpno,Credit)
SC(Sno,Cno,Grade)
Student
Sno(學號) | Sname(姓名) | Sex | Sage | Sdept(所在系) |
---|---|---|---|---|
201215121 | 李勇 | 男 | 20 | CS |
201215122 | 劉晨 | 女 | 19 | CS |
201215123 | 王敏 | 女 | 18 | MA |
201215125 | 張立 | 男 | 20 | IS |
Course
Cno | Cname | Cpno | Ccredit(先修課) |
---|---|---|---|
1 | 資料庫 | 5 | 4 |
2 | 數學 | 2 | |
3 | 資訊系統 | 1 | 4 |
SC
Sno | Cno | Grade |
---|---|---|
201215121 | 1 | 92 |
201215121 | 2 | 85 |
201215121 | 3 | 88 |
201215122 | 2 | 90 |
201215122 | 3 | 80 |
建立資料庫
建立表
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY, /*約束主鍵*/
Sname CHAR(20) UNIQUE, /* Sname取唯一值*/
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20));
CREATE TABLE Course
(Cno CHAR(4) PRIMARY KEY,
Cname CHAR(40) NOT NULL, /*不能取空值*/
Cpno CHAR(4),
Ccredit SMALLINT,
FOREIGN KEY(Cpno) REFERENCES Course(Cno)) /*Cpno是外碼,被參照表的是Course,被參照的列是Cno*/;
CREATE TABLE SC
(Sno CHAR(9),
Cno CHAE(4),
Grade SMALLINT,
FOREIGN KEY(Sno) REFERENCES Student(Sno),
FOREIGN KEY(Cno) REFERENCES Course(Cno));
- 向Student表增加“入學時間”列,其資料型別為日期型
ALTER TABLE Student ADD S_entrance DATE;
- 刪除Student表
DROP TABLE Student CASCADE
- 刪除表中某一列
ALTER TABLE Student DROP COLUMN Sage;
查詢
- 資料查詢
SELECT 目標列
FROM 表/檢視名 AS 別名
WHERE 條件表示式
GROUP BY 列名 [HAVING 條件表示式] /*按列名分組,該屬性列值相等的元組為一個組 通常會在每組中作用聚集函式 加上HAVING短語則按指定條件的組輸出*/
ORDER BY 列名 ASC /*升序*/ DESC /*降序*/ /*關鍵字用於對結果集按照一個列或者多個列進行排序*/
- DISTINCT 消除取值重複的行
SELECT DISTINCT Sno FROM SC
確定範圍
- 判斷語句
- BETWEEN 低值 AND 高值 在什麼範圍
- NOT BETWEEN 低值 AND 高值 不在什麼範圍
確定集合
- IN 查詢屬性值屬於指定集合的元組
- NOT IN
SELECT Sname.Ssex From Student Where Sdept IN('CS','MA')
SELECT Sname.Ssex From Student Where Sdept NOT IN('CS','MA')
字元匹配
LIKE 用來匹配字串 萬用字元有%和_
- % 表示任意長度 可以是0個
- _ 表示任意單個字元
SELECT Sname FROM Student WHERE Sname LIKE '_陽%'
涉及空值查詢
SELECT Sno,Cno FROM SC WHERE Grade IS NULL
聚集函式
COUNT(列名) | 統計元組個數 |
---|---|
SUM(列名) | 計算列值總和 |
AVG(列名) | 計算列值平均值 |
MAX(列名) | 求一列中的最大值 |
MIN(列名) | 求一列中的最小值 |
SELECT COUNT(DISTINCT Sno) FROM SC /*查詢選修了課程的學生人數*/
SELECT MAX(Grade) FROM SC WHERE Cno='1' /*查詢選修1號課程的學生最高分數*/
SELECT SUM(Credit) FROM SC,Course WHERE Sno='201215012' AND SC.Cno = Course.Cno
/*查詢學生選修課程的總學分數*/
- 查詢選修了三門以上課程的學生學號
SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*)>3
/*先分組再用聚集函式對每一組計數 HAVING 短語給出了選擇組的條件,只有滿足條件的才會被顯示出來*/
連線查詢
- 等值連線
SELECT Student.Sname,SC.* FROM Student,SC WHERE Student.Sno = SC.Sno
- 外連線
- INNER JOIN:如果表中有至少一個匹配,則返回行
SELECT column FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name
- LEFT JOIN:即使右表中沒有匹配,也從左表返回所有的行
SELECT column FROM TABLE1 LEFT JOIN TABLE2 ON table1.column_name = table2.column_name
- RIGHT JOIN:即使左表中沒有匹配,也從右表返回所有的行
SELECT column FROM TABLE1 RIGHT JOIN TABLE2 ON TABLE1.COLUMN_NAME = TABLE2.COLUMN_NAME
- FULL JOIN:只要其中一個表中存在匹配,則返回行
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name=table2.column_name;
- 多表連線
SELECT Student.Sno,Sname,Cname,Grade FROM Student,SC,Course WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno;
- 巢狀查詢
SELECT Sname FROM Student WHERE Sno IN
(SELECT Sno FROM SC WHERE Cno='2') /*上層稱為外層查詢或父查詢 下層陳內查詢或子查詢*/
- 帶有比較運算子的子查詢
SELECT Sno,Sname,Sdept FROM Student WHERE Sdept=
(SELECT Sdept FROM Student WHERE Sname = '劉晨')
- 集合查詢(查詢結果列數必須相等)
- 並操作 UNION
- 交操作 INTERSECT
- 差操作
/*查詢計算機系的學生及年齡不大於19的學生*/
SELECT * FROM Student WHERE Sdept ='CS' UNION SELECT * FROM Student WHERE Sage<=19
插入
INSERT INTO SC(Sno,Cno) VALUES('201215128','1')