MySQL中的SQL高级语句[二]

使用语言 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.mzph.cn/news/819636.shtml

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

相关文章

IO——标准IO

1.1概念 标准IO&#xff1a;是在C库中定义的一组专门用于输入输出的函数。 1.2特点 &#xff08;1&#xff09;通过缓冲机制减少系统调用&#xff0c;提高效率 &#xff08;2&#xff09;围绕流操作&#xff0c;用FILE*描述 &#xff08;3&#xff09;标准IO默认打开三个流&a…

PCIe错误定义与分类

前言&#xff1a; PCI总线中定义两个边带信号&#xff08;PERR#和SERR#&#xff09;来处理总线错误。其中PERR#主要对应的是普通数据奇偶校检错误&#xff08;Parity Error&#xff09;&#xff0c;而SERR#主要对应的是系统错误&#xff08;System Error&#xff09;。具体如下…

数据结构复习指导之绪论(算法的概念以及效率的度量)

文章目录 绪论&#xff1a; 2.算法和算法评价 知识总览 2.1算法的基本概念 知识点回顾与重要考点 2.2算法效率的度量 知识总览 1.时间复杂度 2.空间复杂度 知识点回顾与重要考点 归纳总结 绪论&#xff1a; 2.算法和算法评价 知识总览 2.1算法的基本概念 算法( Al…

【现代C++】模块的使用

C20引入了模块的概念&#xff0c;这是一个重要的新特性&#xff0c;旨在替代传统的预处理器和头文件机制。模块旨在提高编译速度、改善代码封装性、减少名称污染&#xff0c;并提供更好的工具支持。下面详细介绍模块的关键概念和使用方法&#xff1a; 1. 模块的基本概念 模块…

openGauss学习笔记-263 openGauss性能调优-TPCC性能调优测试指导-前置软件安装

文章目录 openGauss学习笔记-263 openGauss性能调优-TPCC性能调优测试指导-前置软件安装263.1 安装jdk263.2 安装numactl263.3 安装ant263.4 安装htop工具 openGauss学习笔记-263 openGauss性能调优-TPCC性能调优测试指导-前置软件安装 本章节主要介绍openGauss数据库内核基于…

谷歌浏览器的开发者插件vue-devtools

在这里我留下一个git地址用来下载插件包&#xff0c;首先在自己喜欢的位置创建一个新的文件夹&#xff0c;起一个自己喜欢的文件夹名字&#xff0c;下载到包后&#xff0c;然后点进文件夹里下载依赖&#xff0c;npm install,下载后如下面这个样子 git clone https://gitee.com…

【投稿优惠-EI稳定检索】2024年人工智能、自然语言处理与机器学习国际会议(ICAINLPML 2024)

2024 International Conference on Artificial Intelligence, Natural Language Processing and Machine Learning (ICAINLPML 2024) 网址&#xff1a;www.icainlpml.com 邮箱: ainlpmlsub-conf.com ●会议简介 2024年人工智能、自然语言处理与机器学习国际会议将邀请全球人…

Jackson 2.x 系列【24】Spring Web 集成

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 前言2. Spring Web3. Jackson2ObjectMapperBuilder4. Jackson2ObjectMapperFa…

比例控制器H5773282、H8135950、H3390627、H6079948

名称&#xff1a;BEUEC数字比例放大器、伺服比例控制器、伺服比例阀放大板&#xff0c;订货代号&#xff1a;H5773282、H8135950、H3390627、H6079948、H6108848、H6700353、H8851035、H1688388、H9549313、H3264103、H1182967&#xff0c;输入指令可选10V、4-20mA&#xff0c;…

Session缓存、Hibernate处理对象的状态了解

Session接口 Session接口是Hibernate向应用程序提供的操纵数据库的最主要的接口&#xff0c;它提供了基本的保存&#xff0c;更新&#xff0c;删除和查询的方法。 Session是有一个缓存, 又叫Hibernate的一级缓存 session缓存是由一系列的Java集合构成的。当一个对象被加入到…

[大模型]Atom-7B-Chat 接入langchain搭建知识库助手

Atom-7B-Chat 接入langchain搭建知识库助手 环境准备 在autodl平台中租一个3090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的JupyterLab&#xff0c;并且打开其中的终端开始环境配置…

Linux 网络测速

1.开发背景 网络测速&#xff0c;为了测试开发板的网络速度是否达标的通用测试方法 2.开发需求 搭建 iperf3 &#xff0c;在 ubuntu 下安装服务端&#xff0c;在板卡上安装客户端&#xff0c;服务端和客户端互发 3.开发环境 ubuntu20.04 嵌入式开发板&#xff08;debian 千…

LeetCode_丑数

题目&#xff1a; 题解&#xff1a; 由题&#xff0c;我们知道丑数大于0&#xff0c;丑数都可以写成2*2*...*2*3*3...*3*5*5...*5&#xff0c;有了这个基础就很好写代码了。 用三个while循环将前面的2 3 5全部除掉如果这个数是丑数&#xff0c;最后n是等于1的&#xff0c;反之…

C++_第五周做题总结_构造与析构

id:31 A.Point&#xff08;类与构造&#xff09; 题目描述 下面是一个平面上的点的类定义&#xff0c;请在类外实现它的所有方法&#xff0c;并生成点测试它。 class Point {double x, y; public:Point(); // 缺省构造函数&#xff0c;给x,y分别赋值为0Point(double x_value…

nvm node.js的安装

说明&#xff1a;部分但不全面的记录 因为过程中没有截图&#xff0c;仅用于自己的学习与总结 过程中借鉴的优秀博客 可以参考 1,npm install 或者npm init vuelatest报错 2&#xff0c;了解后 发现是nvm使用的版本较低&#xff0c;于是涉及nvm卸载 重新下载最新版本的nvm 2…

激光雷达初识

一、实车激光雷达 一般在车顶位置: 二、激光雷达组成 激光收发器模块:发射激光器VCSEL+接收模块采用了SiPM(硅基光电倍增管)或者APD,一个激光器发生失效的情况,其他仍可正常工作 扫描模块:水平视场和的垂直视场的扫描,128个阵列的VCSEL激光器负责 信号处理模块:信号处…

深入理解 C++ 中的 KeyFrame 和 KeyFrame*:对象与指针的选择与管理

本文详细讨论了在 C 编程中 KeyFrame 类及其指针 KeyFrame* 的用法、区别与联系。通过探索两者的内存管理、生命周期及使用场景&#xff0c;本文旨在帮助开发者更好地理解何时以及如何选择使用对象或指针&#xff0c;从而提高代码的效率和安全性。 在 C 中&#xff0c;KeyFrame…

【电控笔记2.4】前馈技术

2.4前馈技术 前馈可以减轻控制器的负担

画板探秘系列:创意画笔第一期

前言 我目前在维护一款功能强大的开源创意画板。这个画板集成了多种创意画笔&#xff0c;可以让用户体验到全新的绘画效果。无论是在移动端还是PC端&#xff0c;都能享受到较好的交互体验和效果展示。并且此项目拥有许多强大的辅助绘画功能&#xff0c;包括但不限于前进后退、…

【SQL】DISTINCT GROUP BY

找到所有办公室里的所有角色&#xff08;包含没有雇员的&#xff09;,并做唯一输出(DISTINCT) 用DISTINCT : SELECT DISTINCT B.Building_name,E.Role FROM Buildings B LEFT JOIN Employees EON B.Building_name E.Building需要找到的结果&#xff1a;所有办公室名字&#…