多表连接的基本语法

多表连接,就是将几张表拼接为一张表,然后进行查询

  1. select 字段1, 字段2, ...
  2. from 1 {inner|lift|right} join 2
  3. on 连接条件;

有如下两张表:部门表和员工表

交叉连接和笛卡尔积现象

交叉连接

交叉连接,又名无条件内连接/笛卡尔连接

第一张表种的每一项会和另一张表的每一项依次组合

  1. select * from employee,department;

上述结果肯定不是我们想晓得的,左表中每一个人都有4个部门,仔细观察这4条记录,正好是左表每一条记录和右表一一匹配后的结果。

笛卡尔积现象

笛卡尔积现象产生的原因:两张表没有有效的连接条件。既然你没有连接条件,本表中的第一行肯定是能和另外表中的所有行进行一一匹配,同理,本表中的第二行肯定是能和另外表中的所有行进行一一匹配,以此类推,本表中的最后一行m也可以和另外表中的所有行进行一一匹配。若另外一张表有n行,那么最后显示的行数,肯定就是m*n行了。

如果不想产生笛卡尔积现象,就需要添加有效的表连接条件。拿上述例子来说,左表dep_id只有和右表id相等时,才代表他们的部门。

内连接

内连接(INNER JOIN)是找几张表的交集,即根据条件筛选出来正确的结果。

  1. select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name
  2. from employee as emp INNER JOIN department as dep
  3. on emp.dep_id=dep.id;

由于部门表中没有id=5的部门,所以员工表dep_id=5的这条记录没有返回;而由于行政部没有员工,所以这条记录也没返回。

外连接

左外连接

左连接(left join)是以左表为准,如果右表中没有合适的记录,用NULL补全;其本质是在内连接的基础上增加左表有结果而右表没有的记录(内连接时,这种情况的记录会忽略)。

  1. select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name
  2. from employee as emp left join department as dep
  3. on emp.dep_id=dep.id;

右外连接

跟左连接正好相反,右连接(right join)是以右表为准,如果左表中某些字段没有合适的结果,用NULL补全;其本质是在内连接的基础上增加右表有结果而左表没有的记录(内连接时,这种情况的记录会忽略)。

  1. select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name
  2. from employee as emp right join department as dep
  3. on emp.dep_id=dep.id;

全外连接

全外连接,在内连接的基础上,展示左右表的所有的记录,而左右表中缺省记录以NULL补全。

MySQL中并没有全外连接的FULL JOIN语法,而是借助UNION/UNION ALL语句实现。

UNIONUNION ALL的区别,UNION具有去重功能。

  1. select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name
  2. from employee as emp left join department as dep
  3. on emp.dep_id=dep.id
  4. union
  5. select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name
  6. from employee as emp right join department as dep
  7. on emp.dep_id=dep.id;

子查询

子查询是将一个查询语句嵌套再另一个查询语句中的查询方式:

  • 子查询的内层查询结果,可以作为外层查询语句提供查询条件。
  • 子查询中可以包含INNOT INANDALLEXISTSNOT EXISTS等关键字。
  • 子查询中还可以包含比较运算符,如=!=><等。
  1. -- 查询平均年龄在20以上的部门名称
  2. select name
  3. from department
  4. where id in (
  5. select dep_id
  6. from employee
  7. group by dep_id
  8. having avg(age) > 20);
  9. -- 查询财务部员工姓名
  10. select name
  11. from employee
  12. where dep_id in (
  13. select id
  14. from department
  15. where name='财务部');
  16. -- 查询所有大于平均年龄的员工的年龄和姓名
  17. select name,age
  18. from employee
  19. where age > (
  20. select avg(age) from employee);

MySQL之连接查询和子查询的更多相关文章

  1. mysql的查询、子查询及连接查询

    >>>>>>>>>> 一.mysql查询的五种子句         where(条件查询).having(筛选).group by(分组). ...

  2. MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习

    MySQL之多表查询 阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建 ...

  3. 从项目上一个子查询扩展学习开来:mysql的查询、子查询及连接查询

    上面这样的数据,想要的结果是:如果matchResult为2的话,代表是黑名单.同一个softId,version,pcInfoId的代表是同一个软件,需要去重:同时,如果相同软件里面只要有一个mat ...

  4. MySQL连接查询、联合查询、子查询

    参考地址:http://blog.csdn.net/u011277123/article/details/54863371 1.MySQL连接查询 连接查询:将多张表(>=2)进行记录的连接(按 ...

  5. Mysql的查询语句(联合查询、连接查询、子查询等)

    Mysql的各个查询语句(联合查询.连接查询.子查询等) 一.联合查询 关键字:union 语法形式 select语句1 union[union选项] select 语句2 union[union选项 ...

  6. [转]mysql的查询、子查询及连接查询

    转自:http://www.cnblogs.com/rollenholt/archive/2012/05/15/2502551.html 一.mysql查询的五种子句         where(条件 ...

  7. mysql查询、子查询、连接查询

    mysql查询.子查询.连接查询 一.mysql查询的五种子句 where子句(条件查询):按照“条件表达式”指定的条件进行查询. group by子句(分组):按照“属性名”指定的字段进行分组.gr ...

  8. mysql之连接查询、联合查询、子查询

    本文内容: 连接查询 联合查询 子查询 from子查询 where子查询 exists子查询 首发日期:2018-04-11 连接查询: 连接查询就是将多个表联合起来查询,连接查询方式有内连接.外连接 ...

  9. MYSQL - 外键、约束、多表查询、子查询、视图、事务

    MYSQL - 外键.约束.多表查询.子查询.视图.事务 关系 创建成绩表scores,结构如下 id 学生 科目 成绩 思考:学生列应该存什么信息呢? 答:学生列的数据不是在这里新建的,而应该从学生 ...

  10. MySQL中的联表查询与子查询

    0.准备数据 1.内连接:INNER JOIN 2.左连接:LEFT JOIN 3.右连接:RIGHT JOIN 4.USING子句 扩展知识点: 0.表别名的使用: 1.group by的用法 2. ...

随机推荐

  1. 15Java进阶 进程

    1 线程控制 t.join():让主线程进入线程池,等待t执行完才执行. t.sleep():让线程阻塞,休眠一段时间,休眠结束后进入就绪状态.不会释放锁. t.yield():让线程让出CPU,从运 ...

  2. CExec.jsp中请求过程

  3. 定时任务quartz

      pom引入 <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>qua ...

  4. java顺序结构、循环结构、选择结构

    java顺序结构.选择结构.循环结构 顺序结构: 语句与语句之间,框与框之间是从上到下的顺序进行的,它是由若干个依次执行的处理步骤执组成的,它是任何一个算法都不离开的一种基本算法结构. 选择结构: 1 ...

  5. 🔥 LeetCode 热题 HOT 100(61-70)

    207. 课程表 思路:根据题意可知:当课程之间不存在 环状 循环依赖时,便能完成所有课程的学习,反之则不能.因此可以将问题转换成: 判断有向图中是否存在环.使用 拓扑排序法 : 构建 入度表:记录每 ...

  6. azure删除ns时一直处于terminating状态

    写个脚本 #!/bin/bash NAMESPACE=corekubectl proxy &kubectl get namespace $NAMESPACE -o json |jq '.spe ...

  7. Discuz ML RCE漏洞

    1.漏洞描述 Discuz国际版漏洞存在于cookie的language可控并且没有严格过滤,导致可以远程代码执行. 2.产生原因:Discuz!ML 系统对cookie中的l接收的language参 ...

  8. BUUCTF-[SUCTF 2019]CheckIn(.user.ini利用+exif_imagetype绕过)

    目录 分析 .user.ini使用条件 解题 参考链接 记一道.user.ini利用+exif_imagetype绕过的文件上传的题. 分析 先正经上传一张图片.回显了存储路径,同时发现还包含了一个i ...

  9. 面试反杀「GitHub 热点速览 v.21.33」

    作者:HelloGitHub-小鱼干 作为一个应聘者,面试的时候经常会被面试官问:你有什么问题要问我吗?为了避免这种临时想不到问题的尴尬,reverse-interview-zh 会教你下反向操作,提 ...

  10. 面试官:实现一个带值变更通知能力的Dictionary

    如题, 你知道字典KEY对应的Value什么时候被覆盖了吗?今天我们聊这个刚性需求. 前文提要: 数据获取组件维护了业务方所有(在用)的连接对象,DBA能在后台无侵入的切换备份库. 上文中:DBA在为 ...