MySQL - 子查詢:初學者指南

你好,未來的數據魔法師們!今天,我們將踏上一段令人興奮的旅程,進入MySQL子查詢的世界。別擔心如果你是編程新手——我將成為你友善的導遊,將複雜的概念拆解成容易消化的碎片。所以,來一杯咖啡(或者如果你喜歡,一杯茶),我們一起來深入探討吧!

MySQL - SubQuery

什麼是子查詢?

在我們開始之前,讓我們先了解一下子查詢是什麼。想像你正在計劃一個派對,並需要列出所有喜歡巧克力蛋糕的朋友。你首先列出所有朋友的名單,然後圈出那些喜歡巧克力蛋糕的人。在SQL術語中,主名單是你的主查詢,而圈出巧克力蛋糕愛好者的過程是你的子查詢。這是一個查詢中的查詢——很酷吧?

現在,讓我們探討一下如何在不同的MySQL語句中使用子查詢。

在SELECT語句中使用子查詢

SELECT語句就像是你數據庫的放大鏡。它幫助你找到並检索特定信息。當我們在SELECT中加入子查詢時,就像加入了第二個放大鏡來看得更仔細!

假設我們有兩個表:employeesdepartments。我們想要找到所有在'IT'部門工作的員工。

SELECT first_name, last_name
FROM employees
WHERE department_id = (
SELECT department_id
FROM departments
WHERE department_name = 'IT'
);

在這個例子中,子查詢 (SELECT department_id FROM departments WHERE department_name = 'IT') 首先運行。它找到IT部門的 department_id。然後,主查詢使用這個id來找到該部門的所有員工。

把它想像成這樣:你首先問,“IT部門的ID是多少?”然後使用這個答案來問,“誰在這個ID的部門工作?”

在INSERT語句中使用子查詢

現在,讓我們來談談在INSERT中使用子查詢。這就像從一個名單複製信息到另一個名單,但只有特定的部分。

想像我們有一個 top_performers 表,並且想要填滿那些銷售額超過100,000美元的員工。

INSERT INTO top_performers (employee_id, employee_name, sales)
SELECT employee_id, CONCAT(first_name, ' ', last_name), total_sales
FROM employees
WHERE total_sales > 100000;

在這裡,子查詢其實是整個SELECT語句。它找到所有銷售額超過100,000美元的員工,然後INSERT語句將他們加入到 top_performers 表中。

這就像說,“找到所有的銷售明星,把他們放到我們的VIP名單上!”

在比較運算符中使用子查詢

子查詢也可以與比較運算符如 >, <, = 等一起使用。這在你想將一個值與另一個查詢的結果進行比較時非常有用。

讓我們找到所有收入超過平均工資的員工:

SELECT first_name, last_name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);

子查詢 (SELECT AVG(salary) FROM employees) 計算平均工資。然後,主查詢將每個員工的工資與這個平均值進行比較。

這就像問,“我們公司誰是高收入者?”

在IN或NOT IN運算符中使用子查詢

IN和NOT IN運算符在你想檢查一個值是否與列表中的任何值匹配時非常有用。使用子查詢,這個列表可以動態生成!

讓我們找到所有也是經理的員工:

SELECT first_name, last_name
FROM employees
WHERE employee_id IN (
SELECT DISTINCT manager_id
FROM employees
WHERE manager_id IS NOT NULL
);

在這裡,子查詢創建了一個所有經理ID的列表。主查詢然後找到所有其ID在這個列表中的員工。

把它想像成問,“誰在經理名單上?”

在客戶端程序中使用子查詢

雖然我們大多數的例子都是直接在SQL中,你也可以在客戶端程序中使用子查詢。這在需要執行複雜操作或子查詢依賴於用戶輸入時特別有用。

這裡是一個使用 mysql-connector 库的簡單Python示例:

import mysql.connector

# 連接到數據庫
cnx = mysql.connector.connect(user='your_username', password='your_password',
host='127.0.0.1', database='your_database')
cursor = cnx.cursor()

# 獲取用戶輸入
department = input("Enter department name: ")

# 創建並執行查詢
query = """
SELECT first_name, last_name
FROM employees
WHERE department_id = (
SELECT department_id
FROM departments
WHERE department_name = %s
)
"""
cursor.execute(query, (department,))

# 獲取並打印結果
for (first_name, last_name) in cursor:
print(f"{first_name} {last_name}")

# 關閉連接
cursor.close()
cnx.close()

這個腚本會問用戶輸入一個部門名稱,然後找到該部門的所有員工。這就像有一個友好的機器人助手可以為你快速查找信息!

結論

恭喜你!你已經邁出了進入MySQL子查詢強大世界的第一步。記住,熟練才能精通,所以不要害怕嘗試這些概念。

這裡是一個我們已經涵蓋的子查詢類型的快速參考表:

子查詢類型 描述 示例用例
SELECT 在SELECT語句中的查詢 在表之間查找相關數據
INSERT 在INSERT中使用SELECT作為子查詢 將過濾的數據複製到另一個表
比較 使用子查詢結果進行比較 對比聚合結果
IN/NOT IN 檢查是否在子查詢結果中的列表中 在相關數據中查找匹配
客戶端程序 在應用程序代碼中使用子查詢 基於用戶輸入的動態查詢

記住,子查詢就像是你在SQL武器庫中的秘密武器。它們可能起初看起來有點複雜,但隨著練習,你會很快像專家一樣使用它們!

快樂查詢,未來的數據大師們!

Credits: Image by storyset