天天看點

MySQL Select 查詢語句詳解及進階用法

作者:Java熱點

MySQL是一個開源的關系型資料庫管理系統,支援多種操作語言,其中最基礎、最常用的指令之一就是SELECT語句。在本篇文章中,這裡将詳細介紹MySQL SELECT語句的各個方面,從最基本的查詢語句,到更進階的技巧和功能。

一、基本文法

SELECT語句用于從表格中檢索資料。其基本文法如下:

sql複制代碼SELECT column1, column2, ..., columnN
FROM table_name;
           

在這個文法中,column1, column2, ..., columnN代表要檢索的列名,可以是一個或多個(使用逗号分隔)。FROM後面跟着的是要檢索的表格名稱。

例如,假設我們有一個名為"customers"的表格,其中包含"id", "name"和"email"三列資料,我們想檢索所有客戶的id和name,那麼我們可以使用以下語句:

sql複制代碼SELECT id, name
FROM customers;
           

這将傳回一個結果集,其中包含所有客戶的id和name。

二、條件查詢

除了檢索整個表格外,SELECT語句還可以根據特定條件過濾資料,隻傳回滿足條件的行。條件查詢可以通過加入WHERE子句來實作。WHERE子句後面跟着的是一個或多個條件,用于指定需要檢索的行。例如,我們可以使用以下語句來檢索所有名字為“John”的客戶:

ini複制代碼SELECT id, name
FROM customers
WHERE name = 'John';
           

該語句将傳回一個結果集,其中包含所有名字為“John”的客戶的id和name。

除了"="運算符外,WHERE子句還支援以下比較運算符:

運算符 描述
= 等于
<> 不等于
大于
>= 大于等于
< 小于
<= 小于等于

在WHERE子句中,我們也可以使用AND、OR和NOT這些邏輯運算符來組合多個條件。例如,我們可以使用以下語句來檢索所有名字為“John”且郵箱以“gmail.com”結尾的客戶:

sql複制代碼SELECT id, name, email
FROM customers
WHERE name = 'John' AND email LIKE '%@gmail.com';
           

該語句将傳回一個結果集,其中包含所有滿足以上兩個條件的客戶的id、name和email。

三、通配符查詢

使用通配符可以幫助我們更靈活地進行資料檢索。通配符可以比對任意字元或一組字元。在MySQL中,我們可以使用如下兩種通配符:

  • %:代表零個或多個字元
  • _:代表單個字元

例如,我們可以使用以下語句來檢索所有名字以“J”開頭的客戶:

sql複制代碼SELECT id, name
FROM customers
WHERE name LIKE 'J%';
           

該語句将傳回一個結果集,其中包含所有名字以“J”開頭的客戶的id和name。

我們還可以在LIKE子句中使用_通配符。例如,以下語句将檢索所有名字為“John”的客戶:

sql複制代碼SELECT id, name
FROM customers
WHERE name LIKE 'John';
           

但是,如果我們想檢索所有名字為3個字元、首字母為“J”且第三個字母為“n”的客戶,我們可以使用以下語句:

sql複制代碼SELECT id, name
FROM customers
WHERE name LIKE 'J_n';
           

該語句将傳回一個結果集,其中包含所有滿足以上條件的客戶的id和name。

四、排序查詢

在MySQL中,我們可以通過在SELECT語句中添加ORDER BY子句來對結果集進行排序。ORDER BY子句後面跟着要排序的列名,以及排序方式(ASC表示升序排列,DESC表示降序排列)。例如,以下語句将檢索所有客戶的id和name,并按照name升序排列:

sql複制代碼SELECT id, name
FROM customers
ORDER BY name ASC;
           

我們也可以同時按照多個列進行排序,隻需要在ORDER BY子句中添加多個列名即可。例如,以下語句将檢索所有客戶的id、name和email,并先按照name升序排列,然後按照email降序排列:

sql複制代碼SELECT id, name, email
FROM customers
ORDER BY name ASC, email DESC;
           

五、限制查詢結果

有時候我們隻需要檢索結果集的前幾行或特定範圍内的資料。在MySQL中,我們可以使用LIMIT子句來限制結果集的大小。例如,以下語句将檢索所有客戶的id和name,但隻傳回前10條記錄:

sql複制代碼SELECT id, name
FROM customers
LIMIT 10;
           

我們也可以使用OFFSET子句來指定結果集的起始位置。例如,以下語句将檢索所有客戶的id和name,但從第20條記錄開始,隻傳回10條記錄:

sql複制代碼SELECT id, name
FROM customers
LIMIT 10 OFFSET 20;
           

注意,在MySQL中,LIMIT子句和OFFSET子句的順序是固定的,先寫LIMIT再寫OFFSET。

六、聚合函數

除了基本的SELECT語句外,MySQL還提供了一些聚合函數,用于對資料進行統計和彙總。以下是一些常用的聚合函數:

函數 描述
COUNT() 統計查詢結果的行數
SUM() 計算指定列的總和
AVG() 計算指定列的平均值
MAX() 找出指定列的最大值
MIN() 找出指定列的最小值

例如,以下語句将統計customers表格中所有客戶的數量:

sql複制代碼SELECT COUNT(*)
FROM customers;
           

我們也可以使用聚合函數對滿足特定條件的資料進行統計。例如,以下語句将計算名字以“J”開頭的客戶的數量:

sql複制代碼SELECT COUNT(*)
FROM customers
WHERE name LIKE 'J%';
           

七、分組和過濾

有時候我們需要對資料進行分組統計,或者通過分組來過濾資料。在MySQL中,我們可以使用GROUP BY子句實作分組操作。GROUP BY子句後面跟着要分組的列名,例如:

sql複制代碼SELECT gender, COUNT(*)
FROM customers
GROUP BY gender;
           

該語句将按照gender列進行分組,并統計每組中的客戶數量。

我們也可以使用HAVING子句在分組後過濾資料。HAVING子句與WHERE子句類似,隻不過它作用于分組後的結果集。例如,以下語句将找出名字以“J”開頭的客戶中,訂閱了兩個或更多服務的客戶:

vbnet複制代碼SELECT name, COUNT(*) as num_subscriptions
FROM customers
JOIN subscriptions ON customers.id = subscriptions.customer_id
WHERE name LIKE 'J%'
GROUP BY customers.id
HAVING num_subscriptions >= 2;
           

該語句将按照名字以“J”開頭的客戶進行分組,并統計每個客戶訂閱的服務數量。然後,它使用HAVING子句過濾掉訂閱服務少于2個的客戶。

八、聯結多張表格

在實際的應用中,我們經常需要從多張表格中檢索資料。在MySQL中,我們可以使用JOIN操作将多張表格聯結起來。以下是一些常見的JOIN操作:

  1. INNER JOIN

INNER JOIN傳回兩個表格中滿足連接配接條件的行。例如,以下語句将檢索每個客戶的名字和購買的産品名稱:

vbnet複制代碼SELECT customers.name, products.name
FROM customers
JOIN orders ON customers.id = orders.customer_id
JOIN products ON orders.product_id = products.id;
           

這個查詢将内聯接customers、orders和products三張表格。它通過customers表格中的id和orders表格中的customer_id建立連結,并通過orders表格中的product_id和products表格中的id建立連結。

  1. LEFT JOIN

LEFT JOIN傳回左表格中所有行以及右表格中滿足連接配接條件的行。如果右表格中沒有比對的行,則傳回NULL值。例如,以下語句将檢索每個客戶的名字以及他們最近的訂單日期:

sql複制代碼SELECT customers.name, MAX(orders.order_date)
FROM customers
LEFT JOIN orders ON customers.id = orders.customer_id
GROUP BY customers.id;
           

這個查詢将左聯接customers和right,通過customers表格中的id和orders表格中的customer_id建立連結。它使用GROUP BY子句按照客戶ID進行分組,并計算每個客戶最近的訂單日期。如果某個客戶沒有訂單,則傳回NULL值。

  1. RIGHT JOIN

RIGHT JOIN傳回右表格中所有行以及左表格中滿足連接配接條件的行。如果左表格中沒有比對的行,則傳回NULL值。例如,以下語句将檢索每個産品的名稱以及購買該産品的客戶數量:

sql複制代碼SELECT products.name, COUNT(customers.id)
FROM customers
RIGHT JOIN orders ON customers.id = orders.customer_id
RIGHT JOIN products ON orders.product_id = products.id
GROUP BY products.id;
           

這個查詢将右聯接orders和products,通過orders表格中的product_id和products表格中的id建立連結。它使用GROUP BY子句按照産品ID進行分組,并計算每個産品的購買客戶數量。如果某個産品沒有被任何客戶購買,則傳回NULL值。

  1. FULL OUTER JOIN

FULL OUTER JOIN傳回左表格和右表格中所有行,如果左表格或右表格中沒有比對的行,則傳回NULL值。MySQL不支援FULL OUTER JOIN操作,但我們可以通過UNION操作模拟它。例如,以下語句将傳回customers和orders表格中所有的行:

sql複制代碼SELECT customers.*, orders.*
FROM customers
LEFT JOIN orders ON customers.id = orders.customer_id
UNION
SELECT customers.*, orders.*
FROM customers
RIGHT JOIN orders ON customers.id = orders.customer_id
WHERE customers.id IS NULL;
           

這個查詢将先進行一個LEFT JOIN操作,然後再進行一個RIGHT JOIN操作。它使用UNION操作将兩張表格中的結果合并在一起,并使用WHERE子句過濾掉左表格和右表格中都存在的行。

以上就是MySQL聯結多張表格的基本操作。我們可以根據需要選擇不同的JOIN操作,并使用它們來檢索和分析資料庫中的資料。

九、使用子查詢

子查詢是一種在SELECT語句中嵌套另一個SELECT語句的技術。它允許我們使用查詢結果作為其他查詢的輸入。以下是一些常用的子查詢:

  1. 用于過濾資料

我們可以使用子查詢來過濾需要的資料。例如,以下語句将找出價格高于平均價格的所有産品:

sql複制代碼SELECT name, price
FROM products
WHERE price > (
    SELECT AVG(price)
    FROM products
);
           

這個查詢使用子查詢來計算産品價格的平均值,然後将其作為WHERE子句的輸入,過濾掉價格低于平均價格的産品。

  1. 用于比較資料

我們也可以使用子查詢來比較資料。例如,以下語句将找出銷售總額最高的客戶:

sql複制代碼SELECT name, (
    SELECT SUM(price * quantity)
    FROM orders
    WHERE orders.customer_id = customers.id
) as total_sales
FROM customers
ORDER BY total_sales DESC
LIMIT 1;
           

這個查詢使用子查詢來計算每個客戶的銷售總額,并将其作為SELECT子句的一部分輸出。然後,它使用ORDER BY子句按照銷售總額進行降序排列,并使用LIMIT子句隻傳回最高的銷售總額。

  1. 用于建立派生表格

我們還可以使用子查詢來建立派生表格。例如,以下語句将建立一個包含每個産品曆史訂單數量的表格:

sql複制代碼SELECT products.*, (
    SELECT COUNT(*)
    FROM orders
    WHERE orders.product_id = products.id
) as order_count
FROM products;
           

這個查詢使用子查詢來計算每個産品的曆史訂單數量,并将其作為新的列添加到products表格中。

  1. 用于插入和更新資料

最後,我們可以使用子查詢來插入和更新資料。例如,以下語句将向orders表格中插入一個新的訂單,并自動設定訂單編号:

sql複制代碼INSERT INTO orders (customer_id, product_id, price, quantity)
VALUES (1, 2, (
    SELECT price
    FROM products
    WHERE id = 2
), 5);
           

這個查詢使用子查詢來擷取産品價格,并将其作為INSERT子句的一部分插入到新的訂單中。

繼續閱讀