Oracle 多表查询

关联查询

  • 一、sql:1992语法的连接
    • 笛卡尔积
    • 等值连接
    • 非等值连接
    • 自连接
    • 外连接
  • 二、sql:1999语法的连接
    • 交叉连接
    • 自然连接
    • USING创建连接
    • ON创建连接
    • 左外连接
    • 右外连接
    • FULL OUTER JOIN
    • INNER JOIN
  • 三、子查询
    • 子查询的种类
      • 单行子查询
      • 多行子查询
    • 在From字句中使用子查询
    • 练习
  • 四、行转列

一、sql:1992语法的连接

  • 语法规则
    SELECT tables1.column,tables2.column
    FROM tables1,tables2
    WHERE tables1.column1 = tables2.column2;
  • 连接的类型

等值连接:Equi join
非等值连接:Non-equi join
外连接:Outer join
自连接:Self join

注意:
1、在where子句中写入连接条件。
2、当多个表中有重名列时,必须在列的名字前加入表名作为前缀。

92语法: 数据来自于多张表。
注意: 明确引用同名的列,必须使用表名或者别名区分。

  1. 笛卡尔积
    select 字段列表 from 表1,表2,表3…
  2. 等值连接:去关系列相同的记录
    select 字段列表 from 表1,表2,表3… where 表1.列 = 表2.列 and 表1.列 = 表3.列;
  3. 非等值连接:取关系列不同的记录 != > < >= <= between and
    select 字段列表 from 表1,表2,表3… where 表1.列 != 表2.列 and 表1.列 != 表3.列;
  4. 自连接:(特殊的等值连接)列来自于同一张表,不同角度看待表
    select 字段列表 from 表1 e,表1 m where e.列1 = m.列2;
  5. 外连接:在等值的基础上,确保一张表(主表)的记录都存在从表满足则匹配,不满足补充null。
    (1)左外:主表在左边
    (2)右外:主表在右边

笛卡尔积

笛卡尔积: 当关联多张表,但是不指定连接条件的时候,会进行笛卡尔积,关联后的总记录条数为M * N,一般不要使用。
select * from emp e,dept d;
在这里插入图片描述

等值连接

等值连接: 两个表中包含相同的列名。

  • 语法规则
    SELECT table1.column,table2.column
    FROM table1,table2
    WHERE table1.column1 = table2.column2;
  • 笛卡尔积:表*表
  • 主外键
    1、在外键表中的映射字段称为外键 Foreign key
    2、在主键表中的唯一字段称为主键 Primary key

例: 查询雇员的名称和部门的名称
select ename,dname from emp,dept where emp.deptno = dept.deptno;
在这里插入图片描述

非等值连接

非等值连接: 两个表中没有相同的列名,但是某一个列在另一张表的列的范围之中;<,>,<=,>=,!=,between,and连接时称为非等值连接。

  • 语法规则
    SELECT table1.column,table2.column
    FROM table1,table2
    WHERE table1.column1 != table2.column2;

**例:**查询雇员名称以及自己的薪水等级
select e.ename,e.sal,sg.grade from emp e,salgrade sg where e.sal between sg.losal and sg.hisal;
在这里插入图片描述

自连接

自连接: 将一张表1当成不同的表来看待,自己关联自己。
**例:**将雇员和他经理的名称查出来。
select e.ename,m.ename from emp e,emp m where e.mgr = m.empno;
在这里插入图片描述

外连接

外连接: 在等值的基础上,确保一张表(主表)的记录都存在从表满足则匹配,不满足补充null。
例: 需要将雇员表中的所有数据都进行显示。
分析:利用等值连接的话会把关联到的数据显示,没有关联到的数据不会显示,此时需要外连接。
select * from emp e,dept d where e.deptno = d.deptno; --等值连接
在这里插入图片描述
select * from emp e,dept d where e.deptno = d.deptno(+); --左外连接
在这里插入图片描述
select * from emp e,dept d where e.deptno(+) = d.deptno; --右外连接
在这里插入图片描述
我们学习完92语法可以明显发现92的表连接语法的问题,在92语法中,多张表的连接条件会放在where子句中,同时where需要对表进行过滤,因此,相当于将过滤条件和连接条件揉到一起,太乱了,因此出现了99语法。

二、sql:1999语法的连接

SQL1999修正了上述的问题,吧连接条件,过滤条件分开来,包括以下新的TABLE JOIN句法机构:

  1. CROSS JOIN
  2. NATURAL JOIN
  3. USING子句
  4. ON子句
  5. LEFT OUTER JOIN
  6. RIGHT OUTER JOIN
  7. FULL OUTER JOIN
  8. INNER JOIN

交叉连接

CROSS JOIN: 等同于92语法中的笛卡尔积。
例: select * from emp cross join dept;
在这里插入图片描述

自然连接

NATURAL JOIN: 相当于是等值连接,但是注意,不需要写连接条件,会从两张表中找到相同的列做连接,当两张表中不具有相同的列名的时候,会进行笛卡尔积操作,自然连接跟92语法的自连接没有任何关系。
例:
select * from emp e natural join dept d;
在这里插入图片描述
select * from emp e natural join salgrade sg;
在这里插入图片描述
注意: 自然连接的结果不保留重复的属性。

USING创建连接

USING子句: 可以使用using作为连接条件。
例:
select deptno from emp e join dept d using(deptno);
在这里插入图片描述
select e.deptno,d.deptno from emp e join dept d on e.deptno = d.deptno;
在这里插入图片描述

ON创建连接

ON子句: 可以添加任意的连接条件。

1、自然连接的条件是基于表中所有同名列的等值连接。
2、为了设置任意的连接条件或者指定连接的列,需要使用ON子句。
3、连接条件与其它的查询条件分开书写。
4、使用ON子句使查询语句更容易理解。

例:
相当于92语法中的等值连接
select * from emp e join dept d on e.deptno = d.deptno;在这里插入图片描述
相当于92语法中的非等值连接
select * from emp e join salgrade sg on e.sal between sg.losal and sg.hisal;
在这里插入图片描述

左外连接

LEFT OUTER JOIN: 会把左表中的全部数据正常显示,右表没有对应数据直接显示空即可。
例: select * from emp e left outer join dept d on e.deptno = d.deptno;
在这里插入图片描述

右外连接

RIGHT OUTER JOIN: 会把右表中的全部数据正常显示,左表中没有对应的记录的话显示空即可。
例: select * from emp e right outer join dept d on e.deptno = d.deptno;
在这里插入图片描述

FULL OUTER JOIN

FULL OUTER JOIN: 相当于左外连接和右外连接的合集。
例: select * from emp e full outer join dept d on e.deptno = d.deptno;
在这里插入图片描述

INNER JOIN

INNER JOIN: 两张表的连接查询,只会查询出有匹配记录的数据。
例: select * from emp e inner join dept d on e.deptno = d.deptno;
在这里插入图片描述

三、子查询

概念: SQL允许多层嵌套。子查询,即嵌套在其它查询中的查询。

  • 语法规则
    SELECT select_list
    FROM table
    WHERE expr operator (SELECT select_list FROM table);

理解子查询的关键在于把子查询当作一张表来看待。 外层的语句可以把内嵌的子查询返回的结果当成一张表使用。
1、子查询要用括号括起来。
2、将子查询放在比较运算符的右边。(增强可读性)

子查询的种类

  • 按照子查询返回的记录数,子查询可以分为单行子查询和多行子查询。

在这里插入图片描述

单行子查询

  1. 子查询返回一条记录。
  2. 使用单行记录比较运算符。
OperatorMeaning
=Equal to
>Greater than
>=Greater than or equal to
<Less than
<=Less than or equal to
<>Not equal to

例: 有哪些人的薪水是在整个雇员的平均薪水之上?
1、先求平均薪水
select avg(e.sal) from emp e;
在这里插入图片描述
2、把所有人的薪水与平均薪水比较
select * from emp e where e.sal > (select avg(e.sal) from emp e);
在这里插入图片描述
注意:此处嵌套的子查询在外层查询处理之前执行。

多行子查询

  1. 子查询返回多行行记录。
  2. 使用集合比较运算符。
运算符含义
IN等于列表中的任何值
some将值与子查询返回的任意一个值进行比较
ALL比较子查询返回的每一个值
  • 在多行子查询中使用in
    例: 我们要查在雇员中有哪些人是经理人?
    1、查询所有经理人编号
    select distinct e.mgr from emp e; 在这里插入图片描述
    2、在雇员表中过滤这些编号即可
    select * from emp e where e.empno in (select distinct e.mgr from emp e);
    在这里插入图片描述
  • 在多行子查询中使用some all
    例: 找出部门编号为20的所有员工中收入最高的职员?
    1、找出部门编号为20的所有员工的收入
    select sal from emp where deptno = 20;
    在这里插入图片描述
    2、比较这些员工的工资找出最高工资的职员
    select * from emp where sal >= all(select sal from emp where deptno = 20) and deptno = 20;
    在这里插入图片描述

在From字句中使用子查询

例: 求每个部门平均薪水的等级?
1、先求出部门的平均薪水
select e.deptno,avg(e.sal) from emp e group by e.deptno;
在这里插入图片描述
2、跟薪水登记表做关联,求出平均薪水的等级
select t.deptno, sg.grade from salgrade sg join (select e.deptno, avg(e.sal) vsal from emp e group by e.deptno) t on t.vsal between sg.losal and sg.hisal;
在这里插入图片描述

练习

  • 题1:求平均薪水最高的部门的部门编号
    1、求部门的平均薪水
    select e.deptno,avg(e.sal) from emp e group by e.deptno;
    在这里插入图片描述
    2、求平均薪水最高的部门
    select max(t.vsal) from (select e.deptno, avg(e.sal) vsal from emp e group by e.deptno) t;
    在这里插入图片描述
    3、求部门编号
    select t.deptno from (select e.deptno, avg(e.sal) vsal from emp e group by e.deptno) t where t.vsal = (select max(t.vsal) from (select e.deptno, avg(e.sal) vsal from emp e group by e.deptno) t);
    在这里插入图片描述
  • 题2:求部门平均的薪水等级
    1、求部门每个人的薪水等级
    select e.deptno,sg.grade from emp e join salgrade sg on e.sal between sg.losal and sg.hisal;
    在这里插入图片描述
    2、按照部门求平均薪水等级
    select t.deptno, avg(t.grade) from (select e.deptno, sg.grade from emp e join salgrade sg on e.sal between sg.losal and sg.hisal) t group by t.deptno;
    在这里插入图片描述
  • 题3:求薪水最高的前5名雇员
    select * from (select * from emp order by sal desc) t where rownum <= 5;
    在这里插入图片描述注意:限制输出,limit是mysql中用来做限制输出的,但是oracle中不是;在Oracle中,如果需要使用限制输出和分页的功能的话,必须要使用rownum,但是rownum不能直接使用,需要嵌套使用。
  • 题4:求薪水最高的第6到10名雇员
    select t.,rownum from (select * from emp order by sal desc) t where rownum <= 10;
    在这里插入图片描述
    方式一:select * from (select t.
    , rownum rn from (select * from emp order by sal desc) t where rownum <= 10) t where t.rn > 5 and t.rn <= 10;
    方式二:select * from (select t.*, rownum rn from (select * from emp order by sal desc) t) t where t.rn > 5 and t.rn <= 10;
    在这里插入图片描述
    注意:使用rownum的时候必须要在外层添加嵌套,此时才能将rownum作为其中的一个列,然后在进行限制输出。

四、行转列

例1:
1、建表
create table tmp(rq varchar2(10),shengfu varchar2(5));
insert into tmp values(‘2005-05-09’,‘胜’);
insert into tmp values(‘2005-05-09’,‘胜’);
insert into tmp values(‘2005-05-09’,‘负’);
insert into tmp values(‘2005-05-09’,‘负’);
insert into tmp values(‘2005-05-10’,‘胜’);
insert into tmp values(‘2005-05-10’,‘负’);
insert into tmp values(‘2005-05-10’,‘负’);
在这里插入图片描述
2、要求

日期
2005-05-0922
2005-05-1012

3、解答
select rq,decode(shengfu,‘胜’,1) 胜,decode(shengfu,‘负’,1) 负 from tmp;
在这里插入图片描述
select rq,count(decode(shengfu, ‘胜’, 1)) 胜,count(decode(shengfu, ‘负’, 1)) 负 from tmp group by rq;
在这里插入图片描述
例2:
1、建表
create table STUDENT_SCORE(name VARCHAR2(20),subject VARCHAR2(20),score NUMBER(4,1));
insert into student_score (NAME, SUBJECT, SCORE) values (‘张三’, ‘语文’, 78.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘张三’, ‘数学’, 88.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘张三’, ‘英语’, 98.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘李四’, ‘语文’, 89.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘李四’, ‘数学’, 76.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘李四’, ‘英语’, 90.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘王五’, ‘语文’, 99.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘王五’, ‘数学’, 66.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘王五’, ‘英语’, 91.0);
在这里插入图片描述
2、要求

姓名语文数学英语
张三788898
李四897690
王五996691

至少四种方式解答。
3、解答
方式一:decode
select ss.name,max(decode(ss.subject, ‘语文’, ss.score)) 语文,max(decode(ss.subject, ‘数学’, ss.score)) 数学,max(decode(ss.subject, ‘英语’, ss.score)) 英语 from student_score ss group by ss.name;
在这里插入图片描述
方式二:case when
select ss.name,max(case ss.subject when ‘语文’ then ss.score end) 语文,max(case ss.subject when ‘数学’ then ss.score end) 数学,max(case ss.subject when ‘英语’ then ss.score end) 英语 from student_score ss group by ss.name;
在这里插入图片描述
方式三:join
select ss.name,ss.score 语文 from student_score ss where ss.subject = ‘语文’;
在这里插入图片描述
select ss.name,ss.score 数学 from student_score ss where ss.subject = ‘数学’;
在这里插入图片描述
select ss.name,ss.score 英语 from student_score ss where ss.subject = ‘英语’;
在这里插入图片描述
select ss01.name, ss01.score 语文, ss02.score 数学, ss03.score 英语 from (select ss.name, ss.score from student_score ss where ss.subject = ‘语文’) ss01 join (select ss.name, ss.score from student_score ss where ss.subject = ‘数学’) ss02 on ss01.name = ss02.name join (select ss.name, ss.score from student_score ss where ss.subject = ‘英语’) ss03 on ss01.name = ss03.name;
在这里插入图片描述
方式四:union all
select t.name, sum(t.语文), sum(t.数学), sum(t.英语) from (select ss01.name, ss01.score 语文, 0 数学, 0 英语 from student_score ss01 where ss01.subject = ‘语文’ union all select ss02.name, 0 语文, ss02.score 数学, 0 英语 from student_score ss02 where ss02.subject = ‘数学’ union all select ss03.name, 0 语文, 0 数学, ss03.score 英语 from student_score ss03 where ss03.subject = ‘英语’) t group by t.name;
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

小兴教你做平衡小车-平衡车主板绘制(V4版本 b站课程所使用版本)

文章目录 1 原理图总览2 原理图各模块细致图2.1 2.54mm插针(stm32最小系统扩展接口)2.2 OLED显示2.3 MPU60502.4 TB6612驱动电路2.5 2.54mm排座(stm32最小系统连接接口)2.6 测距模块2.7 蓝牙模块2.8 蜂鸣器模块2.9 电池电压检测电路2.10 M3固定孔2.11 用户小灯模块2.12 电源接口…

在go-zero中使用jwt

gozero使用jwt 两个步骤 获取token验证token 前端获取token 先编写 jwt.api 文件&#xff0c;放在api目录下 syntax "v1"info (title: "type title here"desc: "type desc here"author: "type author here"email: &quo…

无限集中的最小数字

题目链接 无限集中的最小数字 题目描述 注意点 1 < num < 1000 解答思路 由题意得&#xff0c;可以理解为最初集合中有1~1000之间的所有数字&#xff0c;如果集合中存在数字&#xff0c;则添加时不会有任何操作&#xff1b;在移除集合中的元素时&#xff0c;会按顺序…

记录使用极空间NAS通过Docker部署小皮面板(PhpStydy)运行 八图片当面付支付宝接口 PHP项目的遭遇

事件的起因还得从我用八图片的图片加密支付跳转功能&#xff0c;实现打赏金额发案例源码下载链接挣个烟钱的事。八图片的支付接口是PHP web项目的。正好我有个极空间的NAS&#xff0c;搭建到NAS上省去了买主机的费用。 导读 八图片是什么&#xff1f;极空间NAS 部署 PHP网站安装…

Go实现树莓派读取at24c02 eeprom读写数据

步骤 启用i2c 参考 Go实现树莓派读取bh1750光照强度 代码 package mainimport ("fmt""periph.io/x/conn/v3/i2c" )type AT24C02Device struct {dev *i2c.Dev }func NewAT24C02Device(addr uint16, bus i2c.BusCloser) (*AT24C02Device, error) {var (d…

图像融合-下游任务(目标检测、实例分割、深度估计)

下游任务: 采用目标检测、实例分割和深度估计的下游任务来验证图像融合结果质量。 文章目录 下游任务:1.目标检测2.实例分割3.深度估计Update1.目标检测 YOLOv8:https://github.com/ultralytics/ultralytics 步骤内容第一步下载项目到本地第二步安装README中项目相关的环…

LibreNMS简介

目录 1 LibreNMS简单介绍1.1 LibreNMS介绍 2 安装2.1 Ubuntu安装1、安装依赖2、添加 librenms 用户3、下载 LibreNMS4、设置权限5、安装 PHP 依赖项6、设置时区7、配置 MariaDB8、配置 PHP-FPM9、配置 Web 服务器10、启用 lnms 命令11、配置 snmpd12、cron13、启用调度程序14、…

mysql NDBcluster数据库集群介绍、部署及配置

前言: MySQL集群是一个无共享的、分布式节点架构的存储方案,旨在提供容错性和高性能。它由三个主要节点组成:管理节点(MGM)、数据节点和SQL节点。 管理节点(MGM) 定义与用途:管理节点是MySQL Cluster的控制中心,负责管理集群内的其他节点。它提供配置数据,启动和停止…

Flask gevent启动报错UnicodeDecodeError

文章目录 环境代码报错Track解决思路 环境 acondana 24.1.2python 3.7.13 32bitflask 2.2.3gevent 21.8.0 代码 port 7236 logging.basicConfig(levellogging.INFO, # 控制台打印的日志级别filename./logs/app.log, # 将日志写入log_new.log文件中filemodea, # 模式&…

【4】STM32·FreeRTOS·中断管理

目录 一、什么是中断 二、中断优先级分组设置 2.1、中断优先级基本概念 2.2、中断优先级分组 2.3、FreeRTOS中断特点 三、中断相关寄存器 3.1、系统中断优先级配置寄存器 3.2、PendSV和Systick中断优先级的配置 3.3、中断屏蔽寄存器 四、FreeRTOS中断管理实验 一、什…

阿里云服务器在线安装nginx

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《nginx实战》 目录 内容简介 安装步骤 1.root用户登录连接阿里云服务器 2.在usr/local下新建nginx目录 3.安装 1安装下载工具 2下载nginx压缩包 3解压 4安装nginx依赖的库 5编译并安装 6启动nginx 7开启…

ShellCode详解三

直接进入正题。 在完成正式的shellcode代码导出之前&#xff0c;我们先手动的对代码进行导出&#xff0c;以使各位同学更加了解其原理。 手动注入shellcode 1、我们利用DLE工具找到上一节中我们生成的PE文件的代码段位置 上述图片就是我们的代码段位置 2、利用WinHex工具我…

Appium测试之获取appPackage和appActivity

appPackage和appActivity 进行appium自动化测试非常重要的两个参数&#xff0c;我们所测试的APP不同&#xff0c;这两个参数肯定也是不一样的。那如何快速的获取这APP的这两个参数呢&#xff1f;我这里介绍两个方法。 import org.openqa.selenium.remote.DesiredCapabilities;i…

韩国站群服务器在全球网络架构中的重要作用?

韩国站群服务器在全球网络架构中的重要作用? 在全球互联网的蓬勃发展中&#xff0c;站群服务器作为网络架构的核心组成部分之一&#xff0c;扮演着至关重要的角色。韩国站群服务器以其卓越的技术实力、优越的地理位置、稳定的网络基础设施和强大的安全保障能力&#xff0c;成…

docker(二):Centos安装docker

文章目录 1、安装docker2、启动docker3、验证 官方文档&#xff1a;https://docs.docker.com/engine/install/centos/ 1、安装docker 下载依赖包 yum -y install gcc yum -y install gcc-c yum install -y yum-utils设置仓库 yum-config-manager --add-repo http://mirrors…

端到端将重塑智驾?获10亿美金融资,解密英国AI独角兽Wayve

‍作者 |张马也 编辑 |德新 就在前两天&#xff0c;英国AI公司Wayve宣布获得新一轮10.5亿美元融资&#xff0c;投资方为软银、英伟达和现有投资人微软&#xff0c;可以说是顶级豪华阵容。 作为一家英国公司&#xff0c;Wayve这轮融资也创造了英国AI公司有史以来最大的单笔融资…

北斗卫星在农田测量中的广泛应用

北斗卫星在农田测量中的广泛应用 随着科技的不断发展和进步&#xff0c;北斗卫星在农田测量中的应用也越来越广泛。北斗卫星系统是我国自行研制的卫星导航定位系统&#xff0c;具有全球覆盖、高精度和高可靠性的特点&#xff0c;是农田测量领域不可或缺的重要工具。 首先&…

Laravel框架使用图片处理简单教程

PHP图片处理扩展包使用 文中使用的是Laravel框架&#xff0c;更多框架扩展包请点击传送门-》更多框架集成 Intervention Image 是一个开源的 PHP 图像处理和操作 库。它提供了一个更简单也更优雅的方式来创建/编辑/组合图像,并且支持最常见的两个图像处理库 GD Library 和 Im…

静态分析-RIPS-源码解析记录-01

token流扫描重构部分&#xff0c;这一部分主要利用php的token解析api解析出来的token流&#xff0c;对其中的特定token进行删除、替换、对于特定的语法结构进行重构&#xff0c;保持php语法结构上的一致性 解析主要在lib/scanner.php中通过Tokenizer这个类来实现,也就是在main…

机器学习面试篇

如何理解机器学习数据集的概念 数据集是机器学习的基础&#xff0c;它包括了用于训练和测试模型所需的数据。数据集通常以矩阵的形式存在&#xff0c;其中每一行代表一个样本&#xff08;或实例&#xff09;&#xff0c;每一列代表一个特征&#xff08;或属性&#xff09;。…