前面介绍完了MySQL的DDL和DML,今天来学习一下DQL。

一、数据库操作-DQL

1、DQL-基本查询

DQL,Data Query Language(数据查询语言),用来查询数据库表中的记录。
查询的关键字: SELECT。查询的语法结构如下图

1)查询多个字段

1
select 字段1,字段2,字段3 from 表名;

2)查询所有字段(通配符)

1
select * from 表名;

3)设置别名

1
select 字段1 [as 别名1],字段2 [as 别名2] from 表名;

4)去除重复记录

1
select distinct 字段列表 from 表名;

注:*号代表查询所有字段,在实际开发中尽量少用(不直观且影响效率)。

2、DQL-条件查询

2.1 基本语法

1
select 字段列表 from 表名 where 条件列表;

2.2 常用的运算符

在条件查询中有一些常见的运算符,如比较运算符和逻辑运算符,如下图

这里重点是模糊查询,注意一下匹配单个和匹配任意就行。

eg1:从tb_user表中查询年龄在20-25岁之间(包含)的用户信息

1
select * from tb_user where age >=20 and age <=25;

或者

1
select * from tb_user where age between 20 and 25;

eg2:从tb_user表中查询年龄为20,21,22的用户信息

1
select * from tb_user where age = 20 or age = 21 or age = 22;

或者

1
select * from tb_user where age in (20,21,22);

eg3:从tb_user表中查询姓名为两个字的用户信息

1
select * from tb_user where name like '__';

两个字使用两根下划线,同理三个字使用三根下划线。

eg4:从tb_user表中查询姓’张’的用户信息

1
select * from tb_user where name like '张%';

3、DQL-聚合函数

3.1 概述

所谓聚合函数,就是将一列数据作为一个整体,进行纵向计算。常用的函数如下。

注:聚合函数不对null值进行运算

3.2 语法

1
select 聚合函数(字段列表) from 表名;

3.3 示例

eg1:统计tb_user表中用户的数量

1
2
-- count(字段)
select count(id) from tb_user;

或者

1
2
-- count(常量)
select count(1) from tb_user;

或者

1
2
-- count(*) 推荐
select count(*) from tb_user;

eg2:统计tb_user表中年龄最小的用户

1
select min(age) from tb_user;

同理统计最大的则为 max

eg3:统计tb_user表中用户年龄的平均值

1
select avg(age) from tb_user;

4、DQL-分组查询

4.1 基本语法

1
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having分组后过滤条件];

4.2 示例

eg1:根据性别分组,统计tb_user表中男性和女性用户的数量

1
select gender,count(*) from tb_user group by gender;

运行后的效果为一个两行两列的表格,第一列为性别(男或女),第二列为男或女分别对应的数量。

eg2:从tb_emp员工表中,查询入职时间在’2015-01-01’(包含)以前的员工,并对结果根据职位分组,获取员工数量大于等于2的职位

1
select job,count(*) from tb_emp where entrydate <= '2015-01-01' group by job having count(*) >= 2;

4.3 总结

1)注意

  • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
  • 执行顺序: where >聚合函数> having

2)总结(重点–面试题)

where与having区别?(如下两点)

1、执行时机不同: where是分组之前进行过滤,不满足where条件,不参与分组。而having是分组之后对结果进行过滤。

2、判断条件不同: where不能对聚合函数进行判断,而having可以。

5、DQL-排序查询

5.1 基本语法

1
select 字段列表 from 表名 [where 条件列表][ group by分组字段] order by 字段1 排序方式1,字段2 排序方式...;

5.2 排序方式

1)升序:ASC (默认值)
2)降序:DESC

5.3 示例

eg1:从tb_user表中,根据年龄对用户进行升序排序

1
select * from tb_user order by age asc;

由于默认是升序,所以可删掉asc。同理降序即改为desc即可

eg2:根据年龄对用户进行升序排序,年龄相同,再按照更新时间进行降序排序

1
select * from tb_user order by age , update_time desc;

注:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。

6、DQL-分页查询

6.1 基本语法

1
select 字段列表 from 表名 limit 起始索引,查询记录数;

6.2 示例

eg1:从起始索引0 开始查询用户数据,每页展示5条记录

1
select * from tb_user limit 0,5;

eg2:查询第1页用户数据,每页展示5条记录

1
select * from tb_user limit 0,5;

第1页的索引即为0

eg3:查询第2页用户数据,每页展示5条记录

1
select * from tb_user limit 5,5;

分析:第1页已经展示了5条数据,所以第2页应该从第6条数据开始算起,由于索引从0开始,第1页已经展示了0-4这5条数据,所以第2页索引从5开始。

eg4:查询第3页用户数据,每页展示5条记录(分析同上)

1
select * from tb_user limit 10,5;

6.3 总结(几点注意)

起始索引从0开始,起始索引=(查询页码–1)*每页显示记录数。

分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。

如果查询的是第一页数据,起始索引可以省略。