JavaMySQL高级二(详细版)

本文详细介绍了SQL中的IN/NOTIN子查询处理多行数据的方法,NOTIN用于排除不在结果集内的数据,以及EXISTS和NOTEXISTS子查询用于判断是否存在数据。此外,还讨论了子查询在不同SQL结构中的使用规则和常见错误案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.IN/NOT IN子查询

1.NOT IN子查询

2.EXISTS/NOT EXISTS子查询

3.子查询总结

1.子查询知识回顾

1.在SELECT子句的子查询 

2.在FROM子句中的子查询 

 4.总结


1.IN/NOT IN子查询

从执行结果中可以看出,出错的原因是"Subquery returns more than 1 row",也就是说,出错的原因是子查询返回了多于1行的结果。为什么子查询返回多于1行的结果时SQL语句会执行错误?这个原因在前面高级一中介绍子查询的时候提到过,这里再次予以强调。

在使用比较运算符时,要求子查询只能返回1条或空的记录。也就是说,在MySQL中,当子查询跟随在<、>、=、<=、>=、!=之后时,子查询的返回结果不能是多条记录;否则将会出错。那么,出现了这样的问题应该如何解决?解决的方法就是本次将要介绍的IN关键字,将"="替换为"IN"即可。

1.NOT IN子查询

IN子查询将结果集中多条数据作为匹配条件,在实际开发过程中,还存在匹配结果集以外数据的情况。这种查询应该如何实现呢?很简单,在IN关键字前加上表示否定的NOT即可,也就是NOT IN子查询。

2.EXISTS/NOT EXISTS子查询

我们在学习使用SQL语句创建数据库或数据表时使用了EXISTS关键字,用它来判断数据库或数据表是否存在,以决定是否执行创建数据库或数据表的操作。实际上EXISTS和NOT EXISTS关键字也可以用于子查询。

在学习EXISTS子查询前,首先回顾EXISTS在建库建表或删库删表语句中的使用方法。以删除patient_address表为例,使用EXISTS判断patient_address表是否存在,若存在,则删除。关键代码如下。

DROP TABLE IF EXISTS patient_address;

在执行CREATE或DROP语句前,EXISTS语句判断该数据库对象是否已经存在,EXIOSTS的返回值是true或false,根据EXISTS的返回值决定是否执行数据库操作语句。EXISTS的另一种用法是在WHERE语句中作为子查询使用。语法格式如下。

SELECT ······FROM 表名 WHERE EXISTS(子查询);

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

EXISTS子查询的作用是检测是否存在符合查询条件的记录,然后根据业务逻辑查询符合要求的相应记录。

和IN子查询一样,EXISTS子查询也允许添加 NOT关键字实现相反的操作,NOT EXISTS子查询表示结果集中不存在记录时返回true,否则返回false。

3.子查询总结

进入信息时代,人们处于海量数据中,业务需求越来越复杂,这就对开发人员提出更高的要求。开发人员不仅要熟练掌握对数据表中的数据执行增、删、改操作和简单的SQL语句查询,还要根据客户的实际需求使用子查询语句从多张表中查询获取相关数据。

1.子查询知识回顾

当一个查询是另一个查询的条件时,被称为子查询。子查询可以使用几个简单的查询语句构成功能强大的复合查询语句。在编写子查询语句时,需求注意以下事项。

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

子查询常用于SELECT的WHERE子句中。子查询是一个SELECT语句,可以嵌套在一个SELECT、SELECT······INTO语句、INSERT······INTO语句、DELETE语句、UPDATE语句中或嵌套在另一子查询中。

除SELECT的WHERE子句可以嵌套子查询外,子查询还可以嵌套于SELECT语句的列、表和查询条件中,即SELECT子句、GROUP BY子句和HAVING子句。但是ORDER BY子句中不能嵌套子查询。下面介绍子查询经常在SQL语句中出现的位置。

1.在SELECT子句的子查询 

在SELECT子句中进行子查询的语法格式如下。

SELECT(子查询)[AS 列别名] FROM 表名;

此时子查询的结果必须为单行单列,其中,列别名为可选项。

2.在FROM子句中的子查询 

在FROM子句中进行查询的语法格式如下。

SELECT * FROM (子查询) AS 表别名;

此时子查询的结果一般为多行多列,可以当作一张临时表,而且必须为子查询的结果指定表别名。

常见错误:

SELECT * FROM (SELECT * FROM prescription);

这类错误的产生原因就是没有为子查询的查询结果指定别名。正确的写法如下。

SELECT * FROM (SELECT * FROM prescription) AS temp;

代码中的别名可以任意取,没有特殊的要求,通常将子查询语句放在比较条件的右边以增加可读性,子查询可以返回单行或多行数据,此时要选择合适的关键字。

  • 子查询返回单行数据时,比较条件中可以使用比较运算符。
  • 子查询返回多行数据时,比较条件中需要使用IN或NOT IN关键字。
  • 当判断子查询是否有数据返回时,需要使用EXISTS或NOT EXISTS关键字。 
  • 只出现在子查询中但是没有出现在父查询中的表不能包含在输出列中。
  • 子查询的输出结果通常作为其外层子查询的数据源或用于数据判断匹配,而不能作为最外层SELECT子句的输出字段。 

 4.总结

  • 在开发过程中,若判断结果集可以为多条数据,则使用IN子查询能够避免语句执行错误。
  • EXISTS和NOT EXISTS子查询的结果只取决于查询有无结果而与其具体的内容无关。
  • 除SELECT的WHERE子句中可以嵌套子查询外,子查询还可以嵌套于SELET语句的列、表和查询条件中,即SELECT子句、GEOUP BY子句和HAVING子句。
  • ORDER BY子句中不能嵌套查询。
  • 只出现在子查询中但是没有出现在父查询中的表不能包含在输出列中。
### Java 和 MySQL 常见面试题及答案 #### Java 部分 1. **char 和 varchar 的区别** - `CHAR` 是固定长度的数据类型,其大小在创建时指定并保持不变。它适合存储短字符串或定长字符数据。 - `VARCHAR` 是可变长度的数据类型,能够动态调整存储空间以适应实际存储的内容。它的最大长度由定义决定,但在存储时只占用实际所需的空间[^1]。 2. **多线程中的 CAS 操作是什么?** - CAS(Compare And Swap),即比较并交换,是一种无锁算法的核心机制。通过硬件指令实现原子操作,在更新变量值之前先检查当前值是否等于预期值,如果是则更新为新值,否则不进行任何修改。这种技术广泛应用于并发控制中,比如在 JDK 中的 `AtomicInteger` 类就依赖于 CAS 来完成高效的操作[^3]。 3. **JVM 加载类的过程有哪些阶段?** - JVM 加载类分为五个主要阶段:加载、验证、准备、解析以及初始化。其中,“加载”负责将字节码文件读入内存;“验证”确保 Class 文件结构合法安全;“准备”分配静态成员所需的内存资源但未赋初始值;“解析”把符号引用转换成直接引用;最后,“初始化”执行 `<clinit>` 方法来设置类级别的属性初值。 4. **Spring Boot 自动配置原理是什么?** - Spring Boot 使用了一种基于条件装配的方式来进行自动配置。核心组件是 `@EnableAutoConfiguration` 注解,该注解会扫描项目路径下的所有符合条件的 Bean 定义,并依据运行环境动态注册相应的 Beans 实现功能扩展。这一过程借助了大量内置 Starter POMs 提供的支持。 ```java @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` --- #### MySQL 部分 1. **什么是覆盖索引?** - 覆盖索引指的是查询语句所涉及的所有字段都可以从某个单一索引中获得而无需再访问原始表的情况。这样可以显著减少磁盘 I/O 开销提高性能效率[^4]。 2. **MySQL 如何利用索引进行排序?** - 当且仅当索引列的排列次序完全匹配 ORDER BY 子句的需求,并且每列的方向一致时,MySQL 才能单纯依靠索引来完成结果集的排序工作。对于跨多个表格联合检索场景下,则要求这些参与排序的关键要素都来源于首个被联结的对象之中[^5]。 3. **MyISAM 和 InnoDB 主要差异在哪里?** | 特性 | MyISAM | InnoDB | |----------------|----------------------------------|--------------------------------| | 数据安全性 | 不支持事务 | 支持 ACID 事务 | | 锁粒度 | 表级锁定 | 行级锁定 | | 外键约束 | 不支持外键 | 支持外键关系 | | 性能表现 | 查询速度快,写入较慢 | 平衡读写速度 | 上述对比表明两者各有优劣适用于不同业务需求场合。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值