本文整理 MySQL 日常开发中常用的 SQL 语法,适合作为速查手册或博客笔记。
默认环境:MySQL 5.7 / 8.0,SQL 语句通常以分号 ; 结尾。
目录
-
连接与数据库
-
表操作
-
增删改查 CRUD
-
查询条件、排序、分页
-
聚合、分组、去重
-
连接查询 JOIN
-
子查询与 EXISTS
-
索引、视图、事务
-
用户与权限
-
常用函数
-
导入导出与诊断
-
MySQL 8 常用进阶语法
-
总结
-
连接与数据库
命令行连接
bash
1. 连接与数据库
bash
mysql -h 主机 -P 3306 -u 用户名 -p
-h:指定数据库主机地址,本地连接可省略,默认localhost。-P:指定端口号,MySQL 默认端口为3306。-u:指定登录用户名。-p:提示输入密码,也可直接写在-p后(如-p123456),但不推荐,易泄露密码。
连接成功后,命令行提示符变为 mysql>,即可输入 SQL 语句。
1.1 命令行连接与退出
bash
# 退出
exit;
quit;
两种方式均可安全退出 MySQL 客户端,效果相同。
数据库操作
sql
-- 查看所有数据库
SHOW DATABASES;
sql
-- 创建数据库
CREATE DATABASE mydb
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
CHARACTER SET utf8mb4:指定字符集,支持完整的 Unicode 字符(含 emoji)。COLLATE utf8mb4_unicode_ci:指定排序规则,ci表示大小写不敏感,适合中英文混合场景。
sql
-- 使用数据库
USE mydb;
执行后,后续 SQL 默认在该库下操作,无需再带库名前缀。
sql
-- 删除数据库
DROP DATABASE mydb;
⚠️ 危险操作:删除数据库会连同其中所有表和数据一并删除,且不可恢复,生产环境务必谨慎执行。## 2. 表操作
sql
sql
-- 查看当前库所有表
SHOW TABLES;
sql
-- 查看表结构
DESC users;
SHOW CREATE TABLE users;
sql
-- 创建表
CREATE TABLE users (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) DEFAULT NULL,
age TINYINT UNSIGNED DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_email (email),
KEY idx_name (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
sql
-- 修改表
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
ALTER TABLE users MODIFY COLUMN name VARCHAR(100) NOT NULL;
ALTER TABLE users CHANGE COLUMN phone mobile VARCHAR(20);
ALTER TABLE users DROP COLUMN mobile;
ALTER TABLE users ADD INDEX idx_age (age);
sql
-- 删除表
DROP TABLE users;
-- 清空表:自增重置,不能加 WHERE
TRUNCATE TABLE users;
3. 增删改查 CRUD
sql
sql
-- 插入
INSERT INTO users (name, email, age)
VALUES
('张三', 'zhangsan@example.com', 20),
('李四', 'lisi@example.com', 25);
-- 插入或冲突更新
INSERT INTO users (id, name, age)
VALUES (1, '王五', 30)
ON DUPLICATE KEY UPDATE
name = VALUES(name),
age = VALUES(age);
-- 查询
SELECT * FROM users;
SELECT id, name, age FROM users WHERE age > 18;
-- 更新
UPDATE users
SET age = age + 1, name = '张三丰'
WHERE id = 1;
-- 删除
DELETE FROM users WHERE id = 1;
生产环境执行 UPDATE、DELETE 前,先用 SELECT 验证 WHERE 条件,并做好备份。
4. 查询条件、排序、分页
sql
SELECT *
FROM users
WHERE age BETWEEN 18 AND 30
AND name LIKE '张%'
AND email IS NOT NULL
AND id IN (1, 2, 3)
ORDER BY age DESC, id ASC
LIMIT 10 OFFSET 0;
分页写法
sql
-- 前 10 条
LIMIT 10;
-- 跳过 20 条,取 10 条
LIMIT 20, 10;
-- 同上
LIMIT 10 OFFSET 20;
## 5. 聚合、分组、去重
```sql
SELECT
COUNT(*) AS total,
AVG(age) AS avg_age,
SUM(age) AS sum_age,
MAX(age) AS max_age,
MIN(age) AS min_age
FROM users;
SELECT age, COUNT(*) AS cnt
FROM users
GROUP BY age
HAVING cnt > 1;
SELECT DISTINCT age FROM users;
## 6. 连接查询 JOIN
sql
-- 内连接
SELECT u.name, o.order_no, o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
-- 左连接
SELECT u.name, o.order_no
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
-- 查找没有订单的用户
SELECT u.*
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.id IS NULL;
-- 联合
SELECT name FROM users
UNION ALL
SELECT order_no FROM orders;
## 7. 子查询与 EXISTS
sql
SELECT *
FROM users
WHERE id IN (
SELECT user_id
FROM orders
WHERE amount > 100
);
SELECT *
FROM users u
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.user_id = u.id
);
## 8. 索引、视图、事务
索引
SQL
```sql
CREATE INDEX idx_users_name ON users(name);
CREATE UNIQUE INDEX uk_users_email ON users(email);
SHOW INDEX FROM users;
DROP INDEX idx_users_name ON users;
sql
视图
SQL
CREATE VIEW v_user_order AS
SELECT u.id, u.name, o.order_no, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
DROP VIEW v_user_order;
事务
SQL
START TRANSACTION;
UPDATE users SET age = age + 1 WHERE id = 1;
INSERT INTO orders (user_id, order_no, amount)
VALUES (1, 'NO001', 99.00);
COMMIT;
SQL
-- 出错时回滚
ROLLBACK;
9. 用户与权限
sql
CREATE USER 'app'@'%' IDENTIFIED BY 'StrongPass123';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app'@'%';
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'app'@'%';
REVOKE DELETE ON mydb.* FROM 'app'@'%';
DROP USER 'app'@'%';
## 10. 常用函数
```sql
SELECT NOW(), CURDATE(), CURTIME();
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');
SELECT CONCAT('姓名:', name) FROM users;
SELECT IFNULL(email, '无邮箱') FROM users;
SELECT COALESCE(email, phone, '无联系方式') FROM users;
SELECT UPPER(name), LOWER(name), LENGTH(name) FROM users;
SELECT SUBSTRING(name, 1, 2) FROM users;
SELECT ROUND(3.14159, 2), CEIL(3.1), FLOOR(3.9), RAND();
SELECT GROUP_CONCAT(name ORDER BY id SEPARATOR ',') FROM users;
## 11. 导入导出与诊断
导出与导入
bash
### 11.1 导出数据库
```bash
mysqldump -u root -p mydb > mydb.sql
11.2 导入数据库
bash
mysql -u root -p mydb < mydb.sql
```sql
-- MySQL 客户端内导入
SOURCE /path/to/mydb.sql;
诊断
sql
-- 查看执行计划
EXPLAIN SELECT * FROM users WHERE name = '张三';
-- 查看连接进程
SHOW PROCESSLIST;
-- 查看变量
SHOW VARIABLES LIKE 'max_connections';
-- 杀连接
KILL 12345;
12. MySQL 8 常用进阶语法
CTE
sql
WITH order_sum AS (
SELECT user_id, SUM(amount) AS total
FROM orders
GROUP BY user_id
)
SELECT *
FROM order_sum
WHERE total > 1000;
窗口函数
sql
SELECT
name,
age,
ROW_NUMBER() OVER (ORDER BY age DESC) AS rn,
RANK() OVER (ORDER BY age DESC) AS rk,
DENSE_RANK() OVER (ORDER BY age DESC) AS drk
FROM users;