mysql查询之子查询

news2024/11/16 17:55:47

0. 概念

SQL语句中嵌套SELECT语句,称为嵌套查询,又叫子查询。
查询可以基于一个表或多个表。子查询可以添加到SELECT、UPDATE和DELETE中,而且可以进行多层嵌套。子查询常用操作符有 ANY(SOME),ALL、IN、EXISTS。也可以使用比较运算符,如<、<=、>、>=和!=等。。。

1. 数据源

/*
 Navicat Premium Data Transfer

 Source Server         : localhost_3306
 Source Server Type    : MySQL
 Source Server Version : 80016
 Source Host           : localhost:3306
 Source Schema         : tempdb

 Target Server Type    : MySQL
 Target Server Version : 80016
 File Encoding         : 65001

 Date: 08/05/2023 21:40:13
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for class
-- ----------------------------
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class`  (
  `id` int(11) NOT NULL,
  `c_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of class
-- ----------------------------
INSERT INTO `class` VALUES (1, '高三 1 班');
INSERT INTO `class` VALUES (2, '高三 2 班');
INSERT INTO `class` VALUES (3, '高三 3 班');
INSERT INTO `class` VALUES (4, '高三 4 班');
INSERT INTO `class` VALUES (5, '高三 5 班');

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `num` int(11) NOT NULL,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `age` int(11) NULL DEFAULT NULL,
  `tel` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `c_id` int(11) NULL DEFAULT NULL,
  `g_id` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`num`) USING BTREE,
  INDEX `f_std_cls`(`c_id`) USING BTREE,
  CONSTRAINT `f_std_cls` FOREIGN KEY (`c_id`) REFERENCES `class` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (101, '张三', 23, '354456354', 1, NULL);
INSERT INTO `student` VALUES (102, '王五', 34, '4334', 1, 101);
INSERT INTO `student` VALUES (103, '李四', 32, '131434', 3, 101);
INSERT INTO `student` VALUES (104, '赵无极', 23, '4234', 2, NULL);
INSERT INTO `student` VALUES (105, '韩夫子', 34, '23', 2, 102);
INSERT INTO `student` VALUES (106, '高俅', 25, '42543', 4, 103);
INSERT INTO `student` VALUES (107, '范瑶', 26, '2345', NULL, 104);
INSERT INTO `student` VALUES (108, '斯巴达克斯', 27, '422156 ', NULL, 104);

SET FOREIGN_KEY_CHECKS = 1;

在这里插入图片描述

2. 标量子查询

子查询的返回结果为单个值。
常用的操作符:=、<>、>、>=、<、<=。

// 查询高三1班的所有学生
// a. 首先在class表中查询高三 1 班的id;
// b. 再在student查询c_id=id的记录;

mysql> select id from class where c_name='高三 1 班';
+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.00 sec)

mysql> select * from student where c_id=1;
+-----+------+------+-----------+------+------+
| num | name | age  | tel       | c_id | g_id |
+-----+------+------+-----------+------+------+
| 101 | 张三 |   23 | 354456354 |    1 | NULL |
| 102 | 王五 |   34 | 4334      |    1 |  101 |
+-----+------+------+-----------+------+------+
2 rows in set (0.00 sec)
// 采用子查询进行查询
mysql> select * from student where c_id=(select id from class where c_name='高三 1 班');
+-----+------+------+-----------+------+------+
| num | name | age  | tel       | c_id | g_id |
+-----+------+------+-----------+------+------+
| 101 | 张三 |   23 | 354456354 |    1 | NULL |
| 102 | 王五 |   34 | 4334      |    1 |  101 |
+-----+------+------+-----------+------+------+
2 rows in set (0.11 sec)

3. 列子查询

子查询的返回结果为1列,可以是多行。
常用的操作符:IN、NOT IN、ANY、SOME、ALL。
IN:在指定的集合范围之内、多选一;
NOT IN:不在指定的集合范围之内;
ANY:子查询返回列表中,有任意一个满足即可;
SOME:与ANY等同,使用SOME的地方都可以使用ANY;
ALL:子查询返回列表的所有值都必须满足;


// IN的使用
// 查询 高三1班 和 高三2班的所有学生信息
// a. 查询1班 和 2班的id;
// b. 根据班级id来查询学生信息
mysql> select id from class where c_name="高三 1 班" OR  c_name="高三 2 班";
+----+
| id |
+----+
|  1 |
|  2 |
+----+
2 rows in set (0.00 sec)

mysql> select * from student where c_id IN (1,2);
+-----+--------+------+-----------+------+------+
| num | name   | age  | tel       | c_id | g_id |
+-----+--------+------+-----------+------+------+
| 101 | 张三   |   23 | 354456354 |    1 | NULL |
| 102 | 王五   |   34 | 4334      |    1 |  101 |
| 104 | 赵无极 |   23 | 4234      |    2 | NULL |
| 105 | 韩夫子 |   34 | 23        |    2 |  102 |
+-----+--------+------+-----------+------+------+
4 rows in set (0.00 sec)
// 使用列子查询
mysql> select * from student where c_id IN (select id from class where c_name="高三 1 班" OR  c_name="高三 2 班");
+-----+--------+------+-----------+------+------+
| num | name   | age  | tel       | c_id | g_id |
+-----+--------+------+-----------+------+------+
| 101 | 张三   |   23 | 354456354 |    1 | NULL |
| 102 | 王五   |   34 | 4334      |    1 |  101 |
| 104 | 赵无极 |   23 | 4234      |    2 | NULL |
| 105 | 韩夫子 |   34 | 23        |    2 |  102 |
+-----+--------+------+-----------+------+------+
4 rows in set (0.00 sec)

// ALL/SOME的使用
// 查询比高三2班 所有人年龄都高的学生
// a. 查询高三2班的id;
// b. 根据id查询所有2班学生的age;
// c. 比2班 所有人年龄都要大的学生;

mysql> select id from class where c_name="高三 2 班";
+----+
| id |
+----+
|  2 |
+----+
1 row in set (0.00 sec)

mysql> select age from student where c_id=2;
+------+
| age  |
+------+
|   23 |
|   34 |
+------+
2 rows in set (0.00 sec)

mysql> select * from student where age > ALL(select age from student where c_id=(select id from class where c_name="高三 2 班"));
Empty set (0.00 sec)

// ANY的使用
// 查询比高三2班 任意一人年龄都高的学生
// a. 查询高三2班的id;
// b. 根据id查询所有2班学生的age;
// c. 比2班 任意一人年龄都要大的学生;

mysql> select id from class where c_name="高三 2 班";
+----+
| id |
+----+
|  2 |
+----+
1 row in set (0.00 sec)

mysql> select age from student where c_id=2;
+------+
| age  |
+------+
|   23 |
|   34 |
+------+
2 rows in set (0.00 sec)

mysql> select * from student where age > ANY(select age from student where c_id=(select id from class where c_name="高三 2 班"));
+-----+------------+------+---------+------+------+
| num | name       | age  | tel     | c_id | g_id |
+-----+------------+------+---------+------+------+
| 102 | 王五       |   34 | 4334    |    1 |  101 |
| 103 | 李四       |   32 | 131434  |    3 |  101 |
| 105 | 韩夫子     |   34 | 23      |    2 |  102 |
| 106 | 高俅       |   25 | 42543   |    4 |  103 |
| 107 | 范瑶       |   26 | 2345    | NULL |  104 |
| 108 | 斯巴达克斯 |   27 | 422156  | NULL |  104 |
+-----+------------+------+---------+------+------+
6 rows in set (0.00 sec)

4. 行子查询

子查询的返回结果为1行,可以是多列。
常用的操作符:=、<>、IN、NOT IN。

mysql> update student set age=23 where num=102;
Query OK, 1 row affected (0.10 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from student;
+-----+------------+------+-----------+------+------+
| num | name       | age  | tel       | c_id | g_id |
+-----+------------+------+-----------+------+------+
| 101 | 张三       |   23 | 354456354 |    1 | NULL |
| 102 | 王五       |   23 | 4334      |    1 |  101 |
| 103 | 李四       |   32 | 131434    |    3 |  101 |
| 104 | 赵无极     |   23 | 4234      |    2 | NULL |
| 105 | 韩夫子     |   34 | 23        |    2 |  102 |
| 106 | 高俅       |   25 | 42543     |    4 |  103 |
| 107 | 范瑶       |   26 | 2345      | NULL |  104 |
| 108 | 斯巴达克斯 |   27 | 422156    | NULL |  104 |
+-----+------------+------+-----------+------+------+
8 rows in set (0.00 sec)
// 查询与 张三 年龄及班级相同的学生;
// Way1
mysql> select age, c_id from student where name="张三";
+------+------+
| age  | c_id |
+------+------+
|   23 |    1 |
+------+------+
1 row in set (0.00 sec)

mysql> select * from student where age>23 AND c_id=1;
+-----+------+------+------+------+------+
| num | name | age  | tel  | c_id | g_id |
+-----+------+------+------+------+------+
| 102 | 王五 |   34 | 4334 |    1 |  101 |
+-----+------+------+------+------+------+
1 row in set (0.00 sec)

mysql> select * from student where age=23 AND c_id=1;
+-----+------+------+-----------+------+------+
| num | name | age  | tel       | c_id | g_id |
+-----+------+------+-----------+------+------+
| 101 | 张三 |   23 | 354456354 |    1 | NULL |
| 102 | 王五 |   23 | 4334      |    1 |  101 |
+-----+------+------+-----------+------+------+
2 rows in set (0.00 sec)
// way3
mysql> select age, c_id from student where name="张三";
+------+------+
| age  | c_id |
+------+------+
|   23 |    1 |
+------+------+
1 row in set (0.00 sec)

mysql> select * from student where (age,c_id)=(23,1);
+-----+------+------+-----------+------+------+
| num | name | age  | tel       | c_id | g_id |
+-----+------+------+-----------+------+------+
| 101 | 张三 |   23 | 354456354 |    1 | NULL |
| 102 | 王五 |   23 | 4334      |    1 |  101 |
+-----+------+------+-----------+------+------+
2 rows in set (0.00 sec)
// Way3:行子查询
mysql> select * from student where (age,c_id)=(select age, c_id from student where name="张三");
+-----+------+------+-----------+------+------+
| num | name | age  | tel       | c_id | g_id |
+-----+------+------+-----------+------+------+
| 101 | 张三 |   23 | 354456354 |    1 | NULL |
| 102 | 王五 |   23 | 4334      |    1 |  101 |
+-----+------+------+-----------+------+------+
2 rows in set (0.00 sec)

5. 表子查询

子查询的返回结果为多行多列(一个表)。
常用的操作符:IN。


mysql> update student set age=34 where num=102;
Query OK, 1 row affected (0.15 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update student set c_id=2 where num=102;
Query OK, 1 row affected (0.17 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update student set c_id=1 where num=104;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from student;
+-----+------------+------+-----------+------+------+
| num | name       | age  | tel       | c_id | g_id |
+-----+------------+------+-----------+------+------+
| 101 | 张三       |   23 | 354456354 |    1 | NULL |
| 102 | 王五       |   34 | 4334      |    2 |  101 |
| 103 | 李四       |   32 | 131434    |    3 |  101 |
| 104 | 赵无极     |   23 | 4234      |    1 | NULL |
| 105 | 韩夫子     |   34 | 23        |    2 |  102 |
| 106 | 高俅       |   25 | 42543     |    4 |  103 |
| 107 | 范瑶       |   26 | 2345      | NULL |  104 |
| 108 | 斯巴达克斯 |   27 | 422156    | NULL |  104 |
+-----+------------+------+-----------+------+------+
8 rows in set (0.00 sec)
// 查询与 张三或王五的 年龄和班级相同的学生信息
mysql> select age,c_id from student where name="张三" OR name="王五";
+------+------+
| age  | c_id |
+------+------+
|   23 |    1 |
|   34 |    2 |
+------+------+
2 rows in set (0.00 sec)

mysql> select * from student where(age, c_id) IN (select age,c_id from student where name="张三" OR name="王五");
+-----+--------+------+-----------+------+------+
| num | name   | age  | tel       | c_id | g_id |
+-----+--------+------+-----------+------+------+
| 101 | 张三   |   23 | 354456354 |    1 | NULL |
| 104 | 赵无极 |   23 | 4234      |    1 | NULL |
| 102 | 王五   |   34 | 4334      |    2 |  101 |
| 105 | 韩夫子 |   34 | 23        |    2 |  102 |
+-----+--------+------+-----------+------+------+
4 rows in set (0.10 sec)

// 查询年龄>=24的学生信息, 及其班级信息
mysql> select * from student where age>=24;
+-----+------------+------+---------+------+------+
| num | name       | age  | tel     | c_id | g_id |
+-----+------------+------+---------+------+------+
| 102 | 王五       |   34 | 4334    |    2 |  101 |
| 103 | 李四       |   32 | 131434  |    3 |  101 |
| 105 | 韩夫子     |   34 | 23      |    2 |  102 |
| 106 | 高俅       |   25 | 42543   |    4 |  103 |
| 107 | 范瑶       |   26 | 2345    | NULL |  104 |
| 108 | 斯巴达克斯 |   27 | 422156  | NULL |  104 |
+-----+------------+------+---------+------+------+
6 rows in set (0.00 sec)

mysql> select s.*,c.* from (select * from student where age>=24) AS s LEFT JOIN class AS c ON s.c_id=c.id;
+-----+------------+------+---------+------+------+------+-----------+
| num | name       | age  | tel     | c_id | g_id | id   | c_name    |
+-----+------------+------+---------+------+------+------+-----------+
| 102 | 王五       |   34 | 4334    |    2 |  101 |    2 | 高三 2|
| 103 | 李四       |   32 | 131434  |    3 |  101 |    3 | 高三 3|
| 105 | 韩夫子     |   34 | 23      |    2 |  102 |    2 | 高三 2|
| 106 | 高俅       |   25 | 42543   |    4 |  103 |    4 | 高三 4|
| 107 | 范瑶       |   26 | 2345    | NULL |  104 | NULL | NULL      |
| 108 | 斯巴达克斯 |   27 | 422156  | NULL |  104 | NULL | NULL      |
+-----+------------+------+---------+------+------+------+-----------+
6 rows in set (0.00 sec)

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

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

相关文章

Codeforces Round 872 (Div. 2) A-C

Start&#xff1a;May/08/2023 20:05UTC8 Length&#xff1a;02:00 这次总该上分了吧 A LuoTianyi and the Palindrome String 1 s, 256 MB x8531 都一样是-1&#xff0c;普通回文是size()-1 #include<bits/stdc.h> using namespace std; #define int long long #def…

架构-软件工程模块-1

概述 这一模块选择题的分值比较多&#xff0c;案例题和论文也有能用上的地方。主要知识点会特殊标注或说明。 软件开发生命周期 软件工程三要素&#xff1a;方法、工具、过程。不会直接考&#xff0c;但可帮助记忆理解。 传统软件生命周期方法学分为&#xff1a;&#xff08;选…

使用sharding-scaling和sharding-proxy做分库分表数据迁移

背景&#xff1a; 现在有一个有一张表被分成了两张表&#xff0c;t_score1 ,t_score2&#xff0c;但后期数据量激增&#xff0c;两张表不能满足业务需求&#xff0c;扩张为2个库每个库2张表&#xff0c;即数据库 ds_0下有t_score1 ,t_score2 &#xff0c;数据库ds1下有t_score1…

浏览器插件的使用

善于使用浏览器插件&#xff0c;能起到高效上网的作用。 Microsoft Edge 是全球广受欢迎的浏览器&#xff0c;浏览器本身具有快速、简单和轻量级的特点。一流的性能系统和访问速度极大提升您的浏览体验。 对于浏览器的用户来说&#xff0c;安装一些实用的插件&#xff0c;能让…

Navicat设置Oracle数据库主键自增1的方法步骤

一、 创建如下表 Oracle数据库不同于Mysql、Sql Server数据库&#xff0c;Oracle数据库主键自增不能在建表时直接设置&#xff0c;而是需要通过序列和触发器进行设置&#xff01; 二、创建序列 1 2 3 4 5 6create sequence SEQ_DEVICEDATAINFO start with 1 …

iOS可视化动态绘制连通图

上篇博客《iOS可视化动态绘制八种排序过程》可视化了一下一些排序的过程&#xff0c;本篇博客就来聊聊图的东西。在之前的博客中详细的讲过图的相关内容&#xff0c;比如《图的物理存储结构与深搜、广搜》。当然之前写的程序是比较抽象的。上篇博客我们以可视化的方式看了一下各…

数据库(Sql server语言)(一)

例题&#xff1a;&#xff08;不介绍创建和插入&#xff09; star表 ●查询每个组合的名称及其成员个数 select g.name,count(*) 成员个数 from star s,stargroup g where s.gid g.gid group by g.name 如果不写where s.gidg,gid会出现成员个数重复 ●查询身高最高的团…

UG NX二次开发(C#)-建模-反向片体(SheetBody)的法向矢量

文章目录 1、前言2、在UG NX中构建一个片体3、在UG NX中查看片体的法向矢量4、采用UFun函数来实现法向反向5、代码实现6、测试效果1、前言 在UG NX中,一张曲面获取其所属的片体(SheetBody)对象,其在构建时有默认的法向矢量,有时处于功能的需求,比如加工时工件的材料去除方…

探秘信息检索:原理、实现与应用

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

(一)如何使用Spring Boot和MyBatis框架实现即时通信系统中的用户注册功能

文章目录 一、引言二、Spring Boot和MyBatis框架介绍三、注册1. 前端界面实现2. 后端数据持久化操作3. 代码示例 四、实现效果四、个人经验分享五、结语 一、引言 本文将介绍基于Spring Boot和MyBatis框架开发的注册功能实现&#xff0c;该功能是基于Linux的即时通信系统的一个…

二挡起步——pythonweb开发Django框架,前端原生+Django后端框架002(附带小案例)

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

ERROR: Could not find a valid gem ‘cocoapods‘ (>= 0) in any repository

Flutter启动的时候报错 需要重新安装cocoapods&#xff0c;那就重装&#xff0c;可是结果装不上 这是需要梯子的&#xff0c;我开了梯子也是一样安装不上 所以需要指定一下你的http代理ip和端口 你可以找一下你梯子的端口&#xff0c;找找代理命令&#xff0c;比如我的如下…

人工智能概述、发展历程及主要分支

人工智能概述 人工智能发展必备三要素&#xff1a; 数据 算法 计算力 &#xff0c;硬件支撑 CPU、GPU、TPU 计算力之CPU、GPU对比&#xff1a; CPU主要适合I\O密集型的任务 GPU主要适合计算密集型任务 什么类型的程序适合在GPU上运行&#xff1f; &#xff08;1&#…

数据库的逻辑组织

目录 一、数据库构架 二、系统数据库 1&#xff0e;master数据库 2. tempdb数据库 3. model数据库 4. msdb数据库 三、用户数据库 用户数据库在sysdatabases表中的记录 一、数据库构架 数据库存储是按物理方式在磁盘上作为两个或更多的文件实现。用户使用数据库时使…

java学习之异常三

目录 一、throws 一、基本说明 二、使用细节 二、自定义异常 一、 基本概念 ​编辑二、自定义异常的步骤 三、实例 四、练习 三、throw和throws的区别 四、本章作业 第一道 第二题 第三题 第四题 一、throws 一、基本说明 package com.hspedu.throws_;import java.i…

Linux常用命令(2)

文章目录 Linux常用命令&#xff08;2&#xff09;拷贝 cp语法拷贝hello.txt生成一个新文件hello1.txt拷贝hello.txt文件到hello目录里面去拷贝hello目录生成一个新目录hello1拷贝hello1目录到主目录里面去并且命名为hello2目录 更名/移动 mv删除 rm管理员命令echo / cat将信息…

JVM 程序计数器(PC 寄存器)

PC Register 介绍 JVM中的程序计数寄存器( Program Counter Register) 中&#xff0c;Register 的命名源于 CPU 的寄存器, 寄存器存储指令相关的现场信息。 CPU 只有把数据装载到寄存器才能够运行JVM 中的 PC 寄存器是对物理 PC 寄存器的一种抽象模拟PC 寄存器用来存储指向下一…

Vue 子组件触发父组件事件,传递多个参数以及异常情况处理

Start 今天这篇文章记录一下子组件调用父组件事件&#xff0c;传参的逻辑。以及一些特殊的情况。 1. 示例 1.1 父组件 <template><div>我是父组件<hr /><child to-say"toSay" /></div> </template><script> import ch…

toFixed()*100保留的小数位数和预想的不一致

目录 一、问题 二、原因及解决方法 三、总结 一、问题 1.因为演示需要&#xff0c;要造一些假数据&#xff0c;一些数据要求保留2位小数。这需求真的不难&#xff0c;不就是parseFloat().toFixed()不就完了。 2.所以很快就写了如下代码&#xff1a; let aMath.random()*(1…

ChatGPT国内镜像网站大盘点(国内可用免费ChatGPT镜像站点)

目录 ChatGPT国内镜像网站 很多网友想要国内可用免费ChatGPT镜像站点&#xff0c;ChatGPT可以说是最近大火的AI工具&#xff0c;但是国内的小伙伴是无法使用ChatGPT的&#xff0c;要想在国内直接使用ChatGPT的话不仅需要通过技术手段让网络满足要求&#xff0c;还需要国外的手…