網(wǎng)站開發(fā)看書湖北網(wǎng)站seo
?🎉歡迎您來到我的MySQL基礎復習專欄
☆* o(≧▽≦)o *☆哈嘍~我是小小惡斯法克🍹
?博客主頁:小小惡斯法克的博客
🎈該系列文章專欄:力扣刷題講解-MySQL
🍹文章作者技術和水平很有限,如果文中出現(xiàn)錯誤,希望大家能指正🙏
📜 感謝大家的關注!???
?
目錄
🚀組合兩個表
?🚀總結:關于on
?🚀超過經(jīng)理收入的員工
🚀組合兩個表
表:?
Person
+-------------+---------+ | 列名 | 類型 | +-------------+---------+ | PersonId | int | | FirstName | varchar | | LastName | varchar | +-------------+---------+ personId 是該表的主鍵(具有唯一值的列)。 該表包含一些人的 ID 和他們的姓和名的信息。
表:?
Address
+-------------+---------+ | 列名 | 類型 | +-------------+---------+ | AddressId | int | | PersonId | int | | City | varchar | | State | varchar | +-------------+---------+ addressId 是該表的主鍵(具有唯一值的列)。 該表的每一行都包含一個 ID = PersonId 的人的城市和州的信息。
編寫解決方案,報告?Person
?表中每個人的姓、名、城市和州。如果?personId
?的地址不在?Address
?表中,則報告為?null
?。
以?任意順序?返回結果表。
結果格式如下所示。
示例 1:
輸入:
Person表:
+----------+----------+-----------+
| personId | lastName | firstName |
+----------+----------+-----------+
| 1 | Wang | Allen |
| 2 | Alice | Bob |
+----------+----------+-----------+
Address表:
+-----------+----------+---------------+------------+
| addressId | personId | city | state |
+-----------+----------+---------------+------------+
| 1 | 2 | New York City | New York |
| 2 | 3 | Leetcode | California |
+-----------+----------+---------------+------------+
輸出:
+-----------+----------+---------------+----------+
| firstName | lastName | city | state |
+-----------+----------+---------------+----------+
| Allen | Wang | Null | Null |
| Bob | Alice | New York City | New York |
+-----------+----------+---------------+----------+
解釋:
地址表中沒有 personId = 1 的地址,所以它們的城市和州返回 null。
addressId = 1 包含了 personId = 2 的地址信息。
思路:
1.觀察到問題中有一個關鍵:如果?
personId
?的地址不在?Address
?表中,則報告為?null
?。2.很顯然,通過這句話無論 person 是否有地址信息都要返回信息,那么返回null,其實就是因為沒有對應的城市和州
3.既然都要返回人的PersonId ,FirstName, LastName,要左表的全部信息,所以使用左查詢
4.讓person作左表,Address 作右表
5.我們分析出這一步還不算完成,我們還要知道左外連接on的具體知識,請看下面
6..很明顯,在person
表中,
personId是它的主鍵,Address表中addressId對應了personId7..那么我們的on后面的條件肯定是從personld這個字段來建立關系,關系就是p.PersonId = a.PersonId,由此可以返回出address表中的數(shù)據(jù)
8.select * from?Person as p left join Address as a?on 條件
9.把*優(yōu)化一下
10.代碼如下
select FirstName, LastName, City, State
from Person as p
left join Address as a
on p.PersonId = a.PersonId
執(zhí)行:?
?
注意:如果沒有某個人的地址信息,使用?
where
?子句過濾記錄將失敗,因為它不會顯示姓名信息。?
?🚀總結:關于on
在 MySQL 中,多表查詢中的左外連接(LEFT JOIN)是一種用于連接兩個表的查詢操作,它會返回左表中的所有記錄,以及符合連接條件的右表記錄。在左外連接中,ON 后面連接的條件具體是指定兩個表之間的連接條件,它決定了在連接時哪些行應該被匹配。
具體來說,ON 后面的條件通常是用來指定連接兩個表的列之間的關聯(lián)關系。這些條件可以是等值比較(例如,table1.column1 = table2.column2),也可以是其他類型的比較操作(例如,大于、小于、包含等)。這些條件決定了在連接時哪些行應該被匹配起來。
ON 的作用是在進行表連接時指定連接條件,它告訴數(shù)據(jù)庫引擎在進行左外連接時應該如何匹配兩個表的行。通過指定連接條件,可以確保在連接時只有符合條件的行會被匹配起來,從而實現(xiàn)多表查詢的目的。
舉個例子,假設我們有兩個表 A 和 B,我們想要以 A 表的所有記錄為基礎,同時將符合某些條件的 B 表記錄連接起來。在這種情況下,我們可以使用左外連接來實現(xiàn)這一目的。ON 后面的條件將決定 A 表和 B 表之間的連接條件,只有滿足條件的記錄才會被連接起來。
?🚀超過經(jīng)理收入的員工
表:
Employee
?+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | name | varchar | | salary | int | | managerId | int | +-------------+---------+ id 是該表的主鍵(具有唯一值的列)。 該表的每一行都表示雇員的ID、姓名、工資和經(jīng)理的ID。
編寫解決方案,找出收入比經(jīng)理高的員工。
以?任意順序?返回結果表。
結果格式如下所示。
示例 1:
輸入:
Employee 表:
+----+-------+--------+-----------+
| id | name | salary | managerId |
+----+-------+--------+-----------+
| 1 | Joe | 70000 | 3 |
| 2 | Henry | 80000 | 4 |
| 3 | Sam | 60000 | Null |
| 4 | Max | 90000 | Null |
+----+-------+--------+-----------+
輸出:
+----------+
| Employee |
+----------+
| Joe |
+----------+
解釋: Joe 是唯一掙得比經(jīng)理多的雇員。
思路:
方法一
1.在這里面只有一張表,表中有一個很大的缺陷就是并沒有去記錄員工的直屬領導是誰,只有一個字段managerId
2.這個managerId指的就是領導的id,所以managerId指代的就是當前表的主鍵,員工id
3.那么我們可以先找出員工對應的領導,如遇到這種類型的題,只有一個表,那必然是用到自連接的
4.提到自連接,就自然聯(lián)想到了一句話,自連接查詢中,必須要為表起別名,很簡單的邏輯,自連接其實就是把這題想成兩個表,一個員工表,一個領導表,只是說兩個表長的一樣而已,所以名字肯定是要不同,那么我們假設員工表是a,領導表是b
5.那么我們的員工對應的領導的連接條件是什么呢?
6.員工的managerId? = 領導的id
7.來實現(xiàn)一下這個過程(自連接的語法)
8.select * from?Employee a join?Employee b on?b.id = a.managerId
9.但我們的目的并不是找員工對應的領導,我們還有一個條件,要員工工資大于領導工資,也就是a.salary > b.salary
10.我們又想起,連接兩個條件的關鍵字是什么?and
11.此時select * from?Employee a join?Employee b on?b.id = a.managerId and?a.salary > b.salary
12.此時優(yōu)化一下 *?
select a.name as Employee from Employee as ajoin Employee as bon a.managerId =b.id and a.salary>b.salary ;
執(zhí)行:?
?
方法二:
1.嵌套查詢,直接抓著工資硬剛
2.Employee表還是取一個別名a 作為員工表
3.select name as Employee from?Employee as a where salary >? 經(jīng)理的薪資
4.也就是select name as Employee from?Employee as a where salary > (select salary from Employee where Id = a.Managerid )
5.大于號后面的條件就理解為,查取員工對應的領導的薪資
6.整體理解為員工的薪資 大于 員工對應的領導的薪資,則查詢出來了
select name as Employee from?Employee as a where salary > (select salary from Employee where Id = a.Managerid ) ;
寫到這里,每日兩題的力扣就結束了,但是對于第二題來說,我個人認為肯定是自連接的方式讓大家更為接受!