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. spoj-ORDERS - Ordering the Soldiers

    ORDERS - Ordering the Soldiers As you are probably well aware, in Byteland it is always the military ...

  2. 1084 - Winter

    1084 - Winter   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Winter is ...

  3. P1629八

    P1629八 Accepted 标签:[显示标签]     描述 八是个很有趣的数字啊.八=发,八八=爸爸,88=拜拜.当然最有趣的还是8用二进制表示是1000.怎么样,有趣吧.当然题目和这些都没有关 ...

  4. 分析一个简单的goroutine资源池

    分析一个简单的goroutine资源池 tunny. 从资源池中获取goroutine并进行处理的逻辑如下: tunny将goroutine处理单元封装为workWrapper,由此可以对gorout ...

  5. MA8621带SD读卡的USB 2.0高速3端口HUB方案芯片|MA8621中文规格书|USB 2.0方案

    MA8621说明 MA8621是USB 2.0高速3端口集线器的高性能解决方案,带有SD卡控制器,完全符合通用串行总线规范2.0.控制器继承了先进的串行接口技术,当3个DS(下游)端口同时工作时,功耗 ...

  6. Java实习生常规技术面试题每日十题Java基础(六)

    目录 1.在Java语言,怎么理解goto. 2.请描述一下Java 5有哪些新特性? 3.Java 6新特性有哪些. 4.Java 7 新特性有哪些. 5.Java 8 新特性有哪些. 6.描述Ja ...

  7. Eclipse提速优化方法

    Eclipse提速优化方法 Eclipse运行太慢了,尤其是导入大型maven项目的时候经常动不动就down掉,于是总结了一下Eclipse提速的方法. 1.关闭不常用的工程 打开的项目太多,会严重影 ...

  8. [学习笔记] Oracle运算符、连接符、结果去重、范围查询、模糊查询

    运算符 符号 解释 + 加法 - 减法 * 乘法 / 除法,结果是浮点数 = 等于 > 大于 < 小于 <>或者!= 不等于 >= 大于或者等于 <= 小于或者等于 ...

  9. js 模块化 -- export 时 一个默认和多个默认的写法

    js文件 只有一个  food 类,一般写 export {food} 或者 export {food as default} 那么如果有多个呢? 这样 export {food, food2} 或者 ...

  10. react中异步组件以及withRouter的使用

    什么是异步组件?简单来说就是异步加载一个组件,正常情况浏览器加载的是我们打包好的bundle.js文件,那么这个文件是集合了所有js是代码,然而我们首屏加载并不需要一次性加载所有的组件,这会造成性能的 ...