SQL面試基礎與中級問題
咱們進入正題吧。
我建立了一個 Awesome SQL Interview GitHub 儲存庫來準備面試問題和練習 SQL 查詢。我將 SQL 查詢分為三個部分:基礎 (L0)、中級 (L1) 和高階 (L2)。這是基本部分的解決方案。
這是 L1(中級)SQL 查詢練習,請先參考 L0 以獲得更好的練習。
注意:這些範例是在 MySQL 中測試的。對於 MS-SQL 或 Oracle 等其他資料庫,語法可能會有所不同。
L1:中級 SQL
- 涉及使用多個表格、使用 JOIN、GROUP BY、HAVING 和複雜 WHERE 條件的查詢。
- 子查詢、聚合函數和 case 語句簡介。
問題:
- 寫一個查詢來檢索「美國」和「法國」客戶的客戶名稱和城市。
- 如何取得在「舊金山」辦公室工作的所有員工的員工編號、姓氏和辦公室代碼?
- 寫一個查詢,使用訂單和客戶表找出每個客戶的訂單總數。
- 如何擷取已訂購超過 10 次的產品的 ProductName、QuantityInStock 和 buyPrice?
- 寫一個查詢來取得 customerNumber 為 103 的客戶所下訂單的 orderNumber、狀態和 customerName。
- 寫一個查詢來找出 orderdetails 表中每個訂單的總銷售額 (quantityOrdered * PriceEach)。
- 如何找到 orderdetails 表中每個 orderNumber 的平均訂購數量?
- 寫查詢,列出 orderdetails 表中總收入最高的產品線 (quantityOrdered * PriceEach)。
- 編寫一個查詢,透過連接員工表和辦公室表來顯示員工編號、名字、姓氏以及員工工作的辦公室名稱。
- 如何找到從未下過訂單的顧客?
- 編寫一個查詢來檢索 customerName 和每個客戶下的訂單總數(包括未下訂單的客戶)。
- 寫一個查詢來找出訂購產品數量大於 50 的所有訂單的產品名稱和訂購數量。
- 檢索已下訂單的客戶被分配為銷售代表的員工的員工編號、名字和訂單編號。
- 寫一個查詢,根據 buyPrice 計算 products 表中產品的平均價格。
- 如何取得產品表中前 3 個最昂貴的產品?
- 編寫一個查詢來檢索所有狀態為「已出貨」的訂單的 customerName、orderNumber 和 orderDate。
- 如何顯示每個產品線銷售的產品總數?
- 寫一個查詢來找出直接向員工編號 = 1143 的員工報告的員工。
- 寫一個查詢來計算訂單表中的訂單總數(按狀態分組)。
- 列出員工及其經理的姓名。
我也會提到錯誤的事情,知道什麼該做很重要,但也很重要什麼不該做,以及我們在哪裡犯了錯誤。讓我們再進入正題吧...
需要說明的解決方案
-
檢索「美國」和「法國」客戶的客戶名稱和城市的查詢。
- 或->如果條件很多,速度會稍微慢一些,因為查詢會逐一檢查每個條件。
- 在->資料庫引擎在內部進行了稍微優化,特別是對於長列表。
- 兩者都適合 2-3 種情況。對於可讀性和可擴展性而言,IN 更好,尤其是在處理較大的值列表時。
- IS 用於檢查 IS NULL 或 IS NOT NULL 等條件,而不用於字串比較。
取得所有在「舊金山」辦公室工作的員工的員工編號、姓氏和辦公室代碼。
-
使用訂單和客戶表查詢找出每位客戶的訂單總數。
- 在查詢中使用聚合函數時,請務必在 GROUP BY 子句中包含非聚合列。
- 這確保 SQL 知道如何對行進行分組並避免在選擇其他列時出現歧義。
- 在我們的範例中:customerNumber 和 customerName 必須都在 GROUP BY 子句中,因為我們將它們與 COUNT(*) 一起選擇。
?黃金法則:
SELECT 清單中的每一列都必須:
位於 GROUP BY 子句中,或
使用聚合函數,如 COUNT()、SUM() 等 -
檢索已訂購超過10次的產品的產品名稱、庫存數量和購買價格?
- 這個查詢對於中小型資料庫來說是高效的,對於大型資料庫我們可以使用索引,並使用WHERE子句減少掃描數據,而不是僅僅依賴HAVING子句
-
取得 customerNumber 為 103 的客戶所下的訂單的 orderNumber、狀態和 customerName。
說明:
- 使用的表:
- 訂單:包含訂單號碼和狀態。
- customers:包含 customerName。
- 內連接:
- 使用 customerNumber 欄位(公用鍵)組合訂單和客戶表。
- WHERE 子句:
- 過濾資料以僅包含 customerNumber = 103 的記錄。
- 選擇的欄位:
- o.orderNumber:訂單號碼。
- o.status:訂單狀態。
- c.customerName:下訂單的客戶姓名。
- 使用的表:
在 orderdetails 表中找出每筆訂單的總銷售額(訂購數量 * 每個價格)。
-
在 orderdetails 表中找出每個 orderNumber 的平均訂購數量。
- 說明:
- 訂單號碼:
- 以 orderNumber 分組分組。
- AVG(訂購數量):
- 計算屬於同一 orderNumber 的所有行的平均訂購數量。
- 分組依據:
- 確保分別計算每個 orderNumber 的平均值。
-
查詢列出 orderdetails 表中總收入最高的產品線 (quantityOrdered * PriceEach)。
- 說明:
- 產品線:
- 將產品分類為不同的系列,例如「摩托車」或「飛機」。
- SUM(od.quantityOrdered * od.priceEach):
- 計算每個產品線的總收入。
- 內連接:
- 加入productCode 上的產品和訂單詳細資料表,以將產品線與其訂單詳細資料相關聯。
- 依 p.productLine 分組:
- 依每個產品線將結果分組。
- 依總收入排序:
- 依所得降序將分組結果排序,因此所得最高的先出現。
- 限制 1:
- 將結果限制為僅收入最高的產品線。
-
透過連接employees表和offices表來查詢顯示employeeNumber、firstName、lastName以及員工工作的辦公室名稱。
- CONCAT(列,'分隔符號',列,'分隔符號',列)
- CONCAT_WS('分隔符號', 欄位)
-
尋找從未下過訂單的顧客
說明:
- LEFT JOIN: 從客戶表中檢索所有客戶,無論他們在訂單表中是否有匹配的行。
- o.orderNumber IS NULL: 標識沒有任何對應訂單的客戶(即 orderNumber 為 NULL,因為訂單表中沒有符合項目)。
-
專欄:
- 客戶編號: 客戶的唯一識別碼。
- customerName: 客戶姓名。
查詢取得每位客戶的客戶名稱和下單總數(包括未下單的客戶)。
找出訂購產品數量大於 50 的所有訂單的產品名稱和訂購數量。
-
檢索已下訂單的客戶被分配為銷售代表的員工的員工編號、名字和訂單編號。
說明:
-
來自員工 e:
- 我們從員工表(別名 e)開始,因為我們需要員工詳細信息,特別是員工編號和名字。
-
加入客戶 c ON e.employeeNumber = c.salesRepEmployeeNumber:
- 我們將來自員工的員工編號和來自客戶的 salesRepEmployeeNumber 加入客戶表(別名為 c)。這在員工(銷售代表)和客戶之間建立了關係。現在,我們可以確定為每位客戶分配了哪些員工。
-
JOIN 訂單 o ON c.customerNumber = o.customerNumber:
- 我們進一步使用 customerNumber 將訂單表(別名為 o)與客戶表連接。這為我們提供了每位客戶所下的訂單。
-
選擇 e.employeeNumber、e.firstName、o.orderNumber:
- 最後,我們從員工表(銷售代表)中選擇員工編號和名字,並從訂單表中為每個下訂單的客戶選擇訂單編號。
-
來自員工 e:
查詢根據buyPrice計算products表格中產品的平均價格。
取得產品表中前 3 個最昂貴的產品?
重新擷取狀態為「已出貨」的所有訂單的 customerName、orderNumber 和 orderDate。
顯示每個產品系列銷售的產品總數
尋找直接向員工編號 = 1143 的員工報告的員工。
查詢計算訂單表中的訂單總數,依狀態分組。
列出員工及其經理的姓名。
嘿,我的名字是Jaimin Baria,又名Cloud Boy...,如果您喜歡並學到了一些有用的東西,例如這篇文章,請添加評論,並訪問我的Awesome SQL Interview GitHub 存儲庫。
別忘了開始吧?
快樂編碼??
其他貼文
- SQL 實作:
- 第 1 部分
- L0:基本 SQL
- L1:中級 SQL
- L2:進階 SQL - 即將推出
- 第 1 部分
- 系統設計
- 資料庫中ACID事務的實作
- 系統設計中的 ACID 事務
?️ 讀者建議的修復
以上是SQL面試基礎與中級問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

MySQL在Web應用中的主要作用是存儲和管理數據。 1.MySQL高效處理用戶信息、產品目錄和交易記錄等數據。 2.通過SQL查詢,開發者能從數據庫提取信息生成動態內容。 3.MySQL基於客戶端-服務器模型工作,確保查詢速度可接受。

InnoDB使用redologs和undologs確保數據一致性和可靠性。 1.redologs記錄數據頁修改,確保崩潰恢復和事務持久性。 2.undologs記錄數據原始值,支持事務回滾和MVCC。

MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

MySQL在數據庫和編程中的地位非常重要,它是一個開源的關係型數據庫管理系統,廣泛應用於各種應用場景。 1)MySQL提供高效的數據存儲、組織和檢索功能,支持Web、移動和企業級系統。 2)它使用客戶端-服務器架構,支持多種存儲引擎和索引優化。 3)基本用法包括創建表和插入數據,高級用法涉及多表JOIN和復雜查詢。 4)常見問題如SQL語法錯誤和性能問題可以通過EXPLAIN命令和慢查詢日誌調試。 5)性能優化方法包括合理使用索引、優化查詢和使用緩存,最佳實踐包括使用事務和PreparedStatemen

選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。MySQL以其高性能、可扩展性和跨平台支持著称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

MySQL索引基数对查询性能有显著影响:1.高基数索引能更有效地缩小数据范围,提高查询效率;2.低基数索引可能导致全表扫描,降低查询性能;3.在联合索引中,应将高基数列放在前面以优化查询。
