| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> MySQL --- 多表查询 - 笛卡尔积和正确的多表查询、等值连接和不等值连接、内连接和外连接 -> 正文阅读 |
|
[大数据]MySQL --- 多表查询 - 笛卡尔积和正确的多表查询、等值连接和不等值连接、内连接和外连接 |
多表查询前面我们使用的查询,只是对单表进行查询,但是在具体的应用中,经常需要实现在一个查询语句中显示多张数据表的数据,因为基本上数据都是分表的,需要根据当前表在其他表中查询数据,把多张表结合起来进行查询数据的方式叫做多表联合查询。 在具体实现连接操作时,首先将两个或两个以上的表按照某个条件连接起来,然后再查询到所要求的数据记录。 连接查询分为 交叉连接、内连接、外连接 查询三种方式。 基本的信息都存储在员工信息表 emp 中,最后一项信息:部门编号只有一个数字,怎么知道是什么部门?部门在哪个地方?这个时候就需要转到部门表 dept? 里面 部门表 dept 中存储了部门编号所对应的部门详细信息 薪资等级表 salgrade,例如薪资为 800,在 700 到 1200 之间为一等,1201 到 1400 之间为二等
虽然我们确实可以找到某一位员工的信息以及它所在的部门信息,但是我们可以发现这两个查询语句是独立的,我们并不能直观地看到所有的数据,如果想要直观地看到所有的数据,就需要使用多表查询
为什么会有56条记录呢?接下来看一下员工记录条数与部门记录条数?
一个是 4 条,一个是 14 条,每个员工只有一个部门,不能同时在多个部门,查询应该显示 14 条,为什么会显示 56 条呢? 仔细观察数据可以发现,每一位员工都查询出来 4 条数据,显示重复,虽然Smith的部门编号一直都是 20,但是所有的部门都和Smith进行了一个匹配,其中有 3 条数据是无效的 交叉连接
接下来分析为什么会显示 56 条呢? 首先,如果不加条件直接进行查询,则数据条数是两个表记录条数的乘积,这种结果我们称之为笛卡尔乘积。
如果两张表的数据量都很大,那么这种庞大是非常可怕的,所以现在必须想办法消除掉笛卡尔积的无效记录。 想要消除笛卡尔积的无效记录,需要使用关联字段(也就是加上限定条件,员工表中的编号要等于部门表中的编号)。 范例:利用等值条件来处理笛卡尔积,对笛卡尔积的数据进行筛选,只需要满足条件的数据 为了避免二义性,需要指定表名称
如果表名非常长,如果每次都需要指定表名称就变得非常复杂,可以对表取别名。但是如果指定了别名,原来的表名在当前这个 sql 语句就不能使用了
内连接
有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。
等值连接
非等值连接
查询所有员工emp的信息以及部门dept的信息和薪资等级salgrade的信息 可以发现按照下面这种查询方式有 70 条数据,笛卡尔积为 14 × 5 = 70
接下来对薪资等级进行限定,用 AND 进行连接
由于等级是按数字显示,具体内容不太明显,可以考虑使用 CASE 函数
外连接
外连接使用语法如下:
左外连接
首先在 emp 表中插入一条NULL的记录,在进行等值连接的时候,在连接的时候是根据某一个字段把两个表先生成笛卡尔积,然后根据条件进行筛选,去掉一些不相关的。当连接方式条件有一方为空的时候,这个条件在左边匹配不到右边、右边匹配不到左边,应该如何显示? 由于原来的部门表中都有部门,所以我们先插入一条没有部门的记录 插入一条部门编号为NULL的数据(关于插入后面会提及)
? 有 15 个人,查询到 14 条记录,由于连接条件 deptno 为空,不显示 Teacher,也就是左表中的数据不显示,属于隐式内连接
接下来看一下显式内连接,把表中的 ',' 变成关键字
查询员工及对应的部门信息(没有部门的员工也显示出来,没有员工的部门不显示)
使用左外连接,显示 15 条数据
右外连接
查询员工及对应的部门信息(没有部门的员工不显示,没有员工的部门显示)
使用右外连接,虽然没有部门编号是 40 的数据,但是也可以显示部门编号 40,前面的员工信息则显示为空
全连接
查询员工及对应的部门信息(没有部门的员工 显示,没有员工的部门 显示)
自连接
查询每个员工对应的领导姓名????????????????
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/15 23:39:59- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |