一、MySQL中使用的关键字
select:查询
where:筛选
group by:分组
having:筛选
distinct:
order by:排序
limit:限制
regexp:
like:模糊查询
1.1、表的数据
当表中的字段比较多,展示时会错乱的时候,可以使用G 进行分行显示
select * from empG
create table emp( id int not null unique auto_increment, name varchar(20) not null, sex enum('male','female') not null default 'male', #大部分是男的 age int(3) unsigned not null default 28, hire_date date not null, post varchar(50), post_comment varchar(100), salary double(15,2), office int, #一个部门一个屋子 depart_id int ); #插入记录 #三个部门:教学,销售,运营 insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values ('jason','male',18,'20170301','张江第一帅形象代言',7300.33,401,1), #以下是教学部 ('tom','male',78,'20150302','teacher',1000000.31,401,1), ('kevin','male',81,'20130305','teacher',8300,401,1), ('tony','male',73,'20140701','teacher',3500,401,1), ('owen','male',28,'20121101','teacher',2100,401,1), ('jack','female',18,'20110211','teacher',9000,401,1), ('jenny','male',18,'19000301','teacher',30000,401,1), ('sank','male',48,'20101111','teacher',10000,401,1), ('哈哈','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门 ('呵呵','female',38,'20101101','sale',2000.35,402,2), ('西西','female',18,'20110312','sale',1000.37,402,2), ('乐乐','female',18,'20160513','sale',3000.29,402,2), ('拉拉','female',28,'20170127','sale',4000.33,402,2), ('僧龙','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门 ('程咬金','male',18,'19970312','operation',20000,403,3), ('程咬银','female',18,'20130311','operation',19000,403,3), ('程咬铜','male',18,'20150411','operation',18000,403,3), ('程咬铁','female',18,'20140512','operation',17000,403,3);
1.2、关键字的执行顺序
执行顺序:from》where》select
书写顺序:select id,name from emp where id>3;
书写顺序和执行顺序并不一致,可以先书写select * from,之后根据需求将*替换
二、where 筛选条件
作用:将问题数据进行筛选
2.1、筛选范围性中间值,可以使用and进行连接,或者between
select id,name,age from emp where id>=3 and id<=6; select id,name from emp where id between 3 and 6; 两者等价,between可以搭配not使用,即not between :不在中间的
2.2、筛选多个单一数值,可以使用or进行连接,或者in
select * from emp where salary=20000 or salary=18000 or salary=17000; select * from emp where salary in (20000,18000,17000); in可以搭配not使用,即not in:不在里面的
2.3、模糊查询 like
while * like 搭配 % 匹配多个任意字符
_ 匹配单一任意字符
select name,salary from emp where name like '%o%';
2.4、长度限制:char_length()
while char_langth(*)=n; 在*里面筛选出长度等于n的选项
select name,salary from emp where char_length(name) = 4;
2.5、当前数据为空:is null
当描述内容为空时,应该使用 is null而不是= null
select name,post from emp where post_comment is NULL;
三、group by分组
select * from 表名 group by 组名
分组之后最小单位是组(显示的是组名),而不是数据,按照上面分组之后只能拿到分组,其他数据无法直接获取,需要依靠聚合函数
3.1、聚合函数
最大值 max:将部门进行分组,求最大薪资max(salary),
select post as '部门',max(salary) as '最高薪资' from emp group by post; 可以使用as重新命名,
最小值min:将部门进行分组,求最小薪资min(salary)
select post,min(salary) from emp group by post;
求和sum:将部门进行分组,求薪资的总和sum(salary)
select post,sum(salary) from emp group by post;
计数count:将部门记性分组,求部门人数count(id)
select post,count(id) from emp group by post; # 常用 符合逻辑
平均值avg:将部门进行分组,求平均值avg(salary)
select post,avg(salary) from emp group by post;
显示组内指定数据group_concat(指定数据,拼接内容):将部门进行分组,显示部门下员工的姓名,并且还支持拼接
select post,group_concat(name,':',salary) from emp group by post; 使用name和salary进行拼接,中间使用:隔开
select concat('NAME:',name),concat('SAL:',salary) from emp; 不分组是直接使用concat
起别名as:不仅可以给字段起别名,还可以给表起别名
select t1.id,t1.name from emp as t1; #先执行from,将emp的名字改为t1,查看t1的id和name
3.2、分组注意
书写顺序:while》group by
执行顺序:while》group by
书写时分为三步:1.先进行筛选:select * from emp where age>30;
2.接着进行分组:select * from emp where age>30 group by post;
3.最后将*更改:select post,avg(salary) from emp where age>30 group by post;
四、having分组之后的筛选
having的使用方法和while是一致的,但是having是while筛选,接着group by分组之后的筛选,having可以和聚合函数搭配使用
先筛选出30岁以上的,再将部门进行分组,最后保留平均薪资打到10000以上的部门
select post,avg(salary) from emp where age>30 group by post having avg(salary) > 10000 ;
五、distinct去重
将age进行去重,但是要注意不要加入id
select distinct id,age from emp; 需要id和age同时相同,才能去重 select distinct age from emp;
六、order by 排序
order by asc:升序(asc可以不写)
order by desc:降序
6.1、order by和order by desc的混用
先进行age的升序,一旦相同时,使用salary的降序
select * from emp order by age desc,salary asc;
6.2、先筛选出10岁以上的员工,接着讲部门进行分组,在筛选出平均工资大于1000的部门,最后按照平均工资进行升序
select post,avg(salary) from emp where age>10 group by post having avg(salary) > 1000 order by avg(salary) desc ;
七、limit限制展示条数
为避免数据量过大,因此进行分页处理 limit 起始位置,展示条数
select * from emp limit 起始位置,展示条数;
八、正则.
正则:regexp
select * from emp where name regexp '^j.*(n|y)$';
九、多表操作
多表查询分为联表以及子查询
联表(将两张表进行拼接后再查询):当需要查询的信息在两张表里面,就需要先将两张表进行连接
子查询(一个一个往下查询):当查询的信息在两张表里面,使用两张表的id的连接关系,先通过要求为条件找到找到被连接表的id,再以被连接表的id为条件找到连接表里面的信息。
9.1、联表
将两个表进行关系,需要查看一张汇总表时,需要进行拼接
涉及到多表操作的时候 一定要加上表的前缀
select dep.name from emp inner join dep on emp.dep_id = dep.id group by dep.name having avg(age) > 25 ;
inner join:内连接 将emp的dep_id和dep的id进行连接,如果都有则显示
select * from emp inner join dep on emp.dep_id = dep.id;
left join:左连接 将emp的dep_id和dep的id进行连接,只要左边(emp)有的都会显示,右边没有则填null
select * from emp left join dep on emp.dep_id = dep.id;
right join:右连接 将emp的dep_id和dep的id进行连接,只要右边(dep)有的都会显示,左边没有则显示null
select * from emp right join dep on emp.dep_id = dep.id;
union:全连接 将左右两边进行连接,没有的则用null显示
select * from emp left join dep on emp.dep_id = dep.id union select * from emp right join dep on emp.dep_id = dep.id;
9.2、子查询
子查询为分步解决问题的思路,使用一个查询语句的结果去当另一个查询语句的条件
查询部门是技术部门或者人力资源部门的人员
1.先通过筛选部门的得到员工的相关id
select id from dep where name='技术' or name = '人力资源';
2.接着通过id找到人员姓名
select name from emp where dep_id in (200,201);
3.将两个信息合并就是,找到部门的人员信息,只不过是将id做一个中转
select * from emp where dep_id in (select id from dep where name='技术' or name = '人力资源');
10、exists 只返回布尔值
和外层语句搭配使用,当返回True时执行,当外层语句返回False时,不执行
select * from emp where exists (select id from dep where id>3);