oracle基础-多表关联查询 备份

 一、概述

        在实际应用系统开发中会设计多个数据表,每个表的信息不是独立存在的,而是若干个表之间的信息存在一定的关系,当用户查询某一个表的信息时,很可能需要查询关联数据表的信息,这就是多表关联查询。SELECT语句自身是支持多表关联查询的,多表关联查询要比单表查询复杂的多。在进行多表关联查询时,可能会涉及表别名、内连接、外连接、自然连接和交叉连接等概念,下面将对这些内容进行讲解。

二、表的别名

        在多表关联查询时,如果多个表之间存在同名的列,则必须使用表名来限定列的引用。例如,在SCOTT模式中,DEPT表和EMP表都有DEPTNO列,当用户使用该列关联查询两个表时,就需要通过指定表名来区分这两个列的归属。但是,随着查询变得越来越复杂,语句就会因为每次限定列必须输入表名而变得冗长。对于这种情况,SQL提供了设定表别名的机制,使用简短的表别名可以代替原有较长的表名称,这样就大大缩减语句的长度。

        【例2.1】在SCOTT模式下,通过DEPTNO(部门号)列来关联EMP表和DEPT表,并检索这两个表中相关字段的信息,代码及运行结果如下:

select e.empno 员工编号,e.ename 员工姓名,d.dname 部门 from dept d,emp e where d.deptno = e.deptno and e.job = 'MANAGER';

        在上面的SELECT语句中,FROM子句最先执行,然后才是WHERE子句和SELECT子句,这样在FROM子句中指定表的别名后,当需要限定引用列时,其他所有子句都可以使用表的别名。

        另外,还需要注意一点,一旦在FROM子句中为表指定了别名,则必须在剩余的子句中都是用表的别名,而不允许再使用原来的表名称,否则,将出现【例2.2】错误提示。

【例2.2】 

select e.empno 员工编号,e.ename 员工姓名,d.dname 部门 from dept d,emp e where d.deptno = e.deptno and emp.job = 'MANAGER';

 总结:

        1、表的别名在FROM子句中定义,别名放在表名之后,之间用空格隔开。

        2、别名一经定义,在整个查询语句中就只能使用表的别名而不能在使用表名。

        3、表的别名只在所定义的查询语句中有效。

        4、应该选择有意义的别名,表的别名最长为30个字符,但越短越好。

三、内连接

        内连接是一种常用的多表关联查询方式,一般使用关键字INNER JOIN来实现。其中INNER关键字可以省略,当只使用JOIN关键字时,语句默认表示内连接操作。在使用内连接查询多个表时,必须在FROM子句之后定义一个ON子句,ON子句指定内连接操作列与连接条件匹配的数据行,使用比较运算符比较被连接列的值。简单来说,内连接就是使用JOIN指定用于连接的两个表,使用ON指定表的连接条件。若进一步限制查询范围,则可以直接在后面添加WHERE子句。内连接的语法格式如下:

SELECT columns_list
FROM table_name1 [INNER] JOIN table_name2
ON join_condition
[WHERE]

其中:columns_list:字段列表

        table_name1 和 table_name2 :两个要实现内连接的表。

        join_condition:实现内连接的条件表达式

        WHERE :使用where子句进一步限制查询范围。

【例3.1】在scott模式下,通过deptno字段来内连接emp表和dept表,查询dept表中部门名称为 SALES,并检索这两个表中相关的字段信息。

select e.empno 员工编号,e.ename 员工姓名,d.dname 部门 
from emp e inner join dept d 
on e.deptno = d.deptno
where d.dname = 'SALES';

四、外连接

        使用外连接进行多表查询时,返回的查询结果中只包含符合查询条件和连接条件的数据。内连接消除了与另一个表中的任何数据不匹配的行,而外连接扩展了内连接的结果集,除了返回所有匹配的数据外,还会返回一部分或全部不匹配的行,这主要取决于外连接的种类。外连接通过有以下三种。

        左外连接:关键字为LEFT OUTER JOIN 或 LEFT JOIN

        右外连接:关键字为RIGHT OUTER JOIN 或 RIGHT JOIN

        完全外连接:关键字为FULL OUTER JOIN 或 FULL JOIN

与内连接不同的是,外连接不只列出与连接条件匹配的数据,还能够列出左表(左外连接时)、右表(右外连接时)、两个表(全部外连接时)中所有符合搜索条件的数据。

        4.1 左外连接

        左外连接的查询结果中不仅包含了满足连接条件的数据,还包含左表中不满足连接条件的数据。

        【例4.1.1】首先在emp表中插入一条新数据(注意没有为deptno和dname列插入值,即它们的值是null),然后实现emp表和dept表之间通过deptno列进行左外连接。

插入

insert into emp (empno,ename,job) values(9527,'EAST','SALESMAN');

查询

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

结果

        从上面的查询结果中可以看到,虽然新插入的数据deptno值为null,但该行记录让然出现在查询结果中,说明左外连接的查询结果会包含左表中不满足“连接条件”的数据。 

        4.2   右外连接

        同样道理,右外连接的查询结果中不仅包含了满足连接条件的数据行,而且还包含右表中不满足连接条件的数据行。

         【例4.2.1】在SCOTT模式下,实现emp表和dept表之间通过deptno列进行右外连接。

select e.empno,e.ename,e.job,d.deptno,d.dname
from emp e
right join dept d 
on e.deptno = d.deptno

        运行结果如下

          

 ·        从上面的查询结果中可以看到,虽然部门编号为40的数据行在emp表中还没有员工记录,但它却出现在查询结果中,这说明右外连接的查询结果会包含由表中不满足“连接条件”的数据行。

        在外连接中也可以使用外连接的连接运算符,外连接的连接运算符为“(+)”,该连接运算符可以放在等号的左边,也可以放在等号的右边,但是一定要放在缺少信息的那一边,比如放在e.deptno所在的一方。

select e.empno,e.ename,e.job,d.deptno,d.dname
from emp e,dept d
where e.deptno (+)= d.deptno

运行结果

使用(+)操作符时应注意:

        1、当使用(+)操作符执行外连接时,如果在WHERE子句中包含多个条件,则必须在所有条件中都包含(+)操作符。

        2、(+)操作符只适用于列,而不能用在表达式上。

        3、(+)操作符不能与ON和IN操作符一起使用。

4.3 完全外连接

在执行完全外连接时,Oracle会执行一个完成的左外连接和右外连接查询,然后将查询结果合并,并消除重复的数据。

【例4.3.1】 在SCOTT模式下,实现emp表和dept表之间通过deptno列进行完全外连接。

select e.empno,e.ename,e.job,d.deptno,d.dname
from emp e
full join dept d 
on e.deptno = d.deptno

 

4.4 自然连接

        自然连接和内连接功能相似,自然连接是指在检索多个表时,Oracle会将第一个表中的列与第二个表中具有相同名称的列进行自动连接。在自然连接中,用户不需要明确指定进行连接的列,这个任务有Oracle自动完成,自然连接使用NATURAL JOIN 关键字。

【4.4.1】 在emp表中检索工资(sal字段)大于2000的记录,并实现emp表与dept表的自然连接。

select empno,ename,job,dname
from emp natural join dept
where sal > 2000

    由于自然连接要求表之间必须具有相同的列名称,这样容易在设计表时出现不可预知的错误,所以在实际应用中很少用到自然连接。另外需要注意的是,在使用自然连接时,不能为列指定限定词(即表名或表的别名),否则Oracle会弹出“ORA-25155:NATURAL连接中使用的列不能有限定词”的错误提示.

4.5 自连接

     在实际应用中,用户可能会拥有“自引用式”的外键。“自引用式”外键是指表中的一列可以使该表住建的一个外键。

     自连接主要用在自参考表上显示上下级关系或者层次关系。自参照表是指在同一张表的不同列之间具有参照关系活着主从关系的表。例如,emp表包含empno(雇员号)和mgr(管理员号)列,两者之间就具有参照关系。这样用户就可以通过mgr列与empno列的关系,实现查询某个管理者所管理的下属员工信息。

【例4.5.1】在SCOTT模式下,查询所有管理者所管理的下属员工信息。

select e2.ename 上层管理者,e1.ename 下属员工
from emp e1 
left join emp e2 
on e1.mgr = e2.empno
order by e1.mgr

 4.6 交叉连接

交叉连接实际上就是不需要任务连接条件的连接,它使用CROSS JOIN关键字来实现,语法格式:

select colums_list

from talble_name1 cross join table_name2

交叉连接的执行结果是一个笛卡尔积,这种查询结果是非常冗余的,但是可以通过WHERE子句来过滤出有用的记录信息。

【4.6.1】在SCOTT模式下,通过交叉连接dept表和emp表,计算出查询结果的行数。

select count(*)
from emp cross join dept

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/444593.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【NR技术】 3GPP支持无人机服务的关键性能指标

1 性能指标概述 5G系统传输的数据包括安装在无人机上的硬件设备(如摄像头)收集的数据,例如图片、视频和文件。也可以传输一些软件计算或统计数据,例如无人机管理数据。5G系统传输的业务控制数据可基于应用触发,如无人机上设备的开关、旋转、升…

数字化解决方案的设计与实现:提升业务效率与用户体验

摘要:随着数字化时代的到来,越来越多的企业和组织开始寻求数字化解决方案来提升业务效率和改善用户体验。本文将探讨数字化解决方案的设计与实现过程,并介绍一些关键的技术和策略。 ## 引言 在当今竞争激烈的商业环境中,企业和组…

深度学习图像算法工程师--面试准备(2)

深度学习面试准备 深度学习图像算法工程师–面试准备(1) 深度学习图像算法工程师–面试准备(2) 文章目录 深度学习面试准备前言一、Batch Normalization(批归一化)1.1 具体步骤1.2 BN一般用在网络的哪个部分 二、Layer Normaliza…

个人健康管理系统|基于微信小程序的个人健康管理系统设计与实现(源码+数据库+文档)

个人健康管理小程序目录 目录 基于微信小程序的个人健康管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2 运动教程管理 3、公告信息管理 4、论坛信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设…

Java对接腾讯云直播示例

首先是官网的文档地址 云直播 新手指南 可以发现它这个主要是按流量和功能收费的 价格总览 流量这里还只收下行的费用,就是只收观看消耗的流量费 其它的收费就是一些增值业务费 (包括直播转码、直播录制、直播截图、直播审核、智能鉴黄、实时监播、移动直…

【JavaEE初阶 -- 多线程】

认识线程(Thread)Thread类及常见方法 1.认识线程(Thread)1.1 线程1.2 进程和线程的关系和区别1.3 Java的线程和操作系统线程的关系1.4 创建线程 2. Thread类及常用的方法2.1 Thread的常见构造方法2.2 Thread的几个常见属性2.3 启动…

java SSM厂房管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM厂房管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S…

10 | MySQL为什么有时候会选错索引?

前面我们介绍过索引,你已经知道了在 MySQL 中一张表其实是可以支持多个索引的。但是,你写 SQL 语句的时候,并没有主动指定使用哪个索引。也就是说,使用哪个索引是由 MySQL 来确定的。 不知道你有没有碰到过这种情况,一…

Java17 --- springCloud之LoadBalancer

目录 一、LoadBalancer实现负载均衡 1.1、创建两个相同的微服务 1.2、在客户端80引入loadBalancer的pom 1.3、80服务controller层&#xff1a; 一、LoadBalancer实现负载均衡 1.1、创建两个相同的微服务 1.2、在客户端80引入loadBalancer的pom <!--loadbalancer-->&…

Qt学习-22 <QTreeWidget QTreeView>

—均为学习笔记&#xff0c;如有错误请指出 一、QTreeWidget 1. 样式展示&#xff1a; ① ② 2. 样式代码&#xff1a; ① //treeWidget树控件的使用//设置水平头//QStringList() 创建匿名对象&#xff0c;省略起名的操作ui->treeWidget->setHeaderLabels(QString…

对中国境内所有地区KFC门店基本信息的统计(简略版)

我们要获取每个地区的kfc信息就要先获取中国一共有哪些地区 中国所有城市名称获取 import requests from lxml import etreewith open(f./省份.txt, w) as fp:fp.write() with open(f./城市.txt, w) as fp:fp.write()url1http://www.kfc.com.cn/kfccda/storelist/index.aspx#…

高度塌陷问题及解决

什么情况下产生 (when 父盒子没有定义高度&#xff0c;但是子元素有高度&#xff0c;希望用子盒子撑起父盒子的高度&#xff0c;但是子盒子添加了浮动属性之后&#xff0c;父盒子高度为0 <template><div class"father"><div class"son"&…

【兔子机器人】修改GO电机id(软件方法、硬件方法)

一、硬件方法 利用上位机直接修改GO电机的id号&#xff1a; 打开调试助手&#xff0c;点击“调试”&#xff0c;查询电机&#xff0c;修改id号&#xff0c;即可。 但先将四个GO电机连接线拔掉&#xff0c;不然会将连接的电机一并修改。 利用24V电源给GO电机供电。 二、软件方…

LoadBalancer (本地负载均衡)

1.loadbalancer本地负载均衡客户端 VS Nginx服务端负载均衡区别 Nginx是服务器负载均衡&#xff0c;客户端所有请求都会交给nginx&#xff0c;然后由nginx实现转发请求&#xff0c;即负载均衡是由服务端实现的。 loadbalancer本地负载均衡&#xff0c;在调用微服务接口时候&a…

Linux文件和文件夹操作

前言&#xff1a; 相较于前面背诵的诸多内容&#xff0c;可能现在的部分就需要多多的练习了&#xff0c;难度也慢慢提升。 那就大家一起慢慢努力吧&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 目录 一、Linux目录结构 &#xff08;一&#xff09;Window…

2024年AI辅助研发趋势深度分析

2024 年 AI 辅助研发趋势 随着人工智能技术的持续发展与突破&#xff0c;2024年AI辅助研发正成为科技界和工业界瞩目的焦点。从医药研发到汽车设计&#xff0c;从软件开发到材料科学&#xff0c;AI正逐渐渗透到研发的各个环节&#xff0c;变革着传统的研发模式。在这一背景下&a…

果蔬作物疾病防治系统|基于Springboot的果蔬作物疾病防治系统设计与实现(源码+数据库+文档)

果蔬作物疾病防治系统目录 目录 基于Springboot的果蔬作物疾病防治系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、果蔬百科列表 2、公告信息管理 3、公告类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推…

最简单的基于 FFmpeg 的内存读写的例子:内存转码器

最简单的基于 FFmpeg 的内存读写的例子&#xff1a;内存转码器 最简单的基于 FFmpeg 的内存读写的例子&#xff1a;内存转码器正文源程序结果工程文件下载参考链接 最简单的基于 FFmpeg 的内存读写的例子&#xff1a;内存转码器 参考雷霄骅博士的文章&#xff0c;链接&#xf…

利用华为CodeArts持续交付项目演示流程

软件开发生产线&#xff08;CodeArts&#xff09;是面向开发者提供的一站式云端平台&#xff0c;即开即用&#xff0c;随时随地在云端交付软件全生命周期&#xff0c;覆盖需求下发、代码提交、代码检查、代码编译、验证、部署、发布&#xff0c;打通软件交付的完整路径&#xf…

C语言:通讯录(纯代码)

目录 背景&#xff1a;VS2019编译器 创建文件&#xff1a; contact.h代码&#xff1a; test.c代码&#xff1a; contact.c代码&#xff1a; 背景&#xff1a;VS2019编译器 创建文件&#xff1a; contact.h代码&#xff1a; #pragma once#include <string.h> #includ…