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

运行结果

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

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

相关文章

Linux:线程概念与控制

✨✨所属专栏&#xff1a;Linux✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ Linux&#xff1a;线程概念于控制 var code “d7e241ae-ed4d-475f-aa3d-8d78f873fdca” 概念 在一个程序里的一个执行路线就叫做线程thread。更准确一点&#xff1a;线程是“一个进程内部的控制序列” …

人脸识别联合行为检测的办公管理新模式

基于人脸识别与行为检测的办公智能化解决方案 一、背景 在传统办公场景中&#xff0c;员工考勤管理、工位使用情况统计、安全监控等环节存在诸多痛点。例如&#xff0c;传统考勤方式如指纹打卡、刷卡等存在代打卡现象&#xff0c;考勤数据不准确&#xff1b;对于员工是否在工…

ceph weight 和 reweight 的区别

ceph osd df ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS0 nvme 6.98630 0.95508 7.0 TiB 5.0 TiB 4.9 TiB 13 GiB 33 GiB 2.0 TiB 71.10 0.96 83 up1 nvme 6.98630

WInform当今技术特性分析

Windows Forms (WinForms) 技术特性分析 引言 Windows Forms (WinForms) 作为微软最早推出的基于.NET的图形用户界面开发框架&#xff0c;已经存在了20多年。在如今充满了各种现代UI框架的软件开发生态系统中&#xff0c;WinForms仍然保持着其独特的地位。本文将深入分析WinF…

Spark rdd算子解析与实践

一、RDD基础回顾 RDD&#xff08;Resilient Distributed Dataset&#xff09; 是Spark的核心抽象&#xff0c;代表一个不可变、分区的分布式数据集合。其核心特性包括&#xff1a; 容错性&#xff1a;通过血缘&#xff08;Lineage&#xff09;记录数据生成过程&#xff0c;支…

sqlite3的API以及命令行

sqlite是目前最流行的嵌入式数据库。 所谓嵌入式&#xff0c;就是足够简单&#xff0c;可以嵌入到我们自己开发的应用程序之中。 在Linux系统中&#xff0c;sqlite的使用只需要使用它的API&#xff0c;连接它的动态连接库&#xff0c;甚至都不用连接&#xff0c;sqlite的实现…

Allure测试报告按测试终端和测试类型智能分类查看

以下是实现Allure测试报告按测试终端和测试类型智能分类的完整方案: 一、测试框架分层设计 # 项目结构 project/ ├── api_tests/ # API测试 │ └── test_order.py ├── app_tests/ # 移动端测试 │ ├── android/ │ └── ios/ ├── pc_te…

Spine-Leaf 与 传统三层架构:全面对比与解析

本文将详细介绍Spine-Leaf架构&#xff0c;深入对比传统三层架构&#xff08;Core、Aggre、Access&#xff09;&#xff0c;并探讨其与Full-mesh网络和软件定义网络&#xff08;SDN&#xff09;的关联。通过通俗易懂的示例和数据中心网络分析&#xff0c;我将帮助您理解Spine-L…

图像预处理-图像噪点消除

一.基本介绍 噪声&#xff1a;指图像中的一些干扰因素&#xff0c;也可以理解为有那么一些点的像素值与周围的像素值格格不入。常见的噪声类型包括高斯噪声和椒盐噪声。 滤波器&#xff1a;也可以叫做卷积核 - 低通滤波器是模糊&#xff0c;高通滤波器是锐化 - 低通滤波器就…

安卓手机如何改ip地址教程

对于安卓手机用户而言&#xff0c;ip修改用在电商、跨境电商、游戏搬砖、社交软件这些需要开多个账号的项目。因为多个设备或账号又不能在同一ip网络下&#xff0c;所以修改手机的IP地址防检测成为一个必要的操作。以下是在安卓手机上更改IP地址的多种方法及详细步骤&#xff0…

对象池模式在uniapp鸿蒙APP中的深度应用

文章目录 对象池模式在uniapp鸿蒙APP中的深度应用指南一、对象池模式核心概念1.1 什么是对象池模式&#xff1f;1.2 为什么在鸿蒙APP中需要对象池&#xff1f;1.3 性能对比数据 二、uniapp中的对象池完整实现2.1 基础对象池实现2.1.1 核心代码结构2.1.2 在Vue组件中的应用 2.2 …

本地部署大模型实现扫描版PDF文件OCR识别!

在使用大模型处理书籍 PDF 时&#xff0c;有时你会遇到扫描版 PDF&#xff0c;也就是说每一页其实是图像形式。这时&#xff0c;大模型需要先从图片中提取文本&#xff0c;而这就需要借助 OCR&#xff08;光学字符识别&#xff09;技术。 像 Gemini 2.5 这样的强大模型&#x…

《Operating System Concepts》阅读笔记:p700-p732

《Operating System Concepts》学习第 60 天&#xff0c;p700-p732 总结&#xff0c;总计 33 页。 一、技术总结 1.Virtual machine manager (VMM) The computer function that manages the virtual machine; also called a hypervisor. VMM 也称为 hypervisor。 2.types …

软件项目验收报告模板

软件项目验收报告 一、项目基本信息 项目名称XX智能仓储管理系统开发单位XX科技有限公司验收单位XX物流集团合同签订日期2023年3月15日项目启动日期2023年4月1日验收日期2024年1月20日 二、验收范围 入库管理模块&#xff08;包含RFID识别、库存预警&#xff09;出库调度模…

深度学习笔记39_Pytorch文本分类入门

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 一、我的环境 1.语言环境&#xff1a;Python 3.8 2.编译器&#xff1a;Pycharm 3.深度学习环境&#xff1a; torch1.12.1cu113torchvision…

二分查找-LeetCode

题目 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target&#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输出: 4 解释: …

从 Ext 到 F2FS,Linux 文件系统与存储技术全面解析

与 Windows 和 macOS 操作系统不同&#xff0c;Linux 是由爱好者社区开发的大型开源项目。它的代码始终可供那些想要做出贡献的人使用&#xff0c;任何人都可以根据个人需求自由调整它&#xff0c;或在其基础上创建自己的发行版本。这就是为什么 Linux 存在如此多的变体&#x…

leetcode:3210. 找出加密后的字符串(python3解法)

难度&#xff1a;简单 给你一个字符串 s 和一个整数 k。请你使用以下算法加密字符串&#xff1a; 对于字符串 s 中的每个字符 c&#xff0c;用字符串中 c 后面的第 k 个字符替换 c&#xff08;以循环方式&#xff09;。 返回加密后的字符串。 示例 1&#xff1a; 输入&#xff…

JVM详解(曼波脑图版)

(✪ω✪)&#xff89; 好哒&#xff01;曼波会用最可爱的比喻给小白同学讲解JVM&#xff0c;准备好开启奇妙旅程了吗&#xff1f;(๑˃̵ᴗ˂̵)و &#x1f4cc; 思维导图 ━━━━━━━━━━━━━━━━━━━ &#x1f34e; JVM是什么&#xff1f;&#xff08;苹果式比…

ZStack文档DevOps平台建设实践

&#xff08;一&#xff09;前言 对于软件产品而言&#xff0c;文档是不可或缺的一环。文档能帮助用户快速了解并使用软件&#xff0c;包括不限于特性概览、用户手册、API手册、安装部署以及场景实践教程等。由于软件与文档紧密耦合&#xff0c;面对业务的瞬息万变以及软件的飞…