MySQL SQL
SQL 通用语法
- SQL 语句可以单行或多行编写,以
分号结尾。 - SQL 中应使用空格来格式化语句,提高可读性。
- SQL 语句大小写不敏感,但建议使用大写。
- 注释:
- 单行注释:
--、# - 多行注释:
/* */
- 单行注释:
SQL 分类
| 分类 | 全称 | 描述 |
|---|---|---|
| DDL | Data Definition Language | 数据定义语言,用于定义数据库对象,如表、索引、视图、存储过程、函数等 |
| DML | Data Manipulation Language | 数据操作语言,用于对数据库中的数据进行增删改 |
| DQL | Data Query Language | 数据查询语言,用于查询数据库中的数据 |
| DCL | Data Control Language | 数据控制语言,用于控制数据库的访问权限 |
DDL
操作数据库
| 功能 | SQL 语法 | 描述 |
|---|---|---|
| 查询 | SHOW DATABASES; | 查询全部数据库 |
| 查询 | SELECT DATABASE(); | 查询当前数据库 |
| 创建 | CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARACTER SET 字符集] [COLLATE 排序规则]; | [如果数据库不存在],则创建数据库,[并指定字符集]和[排序规则] |
| 删除 | DROP DATABASE [IF EXISTS] 数据库名; | [如果数据库存在],则删除数据库 |
| 使用 | USE 数据库名; | 使用数据库/切换到指定数据库 |
▼sql复制代码MySQL> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | MySQL | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)
▼sql复制代码MySQL> CREATE DATABASE MySQL_study; Query OK, 1 row affected (0.02 sec) MySQL> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | MySQL | | MySQL_study | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) -- 不能创建同名的数据库 MySQL> CREATE DATABASE MySQL_study; -- ERROR 1007 (HY000): Can't create database 'MySQL_study'; database exists -- 使用 IF NOT EXISTS 创建数据库更加安全,只有当数据库不存在时才创建 MySQL> CREATE DATABASE IF NOT EXISTS MySQL_study; Query OK, 1 row affected, 1 warning (0.00 sec) -- 创建数据库,并指定字符集 -- 推荐使用 utf8mb4,不要使用 utf8mb3,utf8mb3 最大长度是 3 个字节,utf8mb4 最大长度是 4 个字节,能兼容更多的字符 MySQL> CREATE DATABASE IF NOT EXISTS MySQL_study01 DEFAULT CHARACTER SET utf8mb4; Query OK, 1 row affected (0.00 sec)
▼sql复制代码MySQL> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | MySQL | | MySQL_study | | MySQL_study01 | | performance_schema | | sys | +--------------------+ 6 rows in set (0.00 sec) -- 使用 IF EXISTS 安全删除数据库 MySQL> DROP DATABASE IF EXISTS MySQL_study01; Query OK, 0 rows affected (0.00 sec) MySQL> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | MySQL | | MySQL_study | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)
▼sql复制代码-- 切换至 MySQL_study 数据库 MySQL> USE MySQL_study; Database changed -- 显示当前数据库 MySQL> SELECT DATABASE(); +-------------+ | DATABASE() | +-------------+ | MySQL_study | +-------------+ 1 row in set (0.00 sec)
操作表
| 功能 | SQL 语法 | 描述 |
|---|---|---|
| 查询 | SHOW TABLES; | 查询当前数据库中的所有表 |
| 查询 | DESC 表名; | 查询表结构 |
| 查询 | SHOW CREATE TABLE 表名; | 查询创建表语句 |
▼sql复制代码-- 数据库中没有表 MySQL> SHOW TABLES; Empty set (0.00 sec)、 -- 切换至 sys 数据库再查询 MySQL> USE sys; Database changed MySQL> SHOW TABLES; +-----------------------------------------------+ | Tables_in_sys | +-----------------------------------------------+ | host_summary | -- ...... | x$waits_global_by_latency | +-----------------------------------------------+ 101 rows in set (0.01 sec)
创建表
建表语句格式:
▼sql复制代码CREATE TABLE [表名]( 字段1 字段类型 [注释], ...... 字段n 字段类型 [注释] )[注释];
▼sql复制代码-- 切换数据库 MySQL> USE MySQL_study; Database changed -- 查询数据库中的表 MySQL> SHOW TABLES; Empty set (0.00 sec) -- 创建表 MySQL> CREATE TABLE tb_user( -> id INT COMMENT '编号', -> name VARCHAR(32) COMMENT '姓名', -> age INT COMMENT '年龄', -> gender VARCHAR(1) COMMENT '性别' -> ) COMMENT '用户表'; Query OK, 0 rows affected (0.02 sec) -- 再次查询数据库中的表 MySQL> SHOW TABLES; +-----------------------+ | Tables_in_MySQL_study | +-----------------------+ | tb_user | +-----------------------+ 1 row in set (0.00 sec)
▼sql复制代码-- 查询表结构 MySQL> DESC tb_user; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | id | int | YES | | NULL | | | name | varchar(32) | YES | | NULL | | | age | int | YES | | NULL | | | gender | varchar(1) | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
▼sql复制代码-- 查看建表语句 MySQL> SHOW CREATE TABLE tb_user; +---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | tb_user | CREATE TABLE `tb_user` ( `id` int DEFAULT NULL COMMENT '编号', `name` varchar(32) DEFAULT NULL COMMENT '姓名', `age` int DEFAULT NULL COMMENT '年龄', `gender` varchar(1) DEFAULT NULL COMMENT '性别' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表' | +---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) -- 存储引擎:ENGINE=InnoDB -- 默认字符编码:CHARSET=utf8mb4 -- 默认排序规则:COLLATE=utf8mb4_0900_ai_ci
修改表
| 功能 | 语法 | 描述 |
|---|---|---|
| 添加 | ALTER TABLE 表名 ADD 列名 新数据类型 [COMMENT 注释] [约束] | 添加新的列 |
| 修改 | ALTER TABLE 表名 MODIFY 列名 新数据类型 | 修改列的数据类型 |
| 修改 | ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型 [COMMENT 注释] [约束] | 修改列的名称和数据类型 |
| 删除 | ALTER TABLE 表名 DROP 列名 | 删除列 |
| 修改 | ALTER TABLE 表名 RENAME TO 新表名 | 修改表名 |
| 删除 | DROP TABLE [IF EXISTS] 表名; | 删除表 |
| 删除 | TRUNCATE TABLE 表名; | 清空表 |
▼sql复制代码MySQL> ALTER TABLE tb_employee ADD nick_name VARCHAR(10) COMMENT '昵称'; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 MySQL> DESC tb_employee; +-----------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+------------------+------+-----+---------+-------+ | id | int | YES | | NULL | | | work_no | varchar(10) | YES | | NULL | | | name | varchar(10) | YES | | NULL | | | gender | char(1) | YES | | NULL | | | age | tinyint unsigned | YES | | NULL | | | id_card | char(18) | YES | | NULL | | | join_date | date | YES | | NULL | | | nick_name | varchar(10) | YES | | NULL | | +-----------+------------------+------+-----+---------+-------+ 8 rows in set (0.00 sec)
▼sql复制代码MySQL> ALTER TABLE tb_employee CHANGE nick_name user_name VARCHAR(20) COMMENT '用户名'; Query OK, 0 rows affected (0.73 sec) Records: 0 Duplicates: 0 Warnings: 0 MySQL> DESC tb_employee; +-----------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+------------------+------+-----+---------+-------+ | id | int | YES | | NULL | | | work_no | varchar(10) | YES | | NULL | | | name | varchar(10) | YES | | NULL | | | gender | char(1) | YES | | NULL | | | age | tinyint unsigned | YES | | NULL | | | id_card | char(18) | YES | | NULL | | | join_date | date | YES | | NULL | | | user_name | varchar(20) | YES | | NULL | | +-----------+------------------+------+-----+---------+-------+
▼sql复制代码MySQL> ALTER TABLE tb_employee DROP user_name; Query OK, 0 rows affected (0.33 sec) Records: 0 Duplicates: 0 Warnings: 0 MySQL> DESC tb_employee; +-----------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+------------------+------+-----+---------+-------+ | id | int | YES | | NULL | | | work_no | varchar(10) | YES | | NULL | | | name | varchar(10) | YES | | NULL | | | gender | char(1) | YES | | NULL | | | age | tinyint unsigned | YES | | NULL | | | id_card | char(18) | YES | | NULL | | | join_date | date | YES | | NULL | | +-----------+------------------+------+-----+---------+-------+ 7 rows in set (0.00 sec)
▼sql复制代码MySQL> ALTER TABLE tb_employee RENAME TO tb_empl; Query OK, 0 rows affected (0.48 sec) MySQL> SHOW TABLES; +-----------------------+ | Tables_in_MySQL_study | +-----------------------+ | tb_empl | | tb_user | +-----------------------+ 2 rows in set (0.00 sec)
▼sql复制代码-- 删除表 MySQL> DROP TABLE IF EXISTS tb_user; Query OK, 0 rows affected (0.05 sec) MySQL> SHOW TABLES; +-----------------------+ | Tables_in_MySQL_study | +-----------------------+ | tb_empl | +-----------------------+ 1 row in set (0.00 sec) -- 清空表 MySQL> TRUNCATE TABLE tb_empl; Query OK, 0 rows affected (0.01 sec) MySQL> SHOW TABLES; +-----------------------+ | Tables_in_MySQL_study | +-----------------------+ | tb_empl | +-----------------------+ 1 row in set (0.00 sec)
数据类型
数值
| 类型 | 大小 | 有符号(SIGNED)范围 | 无符号(UNSIGNED)范围 | 描述 |
|---|---|---|---|---|
| TINYINT | 1字节 | -128~127 | 0~255 | 8位整数 |
| SMALLINT | 2字节 | -32768~32767 | 0~65535 | 16位整数 |
| MEDIUMINT | 3字节 | -8388608~8388607 | 0~16777215 | 24位整数 |
| INT / INTEGER | 4字节 | -2147483648~2147483647 | 0~4294967295 | 32位整数 |
| BIGINT | 8字节 | -9223372036854775808~9223372036854775807 | 0~18446744073709551615 | 64位整数 |
| FLOAT | 4字节 | -3.402823466E+38~3.402823466E+38 | 0~3.402823466E+38 | 单精度浮点数 |
| DOUBLE | 8字节 | -1.7976931348623157E+308~1.7976931348623157E+308 | 0~1.7976931348623157E+308 | 双精度浮点数 |
| DECIMAL(M,D) | 可变长度 | -10^(M-D)~10^(M-D) | 0~10^M | 高精度浮点数 |
字符串
| 类型 | 大小 | 描述 |
|---|---|---|
| CHAR | 0-255字节 | 定长字符串 |
| VARCHAR | 0-65535字节 | 变长字符串 |
| TINYBLOB | 0-255字节 | 二进制字符串 |
| TINYTEXT | 0-255字节 | 文本字符串 |
| BLOB | 0-65535字节 | 二进制字符串 |
| TEXT | 0-65535字节 | 文本字符串 |
| MEDIUMBLOB | 0-16777215字节 | 二进制字符串 |
| MEDIUMTEXT | 0-16777215字节 | 文本字符串 |
| LONGBLOB | 0-4294967295字节 | 二进制字符串 |
| LONGTEXT | 0-4294967295字节 | 文本字符串 |
日期时间
| 类型 | 大小 | 范围 | 格式 | 描述 |
|---|---|---|---|---|
| DATE | 3字节 | 1000-9999年1-12月1-31日 | YYYY-MM-DD | 日期 |
| TIME | 3字节 | 00:00:00-23:59:59 | HH:MM:SS | 时间 |
| YEAR | 1字节 | 1901-2155 | YYYY | 年 |
| DATETIME | 8字节 | 1000-9999年1-12月1-31日 00:00:00-23:59:59 | YYYY-MM-DD HH:MM:SS | 日期和时间 |
| TIMESTAMP | 4字节 | 1970-01-01 00:00:01到2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 时间戳 |
练习
▼sql复制代码MySQL> CREATE TABLE IF NOT EXISTS tb_employee( -> id INT COMMENT '员工编号', -> work_no VARCHAR(10) COMMENT '工号', -> name VARCHAR(10) COMMENT '姓名', -> gender CHAR(1) COMMENT '性别', -> age TINYINT UNSIGNED COMMENT '年龄', -> id_card CHAR(18) COMMENT '身份证号', -> join_date DATE COMMENT '入职日期' -> ) COMMENT '员工表'; Query OK, 0 rows affected (0.01 sec) MySQL> SHOW TABLES; +-----------------------+ | Tables_in_MySQL_study | +-----------------------+ | tb_employee | | tb_user | +-----------------------+ 2 rows in set (0.00 sec) MySQL> DESC tb_employee; +-----------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+------------------+------+-----+---------+-------+ | id | int | YES | | NULL | | | work_no | varchar(10) | YES | | NULL | | | name | varchar(10) | YES | | NULL | | | gender | char(1) | YES | | NULL | | | age | tinyint unsigned | YES | | NULL | | | id_card | char(18) | YES | | NULL | | | join_date | date | YES | | NULL | | +-----------+------------------+------+-----+---------+-------+ 7 rows in set (0.00 sec)
图形化界面工具
- Sqlyog
- Navicat
- DataGrip(推荐)
DataGrip
- 连接数据库:+ -> Data Source -> MySQL -> 填写连接信息 -> 下载驱动 -> 测试连接 -> OK
- 创建数据库:右键连接 -> New -> Schema -> 填写数据库名称 -> OK
- 创建表结构:右键数据库 -> New -> Table -> 填写表结构 -> Execute
- 修改表结构:右键表 -> Modify Table -> 修改表结构 -> Execute
DML
DML: Data Manipulation Language,用于对数据库中表的数据进行操作,包括增加、删除、修改,分别对应三个命令:INSERT、DELETE、UPDATE
INSERT
-
添加指定字段
INSERT INTO 表名(字段1,字段2,...) VALUES (值1, 值2, ...); -
添加所有字段
INSERT INTO 表名 VALUES (值1, 值2, ...); -
添加多行数据:
INSERT INTO 表名 VALUES (值1, 值2, ...),(值1, 值2, ...),(值1, 值2, ...);
注意
- 添加数据时,
值的个数和字段的个数、顺序一致 - 字符串和日期类型的值需要用
单引号括起来 - 值的大小必须在字段的大小范围内
示例
▼sql复制代码-- 指定字段添加数据 INSERT INTO tb_employee(id, work_no, name, gender, age, id_card, join_date) VALUES (1, '1', '张三', '男', 12, '123456789011121314', '20251104'); -- 添加所有字段 INSERT INTO tb_employee VALUES (2, '2', '李四', '男', 13, '123456789011121315', '20251104'); -- 添加多行数据 INSERT INTO tb_employee VALUES (3, '3', '王五', '男', 14, '123456789011121316', '20251104'), (4, '4', '赵六', '男', 15, '123456789011121317', '20251104'), (5, '5', '孙七', '男', 16, '123456789011121318', '20251104');
UPDATE
UPDATE 表名 SET 字段1 = 值1, 字段2 = 值2,...... [WHERE 条件];
注意
- 如果没有
WHERE条件,则更新所有数据
示例
▼sql复制代码-- 将 id 为 1 的员工的年龄 +1 UPDATE tb_employee SET age = age + 1 WHERE id = 1; -- 将 id 为 1 的员工的年龄 +1 并把性别修改为 女 UPDATE tb_employee SET age = age + 1, gender = '女' WHERE id = 1; -- 将所有员工的入职时间修改为 2025-01-01 UPDATE tb_employee SET join_date = '2025-01-01';
DELETE
DELETE FROM 表名 [WHERE 条件];
注意
- 如果没有
WHERE条件,则删除所有数据 - 删除语句是删除整条数据,而不是删除字段的值,如果删除字段的值,则需要使用
UPDATE语句
示例
▼sql复制代码-- 删除女员工 DELETE FROM tb_employee WHERE gender = '女'; -- 删除所有员工 DELETE FROM tb_employee;
DQL
DQL: Data Query Language,用于对数据库进行查询,对应命令:SELECT
SELECT
SELECT 字段 FROM 表名 [WHERE 条件] [GROUP BY 分组字段] [HAVING 分组条件] [ORDER BY 排序字段 [ASC | DESC]] [LIMIT 开始索引, 获取数量];
基本查询
- 查询指定字段
SELECT 字段1, 字段2,... FROM 表名; - 查询所有字段
SELECT * FROM 表名; - 设置别名
SELECT 字段1 AS 别名1, 字段2 AS 别名2,... FROM 表名; - 去重
SELECT DISTINCT 字段1, 字段2,... FROM 表名;
基本查询示例
▼sql复制代码-- 基本查询 -- 1. 查询指定字段,姓名和年龄 SELECT name, age FROM tb_employee; -- 2. 查询全部字段(尽量不使用,使用 * 号无法直观的看出查询了哪些字段) SELECT * FROM tb_employee; -- 可以直观看出查询了哪些字段 SELECT id, work_no, name, gender, age, id_card, work_address, join_date FROM tb_employee; -- 3. 别名 SELECT work_address AS '工作地址' FROM tb_employee; -- AS 可省略 SELECT work_address '工作地址' FROM tb_employee; -- 4. 去重 SELECT DISTINCT work_address AS '工作地址' FROM tb_employee;
条件查询
- 在基础查询的基础上,使用
WHRER关键字添加条件,多个条件之间使用逻辑运算符进行连接SELECT 字段 FROM 表名 WHERE 条件列表;
运算符
- 比较运算符
| 运算符 | 描述 |
|---|---|
| = | 等于 |
| <> 、!= | 不等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| BETWEEN ... AND ... | 区间查询 |
| IN(...) | 集合查询 |
| LIKE 占位符 | 模糊查询(_ 表示任意一个字符,% 表示任意多个字符) |
| IS NULL | 空 |
- 逻辑运算符
| 运算符 | 描述 |
|---|---|
| AND、&& | 与 |
| OR、|| | 或 |
| NOT、 ! | 非 |
条件查询示例
▼sql复制代码-- 条件查询 -- 1. 查询年龄为 22 的员工 SELECT * FROM tb_employee WHERE age = 22; -- 2. 查询年龄大于 22 的员工 SELECT * FROM tb_employee WHERE age > 22; -- 3. 查询年龄大于等于 22 的员工 SELECT * FROM tb_employee WHERE age >= 22; -- 4. 查询没有身份证号的员工 SELECT * FROM tb_employee WHERE id_card IS NULL; -- 5. 查询有身份证号的员工 SELECT * FROM tb_employee WHERE id_card IS NOT NULL; -- 6. 查询年龄不是 22 的员工 SELECT * FROM tb_employee WHERE age != 22; SELECT * FROM tb_employee WHERE age <> 22; -- 7. 查询年龄在 22 和 24 之间的员工 SELECT * FROM tb_employee WHERE age >= 22 AND age <= 24; -- 使用 BETWEEN SELECT * FROM tb_employee WHERE AGE BETWEEN 22 AND 24; -- ,BETWEEN 后的值为 最小值,最大值和最小值的位置不可颠倒 SELECT * FROM tb_employee WHERE AGE BETWEEN 24 AND 22; -- 8,查询性别为女且年龄小于 22 的员工 SELECT * FROM tb_employee WHERE gender = '女' AND age < 22; -- 9,查询年龄为 22 或 24 的员工 SELECT * FROM tb_employee WHERE age = 22 OR age = 24; -- 使用 IN SELECT * FROM tb_employee WHERE age IN (22, 24); -- 10, 查询名字是两个字的员工 SELECT * FROM tb_employee WHERE name LIKE '__'; -- 11. 查询身份证号最后一位是 3 的员工 SELECT * FROM tb_employee WHERE id_card LIKE '%3'; -- 一个 _ 匹配一个字符,需要 17 个 SELECT * FROM tb_employee WHERE id_card LIKE '_________________3';
聚合函数
| 函数 | 描述 |
|---|---|
| COUNT(字段) | 计算字段非空的行数 |
| SUM(字段) | 计算字段的和 |
| AVG(字段) | 计算字段的平均值 |
| MAX(字段) | 获取字段的最大值 |
| MIN(字段) | 获取字段的最小值 |
聚合函数示例
▼sql复制代码-- 聚合函数 -- 1. 统计员工个数 -- 使用全部字段统计个数 SELECT COUNT(*) FROM tb_employee; -- 使用 id 统计个数 SELECT COUNT(id) FROM tb_employee; -- 使用 id_card 统计个数,因为有一个员工的 id_card 是 null, 所以不会被统计在内 SELECT COUNT(id_card) FROM tb_employee; -- 2, 求平均年龄 SELECT AVG(age) FROM tb_employee; -- 3. 求最大年龄 SELECT MAX(age) FROM tb_employee; -- 4. 求最小年龄 SELECT MIN(age) FROM tb_employee; -- 5. 求上海员工的年龄和 SELECT SUM(age) FROM tb_employee WHERE work_address = '上海';
分组查询
-
分组查询就是在基础查询的基础上,使用
GROUP BY分组,多个分组之间使用,进行连接,且分组后仍可以使用 HAVING 进行条件查询SELECT 字段 FROM 表名 [WHERE 条件] [GROUP BY 分组字段] [HAVING 分组后过滤条件]; -
WHERE 和 HAVING 的区别
- WHERE:在分组前过滤数据,被过滤的数据不会参与分组,不可用聚合函数
- HAVING:在分组后过滤数据,且可以使用聚合函数
-
分组查询时,所返回的字段,只能返回
用于分组的字段和聚合函数
分组查询示例
▼sql复制代码-- 分组查询 -- 1. 统计男、女员工的个数 SELECT gender, COUNT(*) AS '人数' FROM tb_employee GROUP BY gender; -- 2. 统计男、女员工的平均年龄 SELECT gender, AVG(age) AS '平均年龄' FROM tb_employee GROUP BY gender; -- 3. 查询年龄小于 24 的员工,并根据工作地址分组,获取人数大于 1 的工作地址 SELECT work_address, COUNT(work_address) FROM tb_employee WHERE age < 24 GROUP BY work_address HAVING COUNT(work_address) > 1; -- 使用别名 SELECT work_address, COUNT(work_address) AS address_count FROM tb_employee WHERE age < 24 GROUP BY work_address HAVING address_count > 1;
排序查询
-
排序查询就是在基础查询的基础上,使用
ORDER BY排序,多个排序之间使用,进行连接SELECT 字段 FROM 表名 [WHERE 筛选条件] [ORDER BY 排序字段 [ASC | DESC]]; -
排序规则
- ASC:升序(默认)
- DESC:降序
-
排序时要注意该字段的类型,数值类型排序时,会按照数值大小排序,字符串类型排序时,会按照字符串字典序排序,如:
20 > 3,但是'20' < '3'
排序查询示例
▼sql复制代码-- 排序查询 -- 1. 年龄升序 -- 默认升序,ASC 可省略 SELECT * FROM tb_employee ORDER BY age; -- 降序 SELECT * FROM tb_employee ORDER BY age DESC; -- 2. 根据工号降序 SELECT * FROM tb_employee ORDER BY work_no DESC; -- 3. 先按年龄升序排序,若年龄相同,按照工号降序排序 SELECT * FROM tb_employee ORDER BY age, work_no DESC;
分页排序
-
分页查询就是在基础查询的基础上,使用
LIMIT分页SELECT 字段 FROM 表名 [WHERE 筛选条件] [ORDER BY 排序字段 [ASC | DESC]] [LIMIT 开始索引, 获取数量]; -
开始索引 = (当前页 - 1) * 获取数量
-
LIMIT 在其他数据库中不支持
分页排序示例
▼sql复制代码-- 分页查询 -- 1. 每页显示 2 条数据,查询第 1 页的数据 -- LIMIT 0, 2 0 可省略 SELECT * FROM tb_employee LIMIT 2; -- 2. 每页显示 2 条数据,查询第 3 页的数据 -- 开始索引 = (当前页 - 1) * 获取数量 = (3 - 1) * 2 = 4 SELECT * FROM tb_employee LIMIT 4, 2;
综合练习
▼sql复制代码-- 练习 -- 1. 查询年龄为 22 24 的女性员工 SELECT * FROM tb_employee WHERE age IN (22, 24) AND gender = '女'; -- 2. 查询年龄在 22 ~ 24 的男员工 SELECT * FROM tb_employee WHERE age BETWEEN 22 AND 24 AND gender = '男'; -- 3. 统计年龄小于 23 的男、女员工个数 SELECT gender, count(gender) AS '人数' FROM tb_employee WHERE age < 23 GROUP BY gender; -- 4. 查询年龄小于 23 员工姓名和年龄,并按年龄进行升序排序,如果年龄相同,按照工号降序排序 SELECT name, age FROM tb_employee WHERE age < 23 ORDER BY age, work_no DESC; -- 5. 查询性别为女,年龄在 20 ~ 23 之间的前 4 个员工,并按年龄进行升序排序,如果年龄相同,按照工号降序排序 SELECT * FROM tb_employee WHERE gender = '女' AND age BETWEEN 20 AND 23 ORDER BY age, work_no DESC LIMIT 4;
DCL
DCL(Data Control Language)数据控制语言,用于对数据库的权限进行控制
用户管理
- 查询用户
USE MySQL; SELECT * FROM user;
- 创建用户
CREATE USER '用户名'@'主机' IDENTIFIED BY '密码';
- 修改用户密码
ALTER USER '用户名'@'主机' IDENTIFIED WITH caching_sha2_password BY '密码';
- 删除用户
DROP USER '用户名'@'主机';
用户管理示例
▼sql复制代码USE MySQL; SELECT * FROM user; -- 1. 创建用户给 admin,只能在当前主机访问 MySQL -- 该用户只能访问 MySQL,不能访问其他数据库 CREATE USER 'admin'@'localhost' IDENTIFIED BY '123456'; -- 2. 创建用户给 admin1,可以在任意主机访问 MySQL CREATE USER 'admin1'@'%' IDENTIFIED BY '123456'; -- 3. 修改密码 -- MySQL 8.0 使用 caching_sha2_password ALTER USER 'admin1'@'%' IDENTIFIED WITH caching_sha2_password BY '1234'; -- 4. 删除用户 DROP USER 'admin1'@'%';
权限控制
| 权限名称 | 权限描述 |
|---|---|
| ALL、ALL PRIVILEGES | 所有权限 |
| SELECT | 查询权限 |
| INSERT | 插入权限 |
| UPDATE | 更新权限 |
| DELETE | 删除权限 |
| ALTER | 修改权限 |
| DROP | 删除权限 |
| CREATE | 创建权限 |
- 查询用户权限
SHOW GRANTS FOR '用户名'@'主机';
- 授权
GRANT 权限名称 ON 数据库.表 TO '用户名'@'主机';
- 撤销授权
REVOKE 权限名称 ON 数据库.表 FROM '用户名'@'主机';
权限控制示例
▼sql复制代码USE MySQL; SELECT * FROM user; -- 1. 查询权限 SHOW GRANTS FOR 'admin'@'localhost'; -- 2. 授权 GRANT ALL ON MySQL_study.tb_employee TO 'admin'@'localhost'; -- 3. 撤销权限 REVOKE ALL ON MySQL_study.tb_employee FROM 'admin'@'localhost';
