表的关系

  • 一对多

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

  • 多对多

如果数据表是多对多的关系那么需要创建一张表,把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 join 表2 on 表1.字段=表2.字段
inner join 表3 on 表2.字段=表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`

MySQL创建数据表关系 mysql建立关系_sqlyog

子查询

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

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

单行单列

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

MySQL创建数据表关系 mysql建立关系_mysql_02

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');

MySQL创建数据表关系 mysql建立关系_子查询_03

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

MySQL创建数据表关系 mysql建立关系_sql_04