1. 程式人生 > 其它 >資料庫複習

資料庫複習

技術標籤:資料庫mysqlsql資料庫

Student(Sno,Sname,Ssex,Sage,Sdept)
Course(Cno,Cname,Cpno,Credit)
SC(Sno,Cno,Grade)

Student

Sno(學號)Sname(姓名)SexSageSdept(所在系)
201215121李勇20CS
201215122劉晨19CS
201215123王敏18MA
201215125張立20IS

Course

CnoCnameCpnoCcredit(先修課)
1資料庫54
2數學2
3資訊系統14

SC

SnoCnoGrade
201215121192
201215121285
201215121388
201215122290
201215122380

建立資料庫

建立表

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));
  1. 向Student表增加“入學時間”列,其資料型別為日期型
ALTER TABLE Student ADD S_entrance DATE;
  1. 刪除Student表
DROP
TABLE Student CASCADE
  1. 刪除表中某一列
 ALTER TABLE Student  DROP COLUMN Sage;

查詢

  1. 資料查詢
SELECT 目標列 
FROM/檢視名 AS 別名 
WHERE 條件表示式
GROUP BY 列名 [HAVING 條件表示式] /*按列名分組,該屬性列值相等的元組為一個組 通常會在每組中作用聚集函式 加上HAVING短語則按指定條件的組輸出*/
ORDER BY 列名 ASC  /*升序*/ DESC  /*降序*/ /*關鍵字用於對結果集按照一個列或者多個列進行排序*/
  1. 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 
/*查詢學生選修課程的總學分數*/
  1. 查詢選修了三門以上課程的學生學號
SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*)>3 
/*先分組再用聚集函式對每一組計數 HAVING 短語給出了選擇組的條件,只有滿足條件的才會被顯示出來*/

連線查詢

  • 等值連線
SELECT Student.Sname,SC.* FROM Student,SC WHERE Student.Sno = SC.Sno
  • 外連線
  1. INNER JOIN:如果表中有至少一個匹配,則返回行
    在這裡插入圖片描述
SELECT column FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name
  1. LEFT JOIN:即使右表中沒有匹配,也從左表返回所有的行
    在這裡插入圖片描述
SELECT column FROM TABLE1 LEFT JOIN TABLE2 ON table1.column_name = table2.column_name
  1. RIGHT JOIN:即使左表中沒有匹配,也從右表返回所有的行
    在這裡插入圖片描述
SELECT column FROM TABLE1 RIGHT JOIN TABLE2 ON TABLE1.COLUMN_NAME = TABLE2.COLUMN_NAME
  1. 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 = '劉晨')
  • 集合查詢(查詢結果列數必須相等)
  1. 並操作 UNION
  2. 交操作 INTERSECT
  3. 差操作
/*查詢計算機系的學生及年齡不大於19的學生*/
SELECT * FROM Student WHERE Sdept ='CS' UNION SELECT * FROM Student WHERE Sage<=19

插入

INSERT INTO SC(Sno,Cno) VALUES('201215128','1')