MySQL 常用语法整理

本文整理 MySQL 日常开发中常用的 SQL 语法,适合作为速查手册或博客笔记。

默认环境:MySQL 5.7 / 8.0,SQL 语句通常以分号 ; 结尾。

目录

  1. 连接与数据库

  2. 表操作

  3. 增删改查 CRUD

  4. 查询条件、排序、分页

  5. 聚合、分组、去重

  6. 连接查询 JOIN

  7. 子查询与 EXISTS

  8. 索引、视图、事务

  9. 用户与权限

  10. 常用函数

  11. 导入导出与诊断

  12. MySQL 8 常用进阶语法

  13. 总结

  14. 连接与数据库

    命令行连接

    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;
相关推荐
不正经的码狗1 小时前
MySQL 免安装教程|安装不报错
mysql
旋生万物1 小时前
MySQL 死锁总复发?用螺旋事务相位互逆法定位加锁顺序(附 Python 诊断脚本)
mysql·大模型·innodb·螺旋生成论·螺旋相位
SelectDB技术团队2 小时前
StarRocks 迁移至 Apache Doris 完整指南:三步完成结构、数据与业务平滑切换
数据库·人工智能·sql·clickhouse·apache doris·selectdb·湖仓架构升级
星光开发者3 小时前
基于Spring Boot的充电桩管理系统的设计与实现-计算机毕设【课程设计】57105
vue.js·spring boot·vscode·mysql·django·php·express
imDwAaY3 小时前
MySQL MVCC 详解:原理、版本链、Read View 与可见性判断
数据库·sql·mysql
Java成神之路-3 小时前
MySQL 约束与索引完全指南
mysql
bbq粉刷匠17 小时前
触发器(下):事务与锁、binlog 一致性与替代方案
sql
百万蹄蹄向前冲17 小时前
密码都对Node.js却连不上Linux数据库
linux·mysql