首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 學習筆記(二):進階查詢、連接、子查詢與正則表達式全解

     編輯:MySQL 綜合教學

一、編碼設置與中文亂碼

查詢涉及中文時,執行前設置連接字符集:

SET NAMES utf8mb4;  -- 或 utf8/gbk,與表字符集一致

可加入連接初始化 SQL 或驅動配置 characterEncoding=utf8mb4。

二、常用查詢子句

2.1 IN / NOT IN

SELECT * FROM t WHERE status IN (1,2,3);
SELECT * FROM t WHERE status NOT IN (4,5);

2.2 BETWEEN AND

SELECT * FROM t WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31';
-- 等價於 create_time >= '2023-01-01' AND create_time <= '2023-12-31'

2.3 DISTINCT 去重

SELECT DISTINCT category FROM products;
-- 配合 GROUP_CONCAT 顯示分組詳情
SELECT category, GROUP_CONCAT(name) FROM products GROUP BY category;

三、聚合函數

函數說明注意
COUNT(*)統計行數(含 NULL)無 WHERE 時 MyISAM O(1),InnoDB 掃描聚簇索引
COUNT(col)統計非 NULL 行數
SUM(col)求和忽略 NULL
AVG(col)平均值忽略 NULL

四、多表連接查詢

4.1 內連接

SELECT o.id, u.name FROM orders o INNER JOIN users u ON o.user_id = u.id;
-- 僅返回雙方匹配的行

4.2 外連接

-- 存在即返回 TRUE,不返回具體數據
SELECT * FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);

5.2 衍生表(FROM 子查詢)

SELECT * FROM (SELECT user_id, COUNT(*) cnt FROM orders GROUP BY user_id) t WHERE cnt > 5;

六、結果集合並

-- UNION:去重合併
SELECT id FROM t1 UNION SELECT id FROM t2;
-- UNION ALL:直接合併,性能更好,無去重
SELECT id FROM t1 UNION ALL SELECT id FROM t2;

七、別名

-- 表別名
SELECT u.name FROM users AS u;
-- 列別名
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;

八、正則表達式查詢 (REGEXP)

MySQL 使用 POSIX 正則,常用元字符:

模式含義示例
^行首WHERE name REGEXP '^php' 以 php 開頭
$行尾WHERE name REGEXP 'module$' 以 module 結尾
.任意單字符WHERE name REGEXP 'P.' 含 P 及其後任意字符
[...]字符集合WHERE name REGEXP '[PCA]' 含 P/C/A 任一
[^...]排除集合WHERE name REGEXP '[^c-z]' 非 c-z 字母
|或WHERE name REGEXP 'php|java|go'
*0 或多次WHERE name REGEXP 'J*A' A 前 0+ 個 J
+1 或多次WHERE name REGEXP 'J+A' A 前 1+ 個 J
{n}恰好 n 次WHERE name REGEXP 'a{3}' 連續 3 個 a
{m,n}m~n 次WHERE name REGEXP 'a{2,4}' 2~4 個 a

實戰示例

-- 查詢書名以 php 開頭
SELECT books FROM tb_book WHERE books REGEXP '^php';
-- 查詢包含 php、c 或 java 任一關鍵詞
SELECT books FROM tb_books WHERE books REGEXP 'php|c|java';

九、性能提示

  • REGEXP 無法使用索引,大表慎用,考慮全文索引或 ES;
  • UNION ALL 優於 UNION,除非業務要求去重;
  • 子查詢優先改寫為 JOIN 或 EXISTS;
  • LEFT JOIN 驅動表放小結果集側,關聯列建索引。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved