多表联查(多表连接)(join)

1、 分类

内连接、自然连接、外链接(左外连接、右外连接、全外连接(mysql不支持))

2、 内连接 inner join(等值连接,制定对应的等值条件)

SELECT * FROM emp,dept;/*得到的数据是不对的*/

得到的数据叫做笛卡尔积:结果是两个表数据的乘积

使用内连接去查

SELECT * FROM emp INNER JOIN dept;

结果依然是笛卡尔积,是因为我们没有制定对应的等值条件

SELECT * FROM emp e INNER JOIN dept d WHERE e.deptno = d.deptno;

/*emp.deptno和dept.deptno这样的写法叫做:完全限定名

两个表中有相同的字段,类似于A村有个老张家,孩子叫张三

B村也有一个老张家,孩子也叫张三,

如果没有用到多表联查,就没有必要使用完全限定名,类似于

A村老张家的爸爸说,张三,吃饭了,指的是自己的孩子

用到了夺标联查,两家在一起,A村的老张家的爸爸说:张三,吃饭了

这个张三指的是谁?(不一定)

*/

提示:一般来讲,我们不使用内连接,因为效率低。用外链接

标准写法:select * from 表1 别名1 inner join 表2 别名2 where 别名1.xxx = 别名2.xxx;

SELECT * FROM emp e INNER JOIN dept d WHERE e.deptno = d.deptno;

方言写法:select * from 表1 别名1,表2别名2 where别名1.xxx = 别名2.xxx;

SELECT * FROM emp e,dept d WHERE e.deptno = d.deptno;

3、 自然连接 natural(不需要指定等值条件)

select * from 表1 别名1 natural join 表2 别名2;

4、 外链接(难点)

左外:select * from 表1 别名1 left [ outer ] join 表2 别名2 on 等值条件;

SELECT * FROM emp e LEFT OUTER JOIN dept d ON e.deptno = d.deptno;

左外的意思是:左表的记录无论是否满足条件,都会被查出来,而右表的记录只有满足条件的,才会被查出来。(左表中数据在右表中如果不存在,则右表的字段值为null)

理解左外右外:

先看两个表数据:

/*左外*/

SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id;

左外连接是以左边的表为基准。通俗的讲,先把左表的数据全都显示出来,然后右边的表id与左边表的id的值是一样的,就拼接上去,比如说上面的id=1的数据,就拼接了。

如果没有匹配的,比如说id=2的数据,右边没有,用null拼接。

/*右外 */

SELECT * FROM table1 t1 RIGHT JOIN table2 t2 ON t1.id = t2.id;

右外跟左外的机制刚好相反。

如何去判断主副表?(左外连接:左边的是主表,右外连接:右边的是主表)

跟讲过的内连接做个简单的比较

SELECT * FROM table1 t1,table2 t2 WHERE t1.id = t2.id;

区别:内连接显示的是满足等值条件的记录,而外链接主表的记录都显示出来。

注意:使用多表联查,不一定要有外键。

例题:/*查询所有工作为文员的员工姓名及部门名称*/

SELECT e.ename,e.job,d.dname

FROM emp e LEFT JOIN dept d ON e.deptno = d.deptno

WHERE e.job = '文员';

例题:/*查询至少有一个员工的部门信息*/

结果很显然不对,因为40部门没人。

分析:因为我把dept作为主表,而主表的数据都显示,所以不合适,更改如下:

如下写法也可以

其实可以不用外链接,也可以查询

子查询

子查询:查询中还有查询(数select的个数)

1、 出现的位置

A from前:作为字段存在的

B where后:作为条件存在的

/*查询出工资高于在30部门工作的所有员工的工资的员工信息*/

C from后:表(极为罕见)

多表联查(多表连接)(join)相关推荐

  1. sql多表联查(内连接、外连接)、实验八表联查

    一.T-sql多表查询 1.内连接(inner join) 1.1概念 只返回两个数据集合之间匹配关系的行 1.2命令 select A.name姓名A,A.school学校A,B.name姓名B,B ...

  2. Mysql库及表的基本概念、增删查改操作以及表的约束、多表联查

    什么是数据库? 存储数据的仓库 数据库的存储介质:磁盘和内存. 为什么要用数据库不用文件?(数据库与文件进行数据存储的区别) 1.文件存储安全性低 2.数据库对数据进行良好的存储,查询以及管理 3.便 ...

  3. 数据库多表联查的方式

    多表联查:多表联查可以通过连接运算实现,即将多张表通过主外键关系关联在一起进行查询.在实际开发过程中,我们的数据大多会来自不同的表中,所以我们就需要使用多表联合查询.多表查询就是对多张表的数据取笛卡尔 ...

  4. 【MySQL数据库】——多表联查

    多表联查可以通过连接运算实现,即将多张表通过主外键关系关联在一起进行查询 一.内联查询 1.非等值查询(也被称为笛卡尔积) 语法:select 查询的字段 from 表1,表2 ........ 以我 ...

  5. mysql备份与多表联查

    mysql备份与多表联查 1.mysql配置文件 2.mysql数据库备份与恢复 2.1 备份类型 2.2 mysql备份工具mysqldump 2.3 mysql数据恢复 2.4 差异备份与恢复 2 ...

  6. two-04 索引 视图 多表联查

    1. 索引 索引是一种排好序的快速查找的数据结构,它帮助数据库高效的进行数据的检索. Explain可以看SQL是否使用了索引. 1.1 索引的分类 单值索引:一个索引只包括一个列 唯一索引:索引列的 ...

  7. hive多表联查full join连接条件问题

    我们在hive中会经常使用多表联查,也就是我们常做的join 或者 union .但是在写完SQL后会发现往往实现不了业务需求,而我们却又找不到原因所在,下面是多表联查有关full join的经典的问 ...

  8. 多表联查--01---LEFT JOIN 实现多表联查

    表的关系 一对一,一张表 有时候会为了性能而拆开(商品信息和商品备注信息–详情-很大) 一对多,必须两张表 多对一,反过来就是一对多,必须两张表 多对多,必须三张表,中间表,来维护它们之间的关系 笛卡 ...

  9. Database之SQLSever:SQL命令实现查询之多表查询、嵌套查询、分页复杂查询,删除表内重复记录数据、连接(join、left join和right join简介及其区别)等案例之详细攻略

    Database之SQLSever:SQL命令实现查询之多表查询.嵌套查询.分页复杂查询,删除表内重复记录数据.连接(join.left join和right join简介及其区别)等案例之详细攻略 ...

最新文章

  1. 【计算理论】可判定性 ( 通用图灵机和停机问题 | 可判定性 与 可计算性 | 语言 与 算法模型 )
  2. 安装模块时提示Collecting package metadata (repodata.json): failed
  3. Codeforces Round #704 (Div. 2) D. Genius‘s Gambit 构造 + 细节
  4. Java 8中使用Lambda表达式的策略模式
  5. excel oss 上传_java实现上传文件到oss(阿里云)功能示例
  6. CentOS下配置apache+gitweb
  7. 随机过程第二章part2
  8. Xshell5免费版安装使用说明
  9. 地址栏中输入IP地址提示指定的网络名不再可用的解决方法
  10. Math类的常用函数总结
  11. python之列表详解
  12. 微软拼音输入法 设置双拼 及全双拼切换
  13. JAVA 图片格式检查方法
  14. 数学笔记11——微分和不定积分
  15. GIS制图的基础三点
  16. python的sort函数
  17. 怎么修改PDF文字,PDF修改文字用什么方法
  18. 怎么在mysql数据库中放图片_如何将图片储存在MySQL数据库中
  19. 在项目中这样写代码的时候,请搭配红花油、跌打损伤酒一起使用
  20. 用互联网对接传统行业,改良还是颠覆?

热门文章

  1. mac下的c语言贪吃蛇
  2. Python-字典学习
  3. jack 服务常见错误解决方法
  4. Apache 实现AJAX跨域请求
  5. Ajax实现跨域请求
  6. Vlan和pvlan全面解析
  7. OpenCV图像色温
  8. ARM和NEON指令
  9. 素数筛线性筛详细详解(个人总结思路超长版)
  10. t3服务器补丁文件夹在哪,FM2017全补丁存放路径汇总 补丁放在哪个文件夹-游侠网...