目录
- 使用DDL语句来操作数据库以及表结构(数据库设计)
- 使用DML语句来完成数据库中数据的增、删、改操作(数据库操作)
学习数据库操作方面的内容:查询(DQL语句)。
查询操作我们分为两部分学习:
-
DQL语句-单表查询操作
-
DQL语句-多表查询操作
数据库中数据的查询操作,也就是DQL语句,DQL语句学习完毕之后,关于单表的操作就讲解完了。包括单表的设计,单表的增删改查。
多表的操作,包括多表的设计,多表的查询等。
一. 数据库操作 --- DQL语句(重点掌握)
1.1 介绍
DQL
- DQL英文全称是Data Query Language(数据查询语言),用来查询数据库表中的记录/数据。
- 查询关键字:SELECT
查询操作是所有SQL语句当中最为常见,也是最为重要的操作。
- 在一个正常的业务系统中,查询操作基本上能够占据90%以上,查询操作的使用频次是要远高于增删改操作的。
- 当我们打开某个网站或APP所看到的展示信息,这些数据都是在数据库当中存储和管理的,都是通过从数据库中查询得到的,而这个查询操作也是最为复杂的一种操作,基本上每点击一次都会发起一次或者是多次的查询操作,而在这个查询过程中,还会涉及到条件、排序、分页等操作。
- 前端页面它仅仅是将数据以好看的样式呈现出来,最终的数据是在数据库当中存储和和管理的,而界面当中的每一条数据都对应于数据库表结构当中的一条记录。
- 比如,当我们点击课程管理这个菜单之后,就会将数据库表结构当中的数据查询出来,然后通过前端代码将数据渲染展示在这个页面上。
- 而为了更好的满足用户的需求,给用户提供更好的体验,我们也允许用户在上面根据条件/关键字来进行查询,在查询出来的这个结果当中,我们也可以对结果进行排序,比如我们可以按照创建时间进行升序排序,也可以按照创建时间进行降序排序。
- 如果我们查询返回的这个数据比较多,假如说有成千上万条,此时如果一次性将成千上万条数据都展示出来,第一个页面加载速度会比较慢,第二个用户体验不好,所以如果数据量比较多,我们可以考虑进行分页展示,这样,用户就可以分页来查看对应的数据了,用户的体验也会更好一些。所以我们可以看到,查询这个操作确实相对是比较繁琐的。
1.2 基本语法
DQL查询语句,语法结构如下:
- 基本查询:DQL语句它的语法是以select开始,select之后跟上的是字段列表,就代表我们要查询返回表中的哪些字段,多个字段之间使用逗号分隔,from之后跟上表名列表,也就是说我们可以从多张表当中进行查询(今天先学习单表查询,后面再学习多表查询)。这就构成了第一个部分,也就是基本查询部分,在基本查询当中,我们只需要指定从哪一张表当中来查询,查询返回哪些字段。
- 条件查询:第二个部分就是条件查询,在基本查询后面可以加上一个关键字where,在where之后跟上条件列表,这里也可以传递多个条件。
- 分组查询:第三个部分就是分组查询,分组查询对应的关键字是group by,在group by之后跟上分组的字段,如果分组之后我们还要进行条件的筛选,在后面再跟上一个关键字having,having之后加上的是分组后的条件。举例:我们现在有一张表是员工表,里面有一个字段是gender性别,现在我想统计男性员工、女性员工各多少人,此时我们就可以先根据性别这个字段来进行一个分组,分完组之后再来统计男性和女性各多少人。
- 排序操作:再往下就是排序操作,我们只需要在后面再加上一个关键字order by,在order by之后跟上排序的字段,这里也是可以支持多个字段进行排序的。
- 分页查询:最后一个方面就是limit分页查询,需要在SQL语句的后面加上一个关键字 --- limit,在limit之后跟上分页参数。
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数
将上面的完整语法拆分为以下几个部分学习:
-
基本查询(不带任何条件)
-
条件查询(where)
-
分组查询(group by)
-
排序查询(order by)
-
分页查询(limit)
准备一些测试数据用于查询操作:
create database db02; -- 创建数据库
use db02; -- 切换数据库
-- 员工管理(带约束)
create table tb_emp (
id int unsigned primary key auto_increment comment 'ID',
username varchar(20) not null unique comment '用户名',
password varchar(32) default '123456' comment '密码',
name varchar(10) not null comment '姓名',
gender tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',
image varchar(300) comment '图像',
job tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管',
entrydate date comment '入职时间',
create_time datetime not null comment '创建时间',
update_time datetime not null comment '修改时间'
) comment '员工表';
-- 准备测试数据
INSERT INTO tb_emp (id, username, password, name, gender, image, job, entrydate, create_time, update_time) VALUES
(1, 'jinyong', '123456', '金庸', 1, '1.jpg', 4, '2000-01-01', '2022-10-27 16:35:33', '2022-10-27 16:35:35'),
(2, 'zhangwuji', '123456', '张无忌', 1, '2.jpg', 2, '2015-01-01', '2022-10-27 16:35:33', '2022-10-27 16:35:37'),
(3, 'yangxiao', '123456', '杨逍', 1, '3.jpg', 2, '2008-05-01', '2022-10-27 16:35:33', '2022-10-27 16:35:39'),
(4, 'weiyixiao', '123456', '韦一笑', 1, '4.jpg', 2, '2007-01-01', '2022-10-27 16:35:33', '2022-10-27 16:35:41'),
(5, 'changyuchun', '123456', '常遇春', 1, '5.jpg', 2, '2012-12-05', '2022-10-27 16:35:33', '2022-10-27 16:35:43'),
(6, 'xiaozhao', '123456', '小昭', 2, '6.jpg', 3, '2013-09-05', '2022-10-27 16:35:33', '2022-10-27 16:35:45'),
(7, 'jixiaofu', '123456', '纪晓芙', 2, '7.jpg', 1, '2005-08-01', '2022-10-27 16:35:33', '2022-10-27 16:35:47'),
(8, 'zhouzhiruo', '123456', '周芷若', 2, '8.jpg', 1, '2014-11-09', '2022-10-27 16:35:33', '2022-10-27 16:35:49'),
(9, 'dingminjun', '123456', '丁敏君', 2, '9.jpg', 1, '2011-03-11', '2022-10-27 16:35:33', '2022-10-27 16:35:51'),
(10, 'zhaomin', '123456', '赵敏', 2, '10.jpg', 1, '2013-09-05', '2022-10-27 16:35:33', '2022-10-27 16:35:53'),
(11, 'luzhangke', '123456', '鹿杖客', 1, '11.jpg', 2, '2007-02-01', '2022-10-27 16:35:33', '2022-10-27 16:35:55'),
(12, 'hebiweng', '123456', '鹤笔翁', 1, '12.jpg', 2, '2008-08-18', '2022-10-27 16:35:33', '2022-10-27 16:35:57'),
(13, 'fangdongbai', '123456', '方东白', 1, '13.jpg', 1, '2012-11-01', '2022-10-27 16:35:33', '2022-10-27 16:35:59'),
(14, 'zhangsanfeng', '123456', '张三丰', 1, '14.jpg', 2, '2002-08-01', '2022-10-27 16:35:33', '2022-10-27 16:36:01'),
(15, 'yulianzhou', '123456', '俞莲舟', 1, '15.jpg', 2, '2011-05-01', '2022-10-27 16:35:33', '2022-10-27 16:36:03'),
(16, 'songyuanqiao', '123456', '宋远桥', 1, '16.jpg', 2, '2010-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:05'),
(17, 'chenyouliang', '12345678', '陈友谅', 1, '17.jpg', null, '2015-03-21', '2022-10-27 16:35:33', '2022-10-27 16:36:07'),
(18, 'zhang1', '123456', '张一', 1, '2.jpg', 2, '2015-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:09'),
(19, 'zhang2', '123456', '张二', 1, '2.jpg', 2, '2012-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:11'),
(20, 'zhang3', '123456', '张三', 1, '2.jpg', 2, '2018-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:13'),
(21, 'zhang4', '123456', '张四', 1, '2.jpg', 2, '2015-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:15'),
(22, 'zhang5', '123456', '张五', 1, '2.jpg', 2, '2016-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:17'),
(23, 'zhang6', '123456', '张六', 1, '2.jpg', 2, '2012-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:19'),
(24, 'zhang7', '123456', '张七', 1, '2.jpg', 2, '2006-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:21'),
(25, 'zhang8', '123456', '张八', 1, '2.jpg', 2, '2002-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:23'),
(26, 'zhang9', '123456', '张九', 1, '2.jpg', 2, '2011-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:25'),
(27, 'zhang10', '123456', '张十', 1, '2.jpg', 2, '2004-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:27'),
(28, 'zhang11', '123456', '张十一', 1, '2.jpg', 2, '2007-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:29'),
(29, 'zhang12', '123456', '张十二', 1, '2.jpg', 2, '2020-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:31');
DataGrip快捷键
- 大写自动给转换:SQL使用大写形式是个好的习惯,使用Ctrl + Shift + U快捷键自动转换。
- SQL格式化:选中需要格式化的SQL代码。使用Ctrl + Shift + L快捷键。
1.3 基本查询
基本查询我们只需要指定从哪一张表当中来查询返回哪些字段就可以。
在基本查询的DQL语句中,不带任何的查询条件,语法如下:
- 查询多个字段:查询返回多个字段,多个字段之间使用逗号分隔,然后在from之后指定表名
select 字段1, 字段2, 字段3 from 表名;
- 查询所有字段(通配符):简化写法:使用*号这个通配符,来通配所有的字段
select * from 表名;
- 设置别名:我们可以为查询返回的字段来设置别名,只需要在字段名后面跟上一个as关键 字,as之后跟上一个别名就可以,as关键字是可以省略的。
select 字段1 [ as 别名1 ] , 字段2 [ as 别名2 ] from 表名;
- 去除重复记录:只需要在字段列表前面加上一个关键字distinct,那么此时就会将查询返回的 字段值自动去重,也就是说如果有多个相同的值,它只保留一个,其他的就 全部去除掉了。
select distinct 字段列表 from 表名;
-- =============================DQL:基本查询=============================
-- 1.查询指定字段 name,entrydate 并返回
select name,entrydate from tb_emp;
-- 2.查询返回所有字段
-- 推荐
select id, username, password, name, gender, image, job, entrydate, create_time, update_time from tb_emp;
-- 不推荐(原因:可读性不好不直观,性能低影响效率)
select * from tb_emp;
-- 3.查询所有员工的 name,entrydate,并起别名(姓名、入职日期)
select name as 姓名,entrydate as 入职日期 from tb_emp;
-- as关键字是可以省略的
select name 姓名,entrydate 入职日期 from tb_emp;
-- 如果别名当中有特殊符号或者说有空格,需要给这个别名加上一个引号(单引号或者双引号都可以)
select name '姓 名',entrydate '入 职 日 期' from tb_emp;
-- 4.查询已有的员工关联了哪几种职位(不要重复)
-- distinct关键字对查询去重
select distinct job from tb_emp;
案例1:查询指定字段 name,entrydate并返回
select name,entrydate from tb_emp;
案例2:查询返回所有字段:先写select from 表名,然后再随便写个字段,就可以自动提示出来!
-- 2.查询返回所有字段
-- 推荐
select id, username, password, name, gender, image, job, entrydate, create_time, update_time from tb_emp;
-- 不推荐(原因:可读性不好不直观,性能低影响效率)
select * from tb_emp;
-
*
号代表查询所有字段,在实际开发中尽量少用(可读性不好不直观、性能低影响效率)
案例3:查询所有员工的 name,entrydate,并起别名(姓名、入职日期)
-- 3.查询所有员工的 name,entrydate,并起别名(姓名、入职日期)
select name as 姓名,entrydate as 入职日期 from tb_emp;
-- as关键字是可以省略的
select name 姓名,entrydate 入职日期 from tb_emp;
-- 如果别名当中有特殊符号或者说有空格,需要给这个别名加上一个引号(单引号或者双引号都可以)
select name '姓 名',entrydate '入 职 日 期' from tb_emp;
案例4:查询已有的员工关联了哪几种职位(不要重复)
-- 4.查询已有的员工关联了哪几种职位(不要重复)
-- distinct关键字对查询去重
select distinct job from tb_emp;
1.4 条件查询
语法:
select 字段列表 from 表名 where 条件列表 ; -- 条件列表:意味着可以有多个条件
- 条件查询就是在基本查询的基础上加上一个关键字where,在where之后来编写条件列表。
- 既然是一个条件列表,就说明where之后的查询条件是可以有多个的。
- 我们学习条件查询主要学习的就是条件的构建方式,而在SQL语句当中,构建条件的运算符有很多,主要分为两类:一类是比较运算符,一类是逻辑运算符。
常用的比较运算符如下:
比较运算符 | 功能 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
between ..最小值. and .最大值.. | 在某个范围之内(包含最小、最大值) |
in(...) | 在in之后的列表中的值,多选一 |
like 占位符 | 模糊查询,模糊匹配(_匹配单个字符, %匹配任意个字符) |
is null | 是null , 还有is not null,不是null |
- between...and...这个是进行范围查询的,在某一个范围之间,那这就代表在最小值和最大值之间,而且包含最小值也包含最大值。
- in(...):括号里面来写列表当中的各个值,而各个值是多选一的关系,也就是说只要能满足其中的一个就可以。
- like关键字是进行模糊匹配的,模糊查询当中有两个占位符 / 通配符,一个是下划线_,一个是百分号%,下划线仅仅匹配单个字符,一个下划线代表一个字符,而百分号是可以匹配任意个字符,也包括零个字符。
- 比较运算符的最后一种就是判断null值的,在SQL语句当中我们要判断null值,不要使用= null,而要使用is null,使用isnull(字段名)来判断是否为NULL值。
说明: NULL与任何值的直接比较都为NULL。
常用的逻辑运算符如下:
逻辑运算符 | 功能 |
---|---|
and 或 && | 并且 (条件列表当中的多个条件同时成立) |
or 或 || | 或者 (条件列表当中的多个条件有任意一个成立) |
not 或 ! | 非 , 不是(指的就是取反的含义) |
-- ==================DQL:条件查询==================
-- 1.查询 姓名 为 杨逍 的员工
-- 字符串要使用''或者""包含
select * from tb_emp where name = '杨逍';
-- 2.查询 id小于等于5 的员工信息
select * from tb_emp where id <= 5;
-- 3.查询 没有分配职位 的员工信息
-- 注意:查询为NULL的数据时,不能使用 = null,否则查询结果没有数据
select * from tb_emp where job is null;
-- 4.查询 有职位 的员工信息
select * from tb_emp where job is not null;
-- 5.查询 密码不等于'123456' 的员工信息
select * from tb_emp where password != '123456';
select * from tb_emp where password <> '123456';
-- 6.查询 入职日期 在'2000-01-01'(包含) 到'2010-01-01'(包含) 之家的员工信息
select * from tb_emp where entrydate >= '2000-01-01' and entrydate <= '2010-01-01';
select * from tb_emp where entrydate between '2000-01-01' and '2010-01-01';
-- 7.查询 入职时间 在'2000-01-01'(包含) 到'2010-01-01'(包含) 之间 且 性别为女 的员工信息
select * from tb_emp where entrydate between '2000-01-01' and '2010-01-01' and gender = 2;
-- 也可以用双与&&,但是在SQL语句当中一般用的都是and关键字
select * from tb_emp where entrydate between '2000-01-01' and '2010-01-01' && gender = 2;
-- 8.查询 职位是 2(讲师),3(学工主管),4(教研主管)的员工信息
-- 方式一:使用or关键字连接多个条件
select * from tb_emp where job = 2 or job = 3 or job = 4;
-- 方式二:in关键字
select * from tb_emp where job in(2,3,4);
-- 9.查询 姓名 为两个字的员工信息
-- like模糊查询,一个下划线_就代表一个字符
-- 模糊查询中,通配符/占位符"_"标识一个任意字符
select * from tb_emp where name like '__';
-- 10.查询 姓'张' 的员工信息
-- 百分号%代表的是任意个字符
-- 通配符"%"代表任意个字符(0个~多个)
-- 这就代表要查询的是姓名当中第一个字符是张,而后面是什么无所谓
select * from tb_emp where name like '张%';
1.5 分组查询
分组查询就是在条件查询where之后加上一个关键字group by来指定分组的字段,如果在分组之后还要进行条件的过滤、条件的筛选,就可以在group by之后再加上一个关键字having,然后通过having这个关键字来指定分组后的过滤条件。而分组这个操作一般会伴随着聚合统计进行,比如我们要根据员工的性别来进行分组,然后分别计算男性员工多少人,女性员工多少人,那此时既需要根据gender这个字段进行分组,还要进行分组之后的聚合统计操作。
这里会涉及到数据库当中的聚合函数,所以在学习分组查询的具体语法之前我们先来学习一下MySQL当中的聚合函数。
1.5 聚合函数
所谓聚合函数指的就是将表当中的某一列数据作为一个整体,进行一个纵向的计算。
之前我们做的查询都是横向查询,就是根据条件一行一行的进行判断,而使用聚合函数查询就是纵向查询,它是对一列的值进行计算,然后返回一个结果值。(将一列数据作为一个整体,进行纵向计算)
我们在调用聚合函数的时候,直接写上聚合函数的名字,然后在小括号当中来指定这个聚合函数要对哪一个字段进行纵向的运算。
count :按照列去统计有多少行数据。
- 在根据指定的列统计的时候,如果这一列中有null的行,该行不会被统计在其中。
sum :计算指定列的数值和,如果不是数值类型,那么计算结果为0
max :计算指定列的最大值
min :计算指定列的最小值
avg :计算指定列的平均值
语法:
select 聚合函数(字段列表) from 表名 ;
注意 : 聚合函数会忽略空值,对NULL值不作为统计。
注意:不要使用count(字段)或count()常量来替代count(*),因为count(*)是SQL92定义的标准统计行数的语法,跟数据库无关,跟NULL和非NULL无关,也就是count(*)会统计值为NULL的行,而count(字段)不会统计此列为NULL的行。
-- ======================DQL:分组查询========================
-- 聚合函数:聚合函数它是不对null值进行运算的
-- 1.统计该企业员工数量
-- 要统计总数量,用到的聚合函数就是count
-- 而count统计总数据量它总共有三种方式
-- 使用count这个聚合函数求取总数据量的三种使用方式:
-- A.count(字段)
select count(id) from tb_emp;
-- 提问:我们count这个字段,到底要count哪个字段,是任何一个字段都可以吗?
-- 由于聚合函数它是不对null值进行运算的,因此如果我们要使用count字段这种形式来统计总数据量,一定要count一个非空字段
-- B.count(常量)
-- 只要count的是一个不为null的常量都可以,因为null值不参与聚合函数的运算
select count(0) from tb_emp;
select count('A') from tb_emp;
-- C.count(*) -- 推荐使用
-- *就是通配的意思,通过count(*)就可以求取这张表的总数据量
-- 在项目开发的时候,推荐使用count(*),因为MySQL数据库底层对此专门做了优化处理
select count(*) from tb_emp;
-- 2.统计该企业最早入职的员工 -- min
-- 最早入职就是入职时间的最小值
select min(entrydate) from tb_emp;
-- 3.统计该企业最迟入职的员工 -- max
-- 最迟入职就是应该计算入职时间的最大值
select max(entrydate) from tb_emp;
-- 4.统计该企业员工 ID 的平均值 -- avg
select avg(id) from tb_emp;
-- 5.统计该企业员工的 ID 之和 -- sum
select sum(id) from tb_emp;
1.6 分组查询:![](https://img-blog.csdnimg.cn/017c80e938ba41d2b9e0ad9baf1c8490.png)
分组查询就是在条件查询where之后加上一个关键字group by来指定分组的字段,如果在分组之后还要进行条件的过滤、条件的筛选,不要写在where之后,要写在having之后,就可以在group by之后再加上一个关键字having,然后通过having这个关键字来指定分组后的过滤条件。而分组这个操作一般会伴随着聚合统计进行,比如我们要根据员工的性别来进行分组,然后分别计算男性员工多少人,女性员工多少人,那此时既需要根据gender这个字段进行分组,还要进行分组之后的聚合统计操作。
分组: 按照某一列或者某几列,把相同的数据进行合并输出。
- 分组其实就是按列进行分类(指定列下相同的数据归为一类),然后可以对分类完的数据进行合并计算。
- 分组查询通常会使用聚合函数进行计算。
语法:
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];
select + 分组字段,聚合函数 from....
-- 分组
-- 1.根据性别分组,统计男性和女性员工的数量 -- count(*)
-- 没有查询条件,但是有分组字段
-- 这代表我们要将员工根据性别这个字段进行一个分组
-- 按照gender字段进行分组(gender字段下相同的数据归为一组)
-- 在分组查询当中,select之后能够返回的字段列表主要包含两类:一类是分组字段,另一类是聚合函数
-- select * from tb_emp group by gender; -- 运行报错
select gender,count(*) from tb_emp group by gender;
-- 2.要查询入职时间在'2015-01-01'(包含)以前的员工,并对结果根据职位分组,获取员工数量大于等于2的职位
-- 报错,原因:在where之后是不能使用count聚合函数的,where不能对聚合函数进行判断
-- "获取员工数量大于等于2的职位",这个条件是属于分组之后的过滤,如果是分组之后的过滤,不要写在where之后
-- 要在后面加上一个关键字having,在having之后再来写分组之后的过滤条件
-- select job,count(*) from tb_emp where entrydate <= '2015-01-01' and count(*) >= 2 group by job;
select job,count(*) from tb_emp where entrydate <= '2015-01-01' group by job having count(*) >= 2;
-- where entrydate <= '2015-01-01' -- 分组前条件
-- group by job -- 按照job字段分组
-- having count(*) >= 2; -- 分组后条件
面试题:SQL语句当中where和having之后跟上的都是查询条件,它们之间有什么样的区别?
where与having区别(面试题)
-
执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是 分组之后对结果进行过滤。
-
判断条件不同:where之后的条件不能对聚合函数进行判断,而having可以。
分组查询的两点注意事项:
- 分组查询之后,查询所返回的字段一般为分组字段和聚合函数,查询其他字段无任何意义。
- 执行顺序:where > 聚合函数 > having
- 首先是where子句先运行,先进行条件的过滤,条件筛选完了之后不满足where条件的是不会进行分组操作的,所以第二个部分执行的就是分组操作加上聚合函数,这部分运行完了之后再来执行第三个部分那就是having子句,在having之后再来对分组后的数据进行条件的过滤。
1.7 排序查询
排序在日常开发中是非常常见的一个操作,有升序排序,也有降序排序。
排序查询对应的关键字是order by,我们只需要在分组查询group by之后跟上一个关键字order by,在order by之后指定排序的字段列表就可以了。
- 排序查询只需要在基本查询,条件查询,分组查询之后加上一个关键字order by,在order by之后指定排序的字段以及这个字段的排序方式。
- 如果排序字段有多个,中间使用逗号分隔,后面再指定第二个排序字段以及第二个字段的排序方式。
语法:
select 字段列表
from 表名
[where 条件列表]
[group by 分组字段 ]
order by 字段1 排序方式1 , 字段2 排序方式2 … ;
而这个排序方式就只有两种,一种是升序,一种是降序,默认是升序。
-
排序方式:
-
ASC :升序(默认值)
-
DESC:降序
-
-- =========================排序查询=========================
-- 1.根据入职时间,对员工进行升序排序 -- asc
-- 按照entrydate字段下的数据进行升序排序
select * from tb_emp order by entrydate asc;
-- 注意事项:如果是升序,可以不指定排序方式ASC
select * from tb_emp order by entrydate; -- 默认就是ASC(升序)
-- 2.根据入职时间,对员工进行降序排序 -- desc
-- 按照entrydate字段下的数据进行降序排序
select * from tb_emp order by entrydate desc;
-- 3.根据 入职时间 对公司的员工进行 升序排序 , 如果入职时间相同, 再按照 更新时间 进行降序排序
-- 如果是多个排序字段,每个排序字段之间使用逗号分隔,后面再指定第二个排序字段
-- 在SQL语句当中,只有当第一个字段值相同的时候,第二个排序字段才会生效
-- 反之,如果是三个字段的排序,那就是前两个字段值都相同时,才会根据第三个字段排序
-- 注意事项:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序
select * from tb_emp order by entrydate, update_time desc;
1.8 分页查询
分页操作在业务系统开发时,也是非常常见的一个功能,日常我们在网站中看到的各种各样的分页条,后台也都需要借助于数据库的分页操作。数据分页展示之后,用户在查看数据的时候只需要点击对应的页码,就可以加载出这一页的数据。
- 如果我们一次性查询出来的数据比较多,就会进行分页展示,从而提高用户的体验。
在DQL语句当中分页查询的语法:
- 分页查询只需要在查询语句的后面加上一个关键字limit,然后在limit之后来指定分页参数就可以了。
- 而limit之后所指定的分页参数有两个,一个是起始索引,一个是查询记录数,两个参数之间使用逗号分隔。
起始索引指的是我们要从哪一条记录往后进行查询,起始索引默认是从0开始的。
而查询记录数指的就是这一页我需要展示多少条数据。
分页查询语法:
select 字段列表 from 表名 limit 起始索引, 查询记录数 ;
-- ============================分页查询========================
-- 1.从 起始索引0 开始查询员工数据,每页展示5条记录
-- 从索引0开始,向后取5条记录
select * from tb_emp limit 0,5;
-- 2.查询 第1页 员工数据,每页展示5条记录
select * from tb_emp limit 0,5;
-- 如果查询的是第一页数据,起始索引可以忽略,直接简写为:limit 条数
select * from tb_emp limit 5;
-- 3.查询 第2页 员工数据,每页展示5条记录
-- 2是页码不是起始索引
-- 从索引5开始,向后取5条记录
select * from tb_emp limit 5,5;
-- 4.查询 第3页 员工数据,每页展示5条记录
-- 从索引10开始,向后取5条记录
select * from tb_emp limit 10,5;
-- 起始索引的计算公式
-- 起始索引 = (页码 - 1) * 每页展示记录数
注意事项:
1. 在分页查询时,将来前端并不会把起始索引传递过来,它传递的都是一个页码,比如我要查询第一页,第二页,第三页,第四页的数据,传递过来一个页码之后,我们在执行SQL语句的时候,需要将页码换算成对应的起始索引:起始索引 = (查询页码 - 1) * 每页展示记录数。
2. 分页查询它其实是属于数据库的方言,所谓数据库的方言指的就是各个关系型数据库之间它们不是通用的,是有不同实现的,不同数据库它们的分页实现方式也不一样,在MySQL当中用的是limit
3. 如果查询的是第一页数据,起始索引可以忽略,直接简写为:limit 条数。