MySQL SQL

SQL 通用语法

  1. SQL 语句可以单行或多行编写,以分号结尾。
  2. SQL 中应使用空格来格式化语句,提高可读性。
  3. SQL 语句大小写不敏感,但建议使用大写。
  4. 注释:
    • 单行注释:--#
    • 多行注释:/* */

SQL 分类

分类全称描述
DDLData Definition Language数据定义语言,用于定义数据库对象,如表、索引、视图、存储过程、函数等
DMLData Manipulation Language数据操作语言,用于对数据库中的数据进行增删改
DQLData Query Language数据查询语言,用于查询数据库中的数据
DCLData 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)范围描述
TINYINT1字节-128~1270~2558位整数
SMALLINT2字节-32768~327670~6553516位整数
MEDIUMINT3字节-8388608~83886070~1677721524位整数
INT / INTEGER4字节-2147483648~21474836470~429496729532位整数
BIGINT8字节-9223372036854775808~92233720368547758070~1844674407370955161564位整数
FLOAT4字节-3.402823466E+38~3.402823466E+380~3.402823466E+38单精度浮点数
DOUBLE8字节-1.7976931348623157E+308~1.7976931348623157E+3080~1.7976931348623157E+308双精度浮点数
DECIMAL(M,D)可变长度-10^(M-D)~10^(M-D)0~10^M高精度浮点数

字符串

类型大小描述
CHAR0-255字节定长字符串
VARCHAR0-65535字节变长字符串
TINYBLOB0-255字节二进制字符串
TINYTEXT0-255字节文本字符串
BLOB0-65535字节二进制字符串
TEXT0-65535字节文本字符串
MEDIUMBLOB0-16777215字节二进制字符串
MEDIUMTEXT0-16777215字节文本字符串
LONGBLOB0-4294967295字节二进制字符串
LONGTEXT0-4294967295字节文本字符串

日期时间

类型大小范围格式描述
DATE3字节1000-9999年1-12月1-31日YYYY-MM-DD日期
TIME3字节00:00:00-23:59:59HH:MM:SS时间
YEAR1字节1901-2155YYYY
DATETIME8字节1000-9999年1-12月1-31日 00:00:00-23:59:59YYYY-MM-DD HH:MM:SS日期和时间
TIMESTAMP4字节1970-01-01 00:00:01到2038-01-19 03:14:07YYYY-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)

图形化界面工具

  1. Sqlyog
  2. Navicat
  3. DataGrip(推荐)

DataGrip

  1. 连接数据库:+ -> Data Source -> MySQL -> 填写连接信息 -> 下载驱动 -> 测试连接 -> OK
  2. 创建数据库:右键连接 -> New -> Schema -> 填写数据库名称 -> OK
  3. 创建表结构:右键数据库 -> New -> Table -> 填写表结构 -> Execute
  4. 修改表结构:右键表 -> Modify Table -> 修改表结构 -> Execute

DML

DML: Data Manipulation Language,用于对数据库中表的数据进行操作,包括增加删除修改,分别对应三个命令:INSERTDELETEUPDATE

INSERT

  1. 添加指定字段

    INSERT INTO 表名(字段1,字段2,...) VALUES (值1, 值2, ...);

  2. 添加所有字段

    INSERT INTO 表名 VALUES (值1, 值2, ...);

  3. 添加多行数据:

    INSERT INTO 表名 VALUES (值1, 值2, ...),(值1, 值2, ...),(值1, 值2, ...);

注意

  1. 添加数据时,的个数和字段的个数、顺序一致
  2. 字符串和日期类型的值需要用单引号括起来
  3. 值的大小必须在字段的大小范围内

示例

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 条件];

注意

  1. 如果没有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 条件];

注意

  1. 如果没有WHERE条件,则删除所有数据
  2. 删除语句是删除整条数据,而不是删除字段的值,如果删除字段的值,则需要使用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 开始索引, 获取数量];

基本查询

  1. 查询指定字段

    SELECT 字段1, 字段2,... FROM 表名;

  2. 查询所有字段

    SELECT * FROM 表名;

  3. 设置别名

    SELECT 字段1 AS 别名1, 字段2 AS 别名2,... FROM 表名;

  4. 去重

    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;

条件查询

  1. 在基础查询的基础上,使用 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 = '上海';

分组查询

  1. 分组查询就是在基础查询的基础上,使用 GROUP BY 分组,多个分组之间使用 , 进行连接,且分组后仍可以使用 HAVING 进行条件查询

    SELECT 字段 FROM 表名 [WHERE 条件] [GROUP BY 分组字段] [HAVING 分组后过滤条件];

  2. WHERE 和 HAVING 的区别

    • WHERE:在分组前过滤数据,被过滤的数据不会参与分组,不可用聚合函数
    • HAVING:在分组后过滤数据,且可以使用聚合函数
  3. 分组查询时,所返回的字段,只能返回用于分组的字段聚合函数

分组查询示例

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;

排序查询

  1. 排序查询就是在基础查询的基础上,使用 ORDER BY 排序,多个排序之间使用 , 进行连接

    SELECT 字段 FROM 表名 [WHERE 筛选条件] [ORDER BY 排序字段 [ASC | DESC]];

  2. 排序规则

    • ASC:升序(默认)
    • DESC:降序
  3. 排序时要注意该字段的类型,数值类型排序时,会按照数值大小排序,字符串类型排序时,会按照字符串字典序排序,如: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;

分页排序

  1. 分页查询就是在基础查询的基础上,使用 LIMIT 分页

    SELECT 字段 FROM 表名 [WHERE 筛选条件] [ORDER BY 排序字段 [ASC | DESC]] [LIMIT 开始索引, 获取数量];

  2. 开始索引 = (当前页 - 1) * 获取数量

  3. 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)数据控制语言,用于对数据库的权限进行控制

用户管理

  1. 查询用户

    USE MySQL; SELECT * FROM user;

  2. 创建用户

    CREATE USER '用户名'@'主机' IDENTIFIED BY '密码';

  3. 修改用户密码

    ALTER USER '用户名'@'主机' IDENTIFIED WITH caching_sha2_password BY '密码';

  4. 删除用户

    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创建权限
  1. 查询用户权限

    SHOW GRANTS FOR '用户名'@'主机';

  2. 授权

    GRANT 权限名称 ON 数据库.表 TO '用户名'@'主机';

  3. 撤销授权

    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';
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP