sql多表查询学习
我们先建立一个表 EMP(15行):
如果想查询所有数据,很简单
select * from EMP;
这样就能查询到EMP的所有数据
在了解多表查询之前 我们应该先复习一下数学中笛卡尔积的概念
比如一个集合有(1,2,3)三个元素 另一个集合有(4,5,6)三个元素
他们的笛卡尔积 其实有3*3 9种情况
连接查询分为 内连接 ,外连接,交叉连接
内连接
内连接分显式和隐式 关键字是inner join 其实这个inner可以不写
隐式的内连接就是笛卡尔积
这里 建立一个DEPT表(4行)
我们想看到这两个表所有的东西,所以要求它们的笛卡尔积 也就是隐式的内连接
隐式的内连接用cross join 关键字
select *from emp cross join dept;
这两个表就会结合到一起:
很明显有15*4 = 60种情况
显式内连接
之前的数据太重叠了 我们实际中不想这样
这里先介绍一种等值连接
原理就是先做笛卡尔积 然后再根据条件筛选,条件是:字段的值要相同,才能筛选 也就是说其实两个字段的名字可以不同
等值连接 有一个自然连接 自然连接就是根据名称相同的字段进行连接 关键字:natural join
我们注意到 emp和dpt这两个表有一个相同字段 :DEPTNO
我们直接做一个 natural join
select *from emp natural join dept;
运行:
此时就是15 行 这个自然连接其实就能帮到我们很多忙了
如果字段名称不相同呢:
用这种语法:
表一 inner join 表二 on 筛选条件
我们可以这么写:
select * from emp e inner join dept p on e.deptno = p.deptno
结果和上一个natural join 是类似的 但是有一点不同:
这个重复列 并没有消去
其实字段的名称相同也可以:
表一 inner join 表二 using (字段名)
select * from emp inner join dept using (deptno);
结果和natural join 一样
下面再介绍一种不等值连接:
select * from emp e inner join dept p on e.sal between 1000 and 1500;
还有一种自连接
select * from emp a inner join emp b on a.empno = b.mgr
外连接:
我们研究内连接的时候都是研究的等值 不等值的情况就会被忽略 外连接还是比较重要的
外连接分为左连接和右连接
我们先改一下表emp
改为50 很显然 关键字“马云”和另一个表的对应是不存在的
我们用内连接查一下
select * from emp e inner join dept p on e.deptno = p.deptno
这个表成为了14行
我们想用emp作为主表 将那行没有筛选到的数据加入进来
所以下面介绍左外连接:
表一 left (outer) join 表二 on 筛选条件
这个outer 也可以省
我们来跑一下
select * from emp e left join dept p on e.deptno = p.deptno
就会发现 这个没有被筛选的不等条件 关键字“马云”这一行被查了出来
左外连接是以左表为主 那么右外连接就是以右表为主呗
满外连接:整合了左外连接和右外链接 关键字full join
就先介绍到这里