mysql加强(4)~多表查询
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)~多表查询的更多相关文章
- mysql 数据操作 单表查询 目录
mysql 数据操作 单表查询 mysql 数据操作 单表查询 简单查询 避免重复DISTINCT mysql 数据操作 单表查询 通过四则运算查询 mysql 数据操作 单表查询 concat()函 ...
- mysql 数据操作 多表查询 目录
mysql 数据操作 多表查询 准备 多表连接查询介绍 mysql 数据操作 多表查询 多表连接查询 笛卡尔积 mysql 数据操作 多表查询 多表连接查询 内连接 mysql 数据操作 多表查询 多 ...
- MySQL数据库语法-多表查询练习一
MySQL数据库语法-多表查询练习一 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要介绍的多表查询的外键约束,以及如何使用外链接和内连接查询数据信息. 一.数据表和测试 ...
- mysql 数据操作 单表查询 where 约束 目录
mysql 数据操作 单表查询 where约束 between and or mysql 数据操作 单表查询 where约束 is null in mysql 数据操作 单表查询 where约束 li ...
- mysql 数据操作 单表查询 group by 分组 目录
mysql 数据操作 单表查询 group by 介绍 mysql 数据操作 单表查询 group by 聚合函数 mysql 数据操作 单表查询 group by 聚合函数 没有group by情况 ...
- MySQL数据库之单表查询中关键字的执行顺序
目录 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 2 执行顺序 3 关键字使用语法 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 select distinct from ...
- mysql中的回表查询与索引覆盖
了解一下MySQL中的回表查询与索引覆盖. 回表查询 要说回表查询,先要从InnoDB的索引实现说起.InnoDB有两大类索引,一类是聚集索引(Clustered Index),一类是普通索引(Sec ...
- MySQL数据库语法-单表查询练习
MySQL数据库语法-单表查询练习 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要是对聚合函数和分组的练习. 一.数据表和测试数据准备 /* @author :yinz ...
- mysql 基础入门 单表查询
单表查询 select 表头,表头 as 别名 ,表头(+-*/的运算) from table_a 1.条件查询 where + 条件 <> , != 不等于 = 等于,也可以表示字符串值 ...
- mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化
先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...
随机推荐
- spoj-ORDERS - Ordering the Soldiers
ORDERS - Ordering the Soldiers As you are probably well aware, in Byteland it is always the military ...
- 1084 - Winter
1084 - Winter PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Winter is ...
- P1629八
P1629八 Accepted 标签:[显示标签] 描述 八是个很有趣的数字啊.八=发,八八=爸爸,88=拜拜.当然最有趣的还是8用二进制表示是1000.怎么样,有趣吧.当然题目和这些都没有关 ...
- 分析一个简单的goroutine资源池
分析一个简单的goroutine资源池 tunny. 从资源池中获取goroutine并进行处理的逻辑如下: tunny将goroutine处理单元封装为workWrapper,由此可以对gorout ...
- MA8621带SD读卡的USB 2.0高速3端口HUB方案芯片|MA8621中文规格书|USB 2.0方案
MA8621说明 MA8621是USB 2.0高速3端口集线器的高性能解决方案,带有SD卡控制器,完全符合通用串行总线规范2.0.控制器继承了先进的串行接口技术,当3个DS(下游)端口同时工作时,功耗 ...
- Java实习生常规技术面试题每日十题Java基础(六)
目录 1.在Java语言,怎么理解goto. 2.请描述一下Java 5有哪些新特性? 3.Java 6新特性有哪些. 4.Java 7 新特性有哪些. 5.Java 8 新特性有哪些. 6.描述Ja ...
- Eclipse提速优化方法
Eclipse提速优化方法 Eclipse运行太慢了,尤其是导入大型maven项目的时候经常动不动就down掉,于是总结了一下Eclipse提速的方法. 1.关闭不常用的工程 打开的项目太多,会严重影 ...
- [学习笔记] Oracle运算符、连接符、结果去重、范围查询、模糊查询
运算符 符号 解释 + 加法 - 减法 * 乘法 / 除法,结果是浮点数 = 等于 > 大于 < 小于 <>或者!= 不等于 >= 大于或者等于 <= 小于或者等于 ...
- js 模块化 -- export 时 一个默认和多个默认的写法
js文件 只有一个 food 类,一般写 export {food} 或者 export {food as default} 那么如果有多个呢? 这样 export {food, food2} 或者 ...
- react中异步组件以及withRouter的使用
什么是异步组件?简单来说就是异步加载一个组件,正常情况浏览器加载的是我们打包好的bundle.js文件,那么这个文件是集合了所有js是代码,然而我们首屏加载并不需要一次性加载所有的组件,这会造成性能的 ...