MySQL 是一种广泛使用的关系型数据库管理系统(RDBMS),其核心语言是 ​​SQL(结构化查询语言)​​。以下是 MySQL 中最常用的 SQL 语句分类及示例,覆盖数据定义、操作、查询、控制和事务管理。

​​一、DDL(数据定义语言)​​

用于定义数据库对象(如数据库、表、索引、视图等)的结构,关键字包括 CREATEALTERDROPTRUNCATE等。

1. ​​创建数据库​​

-- 创建数据库(若不存在)
CREATE DATABASE IF NOT EXISTS mydb;

-- 切换当前使用的数据库
USE mydb;

2. ​​创建表​​

-- 创建表(指定字段、类型、约束)
CREATE TABLE IF NOT EXISTS users (
    id INT UNSIGNED AUTO_INCREMENT COMMENT '用户ID(自增主键)',
    username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名(唯一)',
    age TINYINT UNSIGNED DEFAULT 18 COMMENT '年龄(默认18)',
    email VARCHAR(100) NOT NULL COMMENT '邮箱',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间(默认当前时间)',
    PRIMARY KEY (id)  -- 显式声明主键(与AUTO_INCREMENT配合)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

3. ​​修改表结构​​

-- 添加字段(非空,带默认值)
ALTER TABLE users 
ADD COLUMN phone VARCHAR(20) NOT NULL DEFAULT '13800000000' COMMENT '手机号';

-- 修改字段类型和注释
ALTER TABLE users 
MODIFY COLUMN age SMALLINT UNSIGNED COMMENT '年龄(调整为无符号小整型)';

-- 删除字段
ALTER TABLE users 
DROP COLUMN phone;

-- 添加索引(加速查询)
ALTER TABLE users 
ADD INDEX idx_email (email);  -- 普通索引

-- 添加主键(若未显式声明)
ALTER TABLE users 
ADD PRIMARY KEY (id);

4. ​​删除数据库/表​​

-- 删除数据库(谨慎!)
DROP DATABASE IF EXISTS mydb;

-- 删除表(谨慎!)
DROP TABLE IF EXISTS users;

5. ​​清空表数据​​

-- 清空表(保留结构,比DELETE更快,无法回滚)
TRUNCATE TABLE users;

-- 清空表(逐行删除,可通过事务回滚)
DELETE FROM users;

​​二、DML(数据操作语言)​​

用于对表中的数据进行增删改操作,关键字包括 INSERTUPDATEDELETEMERGE等。

1. ​​插入数据​​

-- 插入单条数据(指定字段)
INSERT INTO users (username, age, email) 
VALUES ('张三', 25, 'zhangsan@example.com');

-- 插入多条数据(批量插入,更高效)
INSERT INTO users (username, age, email) 
VALUES 
    ('李四', 28, 'lisi@example.com'),
    ('王五', 30, 'wangwu@example.com');

-- 插入查询结果(将其他表的数据复制到当前表)
INSERT INTO users_backup (username, age, email)
SELECT username, age, email FROM users WHERE age > 25;

2. ​​更新数据​​

-- 更新单条数据(需WHERE条件,否则全表更新!)
UPDATE users 
SET age = 26, email = 'zhangsan_new@example.com' 
WHERE username = '张三';

-- 批量更新(将年龄大于30的用户年龄+1)
UPDATE users 
SET age = age + 1 
WHERE age > 30;

3. ​​删除数据​​

-- 删除单条数据(需WHERE条件)
DELETE FROM users 
WHERE username = '王五';

-- 清空表(见DDL部分的TRUNCATE)

​​三、DQL(数据查询语言)​​

用于从表中查询数据,核心是 SELECT语句,支持过滤、排序、分组、连接等复杂操作。

1. ​​基础查询​​

-- 查询所有字段(*表示所有列,不建议生产环境使用)
SELECT * FROM users;

-- 查询指定字段(推荐明确列名)
SELECT username, age, email FROM users;

-- 去重查询(DISTINCT)
SELECT DISTINCT age FROM users;  -- 查询所有不同的年龄值

-- 条件过滤(WHERE)
SELECT * FROM users 
WHERE age BETWEEN 20 AND 30  -- 年龄在20-30之间
    AND gender = '女'         -- 性别为女(假设表有gender字段)
    AND create_time > '2024-01-01';  -- 注册时间在2024年后

2. ​​排序(ORDER BY)​​

-- 按年龄升序(ASC,默认),年龄相同则按注册时间降序(DESC)
SELECT * FROM users 
ORDER BY age ASC, create_time DESC;

3. ​​分组与聚合(GROUP BY + 聚合函数)​​

-- 统计各年龄的用户数量
SELECT age, COUNT(*) AS user_count 
FROM users 
GROUP BY age;

-- 过滤分组(HAVING,对分组后的结果过滤)
SELECT age, COUNT(*) AS user_count 
FROM users 
GROUP BY age 
HAVING user_count > 10;  -- 只显示用户数超过10的年龄组

4. ​​多表连接(JOIN)​​

假设有 orders表(订单表),包含 order_iduser_idamount等字段,关联 users表的 id字段。

-- 内连接(INNER JOIN,仅返回两表匹配的记录)
SELECT u.username, o.order_id, o.amount 
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

-- 左连接(LEFT JOIN,返回左表所有记录,右表无匹配则字段为NULL)
SELECT u.username, o.order_id, o.amount 
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

-- 右连接(RIGHT JOIN,类似左连接,以右表为主)
SELECT u.username, o.order_id, o.amount 
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;

5. ​​子查询(嵌套查询)​​

-- 查询年龄大于平均年龄的用户
SELECT * FROM users 
WHERE age > (SELECT AVG(age) FROM users);

-- 查询有订单的用户(存在性检查)
SELECT * FROM users u 
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);

6. ​​分页查询(LIMIT)​​

-- 查询第1-10条数据(页码从1开始)
SELECT * FROM users 
ORDER BY id 
LIMIT 0, 10;  -- 偏移量0,取10条

-- 查询第11-20条数据(第二页)
SELECT * FROM users 
ORDER BY id 
LIMIT 10, 10;

​​四、DCL(数据控制语言)​​

用于管理数据库用户的权限,关键字包括 GRANTREVOKE等。

1. ​​授予权限​​

-- 创建用户(MySQL 8.0+需先创建用户再授权)
CREATE USER 'dev'@'localhost' IDENTIFIED BY '123456';

-- 授予用户对mydb数据库所有表的查询和插入权限
GRANT SELECT, INSERT ON mydb.* TO 'dev'@'localhost';

-- 授予用户所有数据库的所有权限(谨慎!)
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY 'admin123';

2. ​​撤销权限​​

-- 撤销用户对mydb数据库的INSERT权限
REVOKE INSERT ON mydb.* FROM 'dev'@'localhost';

-- 撤销用户所有权限
REVOKE ALL PRIVILEGES ON *.* FROM 'admin'@'%';

​​五、TCL(事务控制语言)​​

用于管理数据库事务,保证数据的一致性和原子性,关键字包括 START TRANSACTIONCOMMITROLLBACK等。

-- 开始事务
START TRANSACTION;

-- 执行操作(例如转账:A转100元给B)
UPDATE accounts SET balance = balance - 100 WHERE username = 'A';
UPDATE accounts SET balance = balance + 100 WHERE username = 'B';

-- 提交事务(所有操作生效)
COMMIT;

-- 若出现错误,回滚事务(所有操作撤销)
ROLLBACK;

​​六、常用函数​​

MySQL 提供丰富的内置函数,用于数据处理和计算。

1. ​​字符串函数​​

SELECT CONCAT('Hello', ' ', 'MySQL');  -- 拼接字符串:'Hello MySQL'
SELECT SUBSTRING('abcdef', 2, 3);       -- 截取子串:'bcd'(从第2位开始取3位)
SELECT LENGTH('你好');                  -- 字节长度(UTF-8下为6,每个汉字3字节)
SELECT UPPER('hello');                  -- 转大写:'HELLO'

2. ​​数值函数​​

SELECT ROUND(3.1415, 2);                -- 四舍五入:3.14
SELECT CEIL(3.14);                      -- 向上取整:4
SELECT FLOOR(3.99);                     -- 向下取整:3
SELECT RAND();                          -- 生成0-1的随机数

3. ​​日期函数​​

SELECT NOW();                           -- 当前时间:'2025-08-15 11:22:54'
SELECT CURDATE();                       -- 当前日期:'2025-08-15'
SELECT DATE_ADD('2025-01-01', INTERVAL 1 MONTH);  -- 日期加1个月:'2025-02-01'
SELECT DATEDIFF('2025-08-15', '2025-01-01');      -- 计算日期差:225天

4. ​​聚合函数​​

SELECT COUNT(*) FROM users;             -- 统计记录数
SELECT SUM(amount) FROM orders;         -- 求和(订单总金额)
SELECT AVG(age) FROM users;             -- 求平均年龄
SELECT MAX(salary) FROM employees;      -- 最大值(最高工资)
SELECT MIN(score) FROM exams;           -- 最小值(最低分)

注意事项​​

1.​SQL 语句大小写​​:MySQL 关键字不区分大小写(如 SELECTselect等价),但表名、字段名是否区分取决于文件系统(Linux 区分,Windows 不区分)。

2.分号结尾​​:每条 SQL 语句以分号 ;结尾(部分客户端支持换行输入)。

3.注释​​:单行注释用 --#,多行注释用 /* ... */

4.性能优化​​:避免全表扫描(如 SELECT *无索引过滤),合理使用索引,减少子查询嵌套。