下面的链接是基于上次的文章讲解,这次补充上次没讲完的知识点即对连表操作的描述
MySQL学习记录(五)补充表的一些操作即where,group by,having用法
一、去重distinct
# 注意必须是完全一样的数据才能去重
# 一定不要将主键忽视了,有主键的情况下是不可能去重的
[
{'id':1,'name':'egon','age':18}
{'id':2,'name':'egon','age':18}
]
# 这两组数据不能去重,不是一模一样的,因为数据的主键值是不相同的也不可能相同
select distinct age from emp; #可以去重
select distinct id,age,name from emp;# 不会去重
select distinct age,name from emp; #可以去重
二、order by 排序
"""
order by 默认是升序 asc 该asc默认可以省略不写
也可修改为降序 desc
"""
select * from emp order by salary; # 得到按照salary升序排序的数据
select * from emp order by salary desc; # 得到按照salary降序排序的数据
# 组合模式
select * from emp order by age desc,salary asc;
# 先按照age降序排,如果碰到age相同则按照salary升序排序
# 案例
"""
统计各部门年龄在10岁以上的员工平均工资并且保留平均工资大于1000的部门,然后对平均工资降序排序
"""
select post,avg(salary) from emp
where age>10
group by post
having avg(salary)>10000
order by avg(salary) desc;
三、limit 限制显示条数
"""
针对数据特别多的情况,一般都是进行分页处理
"""
select * from emp limit 3; # 只展示三条数据
select * from emp limit 0,5; # 从第一条数据开始往后取5条
select * from emp limit 5,5; # 从第六条数据开始往后取5条
# 第一个参数是起始位置,第二个参数是展示条数
四、正则
# regexp
select * from emp where name regexp '^j.*(n|y)$' ;
"""
^ :表示以....开头
$ :表示以....结尾
| :表示或
.*:贪婪匹配
"""
# '^j.*(n|y)$':表示以j开头并且以n或y结尾的数据
五、连表操作
# 表准备
create table dep(
id int,
name char(4)
) ;
create table emp(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int
);
# 拼表
select * from emp,dep; # 结果---->笛卡尔积
select * from emp,dep where emp.dep_id=dep.id;
# 这上面的结果才符合我们的预期,emp表中的dep_id与dep表中的id相对应
"""
MYSQL也知道我们在日后查询数据中,肯定也会经常用到拼表操作,所有特意准备了下面的方法:
inner join 内连接
left join 左连接
right join 右连接
union 全连接
"""
# inner join
select * from emp inner join dep on emp.dep_id=dep.id;
# 只能拼接两表中的公有数据部分
# 会发现上面的结果没有dep表对应的id为203的数据和emp表中id为4的数据,
# 这是因为上面的结果只有两张表 emp.dep_id=dep.id对应的共有数据部分
# left join
select * from emp left join dep on emp.dep_id=dep.id;
# 以左表emp为准,将左表所有的数据都展示出来,没有对应的数据就用null
# right join
select * from emp right join dep on emp.dep_id=dep.id;
# 同样的道理以右表dep为标准,展示右表所有数据,没有的对应数据就用null
# union 全连接 左右两张表的数据全部拿出来
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;