多表联查(多表连接)(join)
多表联查(多表连接)(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)相关推荐
- sql多表联查(内连接、外连接)、实验八表联查
一.T-sql多表查询 1.内连接(inner join) 1.1概念 只返回两个数据集合之间匹配关系的行 1.2命令 select A.name姓名A,A.school学校A,B.name姓名B,B ...
- Mysql库及表的基本概念、增删查改操作以及表的约束、多表联查
什么是数据库? 存储数据的仓库 数据库的存储介质:磁盘和内存. 为什么要用数据库不用文件?(数据库与文件进行数据存储的区别) 1.文件存储安全性低 2.数据库对数据进行良好的存储,查询以及管理 3.便 ...
- 数据库多表联查的方式
多表联查:多表联查可以通过连接运算实现,即将多张表通过主外键关系关联在一起进行查询.在实际开发过程中,我们的数据大多会来自不同的表中,所以我们就需要使用多表联合查询.多表查询就是对多张表的数据取笛卡尔 ...
- 【MySQL数据库】——多表联查
多表联查可以通过连接运算实现,即将多张表通过主外键关系关联在一起进行查询 一.内联查询 1.非等值查询(也被称为笛卡尔积) 语法:select 查询的字段 from 表1,表2 ........ 以我 ...
- mysql备份与多表联查
mysql备份与多表联查 1.mysql配置文件 2.mysql数据库备份与恢复 2.1 备份类型 2.2 mysql备份工具mysqldump 2.3 mysql数据恢复 2.4 差异备份与恢复 2 ...
- two-04 索引 视图 多表联查
1. 索引 索引是一种排好序的快速查找的数据结构,它帮助数据库高效的进行数据的检索. Explain可以看SQL是否使用了索引. 1.1 索引的分类 单值索引:一个索引只包括一个列 唯一索引:索引列的 ...
- hive多表联查full join连接条件问题
我们在hive中会经常使用多表联查,也就是我们常做的join 或者 union .但是在写完SQL后会发现往往实现不了业务需求,而我们却又找不到原因所在,下面是多表联查有关full join的经典的问 ...
- 多表联查--01---LEFT JOIN 实现多表联查
表的关系 一对一,一张表 有时候会为了性能而拆开(商品信息和商品备注信息–详情-很大) 一对多,必须两张表 多对一,反过来就是一对多,必须两张表 多对多,必须三张表,中间表,来维护它们之间的关系 笛卡 ...
- Database之SQLSever:SQL命令实现查询之多表查询、嵌套查询、分页复杂查询,删除表内重复记录数据、连接(join、left join和right join简介及其区别)等案例之详细攻略
Database之SQLSever:SQL命令实现查询之多表查询.嵌套查询.分页复杂查询,删除表内重复记录数据.连接(join.left join和right join简介及其区别)等案例之详细攻略 ...
最新文章
- 【计算理论】可判定性 ( 通用图灵机和停机问题 | 可判定性 与 可计算性 | 语言 与 算法模型 )
- 安装模块时提示Collecting package metadata (repodata.json): failed
- Codeforces Round #704 (Div. 2) D. Genius‘s Gambit 构造 + 细节
- Java 8中使用Lambda表达式的策略模式
- excel oss 上传_java实现上传文件到oss(阿里云)功能示例
- CentOS下配置apache+gitweb
- 随机过程第二章part2
- Xshell5免费版安装使用说明
- 地址栏中输入IP地址提示指定的网络名不再可用的解决方法
- Math类的常用函数总结
- python之列表详解
- 微软拼音输入法 设置双拼 及全双拼切换
- JAVA 图片格式检查方法
- 数学笔记11——微分和不定积分
- GIS制图的基础三点
- python的sort函数
- 怎么修改PDF文字,PDF修改文字用什么方法
- 怎么在mysql数据库中放图片_如何将图片储存在MySQL数据库中
- 在项目中这样写代码的时候,请搭配红花油、跌打损伤酒一起使用
- 用互联网对接传统行业,改良还是颠覆?