【MySQL数据库 | 第十四篇】多表查询案例

news2024/11/30 10:51:08

目录

前言:

引入背景:

 练习:


 

前言:

在第十三篇我们已经详细的介绍了多表查询的类别以及每一个类别的语法:【MySQL数据库 | 第十三篇】多表查询,今天我们将通过案例来巩固我们对多表查询语法的熟悉度。

引入背景:

demp表:


 demp表:

 salgard表:

 练习:

1.查询员工的姓名,年龄,职位,部门信息(隐式内连接)

select emp.name,emp.age,emp.job,dept.name from emp,dept where dept_id=dept.id;

 运行结果:

 2.查询年龄小于30岁的员工姓名,年龄,职位,部门信息(显示内连接)

select emp.name,emp.age,emp.job,dept.name from emp join dept  on emp.dept_id = dept.id where emp.age<30;

运行结果: 

 3.查询所有员工的部门id,部门名称

select emp.name,emp.dept_id,d.name from emp left join dept d on emp.dept_id = d.id;

运行结果:

 4.查询所有年龄大于40岁的员工,以及其所属的部门的名称,如果员工没有分配部门,也要打印出

select emp.name,emp.dept_id,d.name from emp left join dept d on emp.dept_id = d.id where age>40;

运行结果: 

 注意:

很多人在这里,会把两个条件之间的连接写成and,即:

 此时的结果是:

这是因为:

第一个查询中,条件 age > 40 是被放置在 WHERE 子句中的,它是针对整个查询结果集的筛选,即首先根据 emp 表中的 age 字段筛选出年龄大于40岁的记录,然后将符合条件的结果集再与 dept 表进行左连接。而第二个查询中,条件 age > 40 是在 JOIN 子句中进行指定的,它是在连接两个表时使用的筛选条件(所以我们可以看到age不满足条件的dept_id并没有和把dept重命名为d的d.name进行连接,虽然有部门id,但是不打印部门名称)。

具体来说,第一个查询会返回 emp 表中年龄大于40岁的员工记录,并将这些记录与 dept 表按照 emp 表中的 dept_id 字段进行左连接。因此,如果有一名员工的年龄大于40岁,但其所在部门在 dept 表中不存在,则该员工的部门名称为 NULL。

第二个查询会先将 emp 表与 dept 表左连接,然后筛选出符合条件 age > 40 的记录。因此,该查询的结果集中包括了 emp 表和 dept 表中所有符合连接条件的记录,但是未满足筛选条件的记录并不会包含在结果集中。

总的来说,第一个查询是先筛选再连接,而第二个查询是先连接再筛选。这会对查询结果产生影响,因此,在编写 SQL 查询时,需要根据具体的需求选择合适的查询条件和筛选方式。

 5.查询所有员工的薪资等级

select emp.name,salgrade.grade from emp,salgrade where emp.salary between salgrade.losal and salgrade.hisal;

运行结果: 

 6。查询‘研发部’所有员工的信息以及工资等级

select emp.name,salgrade.grade from emp,salgrade where emp.salary between salgrade.losal and salgrade.hisal and emp.dept_id=(select dept.id from dept  where dept.name='研发部');

 运行结果:

7.查询研发部平均工资

select avg(emp.salary) as '研发部平均工资'from emp,dept where emp.dept_id=dept.id and dept.name='研发部';

运行结果: 

 8.查询工资比‘灭绝’高的员工

select emp.name,emp.salary from emp where salary>(select emp.salary from emp where emp.name='灭绝');

运行结果:

 9.查询比平均薪资高的员工

select emp.name,emp.salary from emp where salary>(select avg(emp.salary) as '研发部平均工资'from emp);

 运行结果:

10.查询低于自己所属部门平均薪资的员工

select * from emp e2 where e2.salary<(select avg(e1.salary)from emp e1 where e1.dept_id=e2.dept_id);

运行结果:

 11.查询所有部门信息,统计员工人数:

select d.id ,d.name,(select count(*) from emp e where e.dept_id = d.id )'人数' from dept d;

运行结果:

这个查询语句中使用了子查询,而且子查询被嵌套在主查询的SELECT语句中,因此可能会对性能产生影响,在部分情况下查询速度较慢。

优化建议:

1. 使用JOIN查询代替子查询

通常情况下,使用JOIN的效率要比使用子查询高。可以使用LEFT JOIN来连接emp表和dept表,然后在结果集中统计每个部门的员工数。

例如,可以使用如下的SQL查询语句来代替原有的子查询:

SELECT d.id, d.name, COUNT(e.emp_id) AS '人数'
FROM dept d
LEFT JOIN emp e ON d.id=e.dept_id
GROUP BY d.id;

这样,可以在一条查询语句中完成所有计算,避免了多次查询的开销,并且通过合理的索引设计和调整,可以进一步提高查询效率。

2. 索引优化

在进行大量的统计查询时,使用合适的索引可以大大提高查询效率。对于此查询,可以在emp表的dept_id列和dept表的id列上分别建立索引,以加速查询。

3. 数据库结构优化

如果查询中使用的表和字段是经常访问的,则可以考虑对其进行垂直拆分优化,将其中的热点数据单独存放到一个表中,并配合索引等优化手段,以提高查询效率。

综上所述,优化查询的方法有很多种,需要针对具体的场景和业务需求进行选择和调整。在实践中,可以使用多种手段,综合优化查询语句的性能,以提高查询效率和减少资源消耗。

总结:

SQL语句的语法繁多,我们要多加练习才可以更高的掌握。

今天的内容到这里就结束了,感谢大家的阅读。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

 

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

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

相关文章

JavaSE笔记(二)重制版

面向过程篇 前面我们已经认识了Java语言的相关特性&#xff0c;并且已经成功配置好了开发环境&#xff0c;从这节课开始&#xff0c;我们就可以正式进入到Java语言的学习当中了。Java语言是一门面向对象的语言&#xff0c;但是在面向对象之前&#xff0c;我们还得先学会如何面…

【IMX6ULL驱动开发学习】05.IMX6ULL驱动开发_编写第一个hello驱动【熬夜肝】

经过以下四个步骤&#xff0c;终于可以开始驱动开发了 01.安装交叉编译环境【附下载地址】 02.IMX6ULL烧写Linux系统 03.设置IMX6ULL开发板与虚拟机在同一网段 04.IMX6ULL开发板与虚拟机互传文件 目录 一、获取内核、编译内核 二、创建vscode工作区&#xff0c;添加内核目录…

《计算机组成原理》期末考试手写笔记——模块五: 并行主存系统(交叉存储器+顺序存储器“带宽”的计算方法)

目录 &#xff08;一&#xff09;知识点总结 &#xff08;二&#xff09;经典考试例题 1.设主存储器容量为256字&#xff0c;字长为32位&#xff0c;模块数m4&#xff0c;分别用顺序方式和交叉方式进行组织。主存储器的存储周期T200ns&#xff0c;数据总线宽度为32位&#x…

EMQ X(2):EMQ X服务端环境搭建与配置

1 安装 EMQ X 目前支持的操作系统: Centos6Centos7OpenSUSE tumbleweedDebian 8Debian 9Debian 10Ubuntu 14.04Ubuntu 16.04Ubuntu 18.04macOS 10.13macOS 10.14macOS 10.15Windows Server 2019 产品部署建议 Linux 服务器&#xff0c;不推荐 Windows 服务器。 安装的方式有…

【Linux】HTTP协议

目录 &#x1f680;前言&#x1f683;HTTP协议 &#x1f684;1、URL网址&#x1f685;2、URL的编码和解码&#x1f687;3、HTTP协议格式&#x1f688;4、HTTP请求&#x1f689;4.1、 HTTP GET和POST方法&#x1f68b;4.2、HTTP状态码&#x1f68a;4.3、HTTP常见Header &#x1…

redis架构设计: redis-server的启动(硬核分析)

怎么在windows上用clion搭建redis的源码阅读环境 请看我的上一篇文章 redis启动之后都干了什么呢? 我们知道&#xff0c;redis的服务端对应的源码位置是server.c main函数是程序启动的入口 &#xff0c;下面我来一行一行的分析server.c的源码 1、定义时间函数变量 struct …

chatgpt赋能python:Python多种输出格式详解

Python多种输出格式详解 对于Python程序员来说&#xff0c;输出是非常重要的。无论是在开发阶段还是在生产环境中&#xff0c;输出都是我们调试程序和确认程序运行是否正常的重要手段。Python标准库提供了丰富的输出格式&#xff0c;本文介绍了几种常见的输出格式及其使用方法…

因为写不出拖拽移动效果,我恶补了一下Dom中的各种距离

目录 背景 JS Dom各种距离释义 第一个发现 window.devicePixelRatio 的存在 document.body、document.documentElement和window.screen的宽高区别 scrollWidth, scrollLeft, clientWidth关系 元素自身和父级元素的scrollWidth和scrollLeft关系? offsetWidth和clientWid…

【FDA】图像通过傅里叶变换改变光谱风格,实现域自适应

FDA: Fourier Domain Adaptation for Semantic Segmentation, CVPR2020 翻译&#xff1a;CVF2020邻域自适应/语义分割&#xff1a;FDA: Fourier Domain Adaptation for Semantic SegmentationFDA&#xff1a;用于语义分割的傅立叶域自适应算法_傅里叶域适应_HheeFish的博客-CS…

【TCP/IP】多进程服务器的实现(进阶) - 进程和僵尸进程

目录 僵尸(Zombie)进程 僵尸进程的产生机制 僵尸进程的危害 僵尸进程的销毁 wait函数 waitpid函数 进程管理在网络编程中十分重要&#xff0c;如果未处理好&#xff0c;将会导致出现“僵尸进程”&#xff0c;进而影响服务器端对进程的管控。 僵尸(Zombie)进程 第一次听到…

数据类型

常见的数据类型&#xff1a; int&#xff0c;整数类型&#xff08;整形&#xff09;bool&#xff0c;布尔类型str&#xff0c;字符串类型list&#xff0c;列表类型tuple&#xff0c;元组类型dict&#xff0c;字典类型set&#xff0c;集合类型float&#xff0c;浮点类型&#x…

python Web开发 flask轻量级Web框架实战项目--学生管理系统

上次发的一篇文章&#xff0c;有很多朋友私信我要后面的部分&#xff0c;那咱们就今天来一起学习一下吧&#xff0c;因为我的数据库这门课选中的课题是学生管理系统&#xff0c;所以今天就以这个课题为例子&#xff0c;从0到1去实现一个管理系统。数据库设计部分我会专门出一个…

《Java 核心技术面试》课程笔记(十二)

Java 有几种文件拷贝方式&#xff1f;哪一种最高效&#xff1f; 典型回答 Java 有多种比较典型的文件拷贝实现方式&#xff0c;比如&#xff1a;利用java.io 类库&#xff0c;直接为源文件构建一个 FileInputStream 读取&#xff0c;然后再为目标文件构建一个 FileOutputStre…

chatgpt赋能python:Python模块(Module)是什么?

Python模块&#xff08;Module&#xff09;是什么&#xff1f; Python模块&#xff08;Module&#xff09;是指一些预先编写好的代码&#xff0c;这些代码可以在程序中被引入和使用。它们可以包含可以复用的函数、常量和类。Python模块是一种封装程序代码的方法。 下载Python…

领取的AWS亚马逊云服务器到期会扣费的问题解决办法。

本篇文章主要讲解&#xff0c;领取的AWS亚马逊服务器到期后会持续扣费问题的解决办法。 作者&#xff1a;任聪聪 日期&#xff1a;2023年6月8日 关于aws服务器一年免费期限到期后扣费的问题&#xff0c;网络上的文章并不是很全&#xff0c;故此我通过个人的经验进行了如下的教程…

chatgpt赋能python:Python怎么print换行?

Python怎么print换行&#xff1f; 如果你是一个Python开发者&#xff0c;你可能遇到过需要在Python中打印输出换行的情况。本文将分享几种方式&#xff0c;让你学会如何在Python中print换行。 1. 使用"\n" 您可以在print语句中使用"\n"来表示换行。这个…

陈丹琦团队新作:单卡A100可训300亿参数模型啦!

夕小瑶科技说 原创 作者 | 智商掉了一地、ZenMoore 近年来&#xff0c;随着大模型的涌现&#xff0c;微调语言模型已经在各种下游任务上展现出了卓越的性能。然而&#xff0c;这些庞大模型的参数量常常达到数十亿甚至上百亿的级别&#xff0c;训练这样规模的模型需要消耗大量…

chatgpt赋能python:Python视图(View)在SEO中的重要性

Python视图&#xff08;View&#xff09;在SEO中的重要性 什么是Python视图&#xff1f; Python视图是指&#xff0c;在Web应用程序中&#xff0c;将业务逻辑与显示逻辑分开处理&#xff0c;并以代码的形式定义的可重用组件。它们是与URL相对应的函数或方法。Python视图可以生…

uniapp:uni-app-base 项目基础配置,开箱可用

目前&#xff08;20230605&#xff09;uni-app最新版本&#xff08;3.8.4.20230531&#xff09; 一、官网文档 uni-app官网 二、创建项目 项目目标&#xff1a;vue3tsvitevscode 创建以 typescript 开发的工程&#xff08;如命令行创建失败&#xff0c;请直接访问 gitee 下…

《面试1v1》JVM调优

我是 javapub&#xff0c;一名 Markdown 程序员从&#x1f468;‍&#x1f4bb;&#xff0c;八股文种子选手。 《面试1v1》 连载中… 面试官&#xff1a; 小伙子,说听说你JVM调优挺在行? 候选人&#xff1a; 谢谢夸奖,我对JVM调优还在学习中,远未达到在行的程度。不过日常工作…