当前位置: 首页 > article >正文

SQL——多表连接查询

若一个查询同时涉及两个或两个以上的表, 则称之为连接查询(在FROM子句中体现)。 参与连接的表可有多个,但连接操作在两个表之间进行,即两两连接。


连接查询包括:

  • 内连接
    • 等值连接:用“=”比较被连接列的列值
    • 非等值连接:用“>、>=、<、<=、<>”号进行比较运算
    • 自连接:特殊的内连接,一张表看成两张表,自己连接自己,必须给表取别名
  • 外连接
    • 左外
    • 右外
    • 前外
  • 交叉连接       

1 内连接

执行连接操作的过程:

先取表1中的第1个元组,然后从头开始扫描表2逐一查找满足连接条件的元组;

找到后就将表1中的第1个元组与该元组拼接起来,形成结果表中的一个元组。

表2全部查找完毕后,再取表1中的第2个元组,然后再从头开始扫描表2, …

重复这个过程,直到表1中的全部元组都处理完毕为止。

select ...
    from tablename [inner] join 被连接表
    on 连接条件
    ......

——举例(引用已有数据库:bjpowernode.sql)

dept:部门表emp:员工表salgrade :工资等级表

deptno:部门编号

empno:员工编号

grade:等级
dname:部门名称ename:员工名字losal:最低薪资
loc:部门位置job:工作岗位hisal:最高薪资
mgr:上级领导编号
hiredate:入职时间
sal:月薪
comm:补助/津贴
deptno:部门编号

1.1 等值连接

查询每个员工的部门名称,显示员工名和部门名。

select ename,dname
from emp e join dept d
on e.deptno=d.deptno;

1.2 非等值连接 

查询每个员工的工资等级,显示员工名、工资、工资等级。

select ename,sal,grade
from emp e join salgrade s
on e.sal between s.losal and s.hisal;

1.3 自连接 

特殊的内连接——相互连接的表物理上为同一张表。

必须为两个表取别名,使之在逻辑上成两个表(一个是查询结果表,一个查询条件表)。 注:为表指定别名时,在查询语句中其它地方, 所有用到表名处均要用别名,不能再用原表名。  

<表名>    [AS]   <表别名>  (注意与列别名的区别,group by 后不能用列别名)

查询某个员工的上级领导,显示员工名和对应的领导名。

注:员工的领导编号=领导的员工编号

select a.ename as '员工名',b.ename as '领导名'
from emp a inner join emp b
on a.mgr=b.empno;

 2 外连接

只限制一张表中数据必须满足连接条件, 而另一张表中数据可不满足连接条件。   

外连接与普通连接的区别: 普通连接操作只输出满足连接条件的元组

连接操作以指定表为连接主体,将主体表不满足连接条件的元组一并输出

左外连接:列出左边关系中所有的元组  

右外连接:列出右边关系中所有的元组

# 1.ANSI方式的外连接的语法格式为:
FROM  表1  LEFT | RIGHT |FULL [OUTER]  
    JOIN  表2  ON  <连接条件> 

# 2.theta方式的外连接的语法格式为:
# 左外连接(输出表1中所有内容):
   FROM  表1, 表2  WHERE [表1.]列名(+) = [表2.]列名
# 右外连接(输出表2中所有内容):
   FROM  表1, 表2  WHERE [表1.]列名= [表2.]列名(+) 

2.1 左外连接 

查询每个员工的上级领导。

注:主要查询左边的员工表

select a.ename as '员工', b.ename '领导'
from emp a left join emp b
on a.mgr=b.empno;

2.1 右外连接 

查询每个员工的上级领导。

注:主要查询右边的领导表

select a.ename as '员工', b.ename '领导'
from emp a right join emp b
on a.mgr=b.empno;

 查询哪个部门没有员工。

注:主要的表是部门表,用right 使用where e.empno is null

select d.*
from emp e right join dept d
on e.deptno=d.deptno
where e.empno is null;

3 三张表连接 

查询每个员工的部门名称和工资等级。

注:使用emp表dept表先进行连接,再将emp表和salgrade表连接

select 
    e.ename,d.dname,s.grade
from 
    emp e 
join 
    dept d 
on 
    e.deptno=d.deptno
join 
    salgrade s 
on 
    e.sal between s.losal and s.hisal; 

 查询每个员工的部门名称、工资等级和上级领导。

注:不能在第一个join进行左外连接

select e.ename '员工',d.dname,s.grade,e1.ename '领导'
from
    emp e
join
    dept d
on
    e.deptno=d.deptno
join
    salgrade s
on
    e.sal between s.losal and s.hisal
left join
    emp e1
on
    e.mgr = e1.empno;


http://www.kler.cn/a/10670.html

相关文章:

  • linux安装netstat命令
  • 使用Matlab神经网络工具箱
  • 吾店云介绍 – 中国人的WordPress独立站和商城系统平台
  • FMC 扩展子卡6 路 422,8 组 LVDS,8 路 GPIO
  • SpringBoot整合Freemarker(三)
  • Flutter 小技巧之 Shader 实现酷炫的粒子动画
  • 一种供水系统物联网监测系统
  • ROS1学习笔记:常用可视化工具的使用(ubuntu20.04)
  • 【LeetCode: 剑指 Offer II 112. 最长递增路径 | 递归 | DFS | 深度优先遍历 | 记忆化缓存表】
  • Java——矩形覆盖
  • Flowable开源版和Flowable商业版有什么区别?
  • TCP网络连接的书写
  • 【MySQL面试题小结2023】
  • Linux文件权限
  • 借助Nacos配置中心实现一个动态线程池
  • 旅游酒店住宿
  • CF55D-Beautiful numbers (数位dp)
  • 自动化测试学习(七)-正则表达式,你真的会用吗?
  • Python循环实例
  • 爬虫日常练习-selenium登录12306
  • 2022年陕西省职业院校技能大赛“网络搭建与应用”赛项竞赛试题
  • Github创建组织(organization)
  • CTF-PHP反序列化漏洞1-基础知识
  • extern 关键字
  • 「Vue面试题」Vue项目中有封装过axios吗?主要是封装哪方面的?
  • 【分布式技术专题】「单点登录技术架构」一文带领你好好对接对应的Okta单点登录实现接口服务的实现落地