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

news2025/4/20 8:37:48

目录

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';

运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2338611.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AUTOSAR图解==>AUTOSAR_SWS_KeyManager

AUTOSAR KeyManager详细分析 AUTOSAR 4.4.0 版本密钥与证书管理模块技术分析 目录 1. 概述2. KeyManager架构 2.1 KeyManager在AUTOSAR架构中的位置2.2 架构说明 3. KeyManager模块结构 3.1 模块组件详解3.2 配置项说明 4. KeyManager证书验证流程 4.1 证书验证流程分析 5. Ke…

Jsp技术入门指南【七】JSP动作讲解

Jsp技术入门指南【七】JSP动作讲解 前言一、什么是JSP动作&#xff1f;二、核心JSP动作详解1. jsp:include&#xff1a;动态包含其他页面与<% include %>的区别 2. jsp:forward&#xff1a;请求转发到另一个页面3. jsp:param&#xff1a;为动作传递参数4. jsp:useBean&am…

10软件测试需求分析案例-查询学习信息

用户登录系统后&#xff0c;进入查询学生信息界面&#xff0c;输入查询字段值&#xff0c;点击查询按钮后&#xff0c;展示查询到的学生信息&#xff0c;可以重新输入字段值进行查询。 查询学生信息属于学生信息管理的子菜单&#xff0c;可以根据学号、姓名、性别查询。老师登录…

基于尚硅谷FreeRTOS视频笔记——6—滴答时钟—上下文切换

FreeRTOS滴答 FreeRTOS需要有一个时钟参照&#xff0c;并且这个时钟不会被轻易打断&#xff0c;所以最好选择systick 为什么需要时间参照 就是在高优先级任务进入阻塞态后&#xff0c;也可以理解为进入delay&#xff08;&#xff09;函数后&#xff0c;需要有一个时间参照&…

MCP服务,阿里云百炼,Cline,mysql-mcp-server,MCP通信原理

简介 MCP&#xff08;Model Context Protocol&#xff09;&#xff0c;模型上下文协议&#xff0c;是一种开放标准&#xff0c;用于将AI模型与外部数据源和工具建立安全的双向连接&#xff0c;它就像AI领域的USB-C接口&#xff0c;为AI模型提供了一种标准化方式来连接不同的数…

一个项目中多个Composer的使用方法

composer是依赖管理工具。 有时我们会在一个项目中使用到多个composer&#xff0c;且每个版本不同。 前提&#xff1a;例如项目xyz根目录vendor中存在阿里云的对应代码。我现在需要再composer腾讯云短信发送的SDK。 1、随便找个位置新建文件夹&#xff0c;存储腾讯云短信发送…

MCP 应用案例-网络设备批量管理

案例背景 需求痛点 企业需管理数百台跨地域网络设备&#xff08;交换机/路由器&#xff09;&#xff0c;传统方式存在&#xff1a; 人工SSH登录效率低脚本维护成本高&#xff08;不同厂商CLI语法差异&#xff09;状态监控依赖独立监控系统 解决方案 通过MCP协议构建智能网络…

国产之光DeepSeek架构理解与应用分析02

本专栏 国产之光DeepSeek架构理解与应用分析-CSDN博客 国产之光DeepSeek架构理解与应用分析02-CSDN博客 前置的一些内容理解 GPU TPU NPU的区别&#xff1f; 设计目的 GPU&#xff1a;最初是为了加速图形渲染而设计的&#xff0c;用于处理图像和视频数据&#xff0c;以提供高…

对美团leaf的初步学习

我的项目中使用的雪花算法生成的全局订单号。但是考虑到了雪花算法可能会由于时钟回拨导致生成的全局id重复。于是去研究了美团的leaf服务&#xff1a;Leaf——美团点评分布式ID生成系统 - 美团技术团队&#xff0c;并总结出该文章。 自己项目中的应用 由于对订单表做了分表&…

Nacos深度剖析与实践应用之-负载均衡

&#x1f4a1;简介 Nacos不仅提供服务注册与发现功能&#xff0c;还内置了强大的负载均衡能力。Nacos的负载均衡机制主要应用于服务消费者从服务注册中心获取服务实例列表后&#xff0c;如何选择其中一个实例进行调用的过程。 &#x1f9e0; 学习目的 这篇文章我们将探讨负载…

Photoshop安装与配置--简单攻略版

下载地址:Photoshop软件工具下载 安装完成后&#xff0c;即可运行Photoshop.exe&#xff1b;打开工具页面后&#xff0c;按照下面简单配置即可 1.编辑-》首选项-》常规 或者直接快捷键CtrlK 暂存盘&#xff1a;一定要设置为非C盘 2.性能 3.文件处理 以上配置比较基础&#xf…

桌面级OTA测试解决方案:赋能智能网联汽车高效升级

一、前言 随着智能网联汽车的快速发展&#xff0c;OTA&#xff08;Over-The-Air&#xff09;技术已成为汽车软件更新和功能迭代的关键手段。为确保OTA升级的可靠性、安全性和效率&#xff0c;构建一套高效、便捷的桌面级OTA测试解决方案至关重要。 本方案基于Vector先进的软硬…

PG,TRPO,PPO,GRPO,DPO原理梳理

强化学习方法的分类 一、基础概念 Policy Model&#xff08;Actor Model&#xff09;&#xff1a;根据输入文本&#xff0c;预测下一个token的概率分布&#xff0c;输出下一个token也即Policy模型的“动作”。该模型需要训练&#xff0c;是我们最终得到的模型&#xff0c;并由上…

Cursor新版0.49.x发布

小子看到 Cursor 0.49.x 版本正式发布&#xff0c;截止今天已经有两个小patch版本&#xff01;本次更新聚焦于 自动化Rules生成、改进的 Agent Terminal 以及 MCP 图像支持&#xff0c;并带来了一系列旨在提升编码效率和协作能力的改进与修复。 以下是本次更新的详细内容&…

每日算法-250419

每日算法 - 2024年4月19日 记录今天完成的LeetCode算法题。 1710. 卡车上的最大单元数 题目描述 思路 贪心 解题过程 目标是最大化卡车可以装载的单元总数。根据贪心策略&#xff0c;我们应该优先装载单位体积&#xff08;每个箱子&#xff09;包含单元数 (numberOfUnitsPerB…

PDF转excel+json ,vue3+SpringBoot在线演示+附带源码

在线演示地址&#xff1a;Vite Vuehttp://www.xpclm.online/pdf-h5 源码gitee前后端地址&#xff1a; javapdfexcel: javaPDF转excelhttps://gitee.com/gaiya001/javapdfexcel.git 盖亚/vuepdfhttps://gitee.com/gaiya001/vuepdf.git 后续会推出 前端版本跟nestjs版本 识别复…

如何高效使用 Text to SQL 提升数据分析效率?四个关键应用场景解析

数据分析师和业务人员常常面临这样的困境&#xff1a;有大量数据等待分析&#xff0c;但 SQL 编写却成为效率瓶颈。即使对于经验丰富的数据分析师来说&#xff0c;编写复杂 SQL 查询也需要耗费大量时间&#xff1b;而对于不具备 SQL 专业知识的业务人员&#xff0c;数据分析则更…

分享一个DeepSeek+自建知识库实现人工智能,智能回答高级用法。

这个是我自己搞的DeepSeek大模型自建知识库相结合到一起实现了更强大的回答问题能力还有智能资源推荐等功能。如果感兴趣的小伙伴可以联系进行聊聊&#xff0c;这个成品已经有了实现了&#xff0c;所以可以融入到你的项目&#xff0c;或者毕设什么的还可以去参加比赛等等。 1.项…

jangow靶机笔记(Vulnhub)

环境准备&#xff1a; 靶机下载地址&#xff1a; https://download.vulnhub.com/jangow/jangow-01-1.0.1.ova kali地址&#xff1a;192.168.144.128 靶机&#xff08;jangow&#xff09;地址&#xff1a;192.168.144.180 一.信息收集 1.主机探测 使用arp-scan进行主机探…

PyTorch `flatten()` 和 `squeeze()` 区别

PyTorch flatten() 和 squeeze() 区别 在 PyTorch 里,flatten() 和 squeeze(0) 是两个不同的张量操作, 1. flatten() 方法 flatten() 方法用于把一个多维张量展开成一维张量。它会将张量里的所有元素按顺序排列成一个一维序列。 语法 torch.flatten(input, start_dim=