MySQL数据篇之多表操作-----保姆级教程

Posted 大忽悠爱忽悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据篇之多表操作-----保姆级教程相关的知识,希望对你有一定的参考价值。

外键约束

作用:保证多表之间的数据完整性

测试环境准备:

create table dept(
  did int primary key auto_increment,
  dname varchar(20)
);
insert into dept values(null,'市场部');
insert into dept values(null,'人事部');
insert into dept values(null,'教研部');

create table employee(
       eid int primary key auto_increment,
        ename varchar(20),
       salary double,
         birthday date,
          sex varchar(10),
              dno int
);
insert into employee values(null,'张三',8000,'1980-09-01','男',3);
insert into employee values(null,'李四',9000,'1980-09-01','男',1);
insert into employee values(null,'王五',6000,'1980-09-01','男',2);
insert into employee values(null,'赵六',10000,'1980-09-01','男',3);
insert into employee values(null,'孙七',10000,'1980-09-01','男',1);


向员工表中插入一条记录,没有部门:

insert into employee values(null,'王五',6000,'1980-09-01','男',null);


删除一个人事部门:

delete from dept where did=2;

向刚才做的这两个操作(插入一个没有部门的员工和删除一个带有员工的部门),这种情况都是不应该发生的。

这个时候就需要在多表之间添加外键约束


添加外键

语法

在新表中添加外键约束语法: constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)

在已有表中添加外键约束:alter table 从表表名 add constraints 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)

删除外键语法: alter table 从表表名 drop foreign key 外键名称;

在员工表上添加外键

alter table employee add foreign key(dno) references dept(did);
//让员工表中员工的部门类型不为空,即设置外键为非空
alter table employee modify dno int not null;


注意

添加外键约束后,如果想要删除主键即某个部门,需要先将该部门下关联的员工记录删除,否则报错。

但是我们可以直接删除掉某个部门下的员工,即外键的删除不影响主键。

而主键的删除会影响外键。


表与表之间的关系


一对多的关系

一个部门下可以有多个员工,但是一个员工只能属于一个部门


一对多的建表原则


在多的一方创建外键指向一的一方的主键


多对多的关系

一个学生可以选择多门课程,一个课程可以被多个学生选择

多对多的建表原则


需要创建中间表,中间表中至少有两个字段,分别作为外键指向多对多双方的主键


一对一的例子

一个公司只能有一个注册地址,一个注册地址也只能对应一个公司

一对一的建表原则



多表案例分析


建表:


多表查询

多表查询分类

1.连接查询

交叉连接: cross join

  • 交叉连接:查询到的是两个表的笛卡尔积
  • 语法:
select* from1 cross join2;

或者

select * from1,表2;

内连接:inner join(inner)可以省略

  • 显示的内连接:在sql中显示调用inner join关键字
  • 语法:
select *from1 inner join2 on 关联条件;
  • 隐式内连接 : 在sql中没有调用inner join 关键字
  • 语法:
select *from1,2 where 关联条件;

外连接—outer join(outer可以省略)

  • 左外连接:

  • 语法:

select * from1 left outer join2 on 关联条件;
  • 右外连接
  • 语法:
select * from1 right outer join2 on 关联条件;

2.子查询

一个查询语句需要依赖另一个查询语句的结果


多表查询之数据准备

  1. 班级表数据准备

  2. 学生表数据准备

  3. 课程表数据准备

  4. 学生选课表数据准备


多表查询之交叉连接

使用 cross join 关键字

SELECT * FROM classes CROSS JOIN stu;

不使用cross join关键字

SELECT* FROM classes,stu;

效果一样:


多表查询之内连接–返回两张表都满足条件的部分记录

1.显示内连接

SELECT * FROM classes c INNER JOIN stu s ON c.cid=s.cno;
可以省略INNER
SELECT * FROM classes c JOIN stu s ON c.cid=s.cno;


2.隐式内连接

SELECT *FROM classes c,stu s WHERE c.cid=s.cno;


多表查询之外连接

左外连接

返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。

SELECT *FROM classes c LEFT OUTER JOIN classesstu s ON c.cid=s.cno;
可以省略OUTER
SELECT *FROM classes c LEFT JOIN classesstu s ON c.cid=s.cno;

右外连接

恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。

SELECT *FROM classes c RIGHT OUTER JOIN stu s ON c.cid=s.cno;
可以省略OUTER
SELECT *FROM classes c RIGHT JOIN stu s ON c.cid=s.cno;

内连接与外连接的区别


多表查询之子查询

带in的子查询

  • 查询学生生日在91年之后的班级信息
SELECT *FROM classes  WHERE cid IN (SELECT cno FROM stu WHERE birthday > '1991-01-01');

带exists的子查询

带any的子查询

带all的子查询

以上是关于MySQL数据篇之多表操作-----保姆级教程的主要内容,如果未能解决你的问题,请参考以下文章

SQL进阶篇之多表联查

mysql第四篇:数据操作之多表查询

MySQL数据库篇---对数据库,数据库中表,数据库中表的记录进行添修删查操作---保姆级教程

Navicat for MySQL免费版安装配置教程(超级详细保姆级)

MySQL之多表操作

mysql数据操作之多表查询