MySQL学习笔记(六)补充表的操作之distinct,order by,limit,正则,连表操作

下面的链接是基于上次的文章讲解,这次补充上次没讲完的知识点即对连表操作的描述

​​​​​​​​​​​​​​​​​​​​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;

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值