Datawhale-MySQL-任務四(表聯結)

TNTZS666發表於2019-03-02

MySQL別名

  • 為表取別名:查詢資料時,如果表名很長,使用起來不方便,此時,就可以為表取一個別名,用這個別名來代替表的名稱
    SELECT * FROM 表名 [AS] 別名;
  • 為欄位取別名:在查詢資料時,為了使顯示的查詢結果更加直觀,可以為欄位取一個別名
    SELECT 欄位名 [AS] 別名 [,欄位名 [AS] 別名,……] FROM 表名;

注意:AS關鍵字在指定別名的時候可以省略不寫

INNER JOIN

內連線(inner join)是使用最多的一種連線型別。在連線的兩表中只有滿足連線條件的元組,才作為結果輸出。

  • 一般格式
select[distinct/all]<目標列表示式[別名]清單> 
from<關係名1[別名1]>inner join<關係名2[別名2]> 
on<連線條件表示式>; 

LEFT JOIN

  • 左外連線(Left join)屬於外連線的一種,另外還有右外連線(Right Join),全外連線(Full Join);
  • 左外連線(Left join):除了返回兩表中滿足條件的元組以外,還返回左側表中不匹配元組,右側表中以空值(NULL)替代;
  • 格式就是將上面inner join 改為left join即可。

CROSS JOIN

  • CROSS JOIN子句從連線的表返回行的笛卡兒乘積。假設使用CROSS JOIN連線兩個表。 結果集將包括兩個表中的所有行,其中結果集中的每一行都是第一個表中的行與第二個表中的行的組合。 當連線的表之間沒有關係時,會使用這種情況。要特別注意的是,如果每個表有1000行,那麼結果集中就有1000 x 1000 = 1,000,000行,那麼資料量是非常巨大的。
  • 如果新增了WHERE子句,如果T1和T2有關係,則CROSS JOIN的工作方式與INNER JOIN子句類似
  • 具體例子見連結:MySQL交叉連線(cross join)

自連線

有時,一些特殊的查詢需要對同一個關係進行連線查詢,成為表的自身連線: 即一張表看成是兩張表。
例:要找到某人的間接負責人,則要先找到他的直接負責人,然後通過找他直接負責人的負責人找到某人的間接負責人。
例表emp01:
在這裡插入圖片描述
自連線後的結果:
在這裡插入圖片描述

UNION

MySQL UNION 操作符用於連線兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT 語句會刪除重複的資料。
語法格式:

SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];

引數:

  • expression1, expression2, … expression_n: 要檢索的列。
  • tables: 要檢索的資料表。
  • WHERE conditions: 可選, 檢索條件。
  • DISTINCT: 可選,刪除結果集中重複的資料。預設情況下 UNION 操作符已經刪除了重複資料,所以 DISTINCT 修飾符對結果沒啥影響。
  • ALL: 可選,返回所有結果集,包含重複資料。
    注:UNION語句用於將不同表中相同列中查詢的資料展示出來(不包括重複資料),UNION ALL語句包括重複資料。

區別

INNER JOIN產生的結果是兩張表的交集,LEFT JOIN產生左表的完全集,右表中若沒有匹配則以null值取代。CROSS JOIN將兩張表資料進行一個N*M組合,即笛卡爾積。自連線是對於自身的操作,將自己當成兩張表操作來提取需要的資訊。UNION操作符是用於連線兩個以上的SELECT語句,它和INNER JOIN的區別是一個是連線兩張表,另一個是連線兩個SELECT語句。

作業

專案五:組合兩張表 (難度:簡單)

在資料庫中建立表1和表2,並各插入三行資料(自己造)
表1: Person

列名 型別
PersonId int
FirstName varchar
LastName varchar

PersonId 是上表主鍵

表2: Address

列名 型別
AddressId int
PersonId int
City varchar
State varchar

AddressId 是上表主鍵

編寫一個 SQL 查詢,滿足條件:無論 person 是否有地址資訊,都需要基於上述兩表提供 person 的以下資訊:FirstName, LastName, City, State。
作業程式碼:

-- 專案五(組合兩張表)
-- 建立表Person
CREATE TABLE Person(
PersonId INT NOT NULL,
FirstName VARCHAR(30) NOT NULL,
LastName VARCHAR(30) NOT NULL
);
ALTER TABLE Person MODIFY PersonId INT PRIMARY KEY;
-- 插入資料
INSERT INTO Person VALUES(1,"Alfonso","Carlos");
INSERT INTO Person VALUES(2,"Antonio","Julio");
INSERT INTO Person VALUES(3,"Belen","Sonia");

-- 建立表Address
CREATE TABLE Address(
AddressId INT PRIMARY KEY,
PersonId INT,
City VARCHAR(20),
State VARCHAR(20) 
);

-- 插入資料
INSERT INTO Address VALUES(1,1,"Hangzhou","China");
INSERT INTO Address(AddressId,PersonId) VALUES(2,2);
INSERT INTO Address VALUES(3,3,"NewYork","American");

-- 作業解答
SELECT p.FirstName,p.LastName,a.City,a.State 
FROM Person p LEFT JOIN Address a
ON p.PersonId = a.PersonId

執行結果:
在這裡插入圖片描述

專案六:刪除重複的郵箱(難度:簡單)

編寫一個 SQL 查詢,來刪除 email 表中所有重複的電子郵箱,重複的郵箱裡只保留 Id 最小 的那個。

Id Email
1 a@b.com
2 c@d.com
3 a@b.com

Id 是這個表的主鍵。
例如,在執行你的查詢語句之後,上面的 Email表應返回以下幾行:

Id Email
1 a@b.com
2 c@d.com

作業程式碼:

-- 專案六:刪除重複的郵箱
-- 建立表email
CREATE TABLE email(
id INT PRIMARY KEY,
Email VARCHAR(50) NOT NULL
);
-- 插入資料
INSERT INTO email VALUES(1,"a@b.com");
INSERT INTO email VALUES(2,"c@d.com");
INSERT INTO email VALUES(3,"a@b.com");
-- 自連線
DELETE e1
FROM email e1,email e2
WHERE e1.Email = e2.Email
AND e1.id > e2.id;
-- 查詢結果
select * from email;

執行結果:
在這裡插入圖片描述

相關文章