1. 程式人生 > >資料庫的連線查詢

資料庫的連線查詢

連線查詢:若一次查詢涉及兩個或兩個以上的表,稱之為連線查詢。

連線查詢可以分為:

  • 等值連線
  • 非等值連線
  • 自然連線
  • 自身連線
  • 外連線
  • 複合條件連線

以下的例程,都以下面的三個表為例:

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 = "資料庫";

這裡寫圖片描述