新闻| 文章| 资讯| 行情| 企业| wap手机版| article文章| 首页|会员中心|保存桌面|手机浏览
普通会员

深圳市千色变颜料有限公司

深圳市千色变颜料有限公司,防伪技术产品,色标、色卡,其他未分类,PVC,其他通用塑料,...

企业列表
新闻列表
  • 暂无新闻
推荐企业新闻
联系方式
  • 联系人:全群玉
  • 电话:86 0755 29794452
首页 > 新闻中心 > 【MySQl】多表关联的几种方式和外键问题、多表查询与子查询
新闻中心
【MySQl】多表关联的几种方式和外键问题、多表查询与子查询
发布时间:2024-11-17        浏览次数:0        返回列表

目录

【MySQl】多表关联的几种方式和外键问题、多表查询与子查询

表与表的关联关系

一对一

 一对多

多对多

多表查询

交叉连接

内连接

外连接

全连接(union、union all

自连接

子查询


为什么要有多表:         当一张表中的数据比较多的时候,如果只建立一张表,可能会有大量的数据重复(冗余,站在设计的角度上来讲,将不同的数据放在对应的独立的表中可以减少冗余

外键(foreign key:         用来描述多张表之间的关联关系

一对一

  • 一对一: 如:用户和用户详情
    • 一对一关系多用于表的拆分,将一个实体中经常使用的字段放一张表中,不经常使用的数据放在另一张表中,用于提升查询性能。
    • 实现方式: 外键可以放在任何一张表都行。

【MySQl】多表关联的几种方式和外键问题、多表查询与子查询

        而在真正使用过程中发现 id、photo、nickname、age、gender 字段比较常用,此时就可以将这张表查分成两张表。

【MySQl】多表关联的几种方式和外键问题、多表查询与子查询

建表如下

 

 一对多

  • 一对多 如:部门与员工
    • 一个部门对应多个员工,一个员工对应一个部门
    • 实现方式 在多的一方建立外键,指向一的一方主键

【MySQl】多表关联的几种方式和外键问题、多表查询与子查询

        经分析,员工属于多的一方,而部门表属于一的一方,此时我们会在员工表中添dep_id,指向部门表的主键(id:         【MySQl】多表关联的几种方式和外键问题、多表查询与子查询

         见表语句

 

多对多

  • 多对多 如:商品和订单
    • 一个商品对应多个订单,一个订单包含多个商品
    • 实现方式 外键不管放在哪一方,都会产生冗余 建议建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

【MySQl】多表关联的几种方式和外键问题、多表查询与子查询

         经过分析发现,订单表和商品表都属于多的一方,此时需要创建一个中间表,在中间表中添加订单表的外键和商品表的 外键指向两张表的主键

【MySQl】多表关联的几种方式和外键问题、多表查询与子查询

建表语句如下

 

注意:数据库中可以通过多个字段,共同作用,充当主键

多表查询顾名思义就是从多张表中一次性的查询出我们想要的数据。先准备环境如下

 

交叉连接

        不适合任何匹配条件,生成笛卡尔积。不告诉数据库,表与表的关系,数据库底层会进行全匹配。在真实开发中一定不要使用交叉连接

执行语句

 

【MySQl】多表关联的几种方式和外键问题、多表查询与子查询

从上面的结果我们可以看出一些无效的数据,如孙悟空 这个员工属于1号部门,但是也同时关联了2、3、4号部们。

内连接

将需要的表中的数据通过外键 一 一 关联显示

语法

 

内连接相当于查询AB交集数据

 案例

隐式内连接

 

执行上述语句如下【MySQl】多表关联的几种方式和外键问题、多表查询与子查询

 查询emp的name,gender ,dept表的dname

 

执行语句如下

 上面语句中使用表名指定字段所属有点麻烦,sql也支持给表指别名,上述语句可以改进为

 

显示内连接

 

执行结果如下【MySQl】多表关联的几种方式和外键问题、多表查询与子查询

外连接

语法

 

左外连接:相当于查询A表所有数据和交集部分数据

右外连接:相当于查询B表所有数据和交集部分数据

 案例

查询emp表所有数据和对应的部门信息(左外连接  

 

执行语句结果如下【MySQl】多表关联的几种方式和外键问题、多表查询与子查询

 结果查询显示查询到了左表(emp)中所有数据及两张表能关联的数据。

查询dept表所有数据和对应的员工数据信息(右外连接

 

执行结果如下【MySQl】多表关联的几种方式和外键问题、多表查询与子查询

 结果显示查询到了右表(dept)中所有的数据及两张表能关联的数据

要查询出部门表中所有的数据,也可以通过左外连接实现,只需要将两个表的位置进行互换

 

全连接(union、union all

        将多余SQL查询的结果映射为一个结果集显示。意思就是将SQL查询的多个结果合并起来返回一个结果给用户         union all:将结果全部展示,如果重复,也展示重复部分         union:会去重,不会展示重复部分。

案例

union

 

查询结果【MySQl】多表关联的几种方式和外键问题、多表查询与子查询

union all

 

查询结果: 

【MySQl】多表关联的几种方式和外键问题、多表查询与子查询

 练习:         将所有员工的部门展示出来并且也要将所有部门的员工展示出来

代码如下:  

 

执行结果如下【MySQl】多表关联的几种方式和外键问题、多表查询与子查询

自连接

        有时候,可能需要将一张表当作多张表用。通常情况下,该存在外键,且外键关联自身。

当我们做项目时要做一个板块,板块里有一个子版块,子版块里可能还有子版块等等,如果有n个板块的话,我们可以建n张表,并使用外键一一将他们关联起来。但是我们发现在这些板块中除了外键关联的主键不同外,其他的字段名包括约束都是一样的,这样不仅会使代码冗余,而且浪费了标识符。所以我们可以建一张表。

语句如下

 

【MySQl】多表关联的几种方式和外键问题、多表查询与子查询

 而想要查询第一板块也很简单,查询第一模块的查询条件就是parent_id的只为null

语句如下:  

 

执行结果:【MySQl】多表关联的几种方式和外键问题、多表查询与子查询

 查询第二版块的话需要借助子查询

代码如下

 

执行结果【MySQl】多表关联的几种方式和外键问题、多表查询与子查询

概念

1.第一次查询的结果当做表或者条件进行第二次查询。

2,一般而言子查询的效率较差。至少需要两次查询。

3.子查询中包含:IN、NOT IN、ANY、ALL、EXISTS和NOT EXISTS 等关键字。

4.还可以包含比较运算符=、!=、>、<等。

注意

1.子查询要包含在括号内。

2.将子查询放在比较条件的右侧

3.单行操作符对应单行子查询,多行操作对应多行子查询

案例查询工资高于猪八戒的员工信息

第一步:先查询出来猪八戒的工资

 

第二步:将第一步查询出来的猪八戒工资作为条件 查询工资高于猪八戒的员工信息。

 

 执行结果【MySQl】多表关联的几种方式和外键问题、多表查询与子查询

 子查询根据查询结果不同,作用不同

  • 子查询语句结果是单行单列,子查询语句作为条件值,使用 = != > < 等进行条件判断
  • 子查询语句结果是多行单列,子查询语句作为条件值,使用 in 等关键字进行条件判断
  • 子查询语句结果是多行多列,子查询语句作为虚拟表

案例

查询‘财务部’和‘市场部’所有的员工信息

 

查询入职日期是‘2011-11-11’之后的员工信息和部门信息