Datawhale-MySQL-任務四(表聯結)
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 | |
---|---|
1 | a@b.com |
2 | c@d.com |
3 | a@b.com |
Id 是這個表的主鍵。
例如,在執行你的查詢語句之後,上面的 Email表應返回以下幾行:
Id | |
---|---|
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;
執行結果:
相關文章
- Datawhale-MySQL-任務二MySql
- Datawhale-MySQL-任務三MySql
- Datawhale-MySQL-任務五MySql
- Datawhale-MySQL-任務六(複雜專案)MySql
- 任務四
- 前端學習任務四前端
- 實驗任務四:登入介面、實驗任務五:猜數字
- 第四項任務——測試計劃
- MySQL之表聯結MySql
- 任務打卡系統總結
- 第八項任務——總結
- 任務佇列,巨集任務與微任務佇列
- swoole學習手記(四)非同步任務task非同步
- 巨集任務和微任務
- 獲取任務的執行結果
- 任務排程的思考和總結
- linux基礎(四)——任務排程cron和anacronLinux
- JavaScript巨集任務和微任務JavaScript
- 任務
- Excel聯手PrintFolder 建立連結表Excel
- 我的一個expdp/impdp任務總結
- Event Loop、 巨集任務和微任務OOP
- JavaScript的巨集任務與微任務JavaScript
- 技術管理之路四、任務管理:如何跟蹤執行?
- 四大元件之 Activity_任務和返回棧元件
- SpringBoot與非同步任務、定時任務、郵件任務Spring Boot非同步
- 總結:JavaScript非同步、事件迴圈與訊息佇列、微任務與巨集任務JavaScript非同步事件佇列
- 微任務、巨集任務與Event-LoopOOP
- js中的巨集任務和微任務JS
- 任務系統之Jenkins子任務Jenkins
- macrotask 巨集任務 + microtask 微任務區別Mac
- Android任務和返回棧簡單總結Android
- 任務池
- 任務05
- crontab任務
- 近日任務
- 任務。1
- 任務1