Oracle入门笔记(六)——多表查询

2023-11-03

1.多表查询概览

     由于数据表的设计特点,可能我们查询数据的时候数据来源于不同的数据表,这个时候就需要用到多表查询。首选需要明白以下概念:
(1)左连接、右连接、内连接、外连接;
(2)笛卡尔积:其实就是数学的自由组合。将表A(5条数据)和表B(6条数据)自由组合得到表C(一共有:5*6=30条数据)。
对于各种连接,有这么一张经典的图(具体的可以参考数据库左连接、右连接、内连接、全连接笔记):
在这里插入图片描述
补充说明:对于笛卡尔积,一般情况下由于实际的需要,笛卡尔积的出现往往不是我们需要的数据,因此一般不推荐笛卡尔积的出现和使用。本质上就是两张数据表在表间连接的时候没有给出连接条件导致的。

2.基础多表查询

(1)表间查询,举例:在HR用户靶场下,想要获取雇员的工作部门,必定需要设计多表查询:
在这里插入图片描述
查询方式如下(本质上是基于where查询):
在这里插入图片描述
(2)自表查询,通常处理方式是,采用重命名的形式将一张表改为多张表,然后使用表间查询,举例如下:
在这里插入图片描述
在这里插入图片描述

3.SQL99标准的外连接

(1)左外连接(left outer join),比如查询雇员的部门(包括没有被分配部门的雇员):
在这里插入图片描述
(2)右外连接(right outer join),查询部门中的雇员(包括那些没有雇员的部门):
在这里插入图片描述
(3)全外连接(full outer join),查找部门中的雇员(即包含没有雇员的部门又包含没有部门的雇员):
在这里插入图片描述
说明:左外和右外连接能够通过切换表在连接时候的先后顺序改变两表的连接关系,比如在A left outer join B,等价于 B right outer join A。其实这种连接也可以使用原始的select来完成,只是当连接的表数量多的话不太方便了,像这种左连接其实可以改成等值连接加上左侧目标匹配字段非空+右侧目标匹配字段为空的情况。

4.Oracle自定义的外连接

     Oracle中可以使用(+)来更简洁的使用表间的连接,有(+)的一侧不显示剩余数据,而另一侧显示剩余数据,举例如下:
在这里插入图片描述
注意:这个是Oracle的私有规则,并且只针对左连接和右连接,了解即可。

5.SQL99标准的交叉连接

     cross join,直接生成笛卡尔积,不推荐使用,了解即可:
在这里插入图片描述

6.SQL99标准的自然连接

     natual join,这个也比较好理解,就是直接寻找需要连接的两个表A和B中的相同字段,如果两个表中的字段和类型相同,那么会使用两个表中的字段进行等值连接,如果字段相同但是类型不同会直接报错。在我们设计数据库的时候也可以考虑将不同表中的相同字段的类型统一化,方便直接使用自然连接。使用举例如下:
在这里插入图片描述
     但是有些时候,两个表中的可能有多个字段相同,或者多个相同字段中有某一个字段不是相同类型,,但是又想使用自然连接,我们只想要指定字段来做自然连接,这个时候Using关键字就派上用场了。Using关键字用来指定两个数据表在连接的时候使用的字段,如果其中某个表不含有using中指定的字段,会直接报错,使用举例如下:
在这里插入图片描述
格式:A join B using(A和B中共有的字段名1,A和B中共有的字段名2...)

7.SQL99标准的内连接

     说明一点,使用内连接在查询的效率上和使用原生的查询方式一样,并没有什么优势,比如,如果需要查询雇员的工作部门名和工作城市名。如果使用原生:
在这里插入图片描述
如果使用inner join的话,写法如下:
在这里插入图片描述

8.子查询

    子查询又被称为内查询或者嵌套查询。子查询的使用方式如下(查找薪水大于某指定职员的职员信息):
在这里插入图片描述
说明:子查询还有很多,但是比较常用的是和分组查询一起使用,具体的分组查询在下一篇文章中介绍。

9.union和intersect关键字

    union关键字用来连接两个查询的结果,需要注意的是这个union关键字其实有点像对||运算符的一种补充,使用方式如下:举例:查询职员薪资高于15000和低于3000的职员信息:
在这里插入图片描述
说明:这个union在使用的时候必须保证两个union的连接对象中的字段数量、名称和属性均一致,否则直接报错。并且union能够自己排除重复项,union all则不会自动排除重复项。举例,将薪资大于15000和17000的连接在一起:
在这里插入图片描述
    intersect关键字,联想上面的union all的重复项,这个intersect关键字就是直接取交集,拿到这些重复项:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle入门笔记(六)——多表查询 的相关文章

  • Oracle 事务在 C++ 和 Java 之间的传播

    我们有一个现有的 C 应用程序 我们将逐步将其替换为新的基于 Java 的系统 在我们用 Java 完全重新实现所有内容之前 我们期望 C 和 Java 必须相互通信 RMI SOAP 消息传递等 我们尚未决定 现在我的经理认为我们需要 J
  • 运行 Sqoop 导入和导出时如何找到最佳映射器数量?

    我正在使用 Sqoop 版本 1 4 2 和 Oracle 数据库 运行 Sqoop 命令时 例如这样 sqoop import fs
  • 从 CTE 插入

    WITH DTL AS SELECT CMPI CODE CMN CDTY MTRL CMI WT FACTOR CMI CNTRCT RATE PL PRESENT PRICE TRM CODE ROUND NVL PRESENT PRI
  • 如何在oracle中获取表作为输出参数

    我正在尝试将 Oracle 过程调用的 out 参数强制转换为对象 它不起作用 因为 据我了解 我需要定义一个映射 它告诉方法如何转换它 如果地图为空或未正确填充 则它默认为 STRUCT 类型的对象 在我的情况下这是错误的 我已经构建了一
  • 如何使用 JSON_TABLE 从 Oracle JSON 列获取键值作为结果集

    我用谷歌搜索了很多 似乎无法找到适合我的简单用例的简单解决方案 我在 Oracle 12C 数据库中有一个 json 列 当然实际上是一个带有 json 约束的 varchar 在该列中我存储了这样的 Map 表示 a 9 0847 b 8
  • 将十六进制转换为字符串

    我想用HEXTORAW 从 ASCII 十六进制代码 30 获取 char 值 ASCII HEX 30 应返回 varchar 0 该怎么做呢 是HEXTORAW 正确的功能 你可以使用utl raw http docs oracle c
  • 如何在 Hibernate 中使用 Oracle 查询提示

    我试图在 Hibernate 中使用 Oracle 提示来调用强制索引 但在 Hibernate 3 6 10 Final 中没有找到任何合适的 API 我以某种方式尝试了 Hibernate 标准中的预测 proList add Proj
  • MySQL中是否有类似Oracle中“level”的函数[重复]

    这个问题在这里已经有答案了 我面临一个场景 如果输入是 10 我想要一个数字序列 1 2 3 10 在甲骨文中levelfunction 提供了该功能 我想知道如何在 MySQL 中执行相同的任务 谢谢 您可以在 mysql 中使用此查询
  • 在 plsql 中立即执行

    如何从这段代码中得到结果 EXECUTE IMMEDIATE SELECT FROM table name through for loop 通常的方法看起来像这样 for items in select from this table l
  • Power BI 中的区分大小写

    我想知道是否可以在 Power BI 中配置区分大小写 我在 Oracle 数据库中有数据 其中主键EXample不同于exampLE 但如果我想将其导入到Power BI中 就不行了 任何想法 目前 我认为最好的选择是在查询编辑器阶段为主
  • 以无法破坏的方式限制表中允许的记录数量

    我们有一个 Web 应用程序 Grails 我们将根据用户数量为其出售许可证 数据库 Oracle 10g 中有一个表保存用户 客户将托管自己的软件和数据库副本 有人可以建议一些策略来限制允许存在于用户表中的记录数量 从而使客户无法合理地破
  • 使用绑定和空值命中 Oracle 索引的最佳查询

    我有一个表 该表在多个列上有一个索引 其中许多列可以为空 CREATE UNIQUE INDEX UX MYTABLE A B C D E ON MYTABLE A B C D E 现在 我在 C 代码中尝试检查该表并精确命中索引 对于每个
  • 创建 SYS_REFCURSOR 并将其作为输入参数从 Java 传递给 Oracle 过程

    我必须与具有 SYS REFCURSOR 作为输入参数的外部 Oracle 过程进行通信 过程 merge objects varchar2 中的 p table name p id array 中 varchar2 SYS REFCURS
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • IO 错误:从读取调用中得到负一

    我的时间和想法都快用完了 我需要使用 Java 和 Oracle 数据库模拟预订整架飞机 我们有一些关于如何执行此操作以及预期内容的说明 但我们的代码始终出现这种非常奇怪和意外的行为 数据库看起来像这样 我们需要有一个不断运行的线程池来模拟
  • 不是 select 中带有 MAX 的单组组函数

    Select sg gameno Max sg Year sg end sg hostcity country olympic name from Summergames s Country co where s country isoco
  • oracle中的区间函数

    Query SELECT INTERVAL 300 month INTERVAL 54 2 year to month INTERVAL 11 12 10 1234567 hour to second FROM DUAL 上述查询的输出是
  • 为什么这个 oracle 批量插入不起作用?

    我正在尝试将一些数据批量插入到 oracle 数据库中 我按照文档中的示例进行操作 this DataBaseAccess new OracleConnection connString var dataAdapter new Oracle
  • Oracle 函数中的加密/解密密码

    由于以前设计不佳的结构 我必须使用的当前数据库将用户密码存储为文本 现在 我正在构建一个必须使用这些密码的前端部分 我当然不想发送未加密的密码 我的想法是编写一个 Oracle 函数来加密和解密文本密码 并在存储过程中使用这些函数来返回加密
  • 如何将 SQL 查询结果导出为 csv 样式格式的字符串,然后将其保存到 Oracle 中的 clob 中?

    我有以下问题 我有一个表 Source Data 实际上 有很多不同的源表 我需要将其中的一些数据导出到 Result Table 中 对于每个源表 我都有一些返回数据的 sql 并且需要将其转换为类似 csv 的字符串 例如 Source

随机推荐

  • Percona-mysql server 5.5升级5.6

    http blog csdn net lqx0405 article details 50162557 系统环境 操作系统 CentOS 6 5 64 MySQL Percona server 5 5 5 6 一 升级的目的 为什么MySQ
  • Qt学习:Qt优雅地结束线程

    一 Qt线程 如果一个线程运行完成 就会结束 可很多情况并非这么简单 由于某种特殊原因 当线程还未执行完时 我们就想中止它 不恰当的中止往往会引起一些未知错误 比如 当关闭主界面的时候 很有可能次线程正在运行 这时 就会出现如下提示 QTh
  • noip2007 奖学金 (排序)

    A1159 奖学金 时间限制 1 0s 内存限制 256 0MB 总提交次数 797 AC次数 339 平均分 60 95 将本题分享到 查看未格式化的试题 提交 试题讨论 试题来源 NOIP2007 普及组 问题描述 某小学最近得到了一笔
  • 800-C++ throw(抛出异常)详解

    C throw 抛出异常 详解 抛出 Throw gt 检测 Try gt 捕获 Catch 异常必须显式地抛出 才能被检测和捕获到 如果没有显式的抛出 即使有异常也检测不到 在 C 中 我们使用 throw 关键字来显式地抛出异常 它的用
  • Office Online Server预览不了文件 TLS

    最近Office Online Server预览不了文件 服务器上报 从远程终点接收到一个严重警告 TLS 协议所定义的严重警告代码为 70 错误 经过排查发现TLS 1 1 和 TLS 1 2没有开启 将其开启后文档就能正常访问了 开启T
  • 如何利用R语言怎样处理百分数

    楼主在工作时 遇到一个问题 网上析取的资料中有很多百分数 但是R读取的时候把它默认为是因子类型了 用as numeric 函数也没有用 经过查找资料发现几个将百分数化成小数的小技巧 和大家分享一下 其基本思想就是把百分数按照字符处理 首先将
  • 基于亚博K210开发板——LED(RGB)点灯

    文章目录 开发板 实验目的 实验准备 查看原理图 软件对应SDK GPIO配置函数 什么是 FPIOA 呢 实验代码 LED RGB驱动 主程序控制 实验结果 开发板 实验目的 实现开发板上LED0 LED1以及RGB灯的点亮 实验准备 查
  • 用ISO C++实现自己的信号槽(Qt另类学习)

    有网友抱怨 哪个大牛能帮帮我 讲解一下信号槽机制的底层实现 不要那种源码的解析 只要清楚的讲讲是怎么发送信号 怎么去选择相应的槽 再做出反应 也就是类似于一个信号槽的相应流程 求解啊 看了源码 真的是一头雾水 撞墙的心都有了 本文使用 IS
  • 探索Vue组件通信的秘密:打破隔阂,实现数据共享

    一 Vue组件通信 每个组件都有自己的数据 提供在data中 每个组件的数据是独立的 组件数据无法互相直接访问 合理的 但是如果需要跨组件访问数据 就需要用到组件通信 要是有一万个商品 就要写一万个吗 函数调用 看起来调用时用一个函数 执行
  • js new Promise的基本用法

    function easyShare config return new Promise resolve reject gt try if config true console log 11 config setTimeout gt re
  • 2021秋招复习——CSS

    目录 文章目录 选择器 float布局 position定位 flex布局 水平垂直居中 水平居中 行内元素 块级元素 垂直居中 行内元素 块级元素 BFC 盒模型 CSS3动画 回流 重排 和重绘 响应式布局 选择器 选择器主要包括 选择
  • matlab求解正负因子目标规划,matlab学习系列27多目标规划.docx

    matlab学习系列27多目标规划 docx 27多目标规划一 线性规划的局限性1线性规划要求所求解问题必须满足全部的约束 而实际问题中并非所有约束都需要严格的满足 2线性规划只能处理单目标的优化问题 从而对一些次目标只能转化为约束处理 而
  • AngularJS 截取字符串

    In HTML Template Binding 在HTML的模板绑定中 limitTo expression limitTo limit begin In JavaScript filter limitTo input limit beg
  • 计算机开机键盘屏幕无反应,电脑开机后键盘显示器无反应怎么解决

    电脑开机后主机灯正常 有风扇和机器声音 但是键盘显示器都没有反应 这是怎么回事呢 电脑开机后键盘显示器无反应怎么解决呢 下面学习啦小编就为大家带来了解决电脑开机后键盘显示器无反应的方法 电脑开机后键盘显示器无反应解决方法一 开机状态下把鼠标
  • 机器学习(五):高斯朴素贝叶斯(基础篇)

    机器学习 五 高斯朴素贝叶斯 基础篇 在高斯朴素贝叶斯中 每个特征都是连续的 并且都呈高斯分布 高斯分布又称为正态分布 图画出来以后像一个倒挂的钟 以均值为轴对称 如下图所示 GaussianNB 实现了运用于分类的高斯朴素贝叶斯算法 特征
  • SQLyog出现错误代码1045

    直接修改mysql的密码即可
  • Elasticsearch 常见的 8 种错误及最佳实践

    Elasticsearch 社区有大量关于 Elasticsearch 错误和异常的问题 深挖这些错误背后的原因 把常见的错误积累为自己的实战经验甚至是工具 不仅可以节省我们的开发和运维时间 而且可以帮助确保 Elasticsearch 集
  • matlab批量读入dat数据,并将dat数据转换为tiff格式

    将dat数据 序号1 1500 读入matlab 并将其转换为 png格式 代码参考如下 clear close all num 1500 待读入的dat数量 addpath K 科目2 2 train dat dat 文件夹 cd K 科
  • Nginx 使用---拒绝指定IP访问

    一 问题描述 服务器可能会受到攻击者的恶意访问 攻击者IP会不断的猜测路径 上传文件 木马 或者进行短信消耗 或者破解密码 等等行为 我们要做的是 对这些恶意的访问IP进行拦截 二 Nginx的日志格式 因为首先一定是要查看日志的 所以首先
  • Oracle入门笔记(六)——多表查询

    多表查询 1 多表查询概览 2 基础多表查询 3 SQL99标准的外连接 4 Oracle自定义的外连接 5 SQL99标准的交叉连接 6 SQL99标准的自然连接 7 SQL99标准的内连接 8 子查询 9 union和intersect