夜猫子的知识栈 夜猫子的知识栈
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《Web Api》
    • 《ES6教程》
    • 《Vue》
    • 《React》
    • 《TypeScript》
    • 《Git》
    • 《Uniapp》
    • 小程序笔记
    • 《Electron》
    • JS设计模式总结
  • 《前端架构》

    • 《微前端》
    • 《权限控制》
    • monorepo
  • 全栈项目

    • 任务管理日历
    • 无代码平台
    • 图书管理系统
  • HTML
  • CSS
  • Nodejs
  • Midway
  • Nest
  • MySql
  • 其他
  • 技术文档
  • GitHub技巧
  • 博客搭建
  • Ajax
  • Vite
  • Vitest
  • Nuxt
  • UI库文章
  • Docker
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

夜猫子

前端练习生
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《Web Api》
    • 《ES6教程》
    • 《Vue》
    • 《React》
    • 《TypeScript》
    • 《Git》
    • 《Uniapp》
    • 小程序笔记
    • 《Electron》
    • JS设计模式总结
  • 《前端架构》

    • 《微前端》
    • 《权限控制》
    • monorepo
  • 全栈项目

    • 任务管理日历
    • 无代码平台
    • 图书管理系统
  • HTML
  • CSS
  • Nodejs
  • Midway
  • Nest
  • MySql
  • 其他
  • 技术文档
  • GitHub技巧
  • 博客搭建
  • Ajax
  • Vite
  • Vitest
  • Nuxt
  • UI库文章
  • Docker
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Node基础

  • 《MySQL》学习笔记

    • Navicat for MySQL
    • SQL语法
    • 查询操作
    • 数据统计
    • 高级查询
      • 案例数据
      • 模糊查询:like
        • 通配符:%
        • 通配符:_
        • 转义通配符:\
      • 随机查询:rand()
      • 子查询
        • 单值子查询
        • 多值子查询
        • 操作符 in
        • 操作符 all
        • 操作符 any
        • 操作符 some
        • 关联子查询
    • 内置函数
    • 数据修改
    • 表的操作
    • 列的属性
    • 多表查询
    • 视图
    • 索引
    • 存储程序
    • 游标
    • 事务
    • 安全管理
    • 数据备份
    • 其他内容
  • Midway

  • Nest

  • 其他

  • 服务端
  • 《MySQL》学习笔记
夜猫子
2023-10-31
目录

高级查询

# 高级查询

# 案例数据

{%}

# 模糊查询:like

在MySQL中,我们可以在where子句中使用like运算符来实现模糊查询。like运算符都是放在where子句中使用,并且它一般需要结合通配符来一起使用。

通配符 说明
% 0个或多个字符
_ 1个字符

# 通配符:%

在SQL中,通配符 % 代表的是一个任何长度的字符串(0个或多个字符)。对于“%”来说,它的常用方式有以下3种。

(1)where 列名 like 'string%'

(2)where 列名 like '%string'

(3)where 列名 like '%string%'

示例

查询所有 name 以“瓜”结尾的数据

SELECT * FROM `fruit` where name like '%瓜'
1

image-20250207132540672

# 通配符:_

在SQL中,通配符“”代表的是一个字符,也就是长度为1的字符串。对于“”来说,它的常用方式有以下3种。

(1)where 列名 like 'string_'。

(2)where 列名 like '_string'。

(3)where 列名 like 'string'

示例

查询所有 name 为两个长度且第二个为“瓜”的数据

SELECT * FROM `fruit` where name like '_瓜'
1

image-20250207132931833

# 转义通配符:\

我们可以在“%”或“_”的前面加上一个反斜杠“\”,此时该字符就变成了一个普通字符,而不具备通配符的功能。这一点和大多数编程语言中的转义字符是一样的。

# 随机查询:rand()

对于 MySQL 来说,我们可以使用 rand() 函数来实现随机查询。其中,rand 是“random(随机)”的缩写。

select 列名
from 表名
order by rand()
limit n;
1
2
3
4

# 子查询

子查询,指的是在一条 select 语句中使用另一条 select 语句。一般来说,另一条 select 语句查询的结果往往会作为第一条 select 语句的查询条件。

(1)单值子查询。

(2)多值子查询。

(3)关联子查询。

# 单值子查询

单值子查询,指的是作为子查询的select语句返回的结果是“单个值”,也就是返回1行1列的结果。

**示例:**先查询出最大价格字段,再查询所有数据中匹配最大价值的数据

其中 SELECT MAX(price) FROM fruit 是单值子查询

SELECT * from `fruit` WHERE price = (SELECT MAX(price) FROM fruit);
1

image-20250207135535694

# 多值子查询

  • 多值子查询,指的是作为子查询的 select 语句返回的结果是“多个值”,一般是一列多行。
  • 对于多值子查询来说,一般是放在 where 子句中,结合 in、all、any、some 这4个关键字来一起使用。
  1. all、any、some 这3个关键字必须要和比较运算符一起使用。
  2. “=any” 等价于 “in”。
  3. “<>all” 等价于 “not in”

# 操作符 in

in 操作符用于检查一个值是否存在于子查询返回的结果集中。

新增一张表 popular_types 存最受欢迎的水果类型

CREATE TABLE popular_types (
    type VARCHAR(50) PRIMARY KEY
);
 
INSERT INTO popular_types (type) VALUES
('浆果'),
('瓜果');
1
2
3
4
5
6
7

image-20250207143757229

以下是一个示例:查询所有属于受欢迎类型的水果(浆果、瓜果)

SELECT * FROM fruit
WHERE type IN (SELECT type FROM popular_types);
1
2

# 操作符 all

用于比较某个值与子查询返回的结果集中的所有值。如果外部查询中的值满足与子查询返回的所有值进行比较的条件,则 ALL 操作符返回 TRUE。

**示例:**查找价格低于表中所有“浆果”类型水果价格的“瓜果”类型水果

SELECT * FROM fruits f1
WHERE f1.type = '瓜果' AND f1.price < ALL (SELECT f2.price FROM fruits f2 WHERE f2.type = '浆果');
1
2

image-20250207144538890

# 操作符 any

用于比较某个值与子查询返回的结果集中的任意一个值。如果外部查询中的值满足与子查询返回的任意一个值进行比较的条件,则 ANY 操作符返回 TRUE。

**示例:**查找价格低于表中任意一个“浆果”类型水果价格的“瓜果”类型水果。

SELECT * FROM fruit f1
WHERE f1.type = '瓜果' AND f1.price < ANY (SELECT f2.price FROM fruit f2 WHERE f2.type = '浆果');
1
2

image-20250207145805131

# 操作符 some

在 SQL 标准中,SOME 操作符实际上是 ANY 操作符的一个同义词。这意味着在大多数数据库系统(包括 MySQL)中,SOME 和 ANY 可以互换使用,而不会产生不同的结果。

因此,使用 SOME 操作符的多值子查询与使用 ANY 操作符的多值子查询在语法和功能上是相同的。

# 关联子查询

关联子查询,指的是父查询和子查询是“相关联”的,子查询的条件需要依赖于父查询。

特别注意,关联子查询的关联条件判断一定要写在子查询中,而不是写在父查询中

**示例:**查询每种类型中价格最高的水果

SELECT *
FROM fruit f1
WHERE f1.price = (
    SELECT MAX(f2.price)
    FROM fruit f2
    WHERE f2.type = f1.type
);
1
2
3
4
5
6
7

image-20250207151044629

在这个查询中:

  • f1 是外部查询的别名,用于引用 fruit 表。
  • 子查询是一个关联子查询,因为它引用了外部查询中的 f1.type 列。
  • 子查询查找与 f1 相同类型的水果中的最高价格。
  • 外部查询选择那些其价格等于子查询返回的最高价格的水果。
编辑 (opens new window)
上次更新: 2025/3/12 17:54:26
数据统计
内置函数

← 数据统计 内置函数→

最近更新
01
IoC 解决了什么痛点问题?
03-10
02
如何调试 Nest 项目
03-10
03
Provider注入对象
03-10
更多文章>
Copyright © 2019-2025 Study | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式