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 左表.列 = 右表.列; 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机的智能锁芯报警系统设计

摘 要:在传统的智能锁芯报警系统中,存在响应时间较长的问题,为此,提出一种基于单片机的智能锁芯报警系统。通过控制模块、智能锁芯设置模块、报警模块、中断模块、液晶模块等,建立系统总体框架,根据系统总体框架,通过单片机、电源适配器、智能锁芯、报警器、LED灯等…

CMake构建OpenCv并导入QT项目过程中出现的问题汇总

前言 再此之前请确保你的环境变量是否配置&#xff0c;这是总共需要配置的环境变量 E:\cmake\bin E:\OpenCv\opencv\build\x64\vc15\bin F:\Qt\Tools\mingw730_64\bin F:\Qt\5.12.4\mingw73_64\bin 问题一&#xff1a; CMake Error: CMake was unable to find a build program…

Docker 学习笔记(七):介绍 Dockerfile 相关知识,使用 Dockerfile 构建自己的 centos 镜像

一、前言 记录时间 [2024-4-12] 系列文章简摘&#xff1a; Docker学习笔记&#xff08;二&#xff09;&#xff1a;在Linux中部署Docker&#xff08;Centos7下安装docker、环境配置&#xff0c;以及镜像简单使用&#xff09; Docker 学习笔记&#xff08;三&#xff09;&#x…

51单片机入门_江协科技_27~28_OB记录的自学笔记_AT24C02数据存储秒表

27. AT24C02(I2C总线) 27.1. 存储器介绍 27.2. 存储器简化模型介绍&#xff0c;存储原理 27.3. AT24C02介绍 •AT24C02是一种可以实现掉电不丢失的存储器&#xff0c;可用于保存单片机运行时想要永久保存的数据信息 •存储介质&#xff1a;E2PROM •通讯接口&#xff1a;I2…

ElasticSearch中使用bge-large-zh-v1.5进行向量检索(一)

一、准备 系统&#xff1a;MacOS 14.3.1 ElasticSearch&#xff1a;8.13.2 Kibana&#xff1a;8.13.2 BGE是一个常见的文本转向量的模型&#xff0c;在很多大模型RAG应用中常常能见到&#xff0c;但是ElasticSearch中默认没有。BGE模型有很多版本&#xff0c;本次采用的是bg…

【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件

【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件 往期回顾 【QT入门】Qt自定义控件与样式设计之QProgressBar用法及qss-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QSlider用法及qss-CSDN博客 【QT入门】Qt自定义控件与样式设计之qss的加载方式-CSDN博客 一、最终…

P6170 [USACO16FEB] Circular Barn G

题目 [ 传送门 ] 题目描述 作为当代建筑的爱好者&#xff0c;Farmer John 建造了一个圆形新谷仓&#xff0c;谷仓内部 个房间排成环形&#xff0c;按顺时针顺序编号为&#xff0c;每个房间都有通往与其相邻的左右房间的门&#xff0c;还有一扇门通往外面。 现在 FJ 有 n 头奶牛…

第六季:RTSP协议详解与实时流视频预览

目录 前言1 环境准备2 H.264编码原理和基本概念2.1 图像冗余信息2.2 h.264编码相关的一些概念2.3 h264视频流总体分析2.4 H264的NAL单元详解22.4.1 相关概念 2.5 NALU详解2.6 sps和pps详解2.7 H264的profile和level2.8 序列sequence 前言 本篇文章用于记录实验过程 1 环境准备…

Django中间件路由映射自动加/斜杠问题原因及分析

输入 http://127.0.0.1:8000/main/index/ 输入 http://127.0.0.1:8000/main/index 路由定义情况 urlpatterns [path("index/", views.index) ]可以发现我在输入URL的index路由时&#xff0c;如果没有和Django定义的路由匹配规则一样的话&#xff0c;浏览器自…

深度学习在三维点云处理与三维重建中的应用探索

目录 点云数据处理 数据清洗 数据降噪和简化 数据配准 特征提取 数据增强 数据组织 性能考量 PointNet PointNet 算法问题 改进方法 三维重建 重建算法 架构模块 流程步骤 标记说明 优点和挑战 点云数据处理 数据清洗 去噪&#xff1a;点云数据通常包含噪声…

云计算:Linux 部署 OVS 集群(控制端)实现OpenFlow

目录 一、实验 1.环境 2.Linux 部署 OVS 集群&#xff08;控制端&#xff09; 3.控制端对接服务端OVS网元 4.服务端OVS添加流表 5.服务端删除OVS 二、问题 1. ODL如何查找已安装插件 2.查看流表显示不全 3.如何删除OVS流表 一、实验 1.环境 (1) 主机 表1 宿主机 主…

银行司库系统应用架构介绍

继国务院国资委印发了《关于推动中央企业加快司库体系建设进一步加强资金管理的意见》以及《关于中央企业加快建设世界一流财务管理体系的指导意见》&#xff0c;司库体系建设开始得到了更多重视。其中&#xff0c;作为改革风向标&#xff0c;央企数字化转型及司库建设对整个行…

Node.js从基础到高级运用】二十三、Node.js中自动重启服务器

引言 在Node.js开发过程中&#xff0c;我们经常需要修改代码后重启服务器来应用这些更改。手动重启不仅效率低下&#xff0c;而且会打断开发流程。幸运的是&#xff0c;有一些工具可以帮助我们自动化这个过程。本文将介绍如何使用nodemon来实现Node.js服务器的自动重启。 什么是…

OR36 链表的回文结构

描述 对于一个链表&#xff0c;请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法&#xff0c;判断其是否为回文结构。 给定一个链表的头指针A&#xff0c;请返回一个bool值&#xff0c;代表其是否为回文结构。保证链表长度小于等于900。 测试样例&#xff1a; 1->…

Unity面经(自整)——移动开发与Shader

Unity与Android混合开发 为什么使用Flutter构建 Flutter 是 Google 的开源工具包&#xff0c;用于从单个代码库为移动、Web、桌面和嵌入式设备构建应用程序&#xff08;一套代码跨平台构建app是它最大的优点&#xff09;&#xff0c;并且可以构建高性能、稳定和丰富UI的应用程…

Django Rest Framework的序列化和反序列化

DRF的序列化和反序列化 目录 DRF的序列化和反序列化Django传统序列化Django传统反序列化安装DRF序列化器serializers序列化反序列化反序列化保存instance和data CBV和APIView执行流程源码解析CBV源码分析APIView源码分析 DRF的Request解析魔法方法__getattr__ 什么是序列化&…

第十二届蓝桥杯大赛软件赛省赛Java 大学 B 组题解

1、ASC public class Main {public static void main(String[] args) {System.out.println(

dns服务的正反向解析

目的&#xff1a;完成DNS正反向解析&#xff0c;将步骤及测试同时提交 一、正向解析 1、准备工作 [rootserver ~]# setenforce 0 [rootserver ~]# systemctl stop firewalld 2、服务端、客户端均安装软件 [rootserver ~]# yum install bind -y [rootnode1 ~]# yum install b…

扭蛋机小程序:线上扭蛋机模式发展空间有多大?

潮玩行业近几年的发展非常快&#xff0c;推动了扭蛋机市场的发展&#xff0c;越来越多的人加入到了扭蛋机赛道中&#xff0c;市场迎来了新的发展期。如今&#xff0c;我国的二次元文化的发展不断成熟&#xff0c;扭蛋机主打的二次元商品迎来了更多的商业机会。 一、互联网扭蛋机…

使用shell管理和配置网络服务_1

1、请使用nmcli命令配置仅主机模式网络环境&#xff0c;要求如下: 1) 创建一个新的网卡连接eth1&#xff0c;该连接映射到ens32网卡上; 首先&#xff0c;确保 ens32 网卡没有被其他网络配置文件使用。然后&#xff0c;使用 nmcli 创建一个新的连接&#xff0c;并将其绑定到 e…