數據庫的連接查詢

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

連接查詢可以分爲:

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

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

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 = "數據庫";

這裏寫圖片描述

發佈了129 篇原創文章 · 獲贊 203 · 訪問量 45萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章