LeetCode第183題_從不訂購的客戶

LeetCode 第183題:從不訂購的客戶

題目描述

表: Customers

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| name        | varchar |
+-------------+---------+
id 是該表的主鍵。
該表包含消費者的 id 和名字。

表: Orders

+-------------+------+
| Column Name | Type |
+-------------+------+
| id          | int  |
| customerId  | int  |
+-------------+------+
id 是該表的主鍵。
customerId 是 Customers 表中 id 的外鍵。
該表包含購買了產品的消費者的 id 。

編寫一個 SQL 查詢,報告從不訂購任何東西的所有客戶的名字。

返回結果表以任意順序排列。

難度

簡單

題目鏈接

點擊在LeetCode中查看題目

示例

示例:

輸入:
Customers 表:
+----+-------+
| id | name  |
+----+-------+
| 1  | Joe   |
| 2  | Henry |
| 3  | Sam   |
| 4  | Max   |
+----+-------+
Orders 表:
+----+------------+
| id | customerId |
+----+------------+
| 1  | 3          |
| 2  | 1          |
+----+------------+
輸出:
+-----------+
| Customers |
+-----------+
| Henry     |
| Max       |
+-----------+

提示

  • Customers 表中的 id 是該表的主鍵。
  • Orders 表中的 id 是該表的主鍵。
  • Orders 表中的 customerId 是 Customers 表中 id 的外鍵。

解題思路

方法一:使用左連接(LEFT JOIN)和 IS NULL

解決這道題的關鍵是找出那些在 Customers 表中出現但在 Orders 表中沒有訂單的客戶。這可以通過左連接和 IS NULL 條件來實現。

關鍵點:

  1. 使用 LEFT JOIN 將 Customers 表與 Orders 表連接
  2. 篩選出 Orders.customerId 為 NULL 的記錄,這表示該客戶沒有訂單
  3. 選擇客戶的名字作為結果輸出

時間復雜度:O(n+m),其中 n 和 m 分別是 Customers 表和 Orders 表的行數
空間復雜度:O(n)

方法二:使用 NOT IN 子查詢

另一種解決方法是使用 NOT IN 子查詢,找出那些 id 不在 Orders 表的 customerId 列中的客戶。

關鍵點:

  1. 使用子查詢獲取所有下過訂單的客戶 id
  2. 使用 NOT IN 篩選出不在這個集合中的客戶
  3. 選擇客戶的名字作為結果輸出

時間復雜度:O(n*m),其中 n 和 m 分別是 Customers 表和 Orders 表的行數
空間復雜度:O(m)

方法三:使用 NOT EXISTS 子查詢

也可以使用 NOT EXISTS 子查詢,檢查是否存在與客戶 ID 匹配的訂單。

關鍵點:

  1. 使用相關子查詢檢查每個客戶是否有訂單
  2. 使用 NOT EXISTS 篩選出沒有訂單的客戶
  3. 選擇客戶的名字作為結果輸出

時間復雜度:O(n*m),其中 n 和 m 分別是 Customers 表和 Orders 表的行數
空間復雜度:O(1)

代碼實現

SQL 實現(方法一:LEFT JOIN 和 IS NULL)

SELECT c.name AS Customers
FROM Customers c
LEFT JOIN Orders o ON c.id = o.customerId
WHERE o.id IS NULL;

SQL 實現(方法二:NOT IN 子查詢)

SELECT name AS Customers
FROM Customers
WHERE id NOT IN (SELECT customerIdFROM Orders
);

SQL 實現(方法三:NOT EXISTS 子查詢)

SELECT name AS Customers
FROM Customers c
WHERE NOT EXISTS (SELECT 1FROM Orders oWHERE o.customerId = c.id
);

性能分析

各SQL實現的性能對比:

實現方法執行用時內存消耗特點
方法一389 ms0B使用LEFT JOIN,代碼簡潔清晰
方法二432 ms0B使用NOT IN,直觀但性能較差
方法三394 ms0B使用NOT EXISTS,性能適中

補充說明

代碼亮點

  1. 方法一使用 LEFT JOIN 和 IS NULL,是解決此類問題的標準方法
  2. 方法二和方法三使用子查詢,思路直觀
  3. 所有方法都考慮了正確的結果輸出格式

方法比較

不同方法各有優缺點:

LEFT JOIN

  • 通常執行效率較高,特別是對于索引優化的表
  • 代碼簡潔,語義明確
  • 適用于需要顯示額外信息的場景

NOT IN

  • 語法簡單,易于理解
  • 在某些情況下性能可能較差,特別是當子查詢結果較大時
  • 需要注意 NULL 值的處理

NOT EXISTS

  • 通常比 NOT IN 性能更好,尤其是對大型表
  • 不受 NULL 值影響
  • 在某些數據庫中執行計劃可能更優化

對于本題,LEFT JOIN 方法通常是更好的選擇,因為它既清晰又高效。

常見錯誤

  1. 在方法一中,連接條件寫錯,導致匹配錯誤
  2. 在方法二中,沒有處理 NULL 值的情況(雖然本題數據不包含 NULL)
  3. 篩選條件使用錯誤,如使用 o.id = NULL 而不是 o.id IS NULL
  4. 結果列名格式不符合要求

相關題目

  • 175. 組合兩個表
  • 181. 超過經理收入的員工
  • 182. 查找重復的電子郵箱
  • 197. 上升的溫度

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79137.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79137.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79137.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c語言的常用關鍵字

c語言的常用關鍵字 c語言的關鍵字表示數據類型的關鍵字autocharfloatdoubleintlongshortvoidsignedstruct、enum、unionunsigned 表示分支語句的關鍵字ifelseswitchbreakcasecontinuedefault 表示循環語句的關鍵字whiledoforgoto 用于修飾變量或函數的關鍵字constconst修飾變量…

MCU通用輸入輸出端口(GPIO)設計指南

在嵌入式系統開發中,MCU的GPIO接口是一個基礎但非常實用的功能模塊。GPIO全稱是通用輸入輸出端口,它讓MCU可以靈活地與外部設備進行交互。 GPIO的主要特點包括: 多功能性:每個引腳都可以單獨配置為輸入或輸出 可編程性&#xff…

STM32完整內存地址空間分配詳解

在STM32這類基于ARM Cortex-M的32位微控制器中,整個4GB的地址空間(從0x00000000到0xFFFFFFFF)有著非常系統化的分配方案,每個區域都有其特定的用途。下面我將詳細介紹這些地址區域的分配及其功能: STM32完整內存地址空間分配詳解(0x00000000…

實現水平垂直居中的多種方法

在前端開發中,元素的居中是一個常見但又經常讓人頭疼的問題。本文將全面總結各種CSS居中方法,特別是如何實現一個div的水平垂直居中。 為什么居中這么重要? 居中布局是現代網頁設計中最基礎也最重要的布局方式之一。無論是導航菜單、登錄框…

如何實現服務的自動擴縮容(Auto Scaling)

在云計算和分布式系統的時代,系統的彈性和適應性已成為企業構建高效IT基礎設施的核心需求。自動擴縮容(Auto Scaling)作為一種關鍵技術,旨在根據實時負載變化動態調整計算資源,以確保系統性能穩定,同時優化資源利用效率。簡單來說,自動擴縮容是指系統能夠根據預設規則或…

uniapp+vue3+ts 使用canvas實現安卓端、ios端及微信小程序端二維碼生成及下載

加粗樣式uniapp多端生成帶二維碼海報并保存至相冊的實現 在微信小程序開發中,我們常常會遇到生成帶有二維碼的海報并保存到手機相冊的需求,比如分享活動海報、產品宣傳海報等。今天就來和大家分享一下如何通過代碼實現這一功能。 準備工作 在開始之前&am…

架構師面試(三十八):注冊中心架構模式

題目 在微服務系統中,當服務達到一定數量時,通常需要引入【注冊中心】組件,以方便服務發現。 大家有沒有思考過,注冊中心存在的最根本的原因是什么呢?注冊中心在企業中的最佳實踐是怎樣的?注冊中心的服務…

Day.js和Moment.js對比,日期時間庫怎么選?

在JavaScript的日期處理庫中,Moment.js 和 Day.js 是兩個非常流行的選擇。本文將基于從npmtrends的數據,對這兩個庫進行詳細的對比分析。 Moment.js的重度使用者。凡是遇到時間和日期的操作,就把Moment.js引用上。 直到有天我發現加載的mome…

羅默如何用木星衛星“宇宙鐘表”測量光速?

一、17世紀的“宇宙級實驗” 1676年,丹麥天文學家奧勒羅默(Ole Rmer)在巴黎天文臺做出驚人發現: 木星衛星的“遲到早退”現象,竟能揭示光速的秘密! 通過觀察木衛一(Io)的軌道周期變…

deepseek 技巧整理

1、導出word 和excel 功能,在使用以下提示詞。 請幫我列出減肥期間可以吃的水果,并分析該水果含有的營養元素,以表格的形式星現。1.要以html的方式輸出 2.要可以直接運行 3.頁面要提供可以直接下載word和excel功能

思考軟件框架

數據庫是達夢數據庫 假定里面有40張表,軟件的業務邏輯比較復雜。 當然,依然是對數據庫中數據的增,刪,改,查,組合,顯示。 但是也涉及到多種軟件,多臺設備之間的通信。 我們可以使用…

探索 Disruptor:高性能并發框架的奧秘

在當今的軟件開發領域,處理高并發場景是一項極具挑戰性的任務。傳統的并發解決方案,如基于鎖的隊列,往往在高負載下表現出性能瓶頸。而 Disruptor 作為一個高性能的并發框架,憑借其獨特的設計和先進的技術,在處理海量數…

前端面經-VUE3篇--vue3基礎知識(一)插值表達式、ref、reactive

一、計算屬性(computed) 計算屬性(Computed Properties)是 Vue 中一種特殊的響應式數據,它能基于已有的響應式數據動態計算出新的數據。 計算屬性有以下特性: 自動緩存:只有當它依賴的響應式數據發生變化時&#xff…

數據結構6 · BinaryTree二叉樹模板

代碼函數功能順序如下: 1:destroy:遞歸刪除樹 2:copy:復制二叉樹 3:preOrder:遞歸前序遍歷 4:inOrder:遞歸中序遍歷 5:postOrder:遞歸后續遍…

C++/SDL進階游戲開發 —— 雙人塔防游戲(代號:村莊保衛戰 13)

🎁個人主頁:工藤新一 🔍系列專欄:C面向對象(類和對象篇) 🌟心中的天空之城,終會照亮我前方的路 🎉歡迎大家點贊👍評論📝收藏?文章 文章目錄 十…

強化學習之基于無模型的算法之時序差分法

2、時序差分法(TD) 核心思想 TD 方法通過 引導值估計來學習最優策略。它利用當前的估計值和下一個時間步的信息來更新價值函數, 這種方法被稱為“引導”(bootstrapping)。而不需要像蒙特卡羅方法那樣等待一個完整的 episode 結束才進行更新&…

AE/PR模板 100個現代文字標題動態排版效果動畫 Motion Titles

Motion Titles是一個令人驚艷的AE/PR模板,提供了100個現代文字標題的動態排版效果動畫。這些動畫效果能夠為你的項目增添視覺沖擊力和專業感,為文字標題注入活力和動感。該模板適用于Adobe After Effects CC或更高版本以及Adobe Premiere Pro 2020或更高…

【AI提示詞】二八法則專家

提示說明 精通二八法則(帕累托法則)的廣泛應用,擅長將其應用于商業、管理、個人發展等領域,深入理解其在不同場景中的具體表現和實際意義。 提示詞 # Role: 二八法則專家## Profile - language: 中文 - description: 精通二八法…

前端八股 CSS 1

盒子模型 進行布局時將所有元素表示為一個個盒子box padding margin border content content:盒子內容 待顯示的文本和圖像 padding:內邊距,內容和border之間的空間,不能為負數,受bkc影響 border:邊框&#xff0c…

組件通信-$attrs

概述:$attrs用于實現當前組件的父組件,向當前組件的子組件通信(爺→孫)。 具體說明:$attrs是一個對象,包含所有父組件傳入的標簽屬性。 注意:$attrs會自動排除props中聲明的屬性(可以認為聲明過…