查询关键字
基本查询(不带条件的查询)
1.查询返回多个字段(列)
select 字段1,字段2,字段3,字段4... from 表名;
select * from 表名; (*代表的就是 所有字段 查询所有字段)
2.设置别名
select 字段[as 别名1] 字段[as 别名2] 字段[as 别名3].... from 表名;
select workaddress as '工作地址' from emp;
select workaddress '工作地址' from emp; 上下等效
3.去除重复信息
select distinct 字段列表 from 表名;
概要
-- ----------------------------------查询需求-----------------------------------
-- 1. 基本查询
-- 1. 查询指定字段 ,name workco age 返回
select name,workno,age from emp;
-- 2. 查询返回所有字段数据
select * from emp; -- 但一般不写* 可以把所有的字段打进去
select id, workno, name, gender, age, idcard, workaddress, entrydate from emp;
-- 3. 查询所有员工的工作地址 , 起别名 as
select workaddress as '工作地址' from emp;
-- 不加as 和加as 等效只需要再后面 填备注信息就行
select workaddress '工作地址' from emp;
-- 4. 查询公司员工的上班地址(不要重复 distinct 去除重复
select distinct workaddress from emp;
条件查询 where
select 字段列表 from 表名 where 条件列表
> 大于 >= 大于等于
< 小于 <= 小于等于
= 等于
!= 不等于 <> 不等于
between a and b 在 ab之内 含ab
in(...) 在in之后的列表的值,多选一
like 占位符 模糊匹配 ( _匹配单个字符,%匹配任意个字符) (占位符就是 一个空就是一个占位符
-- 如果要匹配两个字符 就写 name like '__' <- 里面是两个下划线 就是匹配两个字符;
is null 是null is not null 不是空
and 或 && 并且(多个条件同时成立)
or 或 ll 或者 (多个条件任意一个成立)
not 或 ! 非,不是
案例
create table emp(
id int comment '编号',
workno varchar(10) comment '工号',
name varchar(10) comment '姓名',
gender char(1) comment '性别',
age tinyint unsigned comment '年龄',
idcard char(18) comment '身份证号' ,
workaddress varchar(50) comment '工作地址',
entrydate date comment '入职时间'
) comment '员工表';
insert into emp(id, workno, name, gender, age, idcard, workaddress, entrydate)
values (1,'1','犬穷艳','女',20,'123456789012345678','北京','2000-01-01'),(1,'1','刘艳2','女',20,'123456789012345678','北京','2000-01-01'),
(1,'1','犬3穷艳','女',20,'123456789012345678','北京','2000-01-01'),(1,'1','刘5艳','女',20,'123456789012345678','北京','2000-01-01'),
(1,'1','犬3穷艳人','女',20,'123456789012345678','北京','2000-01-01'),(1,'1','刘艳2','女',20,'123456789012345678','北京','2000-01-01'),
(1,'1','犬穷艳人','女',20,'123456789012345678','北京','2000-01-01'),(1,'1','刘1艳','女',20,'123456789012345678','北京','2000-01-01'),
(1,'1','犬亖艳人','女',20,'123456789012345678','北京','2000-01-01'),(1,'1','刘72艳','女',20,'123456789012345678','北京','2000-01-01'),
(1,'1','王亖人','女',20,'123456789012345678','北京','2000-01-01'),(1,'1','刘52艳','女',20,'123456789012345678','北京','2000-01-01'),
(1,'1','王我艳人','女',20,'123456789012345678','北京','2000-01-01'),(1,'1','刘99艳','女',20,'123456789012345678','北京','2000-01-01'),
(1,'1','王3艳人','女',20,'123456789012345678','北京','2000-01-01'),(1,'1','刘999艳','女',20,'123456789012345678','北京','2000-01-01');
-- ----------------------------------查询需求-----------------------------------
-- 1. 基本查询
-- 1. 查询指定字段 ,name workco age 返回
select name,workno,age from emp;
-- 2. 查询返回所有字段数据
select * from emp; -- 但一般不写* 可以把所有的字段打进去
select id, workno, name, gender, age, idcard, workaddress, entrydate from emp;
-- 3. 查询所有员工的工作地址 , 起别名 as
select workaddress as '工作地址' from emp;
-- 不加as 和加as 等效只需要再后面 填备注信息就行
select workaddress '工作地址' from emp;
-- 4. 查询公司员工的上班地址(不要重复 distinct 去除重复
select distinct workaddress from emp;
-- 条件查询
-- 1 .查询年龄等于88的员工
update emp set age = 88 where name ='刘艳2';
select * from emp where age = 88 ;
-- 2. 查询年龄小于20岁的员工信息
select * from emp where age<20 ;
-- 3.查询年龄小于等于20岁的员工信息
select * from emp where age<=20;
-- 4查询没有身份证号的员工信息
insert into emp (id,workno)values (1,'2');
select *from emp where idcard is null;
-- 5查询有身份证号的员工信息
select *from emp where idcard is not null;
-- 6 查询年龄不等于88的员工
select * from emp where age != 88;
select * from emp where age <> 88;
-- 7 查询年龄在15岁(包含) 到 20岁(包含) 之间的员工信息
select * from emp where age between 15 and 20 ; -- beween a and b a是最小值 b是最大值
select * from emp where age>=15 && age<=20 ;
select * from emp where age>=15 and age<=20 ;
-- 8 查询性别为女 且年龄 小于25 岁的员工信息
select * from emp where gender = '女' and age <25 ;
-- 9 年龄等于18 或20 或40;
select * from emp where age =18 ||age=20 or age=40;
select * from emp where age =18 or age=20 or age=40;
select * from emp where age in (18,20,40) ;-- 满足in 18 20 40 之一即可 简化 或
-- 10 查询姓名围殴两个字的员工信息
insert into emp (name) values ('佳泳');
select * from emp where name like '__';
-- 11查询身份证号最后一个是x的员工信息
update emp set idcard='12345678901234567X' where name ='刘1艳';
select * from emp where idcard like '%X' ; -- 他的意思是 前面的是任意数量字符 但最后必须是X
select * from emp where idcard like '_________________X' -- 前面17个_ 最后一个X
分组查询 group by
聚合函数 count max min avg sum
聚合函数就是将一列数据作为一个整体 ,进行纵向计算
count 统计数量
max 最大值
min 最小值
avg 平均值 (average 平均数)
sum 总数
语法
select 聚合函数(字段) from 表名 //所有的 null 值 不参与 聚合函数的运算
-- 聚合函数
-- 1.统计改企业员工的数量
select count(*) from emp; -- * 代表所有字段 35
select count(id) from emp; -- 打出来是 34 所有的统计 是 不统计 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 ='西安';
分组查询 -- 可以人为增加行数
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件]
where和having的条件
- 执行时机不同: where 是分组之前进行过滤, 不满足where条件 不参与分组 , 而having是分组之后对结果过滤
- 判断条件不同,where不能对聚合函数判断 而having可以
分组之前过滤用 where 分组之后 对这几个组 过滤 用 having
案例
-- 分组查询
-- 1. 根据性别分组,统计男性员工 和女性员工的数量
select count(*) from emp group by gender; -- 后面跟上的是分组的字段名 group by 字段名
-- 但是我想知道是男的还是 女的 所以 把gender 也查询出来
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;
排序查询 order by
select 字段列表 from 表名 order by 字段1 排序方式一 ,字段2 排序方式2;
排序方式只有两种 asc 升序 (默认值)
desc ;降序
它的意思是 如果 字段1 两个值相等 则按照字段 2 的排序方式排序
select * from emp order by age asc ,entrydate desc;
比如说 age asc 升序排序, 但有两个或多个age相等 那么这时候 就按照 entrydata 降序排序
案例
-- 排序查询
-- 1 根据年龄对公司的员工进行升序排序
select * from emp order by age asc ;
-- 按照年龄降序排序
select * from emp order by age desc ;
select * from emp order by age ; -- 默认升序 所以直接按列表就可以了
-- 2 根据入职时间,对员工进行 降序排序
select * from emp order by entrydate desc ;
-- 3. 根据年龄对公司的员工进行升序排序, 年龄相同, 再按照 入职时间 进行降序排序
select * from emp order by age asc ,entrydate desc;
分页查询 limit
分页查询是数据库的方言, 不同的数据库有不同的实现, MySQL 中是limit
如果查询的是第一页数据, 起始索引可以省略 直接写 limit 0;
-- 分页查询
-- 参数1 ;起始索引
-- 参数2 查询返回的记录树
select * from emp limit 0,5
从第一条索引开始 然后 向后查5条
第一个起始索引 第一条的起始索引是0所以 1 从起始索引开始向后查找5条记录
如果输入11,5 就是从第12条信息开始向后查找5条
案例
-- 分页查询
-- 查询第一页的员工数据 , 每页展示10条记录
select * from emp limit 0,10 ;
select * from emp limit 10; -- 第一页 也可以这样写
-- 2. 查询第二页 员工数据, 每页展示10条记录 ---> (页码-1)*条数, 条数
select * from emp limit 10,10;
select * from emp limit 30,10; -- 这是 第四页 每页10条信息 但总量只有35条 所以最后只有5条
DQL执行顺序
select 字段 from 表名 where 条件列表 group by 分组字段列表 having 分组后条件列表 order by 排序字段列表 limit 分页参数
首先 from 获取表 然后 执行 where 筛选字段列表 在 group by 将字段列表分组 然后 返回 select 字段列表
接着 将 分好组 的字段列表按照 order by 排序 最后 利用limit 分页
案例
-- 1 查询年龄 为20 21 22 23岁的女性员工信息
select * from emp where gender = '女' and age in(20,21,22);
-- 2查询性别 为 男 , 并且 年龄在20-40 岁 (含) 以内的 姓名为三个字 的员工
select * from emp where gender ='男' and name like '___' between 20 and 40;
-- 3. 统计员工表中, 年龄小于60岁的 ,男性员工 和女性员工的人数
select gender, count(*) from emp where age<60 group by gender;
-- 4. 查询所有年龄小于等于35岁员工的姓名 和年龄 ,并且查询结果按照年龄升序排序,如果年龄相同按照入职时间降序排序
select name,age from emp where age<35 order by age asc , entrydate desc ;
-- 5. 查询性别为男 且年龄在20-40含以内的前5个员工信息, 对查询的结果按照年龄升序排序, 年龄相同按入职时间升序排序
select * from emp where gender='男' and age>20 and age<40 order by age asc ,entrydate desc limit 0,5;
-- 注意的是 order by 在 limit之前 !!!!!!