十分想念顺店杂可。。。
以下是 MySQL 中常用的基本 SQL 语句大全,按功能分类整理,包含语法和示例,方便参考使用:
一、数据库操作(DDL)
用于创建、删除、切换数据库。
创建数据库
-- 基本语法 CREATE DATABASE [IF NOT EXISTS] 数据库名 [CHARACTER SET 字符集] [COLLATE 排序规则];-- 示例:创建名为testdb的数据库,指定utf8mb4字符集 CREATE DATABASE IF NOT EXISTS testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
删除数据库
-- 基本语法 DROP DATABASE [IF EXISTS] 数据库名;-- 示例:删除testdb数据库(谨慎操作!) DROP DATABASE IF EXISTS testdb;
切换 / 使用数据库
USE 数据库名;-- 示例:使用testdb数据库 USE testdb;
查看所有数据库
SHOW DATABASES;
二、表操作(DDL)
用于创建、修改、删除表结构。
创建表
-- 基本语法 CREATE TABLE [IF NOT EXISTS] 表名 (列名1 数据类型 [约束],列名2 数据类型 [约束],...[表级约束] ) [ENGINE=存储引擎] [CHARACTER SET 字符集];-- 示例:创建user表 CREATE TABLE IF NOT EXISTS user (id INT PRIMARY KEY AUTO_INCREMENT, -- 主键,自增name VARCHAR(50) NOT NULL, -- 非空age INT DEFAULT 0, -- 默认值phone VARCHAR(20) UNIQUE, -- 唯一约束create_time DATETIME ) ENGINE=InnoDB CHARACTER SET utf8mb4;
查看表结构
-- 方法1 DESCRIBE 表名; -- 简写 DESC 表名;-- 方法2(更详细) SHOW COLUMNS FROM 表名;
修改表结构(ALTER TABLE)
-- 添加列 ALTER TABLE 表名 ADD 列名 数据类型 [约束]; -- 示例:给user表添加email列 ALTER TABLE user ADD email VARCHAR(100) UNIQUE;-- 修改列类型/约束 ALTER TABLE 表名 MODIFY 列名 新数据类型 [新约束]; -- 示例:修改age列为INT,允许NULL ALTER TABLE user MODIFY age INT NULL;-- 重命名列 ALTER TABLE 表名 CHANGE 旧列名 新列名 数据类型 [约束]; -- 示例:将phone列重命名为mobile ALTER TABLE user CHANGE phone mobile VARCHAR(20) UNIQUE;-- 删除列 ALTER TABLE 表名 DROP 列名; -- 示例:删除email列 ALTER TABLE user DROP email;-- 重命名表 ALTER TABLE 旧表名 RENAME TO 新表名;
删除表
-- 基本语法 DROP TABLE [IF EXISTS] 表名;-- 示例:删除user表 DROP TABLE IF EXISTS user;
查看当前数据库所有表
SHOW TABLES;
三、数据操作(DML)
用于插入、更新、删除表中的数据。
插入数据(INSERT)
-- 插入完整行(按表结构顺序) INSERT INTO 表名 VALUES (值1, 值2, ...);-- 插入指定列(推荐,更灵活) INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...);-- 批量插入 INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2), (值3, 值4), ...;-- 示例:插入用户数据 INSERT INTO user (name, age, mobile, create_time) VALUES ('张三', 25, '13800138000', '2023-01-01 10:00:00');-- 批量插入 INSERT INTO user (name, age) VALUES ('李四', 30), ('王五', 28);
更新数据(UPDATE)
-- 基本语法(务必加WHERE,否则更新全表!) UPDATE 表名 SET 列1=值1, 列2=值2, ... [WHERE 条件];-- 示例:更新张三的年龄为26 UPDATE user SET age=26 WHERE name='张三';-- 多条件更新 UPDATE user SET mobile='13900139000' WHERE name='李四' AND age=30;
删除数据(DELETE)
-- 基本语法(务必加WHERE,否则删除全表数据!) DELETE FROM 表名 [WHERE 条件];-- 示例:删除年龄大于50的用户 DELETE FROM user WHERE age > 50;-- 清空表(速度更快,自增ID会重置) TRUNCATE TABLE 表名; -- 等价于删除表再重建,无法回滚
四、数据查询(DQL)
用于从表中查询数据,核心是SELECT
语句。
基础查询
-- 查询所有列(不推荐,效率低) SELECT * FROM 表名;-- 查询指定列 SELECT 列1, 列2, ... FROM 表名;-- 示例:查询user表的name和age列 SELECT name, age FROM user;
带条件查询(WHERE)
SELECT 列名 FROM 表名 WHERE 条件;-- 条件运算符:=、!=、>、<、>=、<=、BETWEEN...AND、IN、LIKE、IS NULL等 -- 示例1:查询年龄=25的用户 SELECT * FROM user WHERE age = 25;-- 示例2:查询年龄在20-30之间的用户 SELECT * FROM user WHERE age BETWEEN 20 AND 30;-- 示例3:查询姓名包含"张"的用户(%匹配任意字符,_匹配单个字符) SELECT * FROM user WHERE name LIKE '%张%';-- 示例4:查询手机号为空的用户 SELECT * FROM user WHERE mobile IS NULL;-- 多条件:AND(且)、OR(或)、NOT(非) SELECT * FROM user WHERE age > 25 AND name LIKE '李%';
排序(ORDER BY)
SELECT 列名 FROM 表名 [WHERE 条件] ORDER BY 列1 [ASC|DESC], 列2 [ASC|DESC]; -- ASC:升序(默认),DESC:降序-- 示例:按年龄降序排列,年龄相同则按创建时间升序 SELECT * FROM user ORDER BY age DESC, create_time ASC;
分页(LIMIT)
SELECT 列名 FROM 表名 [WHERE 条件] LIMIT 起始位置, 条数; -- 起始位置从0开始(可省略,默认0)-- 示例1:查询前10条数据 SELECT * FROM user LIMIT 10;-- 示例2:查询第11-20条数据(起始位置10,取10条) SELECT * FROM user LIMIT 10, 10;
去重(DISTINCT)
SELECT DISTINCT 列名 FROM 表名;-- 示例:查询所有不重复的年龄 SELECT DISTINCT age FROM user;
聚合函数
常用聚合函数:COUNT()
(计数)、SUM()
(求和)、AVG()
(平均值)、MAX()
(最大值)、MIN()
(最小值)。-- 示例1:统计用户总数 SELECT COUNT(*) AS total_users FROM user; -- *包含NULL,COUNT(列名)不包含NULL-- 示例2:计算平均年龄 SELECT AVG(age) AS avg_age FROM user;-- 示例3:查询最大年龄和最小年龄 SELECT MAX(age) AS max_age, MIN(age) AS min_age FROM user;
分组查询(GROUP BY + HAVING)
GROUP BY
:按列分组,常与聚合函数搭配。HAVING
:筛选分组后的结果(类似 WHERE,但用于分组)。
-- 示例1:按年龄分组,统计每个年龄的用户数 SELECT age, COUNT(*) AS count FROM user GROUP BY age;-- 示例2:筛选用户数>=2的年龄组 SELECT age, COUNT(*) AS count FROM user GROUP BY age HAVING count >= 2;
多表连接查询
假设有user
表(id, name)和order
表(id, user_id, amount),通过user_id
关联。-- 内连接(INNER JOIN):只返回两表匹配的行 SELECT u.name, o.amount FROM user u INNER JOIN `order` o ON u.id = o.user_id;-- 左连接(LEFT JOIN):返回左表所有行,右表无匹配则为NULL SELECT u.name, o.amount FROM user u LEFT JOIN `order` o ON u.id = o.user_id;-- 右连接(RIGHT JOIN):返回右表所有行,左表无匹配则为NULL SELECT u.name, o.amount FROM user u RIGHT JOIN `order` o ON u.id = o.user_id;
子查询
嵌套在其他查询中的查询,可作为条件、结果集或临时表。-- 示例1:子查询作为条件(查询有订单的用户) SELECT * FROM user WHERE id IN (SELECT DISTINCT user_id FROM `order`);-- 示例2:子查询作为临时表(查询每个用户的最新订单) SELECT u.name, o.amount FROM user u JOIN (SELECT user_id, MAX(id) AS max_order_id FROM `order` GROUP BY user_id ) tmp ON u.id = tmp.user_id JOIN `order` o ON tmp.max_order_id = o.id;
五、索引操作(DDL)
-- 创建普通索引
CREATE INDEX 索引名 ON 表名(列名);
-- 示例:给user表的name列创建索引
CREATE INDEX idx_user_name ON user(name);-- 创建复合索引
CREATE INDEX 索引名 ON 表名(列1, 列2, ...);
-- 示例:创建(name, age)复合索引
CREATE INDEX idx_user_name_age ON user(name, age);-- 创建唯一索引
CREATE UNIQUE INDEX 索引名 ON 表名(列名);-- 删除索引
DROP INDEX 索引名 ON 表名;-- 查看表中所有索引
SHOW INDEX FROM 表名;
六、用户与权限(DCL)
-- 创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
-- 示例:允许localhost登录的user1,密码123456
CREATE USER 'user1'@'localhost' IDENTIFIED BY '123456';-- 授予权限(ALL:所有权限,SELECT:查询权限等)
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
-- 示例:授予user1对testdb所有表的查询和插入权限
GRANT SELECT, INSERT ON testdb.* TO 'user1'@'localhost';-- 撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';-- 删除用户
DROP USER '用户名'@'主机名';-- 查看用户权限
SHOW GRANTS FOR '用户名'@'主机名';
七、事务控制
-- 开始事务
START TRANSACTION;
-- 或 BEGIN;-- 提交事务(永久生效)
COMMIT;-- 回滚事务(撤销操作)
ROLLBACK;-- 设置事务隔离级别(READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE)
SET TRANSACTION ISOLATION LEVEL 隔离级别;
常用辅助语句
- 查看当前数据库:
SELECT DATABASE();
- 查看 MySQL 版本:
SELECT VERSION();
- 查看当前用户:
SELECT USER();
- 清空查询缓存(MySQL 8.0 前):
RESET QUERY CACHE;
以上涵盖了 MySQL 日常开发中最常用的 SQL 语句,实际使用时需根据具体场景灵活组合,复杂查询建议用EXPLAIN
分析执行计划以优化性能。