mysql常见的使用语法

mysql常见的适用语法

几个重要关键字的执行顺序

# 书写顺序
select id,name from emp where id > 3;

# 执行顺序
from ==》 where ==》 select

感觉sql语法很像英语的句子书写。

where 关键字:筛选条件

2.查询员工id在3和6之间。
select * from emp where id >=3 and id<=6;

select * from emp where id between 3 and 6;

3 查询姓名中含有o的员工。
select * from emp where name like "%o%";

4.查询员工姓名是由4个字符组成。
select * from emp where name like '____';
select * from emp where char_length(name) = 4;

5.查询id小于3或者大于6的员工信息
select * from emp where id not between 3 and 6;

6. 查询薪资不在20000,18000,17000范围的数据
select * from emp where salary not in (20000,18000,17000);

7.查询岗位描述为空的员工姓名和岗位名.针对null不用等号,用is。
select name,post from emp where post_comment is NULL
# group by 分组

# 分组之后,最小的可操作单位应该是组,不是单个数据。
# 按照什么分组就只能拿到分组,其他字段不能直接获取 需要借助一些方法
# 聚合函数:max,min,avg,sum,count

1. 按照部门分组
select post from emp group by post;

1. 获取每个部门的最高薪资:max
select post,max(salary) from emp group by post;

select post as '部门',max(salary) as '最搞薪资' from emp group by post;
# as可以给字段起别名,也可以省略,到那时不推荐。

2.获取每个部门的最低薪资:min
select post,min(salary) from emp group by post;

3.获取每个部门的平均薪资:avg
select post,avg(salary) from emp group by post;

4.获取每个部门的工资总和:sum
select post,sum(salary) from emp group by post;

5.获取每个部门的人数:count
# 不能对含null的字段进行统计。
select post,count(id) from emp group by post;



6.查询分组之后各部门名称和每个部门所有的员工姓名
# group_concat 不单单可以支持获取分组之后的其他字段值,还支持拼接操作

select post,group_concat(name) from emp group by post;

select post,group_concat(name,'_DSB') from emp group by post;

select post,group_concat(name,":",salary) from emp group by post;

分组注意事项:

# 关键字where和group by同时出现的时候group by必须在where的后面。
1. where先对整体数据进行过滤之后在分组操作.
2. 聚合函数只能在分组之后使用,where筛选条件不能使用聚合函数。
3. 不分组默认整体就是一组。

2. 统计各部门年龄在30岁以上的员工平均薪资
select post,avg(salary) from emp where age>30 group by post;

having分组之后的筛选条件

'''
having的语法跟where是一致的
只不过having是在分组之后进行的过滤操作
即having是可以直接使用聚合函数的。
'''
通缉各部门年龄在30岁以上的员工平均工资并且保留平均薪资大于10000的部门。
select post,avg(salary) from emp where age>30 group by post having avg(salary) > 10000;

distinct去重

'''
一定要注意,必须是完全一样的数据才可以去重。
'''
select distinct id,age from emp;
select distinct age from emp;

order by排序

# 默认之后跟着一个asc.默认是升序
select * from emp order by salary; == select * from emp order by salary asc
# 降序
select * from emp order by salary desc;

# 如果要是比的结构相同,那么可以在之后在增加比较条件。
select * from emp order by salary,id;

limit限制展示条数

针对数据过多的情况,通常做分页处理、

select * from emp limit 3;  # 只展示3条数据

select * from emp limit 0,5;  # 第一个参数是起始位置,第二个参数是展示条数。

正则

select * from emp where name regexp '正则规律';

拼表

select * from emp,dep where emp.dep_id = dep.id;

# 推荐使用这种语法
1. 内连接 inner join
2. 左链接 left join
3. 右链接 right join
4. 全链接 union
1. inner join : 只拼接两张表中共有的数据部分
select * from emp inner join dep on emp.dep_id = dep.id;

2. left join :左表所有的数据都显示出来 没有对应的选项就用null
select * from emp left join dep on emp.dep_id = dep.id;

3. right join : 右表所有的数据都显示出来 没有对应的选项就用null
select * from emp right join dep on emp.dep_id = dep.id;   

4. union : 左右两表所有的数据都展示出来。
左表
union
右表
    

子查询

子查询:就是分步骤解决问题。
将一个查询语句的结果当做另外一个查询语句的条件去做。

select name from emp where dep_id in (200,201);
select id from dep where name='技术' or name = '人力资源';

总结:
表的查询结果可以作为其他表的查询条件
也可以通过其别名的方式把它作为一张虚拟表跟其他表相连。

作业:
1.整理今日内容
2.完成下列分组查询练习题(以课上建表代码为参考)
	1. 查询岗位名以及岗位包含的所有员工名字
    select post,group_concat(name) from emp group by post;
	2. 查询岗位名以及各岗位内包含的员工个数
    select post,count(id) from emp group by post;
	3. 查询公司内男员工和女员工的个数
    select sex,count(id) from emp group by sex;
	4. 查询岗位名以及各岗位的平均薪资
    select post,avg(salary) from emp group by post;
	5. 查询岗位名以及各岗位的最高薪资
    select post,max(salary) from emp group by post;
	6. 查询岗位名以及各岗位的最低薪资
    select post,min(salary) from emp group by post;
	7. 查询男员工与男员工的平均薪资,女员工与女员工的平均薪资
    select sex,avg(salary) from emp group by sex;
3.练习拼表操作并理解其意义
4.理解子查询思路体会其意义
原文地址:https://www.cnblogs.com/liqianxin/p/12836825.html