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