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作为主表 将那行没有筛选到的数据加入进来

所以下面介绍左外连接:

表一 leftouterjoin 表二 on 筛选条件

这个outer 也可以省

我们来跑一下

select * from emp e left join dept p on e.deptno = p.deptno

 

 就会发现 这个没有被筛选的不等条件 关键字“马云”这一行被查了出来

 

左外连接是以左表为主 那么右外连接就是以右表为主呗

满外连接:整合了左外连接和右外链接 关键字full join

就先介绍到这里

 

posted @ 2021-01-02 15:49  然终酒肆  阅读(110)  评论(0编辑  收藏  举报