DQL(數據查詢語言)用于在MySQL數據庫中執行數據查詢操作。它主要包括SELECT語句,用于從表中檢索數據。
0. 基本語法
SELECT 字段列表
FROM 表名列表
WHERE 條件列表
GROUP BY 分組字段列表
HAVING 分組后條件列表
ORDER BY 排序字段列表
LIMIT 分頁參數
1). 查詢多個字段
SELECT 字段1,字段2... FROM 表名:
2). 字段設置別名
SELECT 字段1 [ AS 別名1 ] , 字段2 [ AS 別名2 ] ... FROM 表名;
SELECT 字段1 [ 別名1 ] , 字段2 [ 別名2 ] ... FROM 表名;
3). 去除重復記錄
SELECT DISTINCT 字段列表 FROM 表名;
1. 條件查詢
DQL的主要語句是SELECT語句,它允許我們在數據庫表中進行復雜的查詢操作。SELECT語句的基本語法如下:
SELECT column1, column2, ...
FROM table_name
WHERE conditions
SELECT
關鍵字用于指定要返回的列。FROM
關鍵字用于指定要查詢的表。WHERE
關鍵字用于指定查詢條件,可選。
示例:從名為users
的表中選擇所有年齡大于等于18歲的用戶的名字和年齡:
SELECT name, age
FROM users
WHERE age >= 18;
2. 聚合查詢
在MySQL數據庫中,DQL(數據查詢語言)提供了聚合函數,可以在查詢中對數據進行聚合操作。聚合查詢用于執行諸如計算總和、平均值、最大值、最小值等統計數據的操作。以下是DQL中常用的聚合函數以及示例:
-
COUNT:用于計算匹配條件的行數。
示例:統計名為users
的表中的記錄數。SELECT COUNT(*) FROM users;
-
SUM:用于計算數值列的總和。
示例:計算名為products
的表中價格列的總和。SELECT SUM(price) FROM products;
-
AVG:用于計算數值列的平均值。
示例:計算名為sales
的表中銷售額的平均值。SELECT AVG(sales) FROM sales;
-
MAX:用于找出數值列的最大值。
示例:找出名為scores
的表中分數列的最高分。SELECT MAX(score) FROM scores;
-
MIN:用于找出數值列的最小值。
示例:找出名為temperatures
的表中溫度列的最低溫度。SELECT MIN(temperature) FROM temperatures;
需要注意的是,聚合函數通常與GROUP BY子句一起使用,以便對分組后的數據進行聚合計算。GROUP BY子句根據指定的列對結果進行分組。
示例:計算名為products
的表中每個分類的總銷售額。
SELECT category, SUM(sales) FROM products GROUP BY category;
上述是一些常見的聚合函數,MySQL還提供了其他函數和擴展功能,例如DISTINCT(用于查找唯一的值),HAVING(用于過濾分組后的數據)等等。根據實際需求,可以在查詢中使用適當的聚合函數來滿足特定的統計需求。
3. 分組查詢
在MySQL數據庫中,DQL(數據查詢語言)提供了分組查詢的功能,用于根據指定的列對查詢結果進行分組。分組查詢常與聚合函數一起使用,以便對每個分組進行聚合計算。以下是DQL中分組查詢的詳細講解和示例:
分組查詢使用 GROUP BY
子句來指定要根據哪些列進行分組。在分組查詢中,可以選擇一個或多個列作為分組依據。請注意,除了被分組的列,查詢的 SELECT
語句中通常還包括聚合函數的使用。
分組查詢的基本語法如下:
SELECT column1, column2, ..., aggregate_function(column)
FROM table_name
WHERE conditions
GROUP BY column1, column2, ...
其中 column1, column2, ...
是用于分組的列名, aggregate_function(column)
是應用于每個分組的聚合函數,例如 COUNT(column)、SUM(column)、AVG(column)
等。
示例1:從名為 orders
的表中按客戶分組計算每個客戶的訂單總數。
SELECT customer, COUNT(*) as total_orders
FROM orders
GROUP BY customer;
示例2:從名為 products
的表中按分類分組計算每個分類的產品數量。
SELECT category, COUNT(*) as total_products
FROM products
GROUP BY category;
示例3:從名為 sales
的表中按年份和月份分組計算每個月的總銷售額。
SELECT YEAR(sales_date) as year, MONTH(sales_date) as month, SUM(amount) as total_sales
FROM sales
GROUP BY YEAR(sales_date), MONTH(sales_date);
需要注意的是,分組查詢中除了 GROUP BY
子句外,還可以使用 HAVING
子句來對分組后的數據進行篩選。 HAVING
子句與 WHERE
子句的功能類似,但是 HAVING
用于過濾分組后的數據,可以使用聚合函數和分組列進行條件篩選。
執行順序: where > 聚合函數 > having 。
示例4:從名為 products
的表中按分類分組計算每個分類的平均價格,并僅顯示平均價格大于等于 100 的分類。
SELECT category, AVG(price) as avg_price
FROM products
GROUP BY category
HAVING avg_price >= 100;
4. 排序查詢
在MySQL數據庫中,DQL(數據查詢語言)提供了排序查詢的功能,可以對查詢結果按照指定的列進行排序。排序查詢可以按照升序(默認)或降序的方式排列結果。以下是DQL中排序查詢的詳細講解和示例:
排序查詢使用 ORDER BY
子句來指定要按照哪個列進行排序。可以選擇一個或多個列進行排序,對于多個列,按照列的順序進行排序。默認情況下,排序是按照升序進行的(從小到大)。如果需要按照降序進行排序(從大到小),可以通過在排序列名后面加上 DESC
關鍵字來實現。
排序查詢的基本語法如下:
SELECT column1, column2, ...
FROM table_name
WHERE conditions
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...
其中 column1, column2, ...
是要排序的列名,可以選擇一個或多個列進行排序。 ASC
是升序排序(默認), DESC
是降序排序。
示例1:從名為 employees
的表中按照薪水進行升序排序。
SELECT name, salary
FROM employees
ORDER BY salary ASC;
示例2:從名為 products
的表中按照價格進行降序排序,如果價格相同,則按照產品名稱進行升序排序。
SELECT product_name, price
FROM products
ORDER BY price DESC, product_name ASC;
需要注意的是,可以使用 ORDER BY
子句對多個列進行排序。在多列排序中,按照列在 ORDER BY
子句中的順序進行排序。如果第一個列的值相同,則按照第二個列進行排序,依此類推。
示例3:從名為 sales
的表中按照銷售日期和銷售金額進行排序。
SELECT sale_date, amount
FROM sales
ORDER BY sale_date DESC, amount DESC;
在排序查詢中,還可以使用表達式進行排序,也可以使用函數對排序列進行處理。此外,還可以使用位置索引來指定排序的列。
示例4:從名為 customers
的表中按照合并姓和名進行排序。
SELECT CONCAT(last_name, ' ', first_name) as full_name, age
FROM customers
ORDER BY 1; -- 使用位置索引 1 表示第一個列
5. 分頁查詢
在MySQL數據庫中,DQL(數據查詢語言)提供了分頁查詢的功能,可以限制查詢結果的數量,以便顯示在頁面上,并允許用戶瀏覽多個結果頁。分頁查詢通常與排序查詢一起使用,以確保分頁結果的一致性。以下是DQL中分頁查詢的詳細講解和示例:
分頁查詢使用 LIMIT
子句來限制查詢結果的數量,并使用 OFFSET
子句來指定要跳過的行數。假設每頁顯示的記錄數量為 n,要顯示第 k 頁的結果,偏移量應為 (k-1) * n。
分頁查詢的基本語法如下:
SELECT column1, column2, ...
FROM table_name
WHERE conditions
ORDER BY column1, column2, ...
LIMIT n
OFFSET offset;
其中 column1, column2, ...
是要查詢的列名,可以選擇一個或多個列進行查詢。 n
是每頁顯示的記錄數量, offset
是要跳過的行數。
示例1:從名為 employees
的表中查詢前10條記錄。
SELECT name, salary
FROM employees
LIMIT 10;
示例2:從名為 products
的表中查詢第3頁的記錄,每頁顯示5條記錄。
SELECT product_name, price
FROM products
ORDER BY product_name
LIMIT 5
OFFSET 10;
需要注意的是,LIMIT
子句接受兩個參數,可以只提供一個參數。如果只提供一個參數,則表示要返回的記錄數量。
示例3:從名為 sales
的表中查詢最近的5條記錄。
SELECT sale_date, amount
FROM sales
ORDER BY sale_date DESC
LIMIT 5;
可以使用變量或表達式來指定 LIMIT
和 OFFSET
的值,以便根據不同的情況進行分頁查詢。
示例4:從名為 customers
的表中查詢根據用戶輸入動態指定的頁碼和記錄數量。
SET @page = 2; -- 用戶輸入的頁碼
SET @per_page = 10; -- 用戶輸入的每頁記錄數量SELECT customer_name, age
FROM customers
ORDER BY customer_name
LIMIT @per_page
OFFSET (@page - 1) * @per_page;
通過合理設置 LIMIT
和 OFFSET
的值,可以實現靈活的分頁查詢,以滿足用戶對查詢結果的需求,并提供友好的界面交互體驗。