当前位置: 首页 > news >正文

MySQL 多表操作

一.多表关系

1.一对一关系

一个学生只有一张身份证;一张身份证只能对应一个学生。

在任一表中添加外键,指向另一方主键,确保一对一关系。

一般一对一关系很少见,遇到一对一关系的表最好合并。

2.一对多/多对一关系

一个部门有多个员工,一个员工只能对应一个部门。

实现原则:在多的一方建立外键,指向一的一方的主键。

3.多对多关系

一个学生可以选择很多课程,一个课程也可以被很多学生选择。

实现原则:多对多关系实现需要借助第三章中间表。中间表至少包含两个字段,将多对多的关系,拆成一对多的关系,中间表至少要有两个外键,这两个外键分别指向原来的那两张表的主键。

二.外键约束(Foreign Key)

外键约束是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表,外键所在的表就是从表。

外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。

定义一个外键时,需要遵循下列规则:

1.主表必须已经存在于数据库中,或是当前正在创建的表。

2.必须为主表定义主键

3.主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。

4.外键中列的数目必须和主表中主键的列的数目相同且数据类型也要相同。

三.创建外键约束

1.创建表时设置外键约束

create database mydb3;
use mydb3;
create table if not exists dept(
deptno varchar(20) primary key,-- 部门号
name varchar(20)-- 部门名字
);
create table if not exists emp(
eid varchar(20) primary key, -- 员工编号
ename varchar(20),-- 员工名字
age int,-- 员工年龄
dept_id varchar(20), -- 员工所属部门
constraint emp_fk foreign key (dept_id) references dept(deptno) -- 外键约束
);

2.创建表后设置外键约束

alter table emp add constraint dept_fk foreign key(dept_id) references dept(deptno);

四.在外键约束下的数据操作

1.数据插入

必须先给主表添加数据。

给从表添加数据时,外键列的值不能随便写,必须依赖主表的主键列。

2.数据删除

主表的数据被从表依赖时,不能删除,否则可以删除。

从表的数据可以随便删除。

delete from emp where eid='7';

3.删除外键约束

外键一旦删除,就会解除主表和从表间的关系。

alter table emp drop foreign key dept_fk;

五.外键约束——多对多关系

增加一个中间表,来建立多对多关系。

先建立左侧主表和右侧主表,再建立中间表(从表)。

建立外键约束2次。

alter table score add foreign key(sid) references student(sid);
alter table score add foreign key(cid) references course(cid);

六.多表联合查询

1.交叉连接查询

交叉连接查询返回被连接的两个表所有数据行的笛卡尔积。

笛卡尔积可以理解为一张表的每一行去和另外一张表的任意一行进行匹配。

假如A表有m行数据,B表有n行数据,则返回m*n行数据。

格式:select * from 表1,表2,……;

2.内连接查询

内连接查询求多张表的交集。

格式:

隐式内连接

select * from A,B where 条件;

显示内连接

select * from A inner join B on 条件;

3.外连接查询

外连接分为左外连接(left outer join)、右外连接(right outer join)、满外连接(full outer join)。

左外连接:select * from A left outer join B on 条件;

右外连接:select * from A right outer join B on 条件;

满外连接:select * from A full outer join B on 条件;

select * from dept3 left outer join emp3 on deptno=dept_id;
select * from dept3 left outer join emp3 on deptno=dept_id 
union select * from dept3 right outer join emp3 on deptno=dept_id;

MySQL 对于full outer join的支持不好,所以采用union。

union 去重 union all 没有去重

4.子查询

子查询就是指在一个完整的查询语句之中,嵌套若干个不同功能的小查询

子查询返回的数据类型分为4种:

1.单行单列

2.单行多列

3.多行单列

4.多行多列

select * from emp3 where age=(select max(age) from emp3);
select * from dept3,emp3 where deptno=dept_id and name in ('研发部' ,'销售部');
select * from dept3 join emp3 on deptno=dept_id and (name='研发部' and age <20);

5.子查询关键字

1)all

格式:select ... from...where c>all(查询语句)

查询年龄大于1003部门所有年龄的员工信息

select * from emp3 where age>all(select age from emp3 where dept_id='1003');

 查询不属于任何一个部门的员工信息

select * from emp3 where dept_id!= all(select deptno from dept3);

2)any和some

some和any的作用一样

查询年龄大于‘1003’部门任意一个员工年龄的员工信息

select * from emp3 where age >any(select age from emp3 where dept_id='1003');

3)in

用于判断某个记录的值是否在指定的集合中。

在in前面加not可以将条件反过来。

查询研发部和销售部的员工信息

select * from emp3 where dept_id in (select deptno from dept3 where name in 
('研发部','销售部');

4)exists

exists后面的子查询不返回任何实际数据,只返回真或假。

exists运算效率比in高。

查询公司是否有大于60岁的员工,有则输出。

select * from emp3 a where exists(select * from emp3 where a.age >60);

一行一行查询

查询有所属部门的员工信息

select * from emp3 a where exists(select * from dept3 b where a.dept_id=b.deptno);

6.自关联查询

对表自身进行关联查询,一张表当作多张表使用。

自关联时必须要起别名。

select 字段列表 from 表1 a,表1 b where 条件;

select 字段列表 from 表1 a left join 表1 b on 条件;

七.总结

相关文章:

  • Tomcat 学习之 Servlet
  • 12 Autosar_SWS_MemoryMapping.pdf解读
  • Android全新UI框架之常用ComposeUI组件
  • Mysql表字符集更换
  • unity学习(32)——跳转到角色选择界面(父子类问题)
  • Pytorch 复习总结 3
  • Sora:开启视频内容创作新纪元的AI革命
  • 喝点小酒-胡诌“编程语言学习”
  • 算法:有效的括号
  • 压缩感知(Compressed Sensing)的MATLAB仿真实现
  • 即时通讯技术文集(第33期):IM开发综合技术合集(Part6) [共12篇]
  • Opencv3.2 ubuntu20.04安装过程
  • 新媒体运营-职业属性篇
  • node 环境问题
  • jmeter 命令行启动 动态参数化
  • [译]CSS 居中(Center)方法大合集
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【剑指offer】让抽象问题具体化
  • Angular Elements 及其运作原理
  • crontab执行失败的多种原因
  • IOS评论框不贴底(ios12新bug)
  • Java新版本的开发已正式进入轨道,版本号18.3
  • Nodejs和JavaWeb协助开发
  • OSS Web直传 (文件图片)
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Rancher如何对接Ceph-RBD块存储
  • ubuntu 下nginx安装 并支持https协议
  • Vue官网教程学习过程中值得记录的一些事情
  • 测试如何在敏捷团队中工作?
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • Hibernate主键生成策略及选择
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • "无招胜有招"nbsp;史上最全的互…
  • #pragma once与条件编译
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (4)事件处理——(7)简单事件(Simple events)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)setTimeout 和 setInterval 的区别
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @在php中起什么作用?
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [CF494C]Helping People