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】84. Largest Rectangle in Histogram 柱状图中最大的矩形(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 单调栈 日期 题目地址: https://leetc ...

  2. 1127 - Funny Knapsack

    1127 - Funny Knapsack    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB ...

  3. ZOJ 3960:What Kind of Friends Are You?

    What Kind of Friends Are You? Time Limit: 1 Second Memory Limit: 65536 KB Japari Park is a large zoo ...

  4. Java生成随机数的4种方式

    Random Random 类诞生于 JDK 1.0,它产生的随机数是伪随机数,也就是有规则的随机数.Random 使用的随机算法为 linear congruential pseudorandom ...

  5. 【操作系统】编程模拟FIFO,LRU,NUR,OPT页面置换算法

    #include<stdio.h> #include<stdlib.h> #include<time.h> #define random(x) (rand()%x) ...

  6. 详解Kalman Filter

    中心思想 现有: 已知上一刻状态,预测下一刻状态的方法,能得到一个"预测值".(当然这个估计值是有误差的) 某种测量方法,可以测量出系统状态的"测量值".(当然 ...

  7. 应用TYPE-C外围电源管理IC IM2605

    应用于TYPE-C外围集成同步4开关Buck-Boost变换器的电源管理IC   IM2605 IM2605描述 IM2605集成了一个同步4开关Buck-Boost变换器,在输入电压小于或大于输出电 ...

  8. [云原生]Kubernetes - 集群搭建(第2章)

    目录 一.前置知识点 二.kubeadm部署方式介绍 三.安装要求 四.最终目标 五.准备环境 六.环境初始化 6.1 设置系统主机名以及Hosts文件的相互解析 6.2 安装依赖文件(所有节点) 6 ...

  9. 自学java,如何快速地找到工作

    本人最近一直在帮零基础的java开发者提升能力和找工作,在这个过程中,发现零基础的java程序员,在自学和找工作时,普遍会出现一些问题,同时在实践过程中,也总结出了一些能帮零基础java开发尽快提升能 ...

  10. oracle 之 for循环表

    代码 create table tm_lzh as SELECT 'a1' c1,'b1' c2 FROM dual union all SELECT 'a2' c1,'b2' c2 FROM dua ...