mysql 表的关系&表连接&子查询

表的关系

  • 一对多

建表原则:在多的一方添加 一方的主键作为外键

  • 多对多
    在这里插入图片描述

如果数据表是多对多的关系那么需要创建一张表,把2张关系吧的外键引入

  • 一对一关系
    在这里插入图片描述

在任何一方添加对方的主键作为外键

内连接

  • 表的自然连接(多表查询)

使用的两张表

create database emp;
use emp;
create table department(
id int,
name varchar(20) 
);

create table employee(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int
);

#插入数据
insert into department values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营');

insert into employee(name,sex,age,dep_id) values
('AA','male',18,200),
('BB','female',48,201),
('CC','male',38,201),
('DD','female',28,202),
('EE','male',18,200),
('FF','female',18,204)
;
  • 合并结果集
    1、合并结果集就是把两个select语句的查询结果合并到一起
    2、合并的select语句的列数量、类型、顺序必须完全一样
    3、合并结果集有两种方式:
    union:去除重复记录
    union all:不去除重复记录
    在这里插入图片描述
select id,name from employee
union
select id,name from department;
  • 连接查询(笛卡尔积)
    在这里插入图片描述
    使用主外键关系作为条件来去除无用信息
select 列名
from 表名,表名
where 主表的主键值=子表的外键值
select *
from department,employee
where department.`id`=employee.dep_id;
  • 标准版(内连接)
    关键字inner join...on
    特点:查询结果必须满足条件
    只有左右2个匹配才能在结果中显示,作用和连接查询一样
1 inner join2 on1.字段=2.字段
inner join3 on2.字段=3.字段
...
where 条件
select * 
from employee e 
inner join department d
on e.dep_id=d.id;

外连接

外连接的特点:查询出的结果存在不满足条件的可能
1、左外连接
关键字left join ...on
左外连接是先查出左表(即以左表为主),然后查询右表,右表满足条件的显示出来,不满足的显示null
2、右外连接
关键字right join ...on
右外连接是先查出右表(即以右表为主),然后查询左表,左表满足条件的显示出来,不满足的显示null

全连接

mysql不支持全连接但是可以用union 模拟全连接
左连接一次 union 右连接一次

select * 
from employee e
left join department d
on e.dep_id=d.`id`
union 
select * 
from employee e
right join department d
on e.dep_id=d.`id`

在这里插入图片描述

子查询

当一个查询语句嵌套在另外一个查询语句中称之为子查询。

  • 特点:
    1、子查询的结果作为外查询的条件
    2、认知:所有的子查询都可以使用连接查询实现,反之不行。子查询的更加灵活。
    3、执行顺序:先执行最内层的子查询,然后一层一层往外执行
    4、子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。

单行单列

select * from employee where dep_id=
	(select id from department where name='销售');

在这里插入图片描述

select * from employee where dep_id in
   (select id from department where name not in('销售','技术'));
  • 查询出现的位置:
    where后,作为条件的一部分;
    from后,作为被查询的一条表;
  • 当子查询出现在where后作为条件时,还可以使用如下关键字:
    Any作用同SOME :满足设定条件的最小值均可返回结果
    all:当>|>=时,满足设定条件的最大值可返回结果
    当<│|=时,满足设定条件的最小值可返回结果
    some:跟any一样
  • 子查询结果集的形式
    在这里插入图片描述
    在这里插入图片描述

多行单列

select * from employee where dep_id in
     (select id from department  where name in('销售','技术'));

单行多列
查询性别和部门和AA相同的员工信息

select * from employee where (sex,dep_id) in 
       (select sex, dep_id from employee where name='AA');

在这里插入图片描述

select * from employee where  name!='AA' and (sex,dep_id)  in 
       (select sex, dep_id from employee where name='AA');

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值