【LeetCode-SQL每日一题】——183. 从不订购的客户
🎈寫在前面
? 🙋?♂?大家好呀,我是超夢。小伙伴們都知道,不管是在學習中還是日常工作中,幾乎天天是要跟數(shù)據(jù)庫打交道的,為了更好的操作數(shù)據(jù)庫,我們的SQL知識儲備是必不可少的。想要掌握好SQL,那少不了每天的練習與學習。接下來小夢會帶領(lǐng)小伙伴們一起每天刷一道LeetCode-數(shù)據(jù)庫(SQL)相關(guān)的題目,然后在文章后例舉相關(guān)知識點幫助小伙伴們學習與鞏固,更好的掌握SQL。
?????? 🙋?♂? 小伙伴們?nèi)绻趯W習過程中有不明白的地方,歡迎評論區(qū)留言提問,小夢定知無不言,言無不盡。
目錄
📕SQL題目概述
📕解題思路
📒方法一
📒方法二
📕代碼測試
📒方法一
📒方法二
📕知識點小結(jié)
📕SQL題目概述
Customers 表:
+----+-------+ | Id | Name | +----+-------+ | 1 | Joe | | 2 | Henry | | 3 | Sam | | 4 | Max | +----+-------+Orders 表:
+----+------------+ | Id | CustomerId | +----+------------+ | 1 | 3 | | 2 | 1 | +----+------------+某網(wǎng)站包含兩個表,Customers 表和 Orders 表。編寫一個 SQL 查詢,找出所有從不訂購任何東西的客戶。
例如給定上述表格,你的查詢應(yīng)返回:
+-----------+ | Customers | +-----------+ | Henry | | Max | +-----------+LeetCode原題鏈接~ 點擊進入https://leetcode-cn.com/problems/customers-who-never-order/
📕解題思路
根據(jù)題目,我們先看題目要求我們查什么,要查出從不訂購任何東西的顧客。根據(jù)這一點我們可以從Orders 訂單表中得知CustomerId為1和3的是訂購過東西的顧客,而2和4則沒有訂購過任何東西。再從Customers 顧客表中查id2與id4對應(yīng)的顧客名字就查到了。
📒方法一
1. 根據(jù)解題思路,我們可以先寫一個子查詢查出Orders訂單表中對應(yīng)的CustomerId顧客Id
select customerid from orders;2. 查出顧客Id后,我們就知道誰買過東西誰從來不買東西。我們再通過NOT IN子句給顧客Id做限制,查Customers表中顧客Id不在Orders表中的就是題目所要求的。
select customers.name as 'Customers' from customers where customers.id not in (select customerid from orders);LeetCode原題解析https://leetcode-cn.com/problems/customers-who-never-order/solution/cong-bu-ding-gou-de-ke-hu-by-leetcode/
📒方法二
我們通過左外鏈接,把Customers 表與Orders 表鏈接起來,我們只需要查鏈接后Orders表的數(shù)據(jù)為NULL的數(shù)據(jù),就是從來沒有買過東西的顧客。
select c.name as Customers from Customers c left join Orders o on c.id = o.CustomerId where o.id is null;📕代碼測試
📒方法一
SQL代碼
select customers.name as 'Customers' from customers where customers.id not in (select customerid from orders);執(zhí)行代碼,測試
測試成功!
📒方法二
SQL代碼
select c.name as Customers from Customers c left join Orders o on c.id = o.CustomerId where o.id is null;執(zhí)行代碼,測試
測試成功
📕知識點小結(jié)
外連接分為三種:左外連接(left join),右外連接(right join),全外連接(full join)。這里我們省略了outer 這個關(guān)鍵字。
外連接的一個重要特點:至少有一方保留全集,沒有匹配行用NULL代替。
下面小夢把這三種外連接簡單說一下:
??? 1. LEFT OUTER JOIN,簡稱LEFT JOIN,左外連接(左連接)
????? 結(jié)果集保留左表的所有行,但右表只包含與左表匹配的行。右表相應(yīng)的空行為NULL值。
SELECT * FROM 表1 LEFT JOIN 表2 ON 表1.xx = 表2.xx??? 2. RIGHT OUTER JOIN,簡稱RIGHT JOIN,右外連接 (右連接)
?????? 結(jié)果集保留右表的所有行,但左表只包含與右表匹配的行。左表相應(yīng)的空行為NULL值。
SELECT * FROM 表1 RIGHT JOIN 表2 ON 表1.xx = 表2.xx??? 3. FULL OUTER JOIN,簡稱FULL JOIN,全外連接
?????? 會把兩個表所有的行都顯示在結(jié)果表中。
SELECT * FROM 表1 FULL JOIN 表2 ON 表1.xx = 表2.xx?內(nèi)連接與外連接
?表1 classa?????????????
?????????
表2 classb
1. 內(nèi)連接 inner join (join 默認就是內(nèi)連接)
表1與表2的交集,用上面兩個表演示一下
select classa.id as aid,classb.id as bid from classa inner join classb on classa.id = classb.id;?查詢的結(jié)果是classa與classb的交集
?2. 左外連接 left join
結(jié)果集保留左表的所有行,但右表只包含與左表匹配的行。右表相應(yīng)的空行為NULL值。
select classa.id as aid,classb.id as bid from classa left join classb on classa.id = classb.id;?3. 右外連接 right join
結(jié)果集保留右表的所有行,但左表只包含與右表匹配的行。左表相應(yīng)的空行為NULL值。
select classa.id as aid,classb.id as bid from classa right join classb on classa.id = classb.id;4. 全外連接 full join
會把兩個表所有的行都顯示在結(jié)果表中。
select classa.id as aid,classb.id as bid from classa full join classb on classa.id = classb.id;小伙伴們注意啦!!!
MySQL不支持full join!!!MySQL不支持full join!!!MySQL不支持full join!!!
重要的事情要說三遍!!!那怎么實現(xiàn)和full join一樣的效果呢?那就要通過使用union來實現(xiàn),具體實現(xiàn)SQL語句如下
select classa.id as aid,classb.id as bid from classa left join classb on classa.id = classb.id union select classa.id as aid,classb.id as bid from classa right join classb on classa.id = classb.id;?😀感謝小伙伴們支持,如果有什么疑問,歡迎留言詢問,小夢定知無不言,言無不盡!
總結(jié)
以上是生活随笔為你收集整理的【LeetCode-SQL每日一题】——183. 从不订购的客户的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HQL写topN、Spark写topN
- 下一篇: 比5G网络快100倍!专家称2030年左