多表查询(一)

多表查询(连接查询,库表查询)

多张表联合索引

没有限制条件的关联——笛卡尔集-cross join 

select ename, dname
from emp, dept;
等价于
select ename, dname
from emp cross join dept;

内连接

 A表与B表连接,只查询匹配记录

等值连接:inner-join

#查询每一个员工所在部门的名称,要求最终显示员工姓名和对应的部门名称

select
ename, dname
from emp
inner join dept
on emp.deptno = dept.deptno

非等值连接

查询员工姓名,薪水,薪水对应等级

方法一:

select e.ename, esal, e.grade

from emp as e inner join salgrade as s

on e.sal >= s.losal and e.sal <= s.hisal;

方法二:

select ename, sal, grade

from emp as e inner join salgrade as s

on e.sal between s.losal and s.hisal

自连接

select

emp.ename empname, emp.empno, empmgr.ename as marname, empmgr.empno as mgrno

from emp

inner join emp as empmgr

on emp.mgr = empmgr.empno

外连接

左连接

两张表联合查询,一张表为主,关联另外一张表的匹配字段,如果没有匹配上,在这个主表的连接显示上显示null占位

 练习:查询所有杀手和杀手中被杀清单上的信息名单

select user1.user_name, user1.over, user2.over

from user1

left join user2

on user1.user_name = user2.user_name

 #查询没有在被杀名单上的杀手信息

select

user1.user_name, user1.over, user2.over

from user1 left join user2

on user1.user_name = user2.user_name

where user2.over is null;

右连接

 

 

 查询被杀名单以及上面的杀手信息

select user2.user_name, user2.over, user1.over

from user1

right join user2

on user1.user_name = user2.user_name

 查询被杀名单中不是杀手的信息

select user2.user_name, user2.over, user1.over

from user1

right join user2

on user1.user_name = user2.user_name

where user1.over is null

注意where条件跟的user1.overselect后面查出来以后的值user1.over

全连接(不要求掌握,掌握了很强)-full join

定义:包含左,右两个表的全部行,不管另外一个表中是否存在与他们匹配的行。

full-join没有直接实现的语句,需要通过来拟合表结构实现

#查询杀手清单上的信息,杀手在被杀清单上的信息,被杀清单上的信息,被杀清单上的杀手信息

select user1.user_name, user1.over, user2.over

from user1 left join user2

on user1.user_name = user2.user_name

union all

select user2.user_name, user2.over, user1.over

from user1 right join user2

on user1.user_name = user2.user_name

 

合并结果集

合并结果集的时候,每个查询表中的字段个数要相同

union—合并相同的数据
select ename, job from emp where job = ‘MANAGER’

union

select ename, job from emp where job = ‘CLERK’;

union all 不会合并相同的数据
select ename, job from emp where job = ‘MANAGER’

union all

select ename, job from emp where job = ‘CLERK’;

原文地址:https://www.cnblogs.com/HelloM/p/13551512.html