目录
[1. 数据库操作(高频)](#1. 数据库操作(高频))
[2. 数据表操作(高频)](#2. 数据表操作(高频))
[3. 索引操作(优化查询速度,高频)](#3. 索引操作(优化查询速度,高频))
[1. 插入数据(INSERT)](#1. 插入数据(INSERT))
[2. 修改数据(UPDATE)](#2. 修改数据(UPDATE))
[3. 删除数据(DELETE / TRUNCATE)](#3. 删除数据(DELETE / TRUNCATE))
[1. 基础查询(简单查询)](#1. 基础查询(简单查询))
[2. 条件查询(WHERE子句,高频)](#2. 条件查询(WHERE子句,高频))
[3. 排序查询(ORDER BY,高频)](#3. 排序查询(ORDER BY,高频))
[4. 聚合查询(聚合函数,数据分析常用)](#4. 聚合查询(聚合函数,数据分析常用))
[5. 分页查询(LIMIT/OFFSET,高频,不同数据库有差异)](#5. 分页查询(LIMIT/OFFSET,高频,不同数据库有差异))
[6. 联表查询(JOIN,进阶,高频)](#6. 联表查询(JOIN,进阶,高频))
[7. 子查询(嵌套查询,进阶)](#7. 子查询(嵌套查询,进阶))
[8. 窗口函数(进阶,数据分析高频)](#8. 窗口函数(进阶,数据分析高频))
一、SQL核心分类(先搞懂逻辑,再记语句)
SQL语句按功能可分为4大类,记准分类能快速定位所需语句,避免混乱:
-
DDL(数据定义语言):操作数据库、数据表、索引,核心是「定义结构」(create/drop/alter)
-
DML(数据操作语言):操作数据表中的数据,核心是「增删改」(insert/delete/update)
-
DQL(数据查询语言):查询数据表中的数据,核心是「查」(select,最常用、最核心)
-
DCL(数据控制语言):管理用户、分配权限,核心是「控制访问」(grant/revoke)
二、DDL语句(数据库+数据表+索引操作)
DDL操作会影响数据库/表结构,执行后无法撤销(部分数据库支持事务回滚),操作前建议备份!
1. 数据库操作(高频)
sql
-- 1. 创建数据库(基础写法)
CREATE DATABASE 数据库名;
-- 2. 安全创建(判断是否存在,不存在再创建,推荐)
CREATE DATABASE IF NOT EXISTS 数据库名;
-- 3. 创建数据库并指定字符集(避免乱码,utf8mb4支持Emoji)
CREATE DATABASE IF NOT EXISTS 数据库名 CHARACTER SET utf8mb4;
-- 4. 查看所有数据库
SHOW DATABASES;
-- 5. 切换到指定数据库(操作表前必须执行)
USE 数据库名;
-- 6. 查看当前使用的数据库
SELECT DATABASE();
-- 7. 查看数据库详细信息(字符集、排序规则)
SHOW CREATE DATABASE 数据库名;
-- 8. 修改数据库字符集
ALTER DATABASE 数据库名 CHARACTER SET utf8mb4;
-- 9. 删除数据库(谨慎!会删除库中所有表和数据,不可恢复)
DROP DATABASE 数据库名;
-- 10. 安全删除(判断存在再删除)
DROP DATABASE IF EXISTS 数据库名;
2. 数据表操作(高频)
sql
-- 1. 创建数据表(基础写法,含常用字段类型)
CREATE TABLE 表名 (
字段1 字段类型 [约束],
字段2 字段类型 [约束],
...
);
-- 示例:创建用户表(含主键、非空、默认值约束)
CREATE TABLE IF NOT EXISTS user (
id INT AUTO_INCREMENT PRIMARY KEY, -- 主键,自增(MySQL特有)
username VARCHAR(50) NOT NULL, -- 用户名,非空
age INT DEFAULT 0, -- 年龄,默认值0
gender VARCHAR(10), -- 性别
create_time DATETIME DEFAULT CURRENT_TIMESTAMP -- 创建时间,默认当前时间
);
-- 2. 查看当前数据库所有表
SHOW TABLES;
-- 3. 查看表结构(字段、类型、约束)
DESC 表名;
-- 或查看创建表的完整SQL(更详细)
SHOW CREATE TABLE 表名;
-- 4. 修改表名
ALTER TABLE 表名 RENAME TO 新表名;
-- 5. 给表添加字段
ALTER TABLE 表名 ADD 字段名 字段类型 [约束];
-- 示例:给user表添加phone字段(非空)
ALTER TABLE user ADD phone VARCHAR(20) NOT NULL;
-- 6. 修改字段名
ALTER TABLE 表名 RENAME COLUMN 旧字段名 TO 新字段名;
-- 7. 修改字段类型(注意:修改后需保证原有数据兼容)
ALTER TABLE 表名 MODIFY COLUMN 字段名 新字段类型 [约束];
-- 示例:将user表的age字段改为VARCHAR类型
ALTER TABLE user MODIFY COLUMN age VARCHAR(10);
-- 8. 删除表中的字段
ALTER TABLE 表名 DROP 字段名;
-- 9. 删除数据表(谨慎!会删除表中所有数据)
DROP TABLE 表名;
-- 10. 安全删除数据表
DROP TABLE IF EXISTS 表名;
3. 索引操作(优化查询速度,高频)
sql
-- 1. 创建普通索引(最常用,加速查询)
CREATE INDEX 索引名 ON 表名(字段名);
-- 示例:给user表的username字段创建索引
CREATE INDEX idx_user_username ON user(username);
-- 2. 创建唯一索引(字段值不能重复,兼具去重和加速)
CREATE UNIQUE INDEX 索引名 ON 表名(字段名);
-- 示例:给user表的phone字段创建唯一索引(手机号不能重复)
CREATE UNIQUE INDEX idx_user_phone ON user(phone);
-- 3. 创建复合索引(多字段联合查询时使用,顺序影响效率)
CREATE INDEX 索引名 ON 表名(字段1, 字段2);
-- 示例:给user表的gender和age字段创建复合索引
CREATE INDEX idx_user_gender_age ON user(gender, age);
-- 4. 查看表的所有索引
SHOW INDEX FROM 表名;
-- 5. 删除索引
DROP INDEX 索引名 ON 表名;
三、DML语句(数据增删改,核心高频)
DML操作针对表中的数据,执行后可通过事务回滚(ROLLBACK)撤销,日常开发中使用频率最高!
1. 插入数据(INSERT)
sql
-- 1. 插入单条数据(指定字段,推荐!字段顺序可与表结构不一致)
INSERT INTO 表名 (字段1, 字段2, 字段3, ...) VALUES (值1, 值2, 值3, ...);
-- 示例:给user表插入一条用户数据
INSERT INTO user (username, age, gender, phone) VALUES ('zhangsan', 25, '男', '13800138000');
-- 2. 插入单条数据(不指定字段,需与表结构字段顺序、数量完全一致,不推荐)
INSERT INTO 表名 VALUES (值1, 值2, 值3, ...);
-- 3. 批量插入数据(高效,推荐!MySQL 5.7+、PostgreSQL支持)
INSERT INTO 表名 (字段1, 字段2, ...)
VALUES (值1-1, 值1-2, ...),
(值2-1, 值2-2, ...),
(值3-1, 值3-2, ...);
-- 示例:批量插入3条用户数据
INSERT INTO user (username, age, gender, phone)
VALUES ('lisi', 28, '女', '13900139000'),
('wangwu', 30, '男', '13700137000'),
('zhaoliu', 22, '女', '13600136000');
-- 4. 从其他表查询数据,插入当前表(表间数据迁移)
INSERT INTO 目标表名 (字段1, 字段2, ...)
SELECT 字段1, 字段2, ... FROM 来源表名 WHERE 筛选条件;
-- 示例:将temp_user表中年龄>25的用户,插入到user表
INSERT INTO user (username, age, gender, phone)
SELECT username, age, gender, phone FROM temp_user WHERE age > 25;
2. 修改数据(UPDATE)
sql
-- 1. 条件修改(推荐!只修改满足条件的数据,避免误改全表)
UPDATE 表名 SET 字段1 = 值1, 字段2 = 值2, ... WHERE 筛选条件;
-- 示例:将id=1的用户年龄改为26,性别改为男
UPDATE user SET age = 26, gender = '男' WHERE id = 1;
-- 2. 批量条件修改(结合CASE语句,多条件赋值)
UPDATE 表名
SET 字段 = CASE
WHEN 条件1 THEN 值1
WHEN 条件2 THEN 值2
ELSE 值3
END
WHERE 筛选条件;
-- 示例:根据用户年龄修改等级(age>30为高级,25-30为中级,否则为初级)
UPDATE user
SET level = CASE
WHEN age > 30 THEN '高级'
WHEN age BETWEEN 25 AND 30 THEN '中级'
ELSE '初级'
END;
-- 3. 无条件修改(谨慎!会修改表中所有数据,极少用)
UPDATE 表名 SET 字段1 = 值1, 字段2 = 值2;
3. 删除数据(DELETE / TRUNCATE)
sql
-- 1. 条件删除(推荐!只删除满足条件的数据)
DELETE FROM 表名 WHERE 筛选条件;
-- 示例:删除id=5的用户数据
DELETE FROM user WHERE id = 5;
-- 2. 删除表中所有数据(可回滚,效率较低,保留表结构)
DELETE FROM 表名;
-- 3. 清空表数据(不可回滚,效率极高,保留表结构,不触发DELETE触发器)
TRUNCATE TABLE 表名;
-- 注意:DELETE和TRUNCATE的区别
-- 1. DELETE可加WHERE条件,TRUNCATE不可
-- 2. DELETE可回滚,TRUNCATE不可
-- 3. TRUNCATE会重置自增主键(MySQL),DELETE不会
四、DQL语句(数据查询,最核心、最常用)
DQL语句以SELECT为核心,搭配WHERE、ORDER BY、GROUP BY、JOIN等子句,实现各种查询需求,是日常开发中使用最多的SQL语句,重点掌握!
1. 基础查询(简单查询)
sql
-- 1. 查询表中所有字段(* 代表所有字段,开发中不推荐,效率低)
SELECT * FROM 表名;
-- 2. 查询指定字段(推荐!精准获取所需字段,提高效率)
SELECT 字段1, 字段2, ... FROM 表名;
-- 示例:查询user表的username、age、phone字段
SELECT username, age, phone FROM user;
-- 3. 查询时给字段起别名(AS可省略,简化结果展示)
SELECT 字段1 AS 别名1, 字段2 别名2, ... FROM 表名;
-- 示例:给age字段起别名user_age,username起别名name
SELECT username AS name, age user_age FROM user;
-- 4. 查询去重数据(DISTINCT,去除结果集中重复的记录)
SELECT DISTINCT 字段1, 字段2, ... FROM 表名;
-- 示例:查询user表中所有不重复的性别
SELECT DISTINCT gender FROM user;
2. 条件查询(WHERE子句,高频)
WHERE子句用于筛选满足条件的数据,支持多种运算符,搭配使用更灵活,先记常用运算符:
| 运算符类型 | 具体运算符 | 说明 |
|---|---|---|
| 比较运算符 | = | 等于(注意:NULL不能用=判断) |
| 比较运算符 | >、<、>=、<=、<>(!=) | 大于、小于、大于等于、小于等于、不等于 |
| 逻辑运算符 | AND、OR、NOT | 并且、或者、非(否定条件) |
| 范围运算符 | BETWEEN ... AND ... | 在指定范围内(包含边界值) |
| 集合运算符 | IN、NOT IN | 在/不在指定集合中(简化多个OR条件) |
| 模糊运算符 | LIKE、NOT LIKE | 模糊匹配,%匹配任意字符,_匹配单个字符 |
| 空值判断 | IS NULL、IS NOT NULL | 判断字段是否为NULL(必须用IS,不能用=) |
sql
-- 示例1:单个条件查询(查询年龄=25的用户)
SELECT username, age FROM user WHERE age = 25;
-- 示例2:多个条件查询(AND,年龄>25且性别为男)
SELECT username, age, gender FROM user WHERE age > 25 AND gender = '男';
-- 示例3:多个条件查询(OR,年龄<25或性别为女)
SELECT username, age, gender FROM user WHERE age < 25 OR gender = '女';
-- 示例4:范围查询(BETWEEN,年龄在20-30之间,包含20和30)
SELECT username, age FROM user WHERE age BETWEEN 20 AND 30;
-- 等价于:WHERE age >= 20 AND age <= 30
-- 示例5:集合查询(IN,年龄为22、25、30的用户)
SELECT username, age FROM user WHERE age IN (22, 25, 30);
-- 等价于:WHERE age = 22 OR age = 25 OR age = 30
-- 示例6:模糊查询(LIKE)
SELECT username FROM user WHERE username LIKE '张%'; -- 用户名以"张"开头
SELECT username FROM user WHERE username LIKE '%三'; -- 用户名以"三"结尾
SELECT username FROM user WHERE username LIKE '%李%'; -- 用户名包含"李"
SELECT username FROM user WHERE username LIKE '_丽_'; -- 用户名长度为3,中间是"丽"
-- 示例7:空值查询(IS NULL/IS NOT NULL)
SELECT username FROM user WHERE phone IS NULL; -- 查询手机号为空的用户
SELECT username FROM user WHERE phone IS NOT NULL; -- 查询手机号非空的用户
-- 示例8:否定条件(NOT,年龄不在20-30之间)
SELECT username, age FROM user WHERE NOT age BETWEEN 20 AND 30;
3. 排序查询(ORDER BY,高频)
sql
-- 1. 单列排序(默认升序ASC,可省略)
SELECT 字段1, 字段2 FROM 表名 WHERE 条件 ORDER BY 排序字段 ASC;
-- 示例:查询所有用户,按年龄升序排列(从小到大)
SELECT username, age FROM user ORDER BY age;
-- 2. 单列排序(降序DESC,常用)
SELECT 字段1, 字段2 FROM 表名 WHERE 条件 ORDER BY 排序字段 DESC;
-- 示例:查询所有用户,按年龄降序排列(从大到小)
SELECT username, age FROM user ORDER BY age DESC;
-- 3. 多列排序(先按字段1排序,字段1值相同再按字段2排序)
SELECT 字段1, 字段2 FROM 表名 WHERE 条件 ORDER BY 字段1 ASC, 字段2 DESC;
-- 示例:查询所有用户,先按性别升序,同性别再按年龄降序
SELECT username, gender, age FROM user ORDER BY gender ASC, age DESC;
4. 聚合查询(聚合函数,数据分析常用)
聚合函数用于对数据进行统计分析,常用5个,需搭配GROUP BY使用(无GROUP BY时,默认对全表聚合):
-
COUNT():统计记录条数(最常用)
-
SUM():对数值字段求和
-
AVG():对数值字段求平均值
-
MAX():求字段最大值
-
MIN():求字段最小值
sql
-- 示例1:统计用户总数(COUNT(*),包含NULL值)
SELECT COUNT(*) AS user_total FROM user;
-- 示例2:统计手机号非空的用户数(COUNT(字段),不包含NULL值)
SELECT COUNT(phone) AS user_phone_total FROM user;
-- 示例3:统计所有用户的平均年龄(AVG())
SELECT AVG(age) AS avg_age FROM user;
-- 示例4:统计用户的最大年龄和最小年龄(MAX()、MIN())
SELECT MAX(age) AS max_age, MIN(age) AS min_age FROM user;
-- 示例5:统计所有用户的年龄总和(SUM())
SELECT SUM(age) AS total_age FROM user;
-- 示例6:按性别分组,统计每组的用户数(GROUP BY,核心)
SELECT gender, COUNT(*) AS gender_total FROM user GROUP BY gender;
-- 示例7:按性别分组,统计每组的平均年龄、最大年龄
SELECT gender, AVG(age) AS avg_age, MAX(age) AS max_age FROM user GROUP BY gender;
-- 示例8:分组后筛选(HAVING,注意:HAVING筛选分组结果,WHERE筛选原始数据)
-- 按性别分组,统计每组用户数,只显示用户数>2的分组
SELECT gender, COUNT(*) AS gender_total FROM user GROUP BY gender HAVING gender_total > 2;
5. 分页查询(LIMIT/OFFSET,高频,不同数据库有差异)
分页查询用于限制查询结果条数,实现分页展示(如页面显示10条数据),不同数据库语法不同,重点记MySQL写法:
sql
-- 1. MySQL/PostgreSQL写法(LIMIT 偏移量, 每页条数;偏移量从0开始)
-- 格式:SELECT 字段 FROM 表名 WHERE 条件 ORDER BY 字段 LIMIT 偏移量, 每页条数;
-- 示例1:查询第1页,每页10条数据(偏移量0,跳过0条,取10条)
SELECT username, age FROM user ORDER BY id DESC LIMIT 0, 10;
-- 示例2:查询第2页,每页10条数据(偏移量10,跳过前10条,取10条)
SELECT username, age FROM user ORDER BY id DESC LIMIT 10, 10;
-- 示例3:简化写法(LIMIT 每页条数 OFFSET 偏移量,与上面等价)
SELECT username, age FROM user ORDER BY id DESC LIMIT 10 OFFSET 10;
-- 2. SQL Server写法(TOP)
SELECT TOP 10 username, age FROM user ORDER BY id DESC;
-- 3. Oracle写法(ROWNUM)
SELECT username, age FROM user WHERE ROWNUM <= 10 ORDER BY id DESC;
6. 联表查询(JOIN,进阶,高频)
联表查询用于查询多个关联表的数据(如用户表和订单表),常用4种JOIN,重点掌握内连接和左连接:
sql
-- 先准备两张关联表(示例用)
-- 订单表(order):id(订单ID)、user_id(关联用户表的id)、order_no(订单号)、create_time(创建时间)
CREATE TABLE IF NOT EXISTS `order` (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
order_no VARCHAR(50) NOT NULL,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
-- 外键约束(关联用户表)
FOREIGN KEY (user_id) REFERENCES user(id)
);
-- 1. 内连接(INNER JOIN,最常用):只查询两张表中匹配(关联字段相等)的数据
-- 示例:查询用户的用户名、年龄,以及对应的订单号
SELECT u.username, u.age, o.order_no
FROM user u -- 给user表起别名u
INNER JOIN `order` o -- 给order表起别名o,order是关键字,需用``包裹
ON u.id = o.user_id; -- 关联条件:用户表id = 订单表user_id
-- 2. 左连接(LEFT JOIN):查询左表(user)所有数据,右表(order)匹配不到的显示NULL
-- 示例:查询所有用户,以及他们的订单(没有订单的用户也会显示)
SELECT u.username, u.age, o.order_no
FROM user u
LEFT JOIN `order` o
ON u.id = o.user_id;
-- 3. 右连接(RIGHT JOIN):查询右表(order)所有数据,左表(user)匹配不到的显示NULL
SELECT u.username, u.age, o.order_no
FROM user u
RIGHT JOIN `order` o
ON u.id = o.user_id;
-- 4. 全连接(FULL JOIN):查询两张表所有数据,匹配不到的显示NULL(MySQL不支持,需用UNION替代)
SELECT u.username, u.age, o.order_no
FROM user u
LEFT JOIN `order` o ON u.id = o.user_id
UNION
SELECT u.username, u.age, o.order_no
FROM user u
RIGHT JOIN `order` o ON u.id = o.user_id;
7. 子查询(嵌套查询,进阶)
子查询是将一个查询结果作为另一个查询的条件/数据源,分为单行子查询、多行子查询,简单易懂:
sql
-- 示例1:单行子查询(返回1条结果,用=、>、<等比较运算符)
-- 查询年龄大于平均年龄的用户
SELECT username, age FROM user WHERE age > (SELECT AVG(age) FROM user);
-- 示例2:多行子查询(返回多条结果,用IN、NOT IN等集合运算符)
-- 查询有订单的用户(子查询获取所有有订单的user_id)
SELECT username FROM user WHERE id IN (SELECT DISTINCT user_id FROM `order`);
-- 示例3:子查询作为数据源(将子查询结果作为一张临时表)
-- 查询每个用户的订单数(先子查询统计订单数,再与用户表联表)
SELECT u.username, t.order_count
FROM user u
LEFT JOIN (
SELECT user_id, COUNT(*) AS order_count
FROM `order`
GROUP BY user_id
) t -- 子查询结果起别名t
ON u.id = t.user_id;
8. 窗口函数(进阶,数据分析高频)
窗口函数(Window Function)是SQL进阶必备,核心作用是在不改变原表行数的前提下,对数据进行分组统计、排序排名,区别于GROUP BY(会聚合行数),常用于数据分析、排行榜、TopN等场景,主流数据库(MySQL 8.0+、PostgreSQL、SQL Server)均支持。
窗口函数基本语法:
sql
函数名() OVER (PARTITION BY 分组字段 ORDER BY 排序字段 [窗口范围])
常用窗口函数分类及示例:
sql
-- 一、排名类窗口函数(常用3种,重点掌握)
-- 1. ROW_NUMBER():给每组数据按顺序分配唯一排名,即使值相同,排名也不重复
-- 示例:按性别分组,给用户按年龄降序排名
SELECT
username,
gender,
age,
ROW_NUMBER() OVER (PARTITION BY gender ORDER BY age DESC) AS row_rank
FROM user;
-- 2. RANK():排名可重复,重复排名后会跳过后续排名(如1,1,3)
-- 示例:按性别分组,给用户按年龄降序排名(年龄相同排名相同)
SELECT
username,
gender,
age,
RANK() OVER (PARTITION BY gender ORDER BY age DESC) AS rank_rank
FROM user;
-- 3. DENSE_RANK():排名可重复,重复排名后不跳过后续排名(如1,1,2)
-- 示例:按性别分组,给用户按年龄降序排名(年龄相同排名相同,后续排名连续)
SELECT
username,
gender,
age,
DENSE_RANK() OVER (PARTITION BY gender ORDER BY age DESC) AS dense_rank_rank
FROM user;
-- 二、聚合类窗口函数(复用聚合函数,不聚合行数)
-- 示例1:查询每个用户的信息,以及同性别用户的平均年龄、最大年龄
SELECT
username,
gender,
age,
AVG(age) OVER (PARTITION BY gender) AS avg_gender_age, -- 同性别平均年龄
MAX(age) OVER (PARTITION BY gender) AS max_gender_age -- 同性别最大年龄
FROM user;
-- 示例2:查询每个订单,以及该用户的订单总数、订单最早创建时间
SELECT
o.order_no,
u.username,
o.create_time,
COUNT(o.id) OVER (PARTITION BY o.user_id) AS user_order_total, -- 该用户订单总数
MIN(o.create_time) OVER (PARTITION BY o.user_id) AS first_order_time -- 该用户最早订单时间
FROM `order` o
LEFT JOIN user u ON o.user_id = u.id;
-- 三、偏移类窗口函数(获取相邻行数据,常用2种)
-- 1. LAG(字段, 偏移量, 默认值):获取当前行之前第N行的字段值
-- 2. LEAD(字段, 偏移量, 默认值):获取当前行之后第N行的字段值
-- 示例:查询每个用户的年龄,以及前1个、后1个用户的年龄(按id排序)
SELECT
username,
id,
age,
LAG(age, 1, 0) OVER (ORDER BY id) AS prev_user_age, -- 前1个用户年龄,无则显示0
LEAD(age, 1, 0) OVER (ORDER BY id) AS next_user_age -- 后1个用户年龄,无则显示0
FROM user;
-- 四、窗口范围说明(可选,默认RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-- 简化写法,与上面等价:OVER (PARTITION BY 字段 ORDER BY 字段)
-- 示例:指定窗口范围为"当前行及之前所有行",统计累计年龄
SELECT
username,
age,
SUM(age) OVER (ORDER BY id RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS total_age_acc
FROM user;
注意:窗口函数不能用于WHERE子句(执行顺序问题),若需筛选窗口函数的结果,可将窗口函数查询作为子查询/临时表,再用WHERE筛选。
五、DCL语句(用户+权限管理,运维/管理员常用)
DCL语句主要用于管理数据库用户和权限,日常开发中普通开发者用得少,但管理员必备,重点记常用语句:
sql
-- 1. 用户管理
-- 1.1 创建用户(指定用户名、密码,MySQL 8.0+写法)
CREATE USER '用户名'@'主机地址' IDENTIFIED BY '密码';
-- 示例:创建用户test,密码123456,允许本地访问(localhost)
CREATE USER 'test'@'localhost' IDENTIFIED BY '123456';
-- 允许所有主机访问(%表示任意主机,谨慎使用)
CREATE USER 'test'@'%' IDENTIFIED BY '123456';
-- 1.2 修改用户密码
ALTER USER '用户名'@'主机地址' IDENTIFIED BY '新密码';
-- 示例:修改test用户的密码为654321
ALTER USER 'test'@'localhost' IDENTIFIED BY '654321';
-- 1.3 删除用户
DROP USER '用户名'@'主机地址';
-- 示例:删除test用户(本地访问)
DROP USER 'test'@'localhost';
-- 1.4 查看所有用户(MySQL)
SELECT user, host FROM mysql.user;
-- 2. 权限管理
-- 2.1 授予权限(常用权限:SELECT、INSERT、UPDATE、DELETE、CREATE、DROP)
-- 格式:GRANT 权限1, 权限2 ON 数据库名.表名 TO '用户名'@'主机地址';
-- 示例1:给test用户授予user表的查询、插入、修改权限
GRANT SELECT, INSERT, UPDATE ON test_db.user TO 'test'@'localhost';
-- 示例2:给test用户授予test_db数据库所有表的所有权限(管理员级,谨慎)
GRANT ALL PRIVILEGES ON test_db.* TO 'test'@'localhost';
-- 2.2 查看用户权限
SHOW GRANTS FOR '用户名'@'主机地址';
-- 示例:查看test用户的权限
SHOW GRANTS FOR 'test'@'localhost';
-- 2.3 撤销用户权限
-- 格式:REVOKE 权限1, 权限2 ON 数据库名.表名 FROM '用户名'@'主机地址';
-- 示例:撤销test用户对user表的修改权限
REVOKE UPDATE ON test_db.user FROM 'test'@'localhost';
-- 2.4 刷新权限(授予/撤销权限后,需刷新生效)
FLUSH PRIVILEGES;
六、常用补充语句(高频小技巧)
sql
-- 1. 查看SQL执行计划(优化查询效率,排查慢查询)
EXPLAIN SELECT 字段 FROM 表名 WHERE 条件;
-- 示例:查看用户查询的执行计划
EXPLAIN SELECT username, age FROM user WHERE age > 25;
-- 2. 事务操作(保证DML操作的原子性,要么全成,要么全败)
START TRANSACTION; -- 开启事务
INSERT INTO user (username, age) VALUES ('test1', 20); -- 操作1
UPDATE user SET age = 21 WHERE username = 'test1'; -- 操作2
COMMIT; -- 提交事务(所有操作生效)
-- ROLLBACK; -- 回滚事务(所有操作撤销,出现错误时使用)
-- 3. 拼接字符串(CONCAT函数,MySQL特有)
-- 示例:拼接用户名和年龄,显示为"用户名(年龄)"
SELECT CONCAT(username, '(', age, ')') AS user_info FROM user;
-- 4. 日期函数(常用)
SELECT NOW(); -- 获取当前日期时间(如:2026-03-30 16:30:00)
SELECT CURDATE(); -- 获取当前日期(如:2026-03-30)
SELECT CURTIME(); -- 获取当前时间(如:16:30:00)
SELECT DATE_FORMAT(create_time, '%Y-%m-%d') AS create_date FROM user; -- 格式化日期
-- 5. 条件判断(CASE语句,补充DML中的用法)
SELECT username, age,
CASE
WHEN age < 18 THEN '未成年'
WHEN age BETWEEN 18 AND 35 THEN '青年'
ELSE '中年'
END AS age_group
FROM user;
七、避坑提醒(新手必看)
-
- 关键字不能作为表名/字段名(如order、user、select),若必须使用,需用``(反引号)包裹(MySQL)。
-
- 字符串类型的值必须用单引号包裹(如'男'、'zhangsan'),数值类型不需要。
-
- NULL值不能用=、!=判断,必须用IS NULL、IS NOT NULL。
-
- UPDATE、DELETE语句必须加WHERE条件,否则会修改/删除全表数据(灾难级错误)。
-
- 联表查询时,关联条件(ON)不能少,否则会出现笛卡尔积(数据量暴增)。
-
- 聚合函数(COUNT、SUM等)不能直接和普通字段一起查询,需搭配GROUP BY。
八、总结
以上就是SQL常用语句的全部内容,覆盖了从基础到进阶的所有高频场景,无论是新手入门练习,还是老手日常速查,都能满足需求。建议收藏本文,遇到SQL相关问题,直接复制示例修改使用,效率翻倍!
如果觉得本文有用,欢迎点赞+收藏+关注,助力大家提升后端开发效率~