MySQL中的SQL高级语句[二]

news2024/11/25 12:41:06

使用语言 MySQL

使用工具 Navicat Premium 16

代码能力快速提升小方法,看完代码自己敲一遍,十分有用

  • 拖动表名到查询文件中就可以直接把名字拉进来
  • 以下是使用脚本方法,也可以直接进行修改
  • 中括号,就代表可写可不写 
  • 有些地方的代码有点多,可以在网页按住Ctrl键加鼠标滚轮放大观看

目录

1.MySQL必要技能

2.IN/NOT IN子查询

2.1 in子查询 

2.1.1 in子查询基本概念

2.1.2 in子查询示例

2.2 not in子查询 

2.2.1 not in子查询示例 

2.2.2 注意

3. exists/not exists子查询 

3.1 exists基本概念 

3.2 exists示例 

3.3 not exists示例 

3.4 exists与in的区别 

 4.子查询总结

4.1 子查询知识回顾

4.1.1 编写子查询语句注意事项

4.1.2 在select子句中的子查询 

4.1.3 在from子句中的子查询 

4.2 选择关键字

5.多表联查 

5.1 内连接示例

5.2 内连接示例2 

5.3 左连接/右连接 

5.3.1 左连接

5.3.2 右连接 


 

1.MySQL必要技能

  • 增删改查语句
  • 子查询(in/not in)
  • 多表联查 

并且要知道group by是可以去重的,having可以添加分组条件; 

2.IN/NOT IN子查询

2.1 in子查询 

2.1.1 in子查询基本概念

in关键字用于父查询匹配子查询返回的多个字段值。 

"Subquery returns more than 1 row"这个出错,代表子查询返回了多于1行的结果。
在使用比较运算符时,要求子查询只能返回1条或空的记录。也就是说,在MySQL中,当子查询跟随在<、>、=、>=、<=、!=之后时,子查询的返回结果不能是多条记录;否则将会出现错误。出现了这样的问题时,就需要使用in关键字了,将比较运算符切换为"in"即可
in的作用是限制条件的筛选范围,而且in后面的子查询可以返回多条记录。 

2.1.2 in子查询示例

 运行结果如下:

 

通过阅读以上代码,可以看到这条SQL语句包含5层子查询嵌套,其中有两个子查询是in子查询。使用in子查询的条件就是,在开发过程中,如果判断结果集可能为多条数据,则使用in子查询能够避免语句执行错误。

该代码拆分之后就是这样的,条件就是依次把上面的查询填入子查询而已,不过如果是这么多表的查询,不建议使用子查询(会被骂),推荐使用多表联查;

2.2 not in子查询 

in子查询将结果集中多条数据作为匹配条件,在实际开发过程中,还存在匹配结果集以外的数据的情况。这种查询的实现只需在in关键字前加上表示否定的not即可,也就是not in子查询。 

2.2.1 not in子查询示例 

 

运行结果如下: 

 

这个就是在最近一次开具"血脂、血糖检查"这项检查的科室以外科室看过病的所有病人; 

2.2.2 注意

这个就是在最近一次开具"血脂、血糖检查"这项检查的科室看过病的病人之外的所有输出出来。因此,在编写SQL语句时一定要注意语句的逻辑。 

3. exists/not exists子查询 

3.1 exists基本概念 

我们使用SQL语句创建数据库或数据表时使用了exists关键字,用它来判断数据库或数据表是否存在,以决定是否执行创建数据库或数据表的操作。实际上exists和not exists关键字也可以用于子查询。
在执行create或drop语句前,exists语句判断该数据库对象是否已经存在,exists的返回值是true或false,根据exists的返回值决定是否执行数据库操作语句。exists的另一种是在where语句作为子查询使用,语法格式如下:

  • select .... from 表名 exists(子查询);

exists在where子句中作为子查询使用时,若子查询的查询结果中有数据,则exists子查询的结果为true,其外层查询语句会被执行。若子查询的查询结果中没有数据,则exists子查询的结果为false,其外层查询语句不会被执行。 

3.2 exists示例 

运行结果

在以上示例中,使用exists子查询来判断病人是否做过"血脂、血糖检查",若有,则exists子句返回true。在exists子句返回true后,外层查询继续执行。其中,病人的年龄在表中并没有直接给出,需要通过时间日期函数和算术函数计算得到。

3.3 not exists示例 

运行结果

这个不会进行查询,只会判断李思雨是否有检查过凝血五项,如果没有检查过就查询后添加数据;

3.4 exists与in的区别 

  • EXISTS 用于检查子查询是否返回结果,而 IN 用于比较主查询的列与子查询返回的结果集中的值。
  • EXISTS 更适合用于判断子查询是否为空,而 IN 更适合用于比较列与结果集中的值是否相等。
  • 性能方面,通常情况下 EXISTS 的性能可能比 IN 更好,尤其是当子查询返回的结果集很大时,因为 EXISTS 只需要判断是否存在匹配的行,而不需要返回所有匹配的值;(目前由于版本更新in和exists的速度已经差不多了,但是面试时还是要说exists比较快

 4.子查询总结

4.1 子查询知识回顾

当一个查询时另一个查询的条件时,被称为子查询。子查询可以使几个简单的查询语句构成功能强大的符合查询语句; 

4.1.1 编写子查询语句注意事项

  • 子查询语句必须放在"()"中
  • 子查询语句出现的位置很灵活 

4.1.2 在select子句中的子查询 

在select子句中进行子查询的语法格式如下: 

  • select (子查询) [as 列别名] from 表名;

4.1.3 在from子句中的子查询 

 在from子句中进行子查询的语法格式如下:

  • select * from (子查询) as 表别名;

在from子句中的子查询必须加as别名,别名可以任意取,没有特殊的要求;

4.2 选择关键字

  • 子查询返回单行数据时,比较条件中可以使用比较运算符
  • 子查询返回多行数据时,比较条件中需要使用in或者not in关键字
  • 当判断子查询是否有数据返回时,需要使用exists或not exists关键字。 

子查询的输出结果通常作为其外层子查询的数据源或用于数据判断匹配,而不能作为最外层selec子句的输出字段。 

实现同一个需求可以使用不同的方式,但是不同实现方式的效率是不同的。在数据量比较小的条件下,这种效率上的差距还不是很明显,但是当数据量很大,并且对执行时间要求较高时,差距会非常明显。因此,良好的开发习惯是代码调试成功后,进一步思考是否有更好的解决方法。 

5.多表联查 

多表联查在 MySQL 中通常通过使用 JOIN 子句来实现。有几种类型的 JOIN,包括 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN。下面是一个简单的例子,展示了如何在 MySQL 中执行多表联查: 

5.1 内连接示例

假设你有三个表:patient、prescription 和 checkitem。patient 表包含患者信息,prescription 表包含处方信息,checkitem 表包含检查项目信息。 

5.2 内连接示例2 

 运行结果

 

或者可以不写连接,直接在表列表写需要的表,然后在where中写上多表联查的条件即可 ;

5.3 左连接/右连接 

5.3.1 左连接

  • LEFT JOIN 会返回左边表(左表)中的所有行,即右边表(右表)中没有匹配的行。
  • 如果左表中的行在右表中没有匹配的行,则会在结果集中以 NULL 值显示右表中的列。

LEFT JOIN 语法如下:
SELECT 列列表
FROM 左表
LEFT JOIN 右表 ON 左表.列 = 右表.列; 

5.3.2 右连接 

  • RIGHT JOIN 与 LEFT JOIN 类似,但是它会返回右边表(右表)中的所有行,即左边表(左表)中没有匹配的行。
  • 如果右表中的行在左表中没有匹配的行,则会在结果集中以 NULL 值显示左表中的列。

RIGHT JOIN 语法如下:
SELECT 列列表
FROM 左表
RIGHT JOIN 右表 ON 左表.列 = 右表.列; 

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

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

相关文章

在Ubuntu上安装Docker Compose

Docker Compose 是一个用于定义和管理Docker容器的工具&#xff0c;它使用yml来配置应用的服务、网络和卷等。特别是在定义多个容器时&#xff0c;它非常擅长定义多个容器之间的关系和依赖。 第一步&#xff1a;更新软件包 sudo apt update第二步&#xff1a;安装网络工具cur…

我企业的业务需要制作企业网站吗?11个支持的理由以及5个反对的理由!

如果你的企业经营得还不错&#xff0c;你可能会找出很多理由&#xff0c;说明为什么一个高效的网站对你来说并不那么重要。确实&#xff0c;你明白企业需要在互联网上有一定的存在感&#xff0c;但你可能并不认为一个高效的网站会对你的特定业务产生太大的影响——尤其是当你已…

无尘净化棉签:医药、化妆品及工业应用中的重要角色及防静电特性

无尘净化棉签是一种在医药、化妆品、电子光电产品、半导体、光学、磁头清洗、视频头、清洗头等领域广泛应用的清洁工具。本文探讨了无尘净化棉签在这些领域中的重要性&#xff0c;并特别关注了其防静电特性对产品质量和性能的影响。 无尘净化棉签是一种专为减少或避免产生灰尘和…

MySQL分区表(14/16)

分区表 基本概述 分区表是数据库中一种用于优化大型表数据管理和查询性能的技术。它将一个表的数据根据特定的规则或条件分割成多个部分&#xff0c;每个部分称为一个分区。每个分区可以独立于其他分区进行存储、管理和查询&#xff0c;这样可以提高数据处理的效率&#xff0…

代码随想录第38天| 509. 斐波那契数 70. 爬楼梯

理论基础 刷题大纲&#xff1a; 动态规划5步曲&#xff1a; 1、确定dp数组以及下标的含义 2、确定递推公式 3、dp数组如何初始化 4、确定遍历顺序 5、举例推导dp数组 509. 斐波那契数 509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.co…

羊大师春季运动受伤应急妙招

春季运动时受伤是很常见的情况&#xff0c;特别是在户外活动中。了解一些应急妙招&#xff0c;可以帮助你在受伤时进行初步处理&#xff0c;减轻伤害。以下是几种常见运动伤害的应急处理方法&#xff1a; 扭伤和拉伤 休息&#xff1a;立刻停止运动&#xff0c;避免对受伤部位…

安达发|APS软件系统助力高端装备制造业高质量发展

APS&#xff08;Advanced Planning and Scheduling&#xff0c;高级计划与排程系统&#xff09;软件系统在高端装备制造业中的应用&#xff0c;对于推动行业高质量发展具有重要作用。以下是对这一主题的详细探讨&#xff1a; 高端装备制造业指那些技术含量高、附加值大、市场竞…

Windows 关闭占用指定端口的进程

以下示例以443端口为例&#xff0c;具体哪个端口视自己情况而定 输入命令 # 输出的最后一列就是进程号pid netstat -ano | findstr "443" 找出占用443端口的进程号(pid)&#xff08;第二列是你本机的应用占用的端口&#xff0c;看第二列就行&#xff09;如下图&am…

二叉查找树、二叉搜索树、二叉排序树算法分析及实现

一、几个概念 二叉树&#xff08;Binary Tree&#xff09;&#xff0c;是 n&#xff08;n > 0&#xff09;个结点&#xff08;每个结点最多只有2棵子树&#xff09;的有限集合&#xff0c;该集合或为空集&#xff0c;称为空二叉树&#xff0c;或由一个根节点和两颗互不相交…

算法练习第16天|101. 对称二叉树

101. 对称二叉树 力扣链接https://leetcode.cn/problems/symmetric-tree/description/ 题目描述&#xff1a; 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#x…

稀碎从零算法笔记Day46-LeetCode:互质树

这几天有点懈怠了 题型&#xff1a;树、DFS、BSF、数学 链接&#xff1a;1766. 互质树 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你一个 n 个节点的树&#xff08;也就是一个无环连通无向图&#xff09;&#xff0c;节点编号从 0 到 …

力扣207.课程表

你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示如果要学习课程 ai 则 必须 先学习课程 bi 。 例如…

2024-3-29 群讨论:如何看到一个线程的所有 JFR 事件

以下来自本人拉的一个关于 Java 技术的讨论群。关注公众号&#xff1a;hashcon&#xff0c;私信拉你 如何查看一个线程所有相关的 JFR 事件 一般接口响应慢&#xff0c;通过日志可以知道是哪个线程&#xff0c;但是如何查看这个线程的所有相关的 JFR 事件呢&#xff1f;JMC 有…

77、WAF攻防——权限控制代码免杀异或运算变量覆盖混淆加密传参

文章目录 WAF规则webshell免杀变异 WAF规则 函数匹配 工具指纹 webshell免杀变异 php 传参带入 eval可以用assert来替换,assert也可以将字符串当作php代码执行漏洞 php 变量覆盖 php 加密 使用加密算法对php后门进行加密 php 异或运算 简化:无字符webshellP 无数字字母rc…

WPS二次开发系列:Gradle版本、AGP插件与Java版本的对应关系

背景 最近有体验SDK的同学反馈接入SDK出现报错&#xff0c;最终定位到原因为接入的宿主app项目的gradle版本过低导致&#xff0c;SDK兼容支持了android11的特性&#xff0c;需要对应的gradle插件为支持android11的版本。 现象 解决方案 将gradle版本升级至支持android11的插件版…

【数据结构与算法】之8道顺序表与链表典型编程题心决!

个人主页&#xff1a;秋风起&#xff0c;再归来~ 数据结构与算法 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 目录 1、顺序表 1.1 合并两个有序数组 1.2 原地移除数组中所有的元素va…

Python+selenium搭建Web自动化测试框架

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在程序员的世界中&#xff0c;一切重复性的工作&#xff0c;都应该通过程序自动执行。「自动化测…

Uniapp+基于百度智能云完成AI视觉功能(附前端思路)

本博客使用uniapp百度智能云图像大模型中的AI视觉API&#xff08;本文以物体检测为例&#xff09;完成了一个简单的图像识别页面&#xff0c;调用百度智能云API可以实现快速训练模型并且部署的效果。 uniapp百度智能云AI视觉页面实现 先上效果图实现过程百度智能云Easy DL训练图…

Proxmox VE qm 方式一键创建Windows虚拟机

前言 实现qm 方式一键创建Windows虚拟机&#xff0c;提高效率。 qm 一键创建Windows虚拟机 以下实现在线下载镜像&#xff0c;创建虚拟机&#xff0c;安装系统需要自己手动安装哦&#xff0c;如果想实现全自动安装系统&#xff0c;建议部署自己的内网pxe server 系统参考各参…

蓝桥杯——松散子序列

题目 分析 很明显的动态规划问题&#xff0c;每次我们都取当前位置的最大值就可&#xff0c;从头开始&#xff0c;dp[i]max(dp[i-2],dp[i-3])num[i-3]. 代码 ninput() num[] for i in n:num.append(ord(i)-96) dp[0]*(len(num)3) for i in range(3,len(num)3):dp[i]max(dp[i…