26.多表查询

1.笛卡尔集

创建俩表:

-- 创建部门表(dept)
use mysql_learn
CREATE TABLE dept (deptno INT PRIMARY KEY,       dname VARCHAR(50) NOT NULL,   loc VARCHAR(50)      
);-- 创建员工表(emp)
CREATE TABLE emp (empno INT PRIMARY KEY,        ename VARCHAR(50) NOT NULL,  job VARCHAR(50),             mgr INT,                       hiredate DATE,                sal DECIMAL(10,2) NOT NULL,   comm DECIMAL(10,2),           deptno INT
);

插入一些示例数据:

-- 向部门表插入数据
INSERT INTO dept (deptno, dname, loc) VALUES
(10, 'ACCOUNTING', 'NEW YORK'),
(20, 'RESEARCH', 'DALLAS'),
(30, 'SALES', 'CHICAGO'),
(40, 'OPERATIONS', 'BOSTON');-- 向员工表插入数据
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES
(7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800.00, NULL, 20),
(7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600.00, 300.00, 30),
(7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250.00, 500.00, 30),
(7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975.00, NULL, 20),
(7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250.00, 1400.00, 30),
(7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850.00, NULL, 30),
(7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450.00, NULL, 10),
(7788, 'SCOTT', 'ANALYST', 7566, '1982-12-09', 3000.00, NULL, 20),
(7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000.00, NULL, 10),
(7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500.00, 0.00, 30),
(7876, 'ADAMS', 'CLERK', 7788, '1983-01-12', 1100.00, NULL, 20),
(7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950.00, NULL, 30),
(7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000.00, NULL, 20),
(7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300.00, NULL, 10);  

看看结果:

部门表,里面有4条记录

雇员表,里面有14条记录

假设现在有个需求:打印某个员工的工资条。

我们有两张表:1️⃣雇员表,2️⃣部门表。

当我们根据前面所学习的知识直接对两个表同时查询时会出现以下情况:

SELECT * from dept,emp

可以看到,我们直接将俩表连起来一起查出来的记录有56条之多。

仔细探查我们会发现,这些结果实际上就是第一个表中的四条记录和第二张表的一条记录进行拼接而成的。也就是4*14=56条记录。这就是笛卡尔集

所以这些直接进行查询获得的信息是有冗余的信息,为了得到真正有意义的信息,我们需要做的就是过滤

2.笛卡尔集的解决

为了过滤出有意义的信息,我们直接在where子句中做即可。

SELECT * from dept,empwhere dept.deptno = emp.deptno

这样我们就解决了笛卡尔集,得到了真正有意义的14条记录。

对sql语句稍作修改,也就可以得到每个员工的工资条了。

SELECT ename as '姓名',job as '工作',sal as '薪水',dname as '部门',deptno as '部门号'from dept,empwhere dept.deptno = emp.deptno

我们会发现这样会报错。

SQL 错误 [1052] [23000]: Column 'deptno' in field list is ambiguous

因为我们进行的是多表查询,deptno这个字段在俩表中同时存在,直接写会有歧义的。

我们对sql再次进行修改:

SELECT ename as '姓名',job as '工作',sal as '薪水',dname as '部门',emp.deptno as '部门号'from dept,empwhere dept.deptno = emp.deptno

得到了我们想要的结果了。

注意:多表查询的条件不能少于表的个数减一,否则就会出现笛卡尔集

3.练习

再创建一个工资等级表。

CREATE TABLE grade_salary (grade INT,losal DECIMAL(10, 2),hisal DECIMAL(10, 2)
);INSERT INTO grade_salary (grade, losal, hisal)
VALUES 
(1, 1000.00, 1200.00),
(2, 1201.00, 2000.00),
(3, 2001.00, 3000.00),
(4, 3001.00, 9999.00),
(5, 3001.00, 9999.00);

(1)显示各个员工的姓名,工资,工资等级

SELECT ename,sal,gradefrom emp,grade_salary

很显然,直接查俩个表会出现笛卡尔集。

我们做一下过滤:可以直观的分析出雇员表emp和工资级别表grade_salary之间的联系就是员工工资在工资级别表中的那一个级别区间,也即员工工资和工资级别区间相对应的记录就是我们要查询的结果。

基于此,可以使用between and 语句来判断。

SELECT ename,sal,gradefrom emp,grade_salary gswhere sal between losal and hisal;

(2)显示员工名字,工资,所在部门名字,并按部门号降序排列

显然我们这次需要查询,emp和dept这两张表,为了防止出现笛卡尔集,做一下过滤,最后用order by做一下排序。

SELECT ename,sal,dnamefrom emp e,dept dwhere e.deptno = d.deptnoorder by d.deptno DESC ;

再看一眼,按部门号降序排序也做好了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习题目(仅供参考)

一、注意力和transformer 一、选择题 注意力机制的核心步骤不包括? A. 计算注意力分布 B. 加权平均输入信息 C. 随机丢弃部分输入 D. 打分函数计算相关性 答案:C(硬性注意力虽随机选择输入,但核心步骤仍为分布计算与加权&#xf…

WebWorker:提升前端性能的多线程利器

简介 在现代Web开发中,随着应用越来越复杂,JavaScript的单线程模型开始显现其局限性。Web Workers的出现为解决这一问题提供了优雅的方案,它允许开发者在后台线程中运行脚本,而不会影响主线程的性能。 Web Workers是HTML5标准的…

milvus教程:collection和scheme

环境配置:可以看上一节 一.数据库使用 连接 Milvus Standalone创建数据库 my_database_1(无额外属性)创建数据库 my_database_2(设置副本数为 3)列出所有数据库查看默认数据库(default)详情修…

14:00开始面试,14:06就出来了,问的问题有点变态。。。

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到6月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…

Electron(01)

Electron Electron是什么 electron可以使用前端技术开发桌面应用,跨平台性,开发一套应用,可以打包到三个平台。 electron结合Chromium(谷歌内核)和 Node.js 和Native Api 当使用 Electron 时,很重要的一…

Kafka 拦截器深度剖析:原理、配置与实践

引言 在构建高可用、可扩展的消息系统时,Kafka以其卓越的性能和稳定性成为众多企业的首选。而Kafka拦截器作为Kafka生态中强大且灵活的功能组件,能够在消息的生产和消费过程中实现自定义逻辑的注入,为消息处理流程带来极大的扩展性和可控性。…

Flutter 与原生技术(Objective-C/Swift,java)的关系

在 iOS 开发中,Flutter 与原生技术(Objective-C/Swift)的关系 一、技术定位与核心差异 Flutter 语言:使用Dart 语言开发,通过 AOT(提前编译)将代码转换为原生 ARM 指令,无需依赖 iOS…

最新期刊影响因子,基本包含全部期刊

原文链接:2024年期刊最新影响因子(IF) 2024年期刊最新影响因子(IF) BioinfoR生信筆記 ,注于分享生物信息学相关知识和R语言绘图教程。

java 设计模式_行为型_14策略模式

14.策略模式 策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。 策略模式把这些算法,都抽取出来,组成一个一个的类,可以任意的替换,大大降低了代码…

【AI Study】第四天,Pandas(9)- 进阶主题

文章概要 本文详细介绍 Pandas 的进阶主题,包括: 自定义函数高级索引数据导出实际应用示例 自定义函数 函数应用 # 基本函数应用 def calculate_bonus(salary, performance):"""计算奖金Args:salary (float): 基本工资performance (…

Boost dlib opencv vs2022 C++ 源码安装集成配置

​在进行人脸检测开发时候出现 E1696: 无法打开源文件 "dlib/image_processing/frontal_face_detector.h 解决方案 1, 下载boost 需要:https://www.boost.org/ 或github git clone --recursive https://gitee.com/luozhonghua/boost.git 记住一定要完整版源码…

rest_framework permission_classes 无效的解决方法

写了一个特别简单的view: csrf_exempt login_required() authentication_classes([TokenAuthentication]) permission_classes([IsAdminUser, IsAuthenticated]) def department_management_view(request):if request.method POST:department_name request.POST.…

Windows 体系对比 + 嵌入式开发全流程拆解

一、操作系统层级对比:Windows 家族 vs Linux 家族 角色Windows 体系Linux 体系本质核心内核Windows NT KernelLinux Kernel操作系统引擎(管理CPU/内存/硬件)完整操作系统Windows 11 Home/ProUbuntu / Debian / CentOS内核 界面 软件 驱动…

C# 实现 gRPC高级通信框架简单实现

1. 前言 gRPC(Google Remote Procedure Call)是一个高性能、开源和通用的RPC框架,由Google主导开发。它支持多种编程语言,并广泛用于构建分布式应用程序和服务。gRPC基于HTTP/2协议,支持双向流、请求-响应和多请求-多…

将项目推到Github

前提条件 需要安装GIT需要注册GitHub账号 步骤 首先我们需要登录我们的GITHUB账号,然后点击新建存储库 然后起一个名字,设置一些私有公开即可 创建完成之后,这里有可以远程推送的命令 后面就直接输出命令即可 之后推送即可 git push orig…

K8S 专栏 —— namespace和Label篇

文章目录 namespace创建namespacenamespace使用默认namespaceLabel添加Label查询Labelnamespace 命名空间是一种用于在 kubernetes 集群中划分资源的虚拟化手段,每个资源都属于一个命名空间,使得多个团队或应用可以在同一个集群中独立运行,避免资源冲突。 创建namespace y…

44.第二阶段x64游戏实战-封包-分析掉落物列表id存放位置

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:43.第二阶段x64游戏实战-封包-代码实现获取包裹物品 之前的内容找到了掉落物的…

汇编语言期末快速过手笔记

一、计算机系统组成 计算机系统组成:由硬件系统和软件系统组成 硬件系统:CPU、存储器、输入/输出设备等物理部件软件系统:操作系统、各种语言、系统软件和应用软件 汇编语言分类 属于低级语言(直接面向硬件)与高级语言…

C++相比于C语言增加了哪些概念?

C相比于C语言增加了哪些概念? 作者将狼才鲸创建日期2025-06-17 CSDN阅读地址:C相比于C语言增加了哪些概念?Gitee源码目录:qemu/demo_代码示例/02_C_Class 目标受众:熟悉C语言,对C完全不了解,但…

HarmonyOS5 分布式测试:断网情况支付场景异常恢复验证

以下是针对HarmonyOS 5分布式事务在断网支付场景下的异常恢复验证全流程方案,综合关键技术与测试策略: 一、核心事务机制验证 ‌两阶段提交(2PC)协议‌ 模拟支付流程中网络中断,验证事务协调者能否正确处理预提交与回滚…