【MySQL数据库】多表关系与多表联合查询

您所在的位置:网站首页 mysql表链接方式 【MySQL数据库】多表关系与多表联合查询

【MySQL数据库】多表关系与多表联合查询

2023-05-01 00:13| 来源: 网络整理| 查看: 265

目录

MySQL多表关系

一对一

一对多

多对多

MySQL外键约束

创建外键

数据插入

删除

多表联合查询

交叉连接查询

内连接查询

外连接查询

子查询关键字

自关联

MySQL多表关系

MySQL表与表之间的三种关系

一对多关系:最常见的关系:学生对班级 , 员工对部门

多对多关系:学生与课程 , 用户与角色

一对一关系:使用较少,因为一对一关系可以合成为一张表

一对一

 一个学生对应一个身份证号码

一对多

一个部门可以有多名员工,但一个员工只能归于一个部门 在多的一方建立外外键指向一的一方

多对多

下表为多对多关系,由下表可知多对多关系的中间表至少需要2个外键

MySQL外键约束创建外键

 格式: constraint foreign key 字段名[,字段名2,…] references 主键列1 [,主键列2,…]

方式一 创建表时添加外键 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) –- 外键约束 );方式二 修改表添加外键 altertable add constraint foreign key() references (); -- 创建部门表 create table if not existsdept2( deptno varchar(20) primary key , -- 部门号 name varchar(20) -- 部门名字 ); -- 创建员工表 create table if not exists emp2( eid varchar(20) primary key , -- 员工编号 ename varchar(20), -- 员工名字 age int, -- 员工年龄 dept_id varchar(20) -- 员工所属部门 ; -- 创建外键约束 alter table emp2 add constraint dept_id_fk foreign key(dept_id)references dept2 (deptno);数据插入添加主表数据 -- 注意必须先给主表添加数据添加从表数据 -- 注意给从表添加数据时,外键列的值不能随便写,必须依赖主表的主键列删除主表的数据被从表依赖时,不能删除,否则可以删除从表的数据可以随便删除多表联合查询交叉连接查询

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

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

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

• 笛卡尔积会产生很多冗余的数据,后期的其他查询可以在该集合的基础上进行条件筛选

select * from 表1,表2,表3….; 内连接查询隐式内连接(SQL92标准):select * from A,B where 条件; 显示内连接(SQL99标准):select * from A inner join B on 条件;-- 查询每个部门的所属员工 select * from dept3,emp3 where dept3.deptno = emp3.dept_id; select * from dept3 inner join emp3 on dept3.deptno = emp3.dept_id;外连接查询 左外连接:left outer join            select * from A left outer join B on 条件;  右外连接:right outer join            select * from A right outer join B on 条件; 满外连接: full outer join             select * from A full outer join B on 条件;子查询关键字

子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,通俗一点就是包含select嵌套的查询。

返回的数据类型

单行单列:返回的是一个具体列的内容,可以理解为一个单值数据;单行多列:返回一行数据中多个列的内容;多行单列:返回多行记录之中同一列的内容,相当于给出了一个操作范围;多行多列:查询返回的结果是一张临时表

ALL

ALL: 与子查询返回的所有值比较为true 则返回trueALL可以与=、>、>=、 result1 and c > result2 and c > result3...

ANY/SOME

•ANY:与子查询返回的任何值比较为true 则返回true •ANY可以与=、>、>=、 result1 or c > result2 or c > result3...

IN

IN关键字,用于判断某个记录的值,是否在指定的集合中在IN关键字前边加上not可以将条件反过来select …from …where c > in(查询语句) --等价于: select ...from ... where c > result1 or c > result2 or c > result3...

EXISTS

该子查询如果“有数据结果”(至少返回一行数据), 则该EXISTS() 的结果为“true”,外层查询执行该子查询如果“没有数据结果”(没有任何数据返回),则该EXISTS()的结果为“false”,外层查询不执行EXISTS后面的子查询不返回任何实际数据,只返回真或假,当返回真时 where条件成立注意,EXISTS关键字,比IN关键字的运算效率高,因此,在实际开发中,特别是大数据量时,推荐使用EXISTS关键字select …from …where exists(查询语句)自关联

 自关联.:自关联的基本含义就是 自己join自己,用一张表搞定多张表可以达到的效果. 需要注意的是,当表自关联的时候,需要使用 as 起别名,防止关联的时候引发重名的问题。

select. *. from. areas as p. inner join areas as c on c.cid=p.pid


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3