MySQL 是一种广泛使用的关系型数据库管理系统(RDBMS),其核心语言是 SQL(结构化查询语言)。以下是 MySQL 中最常用的 SQL 语句分类及示例,覆盖数据定义、操作、查询、控制和事务管理。
一、DDL(数据定义语言)
用于定义数据库对象(如数据库、表、索引、视图等)的结构,关键字包括 CREATE、ALTER、DROP、TRUNCATE等。
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(数据操作语言)
用于对表中的数据进行增删改操作,关键字包括 INSERT、UPDATE、DELETE、MERGE等。
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_id、user_id、amount等字段,关联 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(数据控制语言)
用于管理数据库用户的权限,关键字包括 GRANT、REVOKE等。
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 TRANSACTION、COMMIT、ROLLBACK等。
-- 开始事务
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 关键字不区分大小写(如 SELECT和 select等价),但表名、字段名是否区分取决于文件系统(Linux 区分,Windows 不区分)。
2.分号结尾:每条 SQL 语句以分号 ;结尾(部分客户端支持换行输入)。
3.注释:单行注释用 --或 #,多行注释用 /* ... */。
4.性能优化:避免全表扫描(如 SELECT *无索引过滤),合理使用索引,减少子查询嵌套。