Oracle查询入门(五)连表查询

2023-11-05

定义:
表连接查询 : 当要查询的数据来自于多个数据源

现在主要有92语法和99语法
–92语法 select 数据 from 数据源1,数据源2… where 行过滤条件 group by 分组字段1,分组字段2… having 组过滤信息 order by 排序字段1,… desc|asc;

执行流程 : from --> where --> group by --> having --> select --> order by

92语法中表 连接条件定义 在where后面

如果要使用的字段来自于多个数据源中都存在,需要指明限定词|出处

一、92语法

1.1笛卡尔积

--笛卡尔积 : 交叉连接
--查询所有员工的信息以及员工所在部门信息
--数据 : 员工信息*  部门信息*
--来源 : 员工表emp ,部门表 dept
select * from emp,dept;
select emp.*,dept.deptno,dept.dname from emp,dept;
--别名
select e.*,d.deptno,d.dname from emp e,dept d;

1.2等值连接

判断两个数据源中的某个字段值相等或者不相等

–表连接条件 : 过滤通过连表产生的不满足要求的表连接数据
–等值连接 : 判断两个数据源中的某个字段值相等或者不相等
–非等值连接 : 判断区间,判断范围的条件
–92语法中表 连接条件定义 在where后面
–如果要使用的字段来自于多个数据源中都存在,需要指明限定词|出处

--员工名称及部门名称
select ename, dname, e.deptno from emp e, dept d where e.deptno = d.deptno;
--找出30部门的员工名称及部门名称:先关联后过滤
select ename, dname, e.deptno
from emp e, dept d
where e.deptno = d.deptno
and e.deptno = 30;
--记录很多时 :先过滤后关联
-- 数据来源: emp (select * from emp where deptno=30) e , dept(select * from dept
where deptno=30) d
select * from emp where deptno = 30;
select * from dept where deptno = 30;
-- 查询的字段:ename, dname, e.deptno
-- 条件:e.deptno=d.deptno , deptno=30
select ename, dname, e.deptno
from (select * from emp where deptno = 30) e,
(select * from dept where deptno = 30) d
where e.deptno = d.deptno;

1.3非等值连接

非等值连接 : 判断区间,判断范围的条件

--查询员工姓名,工资及等级
--900 属于哪个等级
select grade
from salgrade
where 900 > losal
and 900 < hisal;
select grade from salgrade where 900 between losal and hisal;
--查询员工姓名,工资及等级
-- 数据源: emp e, salgrade s
-- 字段: ename, grade, sal
-- sal between losal and hisal
select ename, grade, sal
from salgrade s, emp e
where sal between losal and hisal;

1.4自连接

特殊的等值连接,一张表作为两个数据源来使用

--找出 存在上级的员工姓名 及上级名称
-- 数据来源: emp e, emp m
-- 字段: e.ename, m.ename
-- 条件: e.mgr=m.empno
select e.ename, m.ename from emp e, emp m where e.mgr = m.empno;

1.5外连接

内连接 : 满足连接条件查询到不满足过滤掉
外连接 : 某一个数据源中的数据不满足连接条件的时候也能显示

左外连接 | 左连接 : from后面主表在左边
右外连接 | 右连接 : from后面主表在右边

主表 : 主表中的数据无论是否满足连接条件都能显示

92语法 : 在连接条件位置,主表的对面添加(+)

select * from emp e1,emp e2 where e1.mgr=e2.empno(+);
select * from emp e1,emp e2 where e1.mgr(+)=e2.empno;
--找出 所有的员工姓名 及上级名称
--找出 所有部门的员工数 及部门名称
select dname, nu
from dept d, (select count(1) nu, deptno from emp group by deptno) e
where d.deptno(+) = e.deptno;

看逗号, 主表在,的左边就叫左外连接主表在,的右边叫右连接

二、99语法

相比较于92语法,99语法更新,功能更完善

  • 叉连接 cross join —>笛卡尔积
  • 自然连接(主外键、同名列) natural join -->等值连接
  • join using连接(同名列) -->等值连接
  • [inner]join on 连接 -->等值连接 非等值 自连接 (解决一切) 关系列必须区分
  • left|right [outer] join on|using -->外连接
  • full join on|using -->全连接 满足直接匹配,不满足 相互补充null ,确保 所有表的记录 都至少出 现一次

2.1交叉连接

select * from emp cross join dept

2.2自然连接

自动做等值连接

select * from emp natural join dept;
--在指定列过程中同名列归共同所有(*除外)
select deptno,e.ename,d.dname from emp e natural join dept d;

2.3using连接

指定同名字段做等值连接

select deptno,e.ename,d.dname from emp e join dept d using(deptno);

2.4on连接

-- natrual 等值
select ename, dname from emp natural join dept where deptno = 30;
--using
select ename, dname from emp join dept using (deptno) where deptno = 30;
--on
select ename, dname
from emp
join dept
on emp.deptno = dept.deptno
where emp.deptno = 30;
--on 非等值连接 、自连接
--部门编号为30的员工名称 工资等级
select ename, grade
from emp e
join salgrade s
on e.sal between s.losal and s.hisal
where deptno = 30;
--部门编号为30的员工名称 上级名称
select e.ename, m.ename mname
from emp e
join emp m
on e.mgr = m.empno
where e.deptno = 30;
--部门编号为30的员工 员工名称 部门名称 工资等级 上级名称
select e.ename, dname, grade, m.ename mname
from emp e
join dept d
on e.deptno = d.deptno
join salgrade s
on e.sal between s.losal and s.hisal
join emp m
on e.mgr = m.empno
where e.deptno = 30;

2.5外连接

--所有部门的 部门名称,员工数
--左外
select dname, n
from dept d
left outer join (select deptno, count(1) n from emp group by deptno) i
on d.deptno = i.deptno;
select dname, n
from dept d
left outer join (select deptno, count(1) n from emp group by deptno) i
using (deptno);
--右外
select dname, n
from (select deptno, count(1) n from emp group by deptno) i
right outer join dept d
on d.deptno = i.deptno;

2.6全连接

select *
from (select 1 no, 'a' "name"
from dual
union
select 2 no, 'b' "name"
from dual) a
full join (select 1 no, 'c' "name"
from dual
union
select 3 no, 'd' "name"
from dual) b
on a.no = b.no;
select *
from (select 1 no, 'a' "name"
from dual
union
select 2 no, 'b' "name"
from dual) a
full join (select 1 no, 'c' "name"
from dual
union
select 3 no, 'd' "name"
from dual) b
using (no);
--主表是员工
select * from emp e1 left join emp e2 on e1.mgr=e2.empno;
select * from emp e1 right join emp e2 on e1.mgr=e2.empno;
select * from emp e1 full join emp e2 on e1.mgr=e2.empno;

主表是员工表:
在这里插入图片描述

主表是上级表:
在这里插入图片描述

使用全连接后包含上面两种表:

在这里插入图片描述

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

Oracle查询入门(五)连表查询 的相关文章

  • 实现软删除的最佳方法是什么?

    目前在做一个项目 我们要对大部分用户 用户角色 实现软删除 我们决定添加一个is deleted 0 数据库中每个表的字段并将其设置为 1 如果特定用户角色点击特定记录上的删除按钮 现在为了将来的维护 每个SELECT查询需要确保它们不包含
  • st_intersects 与 st_overlaps

    这两个查询有什么区别 select a gid sum length b the geom from polygons as a roads as b where st intersects a the geom b the geom gr
  • 如何识别拼写不同的相似单词

    我想从数据库中过滤掉重复的客户名称 一位客户可能有多个同名但拼写差异不大的系统条目 这是一个示例 名为 Brook 的客户可能有 3 个系统条目 有了这个变化 布鲁克 贝尔塔 布鲁克 贝尔塔 比鲁克 贝尔塔 假设我们将此名称放入一个数据库列
  • 删除数据库中的行后如何重新排序ID

    我正在使用 C 来制作具有 sql 数据库的程序 在数据库中我有一个名为Workers 它有一个自动增量和主键ID column 当我删除一条记录时 ID 之间会出现间隙 删除记录后如何重新排序 ID UPDATE 我要做的就是找到记录后将
  • 从 Getdate() 获取时间

    我想采取Getdate 结果 例如 2011 10 05 11 26 55 000 into 11 26 55 AM 我看过其他地方并发现 Select RIGHT CONVERT VARCHAR GETDATE 100 7 这给了我 11
  • SQL 约束以防止根据列的先前值更新列

    是否可以使用检查约束 或其他一些技术 来防止在更新记录时设置与其先前值相矛盾的值 一个例子是 NULL 时间戳 表明发生了某些事情 例如 file exported 一旦文件被导出并且具有非 NULL 值 就不应再将其设置为 NULL 另一
  • 循环预定义值

    有没有办法在 oracle 中执行 for every 如下所示 begin for VAR in 1 2 5 loop dbms output put line The value VAR end loop end 我知道你可以这样做 b
  • Spark SQL 中的 SQL LIKE

    我正在尝试使用 LIKE 条件在 Spark SQL 中实现联接 我正在执行连接的行看起来像这样 称为 修订 Table A 8NXDPVAE Table B 4 8 NXD V 在 SQL Server 上执行联接 A revision
  • 快速将列的副本添加到 MySQL 表

    我需要一种快速的方法来复制表中的 DATETIME 列并为其指定一个新名称 我的表中有一个名为 myDate 的列 名为 myResults 我需要一个查询来在名为 newDate 的表中创建一个新列 该列的数据与 myDate 列完全相同
  • 如何通过SQL查询检查是否有JSON函数?

    有SQL 2016 中的 JSON 函数 https learn microsoft com en us sql t sql functions json functions transact sql例如 JSON VALUE JSON Q
  • 是否可以引用同一个表中的不同列?

    如果博客有一个 类别 表 如下所示 CREATE TABLE categories id INTEGER PRIMARY KEY AUTO INCREMENT parent id INTEGER NOT NULL name VARCHAR
  • SELECT NULL、*、NULL、NULL 中令人困惑的 SQL 错误

    的背景我试图解决第四个现实任务 https www hackthissite org playlevel 4 在 hackthissite org 中 无法确切地弄清楚我应该在 URL 中注入什么 SQL 来检索电子邮件列表 浪费了几个小时
  • 如何从子查询 SQLite 接收两个值

    我是一个自学的 SQLite 新手 我有三个表 person pet person pet schema 是 CREATE TABLE person id INTEGER PRIMARY KEY first name TEXT last n
  • 基于多个表的数据更新单个表 SQL Server 2005,2008

    我需要更新表one使用表中的数据two 表一和表二没有任何公共列相关 桌子three与表相关two 例如 表一 reg det 表 reg det id reg id results 101 11 344 表二 临时表 venue resu
  • 如何通过代码确定Oracle数据类型的字符串值?

    I use DBMS SQL DESCRIBE COLUMNS过程来确定 SELECT 查询的结果集中的列使用什么数据类型 但不幸的是这样我只能得到Oracle数据类型的代码 record col type 1 8 12 等 所以我想知道
  • 如何获取日期时间字段的 UTC?

    我正在使用 MySQL 5 并且正在尝试将日期时间字段转换为 UTC TIMESTAMP 这是我所拥有的 但它不起作用 并且不确定我是否可以做到这一点 但有人可以告诉我我做错了什么吗 谢谢 我已经尝试过这个 SELECT UTC TIMES
  • Oracle SQL 分析查询 - 类似递归电子表格的运行总计

    我有以下数据 由A值 排序依据MM 月 The B列计算为GREATEST current value of A previous value of B 0 以类似电子表格的方式 我怎样才能计算B使用 SQL 查询 我尝试使用分析函数 但未
  • 在 MySQL 中将值设置为 NULL

    我想要一个值被设置为NULL如果我提交的表单中的文本框中没有输入任何内容 我怎样才能做到这一点 我试过插入 NULL 但这只是添加了这个词NULL进入现场 我不确定我应该为此提供什么代码 我只是编写一个 UPDATE 查询 不要放NULL更
  • MySQL 的 TEXT 类型的 Oracle 等效项

    Oracle 是否有与 MySQL 等效的列类型TEXT type 如果不是 那么通常如何存储较大的文本块 BLOB varchar 32767 如果重要的话 它是通过 PHP 访问 Oracle 10 历史背景是非常受欢迎的 Oracle
  • 使用 ActiveRecord 和 Yii2 记录实际的 SQL 查询?

    我正在这样做 students Student find gt all return this gt render process array students gt students 然后在视图中 foreach students as

随机推荐

  • Android界面-attrs自定义属性

    知识点 1 路径 values attrs xml 2 结构 根标签 下一级declare styleable 子标签为attr 3 arr标签 包含属性 name 该属性名称 format 该属性的值格式 子标签 enum 列举出固定的取
  • M个梨子放N个盘子

    M个梨子放N个盘子 题目描述 Macro非常喜欢吃梨 有一天他得到了ACMICPC组委会送给他的一筐梨子 他比较心疼学生 就打算把梨子分给学生吃 现在他要把M个梨子放到N个盘子里面 我们允许有的盘子为空 你能告诉Macro有多少种分法吗 请
  • 基于ResNet的MSTAR数据集目标分类

    基于ResNet的MSTAR数据集目标分类 文章目录 基于ResNet的MSTAR数据集目标分类 说在前面 1 MSART数据集介绍 2 SAR目标分类网络 3 ResNet代码及训练 4 结尾 附录 代码 说在前面 前两篇文章主要讨论了C
  • [网络安全自学篇] 一 web学习及异或解密

    开始学习杨秀璋老师的网络安全 文章会经过优化 来作为学习打卡的标志 本文为CSDN博主 Eastmount 的原创文章 一 工具 术语 1 网安术语 常见安全网站及论坛 看雪 https bbs pediy com 安全客 https ww
  • Vuejs——(7)过渡(动画)

    本篇资料来于官方文档 http cn vuejs org guide transitions html 本文是在官方文档的基础上 更加细致的说明 代码更多更全 简单来说 更适合新手阅读 二十四 过渡动画 过渡动画的定义 简单来说 就是当模块
  • Junit源码与设计模式欣赏

    先介绍下这篇博文的由来 之前已经对JUnit的使用经行了深入的介绍和演示 参考JUnit学习 一 JUnit学习 二 其中的部分功能是通过分析JUnit源代码找到的 得益于这个过程有幸完整的拜读了JUnit的源码十分赞叹作者代码的精美 一直
  • 2022人机交互-考题复习

    最下面有2022的人机交互考题 简答题 什么是人机交互 Human Computer Interaction HCI 是一门专注于设计 评估和实施供人类使用的交互式计算系统的学科 人类处理机模型 最著名的信息处理模型 Card等 1983
  • 自定义spring security oauth2 /oauth/token以及token失效/过期的返回内容格式

    前言 在整合Spring Security Oauth2的时候 获取token的接口 oauth token的返回内容格式为固定的 如下图所示 而token过期或者无效的返回参数格式如下图所示 实际在我们的项目中有时候会要求自定义返回内容格
  • Python-Regression

    本文归纳整理了线性回归 LinearRegression 岭回归 Ridge Lasso回归 Lasso 弹性网 ElasticNet K近邻 SVM等10多种机器学习模块sklearn中回归算法调用及实现过程 有需要的可以参考一下 1 加
  • postman请求传参为Boolean布尔值

    今天使用postman调用接口时 传参为Boolean时遇到了问题 使用传输方式 flag true key bonus gray secret 方法 public String markSwitch Boolean flag String
  • uboot环境变量与内核MTD分区关系

    uboot 与系统内核中MTD分区的关系 http www cnblogs com lidabo p 4774314 html 分区只是内核的概念 就是说A B地址放内核 C D地址放文件系统 也就是规定哪个地址区间放内核或者文件系统 等等
  • element 省市区三级联动

    https github com Plortinus element china area data github源码地址如下
  • [译] APT分析报告:08.漏洞利用图谱–通过查找作者的指纹来寻找漏洞

    这是作者新开的一个专栏 主要翻译国外知名安全厂商的APT报告 了解它们的安全技术 学习它们溯源APT组织和恶意代码分析的方法 希望对您有所帮助 当然 由于作者英语有限 会借助机翻进行校验 还请包涵 前文分享了APT组织拉撒路 Lazarus
  • docker安装kafka

    一 概述 Kafka是由Apache基金会开发的分布式流处理平台 采用发布 订阅模式 支持高吞吐量 低延迟的数据传输 主要用于处理实时数据管道 数据存储和数据分析等大数据应用场景 Kafka采用高效的数据压缩算法 可以在集群中存储大量的数据
  • 【网络】udp_socket编程

    目录 1 认识端口号 1 1 理解端口号和进程ID 1 2 理解源端口号和目的端口号 2 认识TCP协议 3 认识UDP协议 4 网络字节序 5 socket编程接口 5 1socket常见API 5 2sockaddr结构 sockadd
  • Java业务开发常见错误100例总结

    最近在极客时间上看了 Java业务开发常见错误100例 收获还是很大 我个人是很认真地刷了两遍 并花了二十来个晚上认真整理了一份脑图包括大纲和每个知识点的详细笔记 虽然Github上有原创作者整理的版本 效果如下 全部内容如下 自己整理一遍
  • linux(RedHat)启动无法进入图形界面,出现灰色屏幕。

    问题描述 安装完某些软件如DB2 Oracle等 可能出现启动系统 检查完各种硬件设备 但是没有出现登陆界面 出现的 是灰色屏幕 解决过程 初步猜测是无法启动图形界面 进一步论证的方法是在启动时 按下entre键 选择你按装的或者是要更改的
  • JavaScript实现人民币大小写转换

    当使用支票或者签署合同时 需要用到大写人民币 常用的中文大写包括零 壹 贰 叁 肆 伍 陆 柒 捌 玖 拾 佰 仟 万 亿 本文介绍下如何使用JavaScript实现将阿拉伯数字的人民币转换成大写 工具地址 人民币大小写转换工具 人民币大小
  • uni-app自定义配置安卓模拟器 - MuMu模拟器

    第一步 下载MuMu模拟器 下载地址 http mumu 163 com 第二步 配置模拟器端口以及abd路径 该路径在HBuilder安装目录中 然后继续打开你的HBuilder编辑器 运行 运行到手机或模拟器 安卓模拟器端口配置 第三步
  • Oracle查询入门(五)连表查询

    定义 表连接查询 当要查询的数据来自于多个数据源 现在主要有92语法和99语法 92语法 select 数据 from 数据源1 数据源2 where 行过滤条件 group by 分组字段1 分组字段2 having 组过滤信息 orde