DQL-语法

SELECT
  字段列表
FROM
  表名列表
WHERE
  条件列表
GROUP BY
  分组字段列表
HAVING
  分组后的条件列表
ORDER BY
  排序字段列表
LIMIT
  分页参数

DQL-基本查询

查询多个字段

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

设置表名

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

去除重复记录

SELECT DISTINCT 字段列表 FROM 表名;

案例:查询公司员工的上班地址(不要重复)

select distinct workplace from emp;

DQL-条件查询

语法

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

条件

比较运算符

功能

>

大于

>=

大于等于

<

小于

<=

小于等于

=

等于

<>或!=

不等于

BETWEEN ... AND ...

在某个范围之内(含最大值、最小值)

IN(...)

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

LIKE 占位符

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

IS NULL

是NULL

逻辑运算符

功能

AND或&&

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

OR或||

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

NOT或!

非,不是

案例:

  • 查询年龄等于88的员工信息

select * from emp where age=88;
  • 查询年龄小于20的员工信息

select * from emp where age<20;
  • 查询年龄小于等于20的员工信息

select * from emp where age<=20;
  • 查询没有身份证号的员工信息

select * from emp where idcard is null;
  • 查询有身份证号的员工信息

select * from emp where idcard is not null;
  • 查询年龄不等于88的员工信息

select * from emp where age <> 88;
  • 查询年龄在15岁(包含)到20岁(包含)之间的员工信息

select * from emp where age >= 15 and age <= 20;
select * from emp where age >=15 && age <=20;
select * from emp where age between 15 and 20;
  • 查询性别为女,且年龄小于25岁的员工信息

select * from emp where gender='女' and age < 25;
  • 查询年龄等于18或20或40的员工信息

select * from emp where age in(18,20,40);
select * from emp where age = 18 or age = 20 or age = 40;
  • 查询姓名为两个字的员工信息

select * from emp where name like '__';
  • 查询身份证号最后一位是x的员工信息

select * from emp where idcard like '%x';

DQL-聚合函数

  • 什么是聚合函数?(介绍)

将一列数据作为一个整体,进行纵向计算

  • 常见的聚合函数

函数

功能

count

统计数量

max

最大值

min

最小值

avg

平均值

sum

求和

  • 语法

SELECT 聚合函数(字段列表) FROM 表名;

案例:

  • 统计该企业员工数量

select count(*) from emp;
select count(id) from emp;
  • 统计该企业员工的平均年龄

select avg(age) from emp;
  • 统计该企业员工的最大年龄

select max(age) from emp;
  • 统计该企业员工的最小年龄

select min(age) from emp;
  • 统计西安地区员工的年龄之和

select sum(age) from emp where workaddress = '西安';

注意:null值不参与所有聚合函数运算

DQL-分组查询

  • 语法

SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
  • where与having的区别

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

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

案例:

  • 根据性别分组,统计男性员工和女性员工的数量

select gender,count(*) from emp group by gender;
  • 根据性别分组,统计男性员工和女性员工的平均年龄

select gender,avg(age) from emp group by gender;
  • 查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址

select workaddress,count(*) as workaddress_count from emp where age < 45 group by workaddress having count(*) >= 3;

注意:

  • 执行顺序:where > 聚合函数 > having

  • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段毫无意义

DQL-排序查询

  • 语法

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

ASC:升序(默认值)

DESC:降序

案例:

  • 根据年龄对公司的员工进行升序排序

select * from emp order by age;
  • 根据入职时间,对员工进行降序排序

select * from emp order by entrydate;
  • 根据年龄对公司的员工进行升序排序,年龄相同,再按照入职时间进行降序排序

select * from emp order by age,entrydate desc;

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

DQL-分页查询

  • 语法

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

注意:

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

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

  • 如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10

案例:

  • 查询第1页员工数据,每页展示10条记录

select * from emp limit 10;
  • 查询第2页员工数据,每页展示10条记录

select * from emp limit 10,10;

DQL-案例练习

  • 查询年龄为20,21,22,23岁的女性员工信息

select * from emp where gender = '女' and age in(20,21,22,23);
  • 查询性别为男,并且年龄在20~40(含)以内的姓名为三个字的员工

select * from emp where gender = '男' and age between 20 and 40 and name like '___';
  • 统计员工表中,年龄小于60岁的,男性员工和女性员工的人数

select gender,count(*) from emp where age < 60 group by gender;
  • 查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按升序排序,如果年龄相同按入职时间降序排序

select name,age from emp where age <= 35 order by age,entrydate desc;
  • 查询性别为男,且年龄在20~40(含)以内的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入入职时间升序排序

select * from emp where gender = '男' and age between 20 and 40 order by age,entrydate limit 5;