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

【MySQL进阶之路】oracle 9i的经典测试雇员信息表案例——多表查询

目录

引言

笛卡尔积

自连接

子查询

单行子查询

多行子查询

多列子查询

在from子句中使用子查询

合并查询


个人主页:东洛的克莱斯韦克-CSDN博客

引言

在数据库的实际开发中,多表查询是一项非常基础且重要的技能。它允许你将来自不同表的数据结合起来,以满足复杂的业务需求。多表查询主要通过几种方式实现,包括但不限于连接(JOIN)、子查询(Subquery)、联合(UNION)等

本文会配合案例,深入探讨多表查询

准备工作,创建一个雇员信息表(来自oracle 9i的经典测试表) EMP员工表 DEPT部门表 SALGRADE工资等级表 如何显示每个部门的平均工资和最高工资

员工表emp

部门表dept

工资表salgrade

笛卡尔积

笛卡尔积(Cartesian product)是数学和数据库理论中的一个重要概念,尤其是在关系数据库管理系统(RDBMS)中。当两个或多个表进行连接(join)但没有指定任何连接条件时,就会生成笛卡尔积。

在数据库术语中,如果表A有M行,表B有N行,那么A和B的笛卡尔积将是一个包含M*N行的新表,这个新表中的每一行都是通过将A中的每一行与B中的每一行进行组合而得到的。结果表中的列是原始表列的简单并集。

显示部门号为10的部门名,员工名和工资

select ename, sal,dname from EMP, DEPT where EMP.deptno=DEPT.deptno and
DEPT.deptno = 10;

显示各个员工的姓名,工资,及工资级别

select ename, sal, grade from EMP, SALGRADE where EMP.sal between losal and
hisal;

自连接

将一张表看作两个或多个逻辑表,并通过它们之间的共同字段进行连接。这种操作允许我们在同一张表内比较或组合不同行的数据。

如果不指定连接条件,自连接将生成一个笛卡尔积,即表中每一行与其他所有行的组合。这通常不是我们想要的结果,因为它会产生大量无关的数据。

显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号--empno)

select leader.empno,leader.ename from emp leader, emp worker where
leader.empno = worker.mgr and worker.ename='FORD';

子查询

子查询(Subquery)是嵌入在其他SQL语句(通常是SELECT、INSERT、UPDATE或DELETE语句)中的SELECT语句。这种查询允许我们将一个查询的结果用作另一个查询的条件或数据源。子查询也被称为嵌套查询或内部查询,因为它们被嵌入在另一个查询(外部查询)中。

单行子查询

显示SMITH同一部门的员工

select * from EMP WHERE deptno = (select deptno from EMP where
ename='smith');

多行子查询

in关键字;查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自 己的

select ename,job,sal,deptno from emp where job in (select distinct job from
emp where deptno=10) and deptno<>10;

all关键字;显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

select ename, sal, deptno from EMP where sal > all(select sal from EMP where
deptno=30);

any关键字;显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门 的员工)

select ename, sal, deptno from EMP where sal > any(select sal from EMP where
deptno=30);

多列子查询

查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人

select ename from EMP where (deptno, job)=(select deptno, job from EMP
where ename='SMITH') and ename <> 'SMITH';

在from子句中使用子查询

子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。

显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资

select ename, deptno, sal, format(asal,2) from EMP,
(select avg(sal) asal, deptno dt from EMP group by deptno) tmp
where EMP.sal > tmp.asal and EMP.deptno=tmp.dt;

查找每个部门工资最高的人的姓名、工资、部门、最高工资

select EMP.ename, EMP.sal, EMP.deptno, ms from EMP,
(select max(sal) ms, deptno from EMP group by deptno) tmp
where EMP.deptno=tmp.deptno and EMP.sal=tmp.ms;

显示每个部门的信息(部门名,编号,地址)和人员数量

select DEPT.deptno, dname, mycnt, loc from DEPT,
(select count(*) mycnt, deptno from EMP group by deptno) tmp
where DEPT.deptno=tmp.deptno;

合并查询

在SQL中,当我们需要合并多个SELECT语句的执行结果时,可以使用集合操作符UNIONUNION ALL。这两个操作符都允许我们将两个或多个SELECT语句的结果集合并成一个结果集,但它们之间有一些关键的区别。

UNION操作符用于合并两个或多个SELECT语句的结果集,并自动去除重复的行。这意呀着,如果两个结果集中有完全相同的行(基于所有选择的列的值),那么这些行在最终的结果集中只会出现一次。

UNION不同,UNION ALL操作符用于合并两个或多个SELECT语句的结果集,但它不会去除重复的行。如果两个结果集中有相同的行,那么这些行在最终的结果集中都会出现。

将工资大于2500或职位是MANAGER的人找出来

select ename, sal, job from EMP where sal>2500 unionselect ename, sal, job from EMP where job='MANAGER';

将工资大于25000或职位是MANAGER的人找出来

select ename, sal, job from EMP where sal>2500 union allselect ename, sal, job from EMP where job='MANAGER';

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • WPF Mvvm
  • MySQL集群+Keepalived实现高可用部署
  • Hooks 「 useImperativeHandle 」子组件向父组件暴露方法
  • Dockerfile常用指令详解
  • 在NVIDIA jetson中使用jetson-ffmpeg调用硬件编解码加速处理
  • TCP的连接建立及报文段首部格式
  • ESP32-IDF 在 Ubuntu 下的配置
  • 【xilinx】Vivado 成功运行Ubuntu需要哪些 文件?
  • 微软RDL远程代码执行超高危漏洞(CVE-2024-38077)漏洞检测排查方式
  • JavaSE基础(12)——文件、递归、IO流
  • 未知单播泛洪原因
  • 日志审计Graylog 使用教程-kafka收取消息
  • 【数据结构】一篇讲清楚什么是堆? 带图食用超详细~
  • go-zero接入skywalking链路追踪
  • C语言高手参考手册:函数进阶技巧
  • 【翻译】babel对TC39装饰器草案的实现
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • android图片蒙层
  • Apache的基本使用
  • ES6系列(二)变量的解构赋值
  • github从入门到放弃(1)
  • JavaScript实现分页效果
  • js
  • leetcode386. Lexicographical Numbers
  • php中curl和soap方式请求服务超时问题
  • python3 使用 asyncio 代替线程
  • Python爬虫--- 1.3 BS4库的解析器
  • React-生命周期杂记
  • Spring声明式事务管理之一:五大属性分析
  • 给初学者:JavaScript 中数组操作注意点
  • 关于Flux,Vuex,Redux的思考
  • 关于Java中分层中遇到的一些问题
  • 关于springcloud Gateway中的限流
  • 猴子数据域名防封接口降低小说被封的风险
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​一些不规范的GTID使用场景
  • ‌移动管家手机智能控制汽车系统
  • #if和#ifdef区别
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (HAL库版)freeRTOS移植STMF103
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (备忘)Java Map 遍历
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (三)Kafka离线安装 - ZooKeeper开机自启