数据库的核心语言就是SQL语言,SQL语言有四大组成部分:DDL(数据定义语言)、DML(数据操纵语言)、DQL(数据查询语言)和DCL(数据控制语言)。
DQL(Data Query Language)数据查询语言:主要用来查询数据库中表的记录。关键字:select
本文总结了DQL语句并附上DataGrip代码。
- 基本查询
- 条件查询(WHERE)
- 聚合函数(count、max、min、avg、sum)
- 分组查询(GROUP BY)
- 排序查询(ORDER BY)
- 分页查询(LIMIT)
一、基本查询
delete from emp; #删除表所有信息
insert into emp(id, workno, name, gender, age, idcard, workaddress, entrydate)
values(1, '1', '张一', '女', 24, '123456789012345678', '北京', '2021-01-01'),
(2, '2', '李二', '男', 18, '123456789012345670', '北京', '2022-01-01'),
(3, '3', '王三', '男', 28, '123456789712345670', '上海', '2015-06-01'),
(4, '4', '赵四', '女', 20, '213456789012345600', '北京', '2020-09-01'),
(5, '5', '李五二', '男', 40, '123456789012345000', '天津', '2008-01-01'),
(6, '6', '郑六', '男', 18, '123456789012340000', '江苏', '2023-09-01'),
(7, '7', '王七一', '女', 38, '123456780012345670', '北京', '2005-07-01'),
(8, '8', '李八', '女', 56, null, '北京', '2003-09-01');
-- 1.查询指定字段
select name,workno,age from emp;
-- 2.查询所有字段
select id, workno, name, gender, age, idcard, workaddress, entrydate from emp;
-- 3.查询所有员工的工作地址,起别名(as可省略)
select workaddress as '工作地址' from emp;
select workaddress '工作地址' from emp;
-- 4.查询公司员工上班地址(去除重复)
select distinct workaddress '工作地址' from emp;
二、条件查询
-- 1.查询年龄等于28的员工
select * from emp where age = 28;
-- 2.查询年龄小于25的员工
select * from emp where age < 25;
-- 3.查询年龄不等于28的员工(<>或!=)
select * from emp where age != 28;
select * from emp where age <> 28;
-- 4.查询没有身份证号的员工(is null)
select * from emp where idcard is null;
-- 5.查询有身份证号的员工(is not null)
select * from emp where idcard is not null;
-- 6.查询年龄在15岁到20岁之间的员工(&&或and或between..and..)
select * from emp where age >= 15 && age <= 20;
select * from emp where age >= 15 and age <= 20;
select * from emp where age between 15 and 20; #between 最小 and 最大
-- 7.查询性别为女且年龄小于30岁的员工
select * from emp where gender='女' and age < 30;
-- 8.查询年龄等于18或20或40的员工(or或in(...))
select * from emp where age = 18 or age = 20 or age = 40;
select * from emp where age in(18,20,40);
-- 9.查询姓名为三个字的员工(like '_')
select * from emp where name like '___';
-- 10.查询身份证号最后一位是8的员工(like '%')
select * from emp where idcard like '%8';
select * from emp where idcard like '_________________8';
三、聚合函数
-- 1.统计该企业员工数量
select count(*) from emp; #结果是8,首选用*
select count(idcard) from emp; #结果是7,null不计入,易错
-- 2.统计所有员工的平均年龄
select avg(age) from emp;
-- 3.统计所有员工的最大年龄
select max(age) from emp;
-- 4.统计所有员工的最小年龄
select min(age) from emp;
-- 5.统计北京地区的员工年龄之和
select sum(age) from emp where workaddress = '北京';
#null不计入所有聚合函数的计算
四、分组查询
-- where是分组之前过滤,不满足where不参与分组;而having是分组之后过滤。
-- where不能判断聚合函数;而having可以判断聚合函数。
-- 1.根据员工性别分组,统计男性员工和女性员工的数量
select gender, count(*) from emp group by gender;
-- 2.根据性别分组,统计男性员工和女性员工的平均年龄
select gender, avg(age) from emp group by gender;
-- 3.查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址
select workaddress, count(*) from emp where age < 45 group by workaddress having count(*)>=3;
#执行顺序:where > 聚合函数 > having
#一般展示分组后的字段和聚合函数,其他字段无意义
五、排序查询
-- 1.根据年龄对公司员工进行升序、降序排序
select * from emp order by age; #升序(默认)
select * from emp order by age asc; #升序
select * from emp order by age desc; #降序
-- 2.根据年龄对公司员工升序排序,年龄相同,再按照入职时间降序排序
select * from emp order by age asc, entrydate desc;
六、分页查询
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
#分页查询在不同的数据库有不同的实现,MySQL中是LIMIT
-- 1.查询第1页员工数据,每页5条记录 --> 起始索引从0开始
select * from emp limit 0,5;
select * from emp limit 5; #如果查询的是第一页数据,起始索引0可以省略
-- 2.查询第2页员工数据,每页5条记录 --> 起始索引=(页码-1)*每页记录数
select * from emp limit 5,5;
练习:查询性别为女且年龄在20-40岁的前2个员工信息,按年龄升序排序,年龄相同的按入职时间降序排序。
select * from emp where gender = '女' and age between 20 and 40 order by age asc, entrydate asc limit 2;
#前2个用limit 2实现,要放在order by后面