mysql加强(4)~多表查询:笛卡尔积、消除笛卡尔积操作(等值、非等值连接),内连接(隐式连接、显示连接)、外连接、自连接

一、笛卡尔积

1、什么是笛卡尔积:

数学上,有两个集合A={a,b},B={1,2,3},则两个集合的笛卡尔积={{a,1}, {a,2}, {a,3}, {b,1}, {b,2}, {b,3}} 列出所有情况,一共是2*3=6条记录

在数据库中,笛卡尔积是多表查询没有连接条件时返回的表结果。

2、实际开发中应该避免全笛卡尔积 ----在 where 加入有效的连接条件【等值连接】

连接n张表,至少需要n-1个连接条件。

■ 所谓的多表查询---“都是两张表的查询”, 假如有A、B、C、D、E 五张表,先是A、B查询得到AB表,然后C再和AB表查询得到ABC表,然后...

3、外键约束:foreign key FK, 用来限定B表的某一列数据是来自A表的主键列,不允许乱写

【开发中往往是通过java代码检查数据的合法性,不使用外键!】

■ 外键作用:
  • 不允许乱写,要参考另外一张表的主键列,确定是合法数据
  • 和查询没有关系,没有外键不影响查询,仅仅是插入数据时候会做数据检查。
  • 在开发中要支持外键和事务,存储引擎必须是InnoDB
  • 使用外键性能较低,开发中,往往删除外键约束,检查数据是否合法是通过java代码(业务代码)
  • 外键--在“多的一方”,举例,多个员工属于都是属于销售部的(同一个部门)
  • 开发中添加外键,往往是通过下拉框从“多的一方”选出“一方”。

4、消除笛卡尔积(等值连接和非等值连接)

  • 等值连接:最常见的连接操作,通常是存在 主外键约束 条件的多表建立的,连接条件中两个字段通过 = 建立等值关系(连接条件是等号)。

  • 非等值连接:多表连接,连接条件为 不是用等号,用大于、小于、大于等于、小于等于

    #等值连接例子(其中表emp中的部门编号就是参照表dept的部门编号)--- 主外键约束 【不过外键咱一般不加哈哈哈,外键检查作用交给java业务逻辑代码啦】
    select * from emp e, dept d where e.deptno = d.deptno; #非等值连接例子
    #查询员工的姓名、工资、所在部门的名称和工资的等级(表salgrade给出的是工资范围【等级号、最低工资、最高工资】)
    select e.ename,e.sal,d.dname,s.grade from emp e,dept d,salgrade s where e.deptno = d.deptno and e.sal between s.losal and s.hisal;

二、多表连接查询(所谓'连接'---通过一个列名去寻找对应的另外一个列名

1、多表查询分类:

内连接(隐式/显式连接)、外连接(左外连接、右外连接、全外连接)、自连接

2、多表查询图示:

3、当多表查询有重名的列时,必须在列名前加上表名【一般用别名】作为前缀。

# 当多表中有重名列时,必须在列名前加上表名【一般用别名】作为前缀。
select * from emp, dept where emp.deptno = dept.deptno;
select * from emp e, dept d where e.deptno = d.deptno;

4、内连接查询

(1)隐式连接语法(没有join):

​ select [字段1[,字段2....]]

​ from 表A, 表B

​ where 查询过滤条件 and 消除笛卡尔积的连接条件

​ [order by 排序字段1 asc|desc [,排序字段2[asc|desc],...]]

(2) 显示连接语法(有join)---常用

​ select [字段1[,字段2....]]

​ from 表A [inner] join 表B on 消除笛卡尔积的连接条件 [join 表C on 消除笛卡尔积条件...]

​ where 查询过滤条件

​ [order by 排序字段1 asc|desc [,排序字段2[asc|desc],...]]

#查询员工编号,员工名称,员工所属部门编号和名称。
select e.empno, e.ename, d.deptno, d.dname from emp e join dept d on e.deptno = d.deptno;
# 显示查询的等值连接,当列名是相同时,可以使用using
select e.empno, e.ename, d.deptno, d.dname from emp e join dept d using (deptno); #查询员工编号,员工名称,员工所属部门编号和名称以及薪资等级
select e.empno, e.ename, d.deptno, d.dname,s.grade from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.losal and s.hisal;
  • 自然连接:是表之间的同名列都进行等值连接。

■ 内连接【等值连接】---匹配条件才显示。

5、外连接

内连接最大问题:必须匹配条件才能查询出来

例如新人没有分配部门,但是多表查询的时候,查询员工编号、姓名、所属于部门时,新人的信息就不会显示出来。

(1)左连接/外连接 【以谁为准,谁显示全部,以哪张表为准,显示该表的全部,连接那张不满足补null】

  • 左(外)连接:查询出join左边表的所有数据,若是右边表不匹配使用null填充。
  • 右(外)连接:查询出join右边表的所有数据,若是左边表不匹配使用null填充。

(2)全外连接查询

  • mysql 暂时不支持,但是可以通过 union+左右连接完成。

    select e.ename, d.dname from emp e left join dept d on e.deptno = d.deptno
    union
    select e.ename, d.dname from emp e right join dept d on e.deptno = d.deptno;

6、自连接(自己和自己连接,把一张表看成两张表使用,通过别名区分)---常用

  • 在查询语句中,一张表可以重复使用多次,完成多次连接的需要。

    #查询员工名称和其对应的主管名称     emp 表有员工名称的列(主管也属于员工),也有主管的编号---通过主管的编号去找对应的员工名称【连接】
    select e1.ename, e2.ename from emp e1 join emp e2 on e1.mgr = e2.empno;

❀ 总结:多表连接查询,所谓'连接'---通过一个列名去寻找对应的另外一个列名

mysql加强(4)~多表查询的更多相关文章

  1. mysql 数据操作 单表查询 目录

    mysql 数据操作 单表查询 mysql 数据操作 单表查询 简单查询 避免重复DISTINCT mysql 数据操作 单表查询 通过四则运算查询 mysql 数据操作 单表查询 concat()函 ...

  2. mysql 数据操作 多表查询 目录

    mysql 数据操作 多表查询 准备 多表连接查询介绍 mysql 数据操作 多表查询 多表连接查询 笛卡尔积 mysql 数据操作 多表查询 多表连接查询 内连接 mysql 数据操作 多表查询 多 ...

  3. MySQL数据库语法-多表查询练习一

    MySQL数据库语法-多表查询练习一 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要介绍的多表查询的外键约束,以及如何使用外链接和内连接查询数据信息. 一.数据表和测试 ...

  4. mysql 数据操作 单表查询 where 约束 目录

    mysql 数据操作 单表查询 where约束 between and or mysql 数据操作 单表查询 where约束 is null in mysql 数据操作 单表查询 where约束 li ...

  5. mysql 数据操作 单表查询 group by 分组 目录

    mysql 数据操作 单表查询 group by 介绍 mysql 数据操作 单表查询 group by 聚合函数 mysql 数据操作 单表查询 group by 聚合函数 没有group by情况 ...

  6. MySQL数据库之单表查询中关键字的执行顺序

    目录 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 2 执行顺序 3 关键字使用语法 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 select distinct from ...

  7. mysql中的回表查询与索引覆盖

    了解一下MySQL中的回表查询与索引覆盖. 回表查询 要说回表查询,先要从InnoDB的索引实现说起.InnoDB有两大类索引,一类是聚集索引(Clustered Index),一类是普通索引(Sec ...

  8. MySQL数据库语法-单表查询练习

    MySQL数据库语法-单表查询练习 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要是对聚合函数和分组的练习. 一.数据表和测试数据准备 /* @author :yinz ...

  9. mysql 基础入门 单表查询

    单表查询 select 表头,表头 as 别名 ,表头(+-*/的运算) from table_a 1.条件查询 where + 条件 <> , != 不等于 = 等于,也可以表示字符串值 ...

  10. mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化

    先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...

随机推荐

  1. 【LeetCode】1154. Day of the Year 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 计算1月1号之间天数 日期 题目地址:https:// ...

  2. 【LeetCode】724. Find Pivot Index 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 先求和,再遍历 日期 题目地址:https://le ...

  3. Codeforces 777E:Hanoi Factory(贪心)

    Of course you have heard the famous task about Hanoi Towers, but did you know that there is a specia ...

  4. 第七个知识点:随机性如何辅助计算和什么是BPP类问题

    第七个知识点:随机性如何辅助计算和什么是BPP类问题 原文地址:http://bristolcrypto.blogspot.com/2014/11/52-things-number-7-how-doe ...

  5. Proximal Algorithms 4 Algorithms

    目录 Proximal minimization 解释 Gradient flow 解释1 最大最小算法 不动点解释 Forward-backward 迭代解释 加速 proximal gradien ...

  6. RTD2172方案|TYPEC转HDMI2.0转换器芯片|CS5265替代RTD2172

    RTD2172 USB Type-C到HDMI转换器结合了USB Type-C输入接口和数字高清多媒体接口(HDMI)输出.嵌入式微控制器(MCU)基于工业标准8051内核.接收器端口将信道配置(CC ...

  7. 云南农职《JavaScript交互式网页设计》 综合机试试卷⑤——简单分类菜单

    一.语言和环境 实现语言:HTML,CSS,JavaScript,JQuery. 开发环境:HBuilder. 二.题目(100分): 1.使用Jquery和JavaScript实现二级分类菜单管理 ...

  8. C# double类型精度丢失问题

    我们先看一段代码,可以在控制台程序中执行看看结果 { double d = 500; double d1 = 233.84; double d2 = d - d1; //d2=266.15999999 ...

  9. Pytest_参数化(10)

    pytest参数化有两种方式: mark的parametrize标记:@pytest.mark.parametrize(变量名,变量值),其中变量值类型为列表.元组或其它可迭代对象. fixture的 ...

  10. Pytest_常用执行参数详解(3)

    前面讲了测试用例的执行方式,也认识了 -v  -s 这些参数,那么还有没有其它参数呢?答案肯定是有的,我们可以通过 pytest -h来查看所有可用参数. 从图中可以看出,pytest的参数有很多,但 ...