日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

【LeetCode-SQL每日一题】——183. 从不订购的客户

發布時間:2023/12/10 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode-SQL每日一题】——183. 从不订购的客户 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

🎈寫在前面

? 🙋?♂?大家好呀,我是超夢。小伙伴們都知道,不管是在學習中還是日常工作中,幾乎天天是要跟數據庫打交道的,為了更好的操作數據庫,我們的SQL知識儲備是必不可少的。想要掌握好SQL,那少不了每天的練習與學習。接下來小夢會帶領小伙伴們一起每天刷一道LeetCode-數據庫(SQL)相關的題目,然后在文章后例舉相關知識點幫助小伙伴們學習與鞏固,更好的掌握SQL。

?????? 🙋?♂? 小伙伴們如果在學習過程中有不明白的地方,歡迎評論區留言提問,小夢定知無不言,言無不盡。


目錄

📕SQL題目概述

📕解題思路

📒方法一

📒方法二

📕代碼測試

📒方法一

📒方法二

📕知識點小結


📕SQL題目概述

Customers 表:

+----+-------+ | Id | Name | +----+-------+ | 1 | Joe | | 2 | Henry | | 3 | Sam | | 4 | Max | +----+-------+

Orders 表:

+----+------------+ | Id | CustomerId | +----+------------+ | 1 | 3 | | 2 | 1 | +----+------------+

某網站包含兩個表Customers 表Orders 表。編寫一個 SQL 查詢,找出所有從不訂購任何東西的客戶

例如給定上述表格,你的查詢應返回:

+-----------+ | Customers | +-----------+ | Henry | | Max | +-----------+

LeetCode原題鏈接~ 點擊進入https://leetcode-cn.com/problems/customers-who-never-order/

📕解題思路

根據題目,我們先看題目要求我們查什么,要查出從不訂購任何東西的顧客。根據這一點我們可以從Orders 訂單表中得知CustomerId為1和3的是訂購過東西的顧客,而2和4則沒有訂購過任何東西。再從Customers 顧客表中查id2與id4對應的顧客名字就查到了。

📒方法一

1. 根據解題思路,我們可以先寫一個子查詢查出Orders訂單表中對應的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表的數據為NULL的數據,就是從來沒有買過東西的顧客。

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);

執行代碼,測試

測試成功!

📒方法二

SQL代碼

select c.name as Customers from Customers c left join Orders o on c.id = o.CustomerId where o.id is null;

執行代碼,測試

測試成功


📕知識點小結

外連接分為三種:左外連接(left join),右外連接(right join),全外連接(full join)。這里我們省略了outer 這個關鍵字。

外連接的一個重要特點:至少有一方保留全集,沒有匹配行用NULL代替。

下面小夢把這三種外連接簡單說一下:

??? 1. LEFT OUTER JOIN,簡稱LEFT JOIN,左外連接(左連接)

????? 結果集保留左表的所有行,但右表只包含與左表匹配的行。右表相應的空行為NULL值。

SELECT * FROM 表1 LEFT JOIN 表2 ON 表1.xx = 表2.xx

??? 2. RIGHT OUTER JOIN,簡稱RIGHT JOIN,右外連接 (右連接)

?????? 結果集保留右表的所有行,但左表只包含與右表匹配的行。左表相應的空行為NULL值。

SELECT * FROM 表1 RIGHT JOIN 表2 ON 表1.xx = 表2.xx

??? 3. FULL OUTER JOIN,簡稱FULL JOIN,全外連接

?????? 會把兩個表所有的行都顯示在結果表中。

SELECT * FROM 表1 FULL JOIN 表2 ON 表1.xx = 表2.xx

?內連接與外連接

?表1 classa?????????????

?????????

表2 classb

1. 內連接 inner join (join 默認就是內連接)

表1與表2的交集,用上面兩個表演示一下

select classa.id as aid,classb.id as bid from classa inner join classb on classa.id = classb.id;

?查詢的結果是classa與classb的交集

?2. 左外連接 left join

結果集保留左表的所有行,但右表只包含與左表匹配的行。右表相應的空行為NULL值。

select classa.id as aid,classb.id as bid from classa left join classb on classa.id = classb.id;

?3. 右外連接 right join

結果集保留右表的所有行,但左表只包含與右表匹配的行。左表相應的空行為NULL值。

select classa.id as aid,classb.id as bid from classa right join classb on classa.id = classb.id;

4. 全外連接 full join

會把兩個表所有的行都顯示在結果表中。

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!!!

重要的事情要說三遍!!!那怎么實現和full join一樣的效果呢?那就要通過使用union來實現,具體實現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;


?😀感謝小伙伴們支持,如果有什么疑問,歡迎留言詢問,小夢定知無不言,言無不盡!

總結

以上是生活随笔為你收集整理的【LeetCode-SQL每日一题】——183. 从不订购的客户的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。