資料庫的連線查詢
阿新 • • 發佈:2019-02-10
連線查詢:若一次查詢涉及兩個或兩個以上的表,稱之為連線查詢。
連線查詢可以分為:
- 等值連線
- 非等值連線
- 自然連線
- 自身連線
- 外連線
- 複合條件連線
以下的例程,都以下面的三個表為例:
CREATE TABLE Student (
Sno INT(6) PRIMARY KEY, # 學號
Sname VARCHAR(20) NOT NULL, # 姓名
Ssex CHAR(2) NOT NULL, # 性別
Sage INT NOT NULL, # 年齡
Sdept VARCHAR(10) NOT NULL # 所在系
);
CREATE TABLE Course (
Cno INT PRIMARY KEY, # 課程號
Cname VARCHAR(40) NOT NULL, # 課程名
Cpno INT, # 先修課
Ccredit INT NOT NULL # 學分
);
CREATE TABLE SC (
Sno INT(6), # 學號
Cno INT, # 課稱號
Grade INT # 得分
);
INSERT INTO Student VALUES (950001, '李大勇', '男', 20, 'CS' );
INSERT INTO Student VALUES (950002, '劉曉晨', '女', 19, 'CS');
INSERT INTO Student VALUES (950003, '王敏', '女', 18, 'MA');
INSERT INTO Student VALUES (950004, '張成功', '男', 19, 'IS');
INSERT INTO Course VALUES (1, '資料庫', 5, 4);
INSERT INTO Course (Cno, Cname, Ccredit) VALUES (2, '數學', 2);
INSERT INTO Course VALUES (3, '資訊系統', 1, 4);
INSERT INTO Course VALUES (4, '作業系統', 6, 3);
INSERT INTO Course VALUES (5, '資料結構', 7, 6);
INSERT INTO Course (Cno, Cname, Ccredit) VALUES (6, '資料處理', 4);
INSERT INTO Course VALUES (7, 'C語言', 6, 4);
INSERT INTO SC VALUES (950001, 1, 90);
INSERT INTO SC VALUES (950001, 2, 88);
INSERT INTO SC VALUES (950001, 3, 79);
INSERT INTO SC VALUES (950002, 2, 93);
INSERT INTO SC VALUES (950002, 3, 80);
Student表
Course表
SC表
等值連線與非等值連線
等值連線:當連線的比較運算子為=時,則為等值連線
非等值連線:與等值連線相反
問題:查詢每個學生的姓名及其選修課情況
SELECT Student.Sname,SC.Cno FROM Student,SC WHERE Student.Sno = SC.Sno;
自身連線
自身連線:連線操作在同一個表中進行,即自己連線自己
問題:查詢每門課的間接選修課,即先修課的先修課:
SELECT A.Cno ,B.Cpno FROM Course AS A,Course AS B WHERE A.Cpno = B.Con;
注:在自身連線時,必須給同一個表取上不同的別名,以區分,不然無法完成自身連線
外連線
外連線可以分為:左外連線,右外連線,全外連線
CREATE TABLE A(
id int PRIMARY KEY ,
name VARCHAR(20) ,
score INT
);
INSERT INTO A VALUES (1,'zp',80);
INSERT INTO A VALUES (2,'hh',75);
INSERT INTO A VALUES (3,'ee',89);
INSERT INTO A VALUES (4,'rr',86);
CREATE TABLE B(
id INT PRIMARY KEY ,
type VARCHAR(20),
s INT
);
INSERT INTO B VALUES (1,'ll',10);
INSERT INTO B VALUES (2,'cc',20);
INSERT INTO B VALUES (3,'xx',30);
A表
B表
內連線:
SELECT * FROM A INNER JOIN B ON A.id = B.id;
結論:內連線只連線匹配的行
左外連線:
SELECT * FROM A LEFT JOIN B ON A.id = B.id;
結論:左外連線包含左表(A)的全部內容,包含右表(B)匹配的內容
右外連線
SELECT * FROM A RIGHT JOIN B ON A.id = B.id;
結論:右外連線包含右表(B)的全部內容,包含左表(A)匹配的內容
SELECT * FROM A FULL JOIN B ;
結論:全連線指將倆表的全部內容都連線起來,關於為何有12行,這與DBMS的連線實現有關:
我們可以將其想成兩層的for迴圈,A表的第一行分別與B表的3行匹連線,然後是第二行,依次類推
複合條件連線
WHERE子句有多個連線條件,稱為複合條件連線
例:查詢選修了資料庫課程且成績在90分及以上的學生的學號和姓名
SELECT SC.Sno,Student.Sname FROM Student,SC,Course WHERE SC.Sno = Student.Sno AND SC.Cno=Course.Cno AND SC.Grade >= 90 AND Course.Cname = "資料庫";