当前位置: 首页 > news >正文

SQL通用语法和注释,SQL语句分类(DDL,DML,DQL,DCL)及案例

目录

SQL通用语法和注释

SQL语句分类(DDL,DML,DQL,DCL,TPL,CCL)

DDL(数据定义语言)

数据库操作

查询(SHOW、SELECT)

创建(CREATE)

删除(DROP)

使用(USE)

表操作

查询(SHOW、DESC)

创建(CREATE)

修改(ALTER)

删除(DROP)

DML(数据操作语言)

添加数据(INSERT)

修改数据(UPDATE)

删除数据(DELETE)

DQL(数据查询语言)

DQL执行顺序

基本查询

条件查询(WHERE),比较运算符,逻辑运算符

分组查询(GROUP BY)和 聚合函数

聚合函数(count、max、min、avg、sum)

分组查询(GROUP BY)

排序查询(ORDER BY)

分页查询(LIMIT)

案例

DCL(数据控制语言)

管理数据库用户

查询用户

创建用户

修改用户密码

删除用户

权限控制

查询用户权限

授予用户权限

撤销用户权限


SQL:操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准。

主流的关系型数据库都支持SQL语言,在MySQL中SQL不区分大小写。

SQL通用语法和注释

SQL通用语法:

  1. SQL语句可以单行或多行书写,以分号结尾
  2. SQL语句可以使用空格或者缩进(空格和缩进的个数是没有限制的)来增强语句的可读性(如果SQL语句过长)
  3. MySQL数据库的SQL语句是不区分大小写的,关键字建议大写
  4. 注释:
    1. 单行注释:-- 注释内容# 注释内容
    2. 多行注释:/*注释内容*/

注意:在HeidiSQL中,可以使用快捷键ctrl+/自动注释

SQL语句分类(DDL,DML,DQL,DCL,TPL,CCL)

SQL语句分为6类:

分类

全称

说明

DDL

Data Definition Language

数据定义语言,用来定义数据库对象(数据库,表,字段等..)

DML

Data Manipulation Language

数据操作语言,用来对数据库表中的数据进行增删改

DQL

Data Query Language

数据查询语言,用来查询数据库中表的记录

DCL

Data Control Language

数据控制语言,用来管理数据库用户、控制用户具有的数据库的访问权限

TPL

Data Query Language

事务处理语言,为了确保被DML语句影响的表可以及时更新

CCL

Cursor Control Language

指针控制语言,规定了SQL语句在宿主语言的程序中的使用的规则

DDL(数据定义语言)

DDL(Data Definition Language):数据定义语言,用来定义数据库对象(数据库,表,字段等..)。

数据库操作
查询(SHOW、SELECT)

查询所有数据库

SHOW DATABASES;

查询当前所处的数据库

SELECT DATABASE();

示例如下:

创建(CREATE)

创建数据库

CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则]

注意:

  1. IF NOT EXISTS:表示如果这个数据库不存在,则创建该数据库,否则不执行任何操作
  2. DEFAULT CHARSET:指定数据库所使用的字符集,比如UTF-8(但UTF8它存储的长度是3个字节,推荐使用UTF8mb4,它支持四个字节)
  3. COLLATE:指定排序规则

示例如下:

在Linux中的MySQL中,创建一个名为hyh2的数据库

注意:在Linux的MySQL中,创建数据库时,最好指定数据库的字符集,不然后续中文容易出现错误。

输入:CREATE DATABASE hyh2 CHARSET=UTF8MB4;

执行后,创建数据库hyh2成功

删除(DROP)

删除数据库

DROP DATABASE [IF EXISTS] 数据库名;

注意:

IF EXISTS:表示如果存在,则删除,否则不执行任何操作

示例如下:

使用(USE)

使用数据库(切换到该数据库)

USE 数据库名;

示例如下:

表操作
查询(SHOW、DESC)

查询当前所在数据库所有表

SHOW TABLES;

查询表结构(查看该表中有哪些字段,字段的类型等..)

DESC 表名;

查询指定表的建表语句

SHOW CREATE TABLE 表名;

查询当前所在数据库所有表-示例如下:

查询表结构(查看该表中有哪些字段,字段的类型等..)-示例如下:

查询指定表的建表语句-示例如下:

创建(CREATE)

创建表结构:

CREATE TABLE 表名(

字段1 类型 [约束] [COMMENT 字段1注释],

字段2 类型 [约束] [COMMENT 字段2注释]

字段N 类型 [约束] [COMMENT 字段N注释]

)[COMMENT 表注释]

注意:一般id可设置为主键(PRIMARY KEY),id字段一般会设置为自增(AUTO_INCREMENT)

创建表结构-示例如下:

案例:

根据需求设计表,要求合理数据类型和长度。

需求:

  1. 编号(纯数字)
  2. 员工工号(字符串类型,长度不超过10位)
  3. 员工姓名(字符串类型,长度不超过10位)
  4. 性别(男/女,存储一个汉字)
  5. 年龄
  6. 身份证号(二代身份证号均为18位,身份证中有X这样的字符)
  7. 入职时间(年月日即可)

代码如下:

CREATE TABLE emp(

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 '身份证号',

entry_date DATE COMMENT '入职时间'

) COMMENT '员工表';

注意:编码格式要是UTF-8,最好在记事本上将代码打出来,再拿去执行。

运行如下:

创建一个student表(学生表),有以下要求:

  1. 第一个字段:id(编号),整型,主键,自增,无符号
  2. 第二个字段:stu_name(姓名),字符串类型,非空
  3. 第三各字段:age(年龄),整型
  4. 第四个字段:height(身高),数值类型,精度是5,标度是2

输入sql语句:

CREATE TABLE student(

    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '编号',

    stu_name VARCHAR(20) NOT NULL COMMENT '姓名',

    age INT COMMENT '年龄',

    height DECIMAL(5, 2) COMMENT '身高'

)COMMENT '学生表';

执行后,表结构如下:

修改(ALTER)

往表中添加字段

ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];

示例如下:

为emp表中添加一个新字段“昵称”nickname,类型为VARCHAR(20)

代码:ALTER TABLE emp ADD nickname VARCHAR(20) COMMENT '昵称';

修改字段的数据类型

ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);

示例如下:

将emp表中的age字段的数据类型改为CHAR(3)

代码:ALTER TABLE emp MODIFY age CHAR(3)

修改字段名和字段类型

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];

示例如下:

将emp表的nickname修改为username,类型为VARCHAR(30)

代码为:ALTER TABLE emp CHANGE nickname username VARCHAR(30) COMMENT '用户名';

删除表中字段

ALTER TABLE 表名 DROP 字段名;

示例如下:

将emp表中的username字段删除

代码:ALTER TABLE emp DROP username;

修改表名

ALTER TABLE 表名 RENAME TO 新表名;

示例如下:

将emp表的表名修改为employee

代码:ALTER TABLE emp RENAME TO employee;

删除(DROP)

删除表

DROP TABLE [IF EXISTS] 表名;

注意:这种方式效率高

示例如下:

删除table_user表

DROP TABLE IF EXISTS table_user;

删除指定表,并重新创建该表

TRUNCATE TABLE 表名;

注意:

  1. 表中数据被删除了,只留下了表结构(空表)
  2. 这种方式效率低

示例如下:

删除表employee

代码:TRUNCATE TABLE employee;

DML(数据操作语言)

DML(Data Manipulation Language):数据操作语言,用来对数据库表中的数据进行增删改

添加数据(INSERT)

给表中指定的字段添加数据

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

给表中全部字段添加数据

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

批量添加数据-给表中指定的字段添加数据

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

批量添加数据-给表中全部字段添加数据

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

以上4条语句-注意:

  1. 插入字段的值要与指定字段的顺序一一对应;
  2. 字符串和日期型数据应该包含在引号中;
  3. 插入数据的大小,应该在字段的规定范围内。
  4. 如果主键是自增的,可以用0或NULL代替

示例如下:

向test数据库的employee表中插入3条数据:

代码为:

/*给表中指定的字段添加数据*/

INSERT INTO employee(id, work_no, name, id_card) VALUES(1, '1', '小红', '123456789012345678');

/*批量添加数据-给表中全部字段添加数据*/

INSERT INTO employee VALUES(2, '2', '小黑', '', 30, '123456789012345678', '2019-10-20'),

(3, '3', '小兰', '', 26, '123456789012345678', '2020-03-31');

表student为空表,向student表中插入2条数据记录

sql语句,如下:

INSERT INTO student VALUES(NULL, '学生001', 14, 165.19), (NULL, '学生002', 12, 154.67);

执行后,表student中的数据为:

修改数据(UPDATE)

修改表中字段的值

UPDATE 表名 SET 字段名1 = 值1, 字段名2 = 值2, ... [WHERE 条件];

注意:

UPDATE语句的条件如果没有,则会修改整张表的所有数据。

示例如下:

  1. 将名字为小黑的这条记录的年纪改为46
  2. 将所有员工的入职时间改为2024-09-08

代码为:

/*将名字为小黑的这条记录的年纪改为46*/

UPDATE employee SET age = 46 WHERE NAME = '小黑';

/*将所有员工的入职时间改为2024-09-08*/

UPDATE employee SET entry_date = '2024-09-08';

删除数据(DELETE)

删除表中的记录

DELETE FROM 表名 [WHERE 条件];

注意:

  1. DELETE语句的条件如果没有,则会删除整张表的所有数据记录;
  2. DELETE是删除记录的,要清除某字段的值要用UPDATE;
  3. DELETE删除所有数据后,如果再插入数据记录,自增长字段不会从1开始
  4. 这种方法是物理删除(真删)
  5. 工作中大部分使用逻辑删除,即不真正的删除记录。逻辑删除是指通过设定一个字段来标识当前记录已经删除。比如用:根据is_delete字段来标识,1代表删除,0表示未删除。比如:可以通过表中字段is_delete来判断是否显示该记录给用户,如下图表中的数据:

示例如下:

  1. 删除年纪为26的员工的记录
  2. 删除表中的所有员工的记录

代码为:

USE test;

/*删除年纪为26的员工的记录*/

DELETE FROM employee WHERE age = 26;

SELECT * FROM employee;

/*删除所有员工记录*/

DELETE FROM employee;

SELECT * FROM employee;

运行如下:

DQL(数据查询语言)

DQL(Data Query Language):数据查询语言,用来查询数据库中表的记录。

DQL执行顺序

DQL语法:

SELECT

字段名称

FROM

表名列表

WHERE

条件列表

GROUP BY

分组字段列表

HAVING

分组后条件列表

ORDER BY

排序字段列表

LIMIT

分页参数

DQL语句的先后执行顺序为:

FROM

表名列表

WHERE

条件列表

GROUP BY

分组字段列表

HAVING

分组后条件列表

SELECT

字段列表

ORDER BY

排序字段列表

LIMIT

分页参数

基本查询

查询表中指定字段数据

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

查询表中指定字段数据,同时给字段设置别名(使SQL语句看起来更加精简易读,也避免查询返回相同字段数据时的冲突)

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

注意:AS可以省略。

查询指定字段数据,同时去除重复记录

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

查询表中所有字段数据(使用通配符*代表所有字段|也可以把所有的字段都列出来)

SELECT * FROM 表名;

注意:在实际开发中,尽量不要使用通配符*来查询所有字段数据,因为*不直观,同时会影响效率,在项目组中会有对应的开发规范,我们要遵循开发规范,尽量不要使用*。

示例如下:

数据准备:

创建表结构emp

CREATE TABLE emp(

id INT COMMENT '编号',

work_no VARCHAR(10) COMMENT '工号',

emp_name VARCHAR(10) COMMENT '姓名',

gender char(1) COMMENT '性别',

age TINYINT UNSIGNED COMMENT '年龄',

id_card char(18) COMMENT '身份证号',

work_address VARCHAR(30) COMMENT '工作地址',

entry_date DATE COMMENT '入职时间'

) COMMENT '员工表';

向表中添加数据记录

INSERT INTO emp VALUES

(1, '1', '小黑', '', 31, '123456789012345678', '上海', '2019-10-20'),

(2, '2', '晓峰', '', 29, '123456789021345678', '上海', '2020-01-23'),

(3, '3', '小花', '', 30, '123456789031245678', '武汉', '2017-10-20'),

(4, '4', '小晓', '', 49, '123456789041235678', '上海', '2019-11-20'),

(5, '5', '思思', '', 30, '123456789051234678', '上海', '2016-10-20'),

(6, '6', '小齐', '', 36, '123456789061234578', '青岛', '2019-08-21'),

(7, '7', '小华', '', 27, '123456789071234568', '上海', '2021-10-20'),

(8, '8', '露毛', '', 38, '123456789013245678', '上海', '2019-07-20'),

(9, '9', '小青', '', 46, '123456789014235678', '郑州', '2012-9-20'),

(10, '10', '小五', '', 32, '12345678901567861X', '苏州', '2020-07-08');

执行以上语句,运行完毕后,emp表中数据如下:

查询emp表中指定字段:emp_nam,entry_date,work_address

代码为:SELECT emp_name, entry_date, work_address FROM emp;

查询emp返回所有字段数据

代码:

/*列出所有字段,查询所有字段数据*/

SELECT id, work_no, emp_name, gender, age, id_card, work_address, entry_date FROM emp;

/*使用通配符代表所有字段,查询所有字段数据

但这种方法不建议,因为不直观,也会影响开发效率*/

SELECT * FROM emp;

运行后

查询emp表返回所有员工的work_address,同时给work_address起别名“工作地址”

代码:

/*work_address起别名工作地址”*/

SELECT work_address AS '工作地址' FROM emp;

/*work_address起别名工作地址,省略AS*/

SELECT work_address '工作地址' FROM emp;

运行

查询emp表中员工的上班地址都有哪些?(去重)

代码:

/*查询emp表中员工的上班地址都有哪些?(去重)*/

SELECT DISTINCT work_address AS "员工的上班地址" FROM emp;

条件查询(WHERE),比较运算符,逻辑运算符

在表中查询指定字段数据,同时字段数据要符合查询条件

SELECT 字段列表 FROM 表名 WHERE 条件列表;

条件:

比较运算符

功能

>

大于

>=

大于等于

<

小于

<=

小于等于

=

等于

<>或!=

不等于

BETWEEN...AND...

在某个范围之间(含最小和最大值)。

注意:先写最小值,再写最大值。

IN(...)

在in之后列表中的值,多选一

LIKE 占位符

模糊匹配(_匹配单个字符,%匹配任意字符)

IS NULL

是空

IS NOT NULL

不是空

逻辑运算符

功能

AND或&&

并且(多个条件同时成立)。

注意:&&将会在未来弃用,不建议使用该方式。

OR或||

或者(多个条件任意一个成立)

注意:||将会在未来弃用,不建议使用该方式。

NOT或!

非,不是

示例如下:

emp表中数据如下:

查询emp表中年龄等于30的员工记录

代码:

/*查询emp表中年龄等于30的员工记录*/

SELECT * FROM emp WHERE age = 30;

执行

查询emp表中年龄小于等于30的员工记录

代码:

/*查询emp表中年龄小于等于30的员工记录*/

SELECT * FROM emp WHERE age <= 30;

运行

查询emp表中身份证号为空的员工记录

代码:

/*查询emp表中身份证号为空的员工记录*/

SELECT * FROM emp WHERE id_card IS NULL;

执行

查询emp表中身份证号不为空的员工记录

代码:

/*方式1:查询emp表中身份证号不为空的员工记录*/

SELECT * FROM emp WHERE id_card IS NOT NULL;

/*方式2:查询emp表中身份证号不为空的员工记录*/

SELECT * FROM emp WHERE id_card !='';

运行

查询emp表中工作地址(work_address)不在上海的员工记录

代码:

/*方式1:查询emp表中工作地址(work_address)不在上海的员工记录*/

SELECT * FROM emp WHERE work_address != '上海';

/*方式2:查询emp表中工作地址(work_address)不在上海的员工记录*/

SELECT * FROM emp WHERE work_address <> '上海';

/*方式3:查询emp表中工作地址(work_address)不在上海的员工记录*/

SELECT * FROM emp WHERE NOT work_address = '上海';

运行

查询emp表中年龄(age)在30(包含)到36(包含)之间的员工记录

代码:

/*方式1:查询emp表中年龄(age)在30(包含)到36(包含)之间的员工记录*/

SELECT * FROM emp WHERE age BETWEEN 30 AND 36;

/*方式2:查询emp表中年龄(age)在30(包含)到36(包含)之间的员工记录*/

SELECT * FROM emp WHERE age >= 30 AND age <= 36;

/*方式3:查询emp表中年龄(age)在30(包含)到36(包含)之间的员工记录,注意:&&将会在未来弃用,不建议使用该方式*/

SELECT * FROM emp WHERE age >= 30 && age <= 36;

运行

查询emp表中年龄小于40,且性别为女的员工记录

代码:

/*查询emp表中年龄小于40,且性别为女的员工记录*/

SELECT * FROM emp WHERE age < 40 AND gender = '';

运行

查询emp表中年龄等于30或年龄等于36或年龄等于46的员工记录

/*方式1:查询emp表中年龄等于30或年龄等于36或年龄等于46的员工记录*/

SELECT * FROM emp WHERE age = 30 OR age = 36 OR age = 46;

/*方式2:查询emp表中年龄等于30或年龄等于36或年龄等于46的员工记录,注意||将会过时,不建议使用该方式*/

SELECT * FROM emp WHERE age = 30 || age = 36 || age = 46;

/*方式3:查询emp表中年龄等于30或年龄等于36或年龄等于46的员工记录*/

SELECT * FROM emp WHERE age IN(30, 36, 46);

运行

更新emp表的数据

查询emp表中姓名为3个字的员工记录

代码:

/*查询emp表中姓名为3个字的员工记录

使用3_下划线,占位3个字符*/

SELECT * FROM emp WHERE emp_name LIKE '___';

运行

查询emp表中入职时间在2010-2019(2010和2019都包含)年之间的员工记录

/*查询emp表中入职时间在2010-201920102019都包含)年之间的员工记录*/

SELECT * FROM emp WHERE entry_date LIKE '201%';

运行

分组查询(GROUP BY)和 聚合函数
聚合函数(count、max、min、avg、sum)

聚合函数:将一列数据作为一个整体,进行纵向计算;使用聚合函数方便进行数据统计。

常见的聚合函数

函数

功能

COUNT(*或字段名)

统计数量(统计指定字段不为NULL的记录行数

MAX(字段名)

最大值(计算指定字段的数值和,如果指定列类型不是数值类型,则计算结果为0)

MIN(字段名)

最小值

AVG(字段名)

平均值(计算指定列的平均值,如果指定列类型不是数值类型,则计算结果为0

SUM(字段名)

求和

注意:null值不参与聚合函数的计算。

示例如下:

emp表中的数据如下:

统计emp表所有员工的数量

代码:

/*方法1:统计emp表所有员工的数量*/

SELECT COUNT(*) FROM emp;

/*方法2:统计emp表所有员工的数量

注意:函数是统计列的数据,所以除了id

只要字段的数据不为空(比如:COUNT(id_card)9),其他的字段都可以作为统计*/

SELECT COUNT(id) FROM emp;

运行

统计emp表中员工的平均年龄

代码:

/*统计emp表中员工的平均年龄*/

SELECT AVG(age) FROM emp;

运行

查询emp表中员工的最大年龄

代码:

/*查询emp表中员工的最大年龄*/

SELECT MAX(age) FROM emp;

运行

查询emp表中员工的最小年龄

代码:

/*查询emp表中员工的最小年龄*/

SELECT MIN(age) FROM emp;

运行

统计emp表中在上海工作的员工的年龄之和

代码:

/*统计emp表中在上海工作的员工的年龄之和*/

SELECT SUM(age) FROM emp WHERE work_address = '上海';

运行

分组查询(GROUP BY)

分组:按照字段分组,字段值相同的数据会被放到一个组中

分组的目的:是对每一组的数据进行统计(使用聚合函数)

分组查询语法:

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

注意:

  1. 执行顺序:WHERE > 聚合函数 > HAVING。
  2. 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
  3. WHERE和HAVING的区别:
    1. 执行时机不同:WHERE是分组之前进行过滤,不满足WHERE条件,不参与分组;而HAVING是分组之后对结果进行过滤
    2. 判断条件不同:WHERE不能对聚合函数进行判断,而HAVING可以。

示例如下:

emp表数据如下:

对emp表进行分组查询:根据性别分组,统计男性员工和女性员工的数量。

代码:

/*emp表进行分组查询:根据性别分组,统计男性员工和女性员工的数量*/

SELECT gender, COUNT(*) FROM emp GROUP BY gender;

运行

对emp表进行分组查询:根据性别分组,统计男性员工和女性员工的平均年龄。

代码:

/*emp表进行分组查询:根据性别分组,统计男性员工和女性员工的平均年龄*/

SELECT gender, AVG(age) FROM emp GROUP BY gender;

运行

  1. 对emp表进行分组查询:查询年龄小于36的员工,并根据工作地址分组。
  2. 对emp表进行分组查询:查询年龄小于36的员工,并根据工作地址分组,获取员工数量大于等于2的工作地址。

代码:

/*emp表进行分组查询:查询年龄小于36的员工,并根据工作地址分组*/

SELECT work_address, COUNT(*) FROM emp WHERE age < 36 GROUP BY work_address;

/*emp表进行分组查询:查询年龄小于36的员工,并根据工作地址分组,获取员工数量大于等于2的工作地址*/

-- WHERE不能对聚合函数进行判断,而HAVING可以

SELECT work_address, COUNT(*) FROM emp WHERE age < 36 GROUP BY work_address HAVING COUNT(*) >= 2;

运行

如下表,学生成绩表:

要求:计算每个学生的总成绩,sql语句如下:

-- 方式1

SELECT name, SUM(chinese + english + math) FROM exam GROUP BY id;

-- 方式2

SELECT id, name, (chinese + english + math) FROM exam;

执行结果,如下:

如下表,学生表:

要求1:查询各种性别的人数, 每组最大年龄, 每组最小年龄

sql语句,如下:

SELECT sex, COUNT(*), MAX(age), MIN(age) FROM student_02 GROUP BY sex;

执行结果:

要求2:查询每个班级中各种性别的人数, 各种性别的最小年龄

sql语句如下:

-- 思路:先按班级分组,再按性别分组

SELECT class, sex, COUNT(*), MIN(age) FROM student_02 GROUP BY class, sex;

执行结果:

要求3:查询所有班级中不同性别的记录数(个数)大于1的信息

sql语句如下:

-- WHERE不能对聚合函数进行判断,而HAVING可以

SELECT class, sex, COUNT(*) FROM student_02 GROUP BY class, sex HAVING COUNT(*) > 1;

执行结果:

排序查询(ORDER BY)

排序查询语法

SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1, 字段2 排序方式2;

注意:

  1. 排序方式:
    1. ASC:升序(默认值)
    2. DESC:降序
  2. 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序

示例如下:

emp表的数据如下:

在emp表中根据年龄对员工记录进行升序排序

代码:

/*emp表中根据年龄对员工记录进行升序排序,ASC可以省略*/

SELECT * FROM emp ORDER BY age ASC;

运行

在emp表中根据入职时间对员工记录进行降序排序

代码:

/*emp表中根据入职时间对员工记录进行降序排序*/

SELECT * FROM emp ORDER BY entry_date DESC;

运行

在emp表中,根据年龄对员工进行升序排序,如果年龄相同,再按照入职时间进行降序排序

代码:

/*emp表中,根据年龄对员工进行升序排序,如果年龄相同,再按照入职时间进行降序排序,注意:ASC省略了*/

SELECT * FROM emp ORDER BY age, entry_date DESC;

运行

分页查询(LIMIT)

分页查询语法

SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;

注意:

  1. 起始索引从0开始起始索引=(查询页码-1)*每页显示记录数
  2. 分页查询是数据库的“方言”,不同的数据库有不同的实现方式,MySQL中是LIMIT。
  3. 如果查询的是第一页,起始索引可以省略。

示例如下:

emp表数据如下:

在emp表中查询第一页员工数据,每页显示4条记录

代码:

/*emp表中查询第一页员工数据,每页显示4条记录,注意:起始索引0可以省略*/

SELECT * FROM emp LIMIT 0, 4;

-- 省略起始索引0

SELECT * FROM emp LIMIT 4;

运行

在emp表中查询第2页员工数据,每页显示3条记录

代码:

/*emp表中查询第2页员工数据,每页显示3条记录,起始索引 = (2-1)*3 = 3*/

SELECT * FROM emp LIMIT 3, 3;

运行

案例

emp表数据如下:

查询emp表中年龄在29,32,30,46的女性员工记录

代码:

/*查询emp表中年龄在29323046的女性员工记录*/

SELECT * FROM emp WHERE age IN(29, 32, 30, 46) AND gender = '';

运行结果

查询emp表中性别为男,年龄在30~40之间(包含30和40)并且姓名为2个字的员工记录

代码:

/*方式1:查询emp表中性别为男,年龄在30~40之间(包含3040)并且姓名为2个字的员工记录*/

SELECT * FROM emp WHERE gender = '' AND age BETWEEN 30 AND 40 AND emp_name LIKE '__';

/*方式2:查询emp表中性别为男,年龄在30~40之间(包含3040)并且姓名为2个字的员工记录*/

SELECT * FROM emp WHERE gender = '' AND (age >= 30 AND age <= 40) AND emp_name LIKE '__';

执行结果

统计emp表中,年龄小于40的,男性员工和女性员工的人数

/*统计emp表中,年龄小于40的,男性员工和女性员工的人数*/

SELECT gender, COUNT(*) AS '人数' FROM emp WHERE age < 40 GROUP BY gender;

运行结果

查询emp表中年龄小于等于30岁的员工的姓名,年龄,入职时间,并对查询结果按年龄进行升序排序,如果年龄相同就按入职时间降序排序

代码:

-- 查询emp表中年龄小于等于30岁的员工的姓名,年龄,入职时间,

-- 并对查询结果按年龄进行升序排序,如果年龄相同就按入职时间降序排序

# 注意:ASC可以省略

SELECT emp_name, age, entry_date FROM emp WHERE age <= 30 ORDER BY age ASC, entry_date DESC;

运行结果

查询emp表中性别为男,年龄在20~40(含20和40)之间的前4个员工记录,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序

代码:

/*

查询emp表中性别为男,年龄在20~40(含2040)之间的前4个员工记录,

并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序

注意:ASC可以省略

*/

SELECT * FROM emp WHERE gender = '' AND (age BETWEEN 20 AND 40) ORDER BY age ASC, entry_date DESC LIMIT 0, 4;

运行结果

DCL(数据控制语言)

DCL(Data Control Language):数据控制语言,用来管理数据库用户、控制用户具有的数据库的访问权限

注意:

这类SQL开发人员操作比较少,主要是DBA(Database Administrator 数据库管理员)使用

管理数据库用户
查询用户

查询用户语法:

USE mysql;

SELECT * FROM user;

注意:

在MySQL数据库中,用户的信息和用户具有的权限的信息都是存放在系统数据库mysql的user表中的

查看mysql系统数据库的user表中的数据

示例如下:

使用系统数据库mysql,查询user表中用户的信息

代码:

/*使用系统数据库mysql*/

USE mysql;

/*查询user表的数据*/

SELECT * FROM user;

运行结果

创建用户

创建用户语法:

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

注意:

主机名指的是在哪一个主机上这个用户可以访问MySQL数据库;

示例如下:

创建数据库用户hyh,只能在localhost主机上访问,密码设置为123456

代码:

/*创建数据库用户hyh,只能在localhost主机上访问,密码设置为123456

注意:还未分配权限*/

CREATE user 'hyh'@'localhost' IDENTIFIED BY '123456';

运行结果

创建用户hyh2,想在任意的主机上都能访问该数据库,密码123456

代码:

/*创建用户hyh2,想在任意的主机上都能访问该数据库,密码123456

使用通配符%代表任意主机*/

CREATE user 'hyh2'@'%' IDENTIFIED BY '123456';

运行结果

修改用户密码

修改用户密码语法

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

注意:

Mysql_native_password是加密方式

示例如下:

修改用户hyh2的密码为123

代码:

/*修改用户hyh2的密码为123*/

ALTER user 'hyh2'@'%' IDENTIFIED WITH mysql_native_password BY '123';

测试用户hyh2的密码

删除用户

删除用户的语法

DROP USER '用户名'@'主机名';

示例如下:

删除用户hyh2

代码:

/*删除用户hyh2*/

DROP user 'hyh2'@'%';

运行结果

权限控制

MySQL中常用的权限:

权限

说明

ALL,ALL PRIVILEGES

所有权限

SELECT

查询权限

INSERT

插入数据

UPDATE

修改数据

DELETE

删除数据

ALTER

修改表/字段

DROP

删除数据库/表/视图

CREATE

创建数据库/表

查询用户权限

查询用户权限语法:

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

示例如下:

查询root@localhost用户的权限

代码:

SHOW GRANTS FOR 'root'@'localhost';

运行结果

查询hyh@localhost用户的权限

代码:

SHOW GRANTS FOR 'hyh'@'localhost';

运行结果

授予用户权限

授予用户权限语法:

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

注意:

如果要给所有数据库,所有的表都赋予权限,可以写*.*

示例如下:

授予hyh@localhost用户的test数据库的所有表的所有权限

代码:

# 授予hyh@localhost用户的test数据库的所有表的权限

GRANT ALL ON test.* TO 'hyh'@'localhost';

运行结果

撤销用户权限

撤销用户权限语法:

REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';

示例如下:

撤销hyh@localhost用户的test数据库的所有表的所有权限

代码:

# 授予hyh@localhost用户的test数据库的所有表的权限

REVOKE ALL ON test.* FROM 'hyh'@'localhost';

运行结果

相关文章:

  • KDCJ-400kv冲击耐压试验装置
  • 中华传承-医山命相卜-铁板神数
  • useMemo + memo + useContext 性能优化实战:从无感重渲染到丝滑体验
  • EVAL长度限制突破
  • 探索 JavaScript 中的 Promise 高级用法与实战
  • 研究生面试常见问题
  • EDID结构
  • 第六章:6.6输入以下的杨辉三角形,要求输出10行
  • 嵌入式系统中Flash操作全面解析与最佳实践
  • 通过 Tailwind CSS 自定义样式 实现深色模式切换
  • JavaScript 所有操作数组的方法
  • 并发设计模式实战系列(1):半同步/半异步模式
  • index: 自动化浏览器智能体
  • React 中如何获取 DOM:用 useRef 操作非受控组件
  • 基于n8n的AI应用工作流原理与技术解析
  • 【LLMs篇】09:白话PPO训练
  • Day53 二叉树的层序遍历
  • 【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件yolo.py解读
  • GN ninja 工程化构建例程
  • yarn的三大组件及各自的作用
  • 哈佛大学就联邦经费遭冻结起诉特朗普政府
  • 普京签署法律,诋毁俄军将面临最高7年监禁
  • 商务部:支持外籍医生开设诊所,优化罕见病药品进口抽检模式
  • 中方决定对在涉港问题上表现恶劣的美国国会议员等实施制裁
  • 成功卫冕!孙颖莎4比0战胜蒯曼,获澳门世界杯女单冠军
  • 调查显示特朗普在经济问题上的支持率跌至其总统生涯最低