MySQL - Having 子句

您好,有抱負的數據愛好者!今天,我們將深入MySQL的一個強大功能:HAVING子句。作為您友善的鄰居計算機科學老師,我非常興奮能夠指導您走過這段旅程。別擔心您對編程是新手;我們會一步一步地進行,很快您就能夠像專業人士一樣過濾數據!

MySQL - Having Clause

MySQL Having 子句

讓我們從基礎開始。HAVING子句就像俱樂部的保鏢,但它不是檢查身份證,而是檢查數據群組。它與GROUP BY子句一起使用,用於過濾滿足特定條件的群組記錄。

想像一下您正在整理您的漫畫書收藏。您已經按超級英雄分組,但現在您只想看到出現在超過五本漫畫中的英雄。這就是HAVING的作用!

這裡是基本語法:

SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);

讓我們看一個簡單的例子。假設我們有一個名為employees的表:

SELECT department, COUNT(*) as employee_count
FROM employees
GROUP BY department
HAVING employee_count > 10;

這個查詢會顯示所有員工數量超過10個的部門。HAVING子句在分組完成後檢查employee_count

當使用WHERE與HAVING

您可能會想,“等一下,老師!這不就是WHERE的作用嗎?”問得好!這裡是關鍵區別:

  • WHERE在分組前過濾單個行
  • HAVING在分組後過濾群組

將WHERE視為初始安全檢查,而HAVING則是派對的VIP名單!

HAVING子句與ORDER BY子句

現在,讓我們為我們的結果添加一些順序。ORDER BY子句就像劇院的引座員,確保每個人都在他們的正確座位上。

SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING avg_salary > 50000
ORDER BY avg_salary DESC;

這個查詢會顯示平均薪水超過50,000美元的部門,並按從高到低的順序排序。這就像為您的公司創建一個“高賭注”名單!

HAVING子句與COUNT()函數

COUNT()函數是您可靠的計算器。讓我們用它來找忙碌的經理:

SELECT manager_id, COUNT(*) as team_size
FROM employees
GROUP BY manager_id
HAVING team_size > 5
ORDER BY team_size DESC;

這個查詢列出了有超過5個團隊成員的經理。這就像找出哪些老師有最大的班級!

HAVING子句與AVG()函數

AVG()是您友善的平均值計算器。讓我們用它來找表現出色的產品類別:

SELECT category, AVG(price) as avg_price
FROM products
GROUP BY category
HAVING avg_price > 100
ORDER BY avg_price DESC;

這個查詢會顯示平均價格超過100美元的產品類別。這就像在百貨公司中識別奢侈品區域!

HAVING子句與MAX()函數

MAX()就像您數據中的高跳冠軍。讓我們用它來找每個類別中最貴的產品:

SELECT category, MAX(price) as max_price
FROM products
GROUP BY category
HAVING max_price > 1000
ORDER BY max_price DESC;

這個查詢列出了至少有一個產品價格超過1000美元的類別。這就像在每個部門中找到“大票”項目!

使用客戶端程序使用Having 子句

現在,讓我們使用MySQL客戶端程序將所有這些應用到實際中。我會使用書店數據庫的經典例子:

-- 創建books表
CREATE TABLE books (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100),
author VARCHAR(50),
genre VARCHAR(50),
price DECIMAL(5,2),
sold INT
);

-- 插入一些樣本數據
INSERT INTO books (title, author, genre, price, sold) VALUES
('The Great Gatsby', 'F. Scott Fitzgerald', 'Classic', 12.99, 1000),
('To Kill a Mockingbird', 'Harper Lee', 'Classic', 14.99, 1500),
('1984', 'George Orwell', 'Sci-Fi', 11.99, 2000),
('Pride and Prejudice', 'Jane Austen', 'Romance', 9.99, 1800),
('The Hobbit', 'J.R.R. Tolkien', 'Fantasy', 19.99, 2500),
('Harry Potter', 'J.K. Rowling', 'Fantasy', 24.99, 5000),
('The Catcher in the Rye', 'J.D. Salinger', 'Classic', 13.99, 1200);

-- 現在讓我們使用HAVING來分析我們的書籍銷售
SELECT genre, AVG(price) as avg_price, SUM(sold) as total_sold
FROM books
GROUP BY genre
HAVING total_sold > 2000
ORDER BY total_sold DESC;

這個查詢會顯示總銷售量超過2000冊的類別,以及它們的平均價格。這就像在我們的書店中找出暢銷的區域!

這裡是發生的事情的分解:

  1. 我們選擇類別,計算平均價格,並總結總銷售量。
  2. 我們按類別對結果進行分組。
  3. HAVING子句過濾出總銷售量少於2000的類別。
  4. 最後,我們按總銷售量降序排列結果。

就是这样!您已經使用HAVING子句從數據中獲得了寶貴的洞察。記住,熟能生巧,所以不要害怕嘗試您自己的查詢。

這裡是我們與HAVING一起使用過的函數的快速參考表:

函數 描述 示例
COUNT() 計算群組中的行數 HAVING COUNT(*) > 5
AVG() 計算一組值的平均值 HAVING AVG(price) > 100
MAX() 返回一组中的最大值 HAVING MAX(price) > 1000
SUM() 計算一組值的總和 HAVING SUM(sold) > 2000

祝您查詢愉快,未來的數據巫師!

Credits: Image by storyset