【MySQL】_自连接与子查询、

目录

 1. 自连接

2. 子查询(嵌套查询)

2.1 子查询分类

2.2 单行子查询示例1:查询不想毕业同学的同班同学

2.3 多行子查询示例2:查询语文或英语课程的信息成绩

3. 合并查询

3.1 示例1:查询id=3或者名字为英文的课程


本专栏关于联合查询已建立相应库与表,原文链接如下:

【MySQL】_联合查询基础表-CSDN博客

内连接原文如下:

【MySQL】_内连接-CSDN博客

外连接原文如下:

【MySQL】_外连接-CSDN博客

基于以上内容,本篇介绍自连接与子查询、合并查询;

 1. 自连接

        自连接是表自身与自身做笛卡尔积,在SQL中进行条件查询,都是指定某一列或多个列之间进行关系运算,无法进行行与行之间的运算,在某些情况下需要对行与行之间进行关系运算,就要使用到自连接。自连接的本质是将行转为列

示例:显示所有“课程id为3”比“课程id为1”成绩高的成绩信息:

(成绩信息在score表中)

(1)对score进行自连接(别名求笛卡尔积)并删除无效信息:

mysql> select* from score as s1, score as s2 where s1.student_id = s2.student_id;

(2)选出第一列id=1的课程与第二列id=3的课程:

mysql> select* from score as s1, score as s2-> where s1.student_id = s2.student_id-> and s1.course_id = 1-> and s2.course_id = 3;

(该结果表示有三个同学同时选修了这两门课程)

(3)增加左列成绩小于右列成绩条件,SQL指令与查询结果为:

mysql> select* from score as s1,score as s2-> where s1.student_id = s2.student_id-> and s1.course_id = 1-> and s2.course_id = 3-> and s1.score < s2.score;
+-------+------------+-----------+-------+------------+-----------+
| score | student_id | course_id | score | student_id | course_id |
+-------+------------+-----------+-------+------------+-----------+
|  70.5 |          1 |         1 |  98.5 |          1 |         3 |
|  33.0 |          3 |         1 |  68.0 |          3 |         3 |
+-------+------------+-----------+-------+------------+-----------+
2 rows in set (0.00 sec)

注:(1)不能直接进行自连接:

mysql> select* from score,score;
ERROR 1066 (42000): Not unique table/alias: 'score'

需要为表指定两个别名,即:

mysql> select* from score as s1, score as s2;

2. 子查询(嵌套查询)

子查询是指嵌入其他SQL语句中的select语句,即将多个查询语句合并为一个语句;

2.1 子查询分类

(1)单行子查询:查询结果只有一条记录;

(2)多行子查询:查询结果为多条记录;

2.2 单行子查询示例1:查询不想毕业同学的同班同学

(1)分步查询SQL指令及查询结果为:

mysql> select classes_id from student where name="不想毕业";
+------------+
| classes_id |
+------------+
|          1 |
+------------+
1 row in set (0.00 sec)mysql> select name from student where classes_id =1;
+------------+
| name       |
+------------+
| 黑旋风李逵 |
| 菩提老祖   |
| 白素贞     |
| 许仙       |
| 不想毕业   |
+------------+
5 rows in set (0.00 sec)

(2)子查询SQL指令及查询结果为:

mysql> select name from student where classes_id = (select classes_id from student where name="不想毕业");
+------------+
| name       |
+------------+
| 黑旋风李逵 |
| 菩提老祖   |
| 白素贞     |
| 许仙       |
| 不想毕业   |
+------------+
5 rows in set (0.00 sec)

即将条件查询的某一个值替换为一个select查询语句;

2.3 多行子查询示例2:查询语文或英语课程的信息成绩

先查询出两个课程的课程id,再根据course_id在score表中查询;

(1)分步查询SQL指令及查询结果为:

mysql> select id from course where name="语文" or name="英文";
+----+
| id |
+----+
|  4 |
|  6 |
+----+
2 rows in set (0.00 sec)mysql> select* from score where course_id in(4,6);
+-------+------------+-----------+
| score | student_id | course_id |
+-------+------------+-----------+
|  98.0 |          1 |         6 |
|  72.0 |          4 |         6 |
|  43.0 |          6 |         4 |
|  79.0 |          6 |         6 |
|  92.0 |          7 |         6 |
+-------+------------+-----------+
5 rows in set (0.00 sec)

(2)子查询SQL指令及查询结果为:

mysql> select* from score where course_id in(select id from course where name="语文" or name="英文");
+-------+------------+-----------+
| score | student_id | course_id |
+-------+------------+-----------+
|  98.0 |          1 |         6 |
|  72.0 |          4 |         6 |
|  43.0 |          6 |         4 |
|  79.0 |          6 |         6 |
|  92.0 |          7 |         6 |
+-------+------------+-----------+
5 rows in set (0.00 sec)

3. 合并查询

合并查询就是将两个查询语句的结果合并到一起;

3.1 示例1:查询id=3或者名字为英文的课程

(1)使用逻辑或实现查询:

mysql> select* from course where id<3 or name="英文";
+----+--------------+
| id | name         |
+----+--------------+
|  1 | Java         |
|  2 | 中国传统文化 |
|  6 | 英文         |
+----+--------------+
3 rows in set (0.00 sec)

(2)使用union关键字进行合并查询:

mysql> select* from course where id<3 union select* from course where name="英文";
+----+--------------+
| id | name         |
+----+--------------+
|  1 | Java         |
|  2 | 中国传统文化 |
|  6 | 英文         |
+----+--------------+
3 rows in set (0.00 sec)

注:(1)union与逻辑或的区别:

逻辑或只能对一张表的查询结果进行合并,但union可以对多张表的查询结果进行合并(要求多个结果的列须对应)

(2)union与union all的区别:

使用union关键字对多个查询结果进行合并时会自动去重,但unionall不会去重

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

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

相关文章

数据分析-Pandas数据探查初步柱状图

数据分析-Pandas数据探查初步柱状图 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&am…

在Arcgis中删除过滤Openstreetmap道路属性表中指定highway类型道路

一、导出道路类型并分析 1. 导出道路类型 选中highway属性列&#xff0c;选择汇总→确定 2. 分析 用Excel打开输出表&#xff0c;包含的道路类型如下 0.空值’’ 车辆可行驶道路&#xff08;和bfmap的并集&#xff09; 空值&#xff08;无定义道路&#xff09; 二、…

Docker - compose常用命令(常规操作顺序)

----------------------------------------------------------【Docker】-------------------------------------------------------------------- 【本地部署】 构建Docker镜像 docker build -t your-image-name .运行容器 docker run -p 8080:8700 your-image-name , 本地验…

基于Vue(提供Vue2/Vue3版本)和.Net Core前后端分离、强大、跨平台的快速开发框架

前言 今天大姚给大家推荐一款基于Vue&#xff08;提供Vue2/Vue3版本&#xff09;和.Net Core前后端分离、开源免费&#xff08;MIT License&#xff09;、强大、跨平台的快速开发框架&#xff0c;并且框架内置代码生成器&#xff08;解决重复性工作&#xff0c;提高开发效率&a…

element el-table表格内容宽度自适应,不换行,不隐藏

2024.2.27今天我学习了如何用el-table实现表格宽度的自适应&#xff0c;当我们动态渲染表格数据的时候&#xff0c;有时候因为内容太多会出现挤压换行的效果&#xff1a; 我们需要根据内容的最大长度设置动态的宽度&#xff0c;这边我在utils里面封装了一个js&#xff1a; //…

求两个向量之间的夹角

求两个向量之间的夹角 介绍Unity的API求向量夹角Vector3.AngleVector3.SignedAngle 自定义获取方法0-360度的夹角 总结 介绍 求两个向量之间的夹角方法有很多&#xff0c;比如说Unity中的Vector3.Angle&#xff0c;Vector3.SignedAngle等方法&#xff0c;具体在什么情况下使用…

高性能Server的基石:reactor反应堆模式

业务开发同学只关心业务处理流程。但是我们开发的程序都是运行服务端server上&#xff0c;服务端server接收到IO请求后&#xff0c;是如何处理请求并最终进入业务流程的呢&#xff1f;这里不得不提到reactor反应堆模型。reactor反应堆模型来源于大师Doug Lea在 《Sacalable io …

Unity中URP下实现水体(水面反射)

文章目录 前言一、原理1、法一&#xff1a;使用立方体纹理 CubeMap&#xff0c;作为反射纹理使用2、法二&#xff1a;使用反射探针生成环境反射图&#xff0c;所谓反射的采样纹理 二、实现水面反射1、定义和申明CubeMap2、反射向量需要什么3、计算 N ⃗ \vec{N} N 4、计算 V ⃗…

Mybatis | Mybatis的“入门程序“

Mybatis的入门程序 目录: Mybatis的入门程序一、查询数据根据表 “主键id” 查询数据模糊查询 二、添加数据三、更新数据四、删除数据 作者简介 &#xff1a;一只大皮卡丘&#xff0c;计算机专业学生&#xff0c;正在努力学习、努力敲代码中! 让我们一起继续努力学习&#xff0…

Freesia项目介绍

项目介绍 这是一个Spring Boot Vue的前后端分离项目&#xff0c;实现的是一个通用的后台管理系统。 框架使用 前端使用了layui-vue和layui-vue-admin&#xff0c;分别提供了组件和前端整体架构的支持。 后端使用Spring Boot框架管理 项目技术使用 前端 Layui-vue、Layui…

Android 接入指纹识别

接入指纹框架&#xff1a;https://github.com/Tencent/soter implementation com.github.Tencent.soter:soter-wrapper:2.0.91.Application中初始化 class IApplication : Application() {override fun onCreate() {super.onCreate()instance thisinitSort()}private fun in…

Java8 Stream操作流10条常用方法

1.基础数据 Data AllArgsConstructor NoArgsConstructor public class User {private String name;private Integer age;private String sex;private String city; //城市private Integer money; //业绩金额 } //准备数据List<User> users new ArrayList<>();use…

UnityWebGL UGUI中文不显示问题

这是Unity编辑中效果 打包成webgl后的效果&#xff08;中文没有显示出来&#xff09; 解决方法 将Unity默认使用的Arial替换成中文字体。 1.找到电脑字体库&#xff08;win电脑字体库路径&#xff1a;C:\Windows\Fonts &#xff1b;Mac电脑搜索“字体册”&#xff09;。 2.将…

P1015 [NOIP1999 普及组] 回文数

难度&#xff1a;普及- 题目描述 若一个数&#xff08;首位不为零&#xff09;从左向右读与从右向左读都一样&#xff0c;我们就将其称之为回文数。 例如&#xff1a;给定一个十进制数 56&#xff0c;将 56 加 65&#xff08;即把 56 从右向左读&#xff09;&#xff0c;得到…

java008 - Java方法

1、方法概述 1.1 概念 将独立功能的代码块组织成为一个整体&#xff0c;使其具有特殊功能的代码集。 1.2 注意事项 方法必须先创建才能使用&#xff0c;该过程称为方法的定义方法创建好不能直接运行&#xff0c;需要手动使用才执行&#xff0c;该过程称为方法的调用 2、方…

ABAP-CPI: Get CPI Monitoring Log (通过postman去获取CPI监控中心的日志)

参照文档: SAP Business Accelerator Hub Using Message Monitoring and Logging (sap.com) 进入到你的CPI监控中心: 获取到上面的 https://..hana.ondemand.com的地址,在它后面加上/api/v1 即https://....hana.ondemand.com/api/v1 然后就可以开始postman调用了,文章…

终于支持中文,开源手绘风格画板工具 Revezone 推荐!

Excalidraw 是一款老牌的手绘风格画板工具&#xff0c;颜值高&#xff0c;操作简单&#xff0c;GitHub 上拥有 69k 的 Star &#x1f449; https://excalidraw.com/ 可惜的是&#xff0c;Excalidraw 只有网页版&#xff0c;也不支持中文字体&#xff1a; 最近发现了国内开发者…

Random,随机函数

黑马程序员学习笔记 nextInt(n)&#xff1a; 只生成0~(n-1)之间的数字&#xff0c;不包括n 主要代码就三个; package com.zhang.random;import java.util.Random;public class RandomDemo1 {public static void main(String[] args) {//目标&#xff1a;掌握使用Random生成随…

SAP PO接口行项目json缺少中括号[]问题

PO接口小问题问题&#xff1a;如果需要同时传输DATA与ITEM&#xff0c;此处选择很重要&#xff0c;如果选择&#xff1a;HTTP Header ITEM将缺少[].需要注意 PO接口小问题 问题&#xff1a;如果需要同时传输DATA与ITEM&#xff0c;此处选择很重要&#xff0c;如果选择&#…

Vue项目 快速上手(如何新建Vue项目,启动Vue项目,Vue的生命周期,Vue的常用指令)

目录 一.什么Vue框架 二.如何新建一个Vue项目 1.使用命令行新建Vue项目 2.使用图形化界面新建Vue项目 三.Vue项目的启动 启动Vue项目 1.通过VScode提供的图形化界面启动Vue项目 2.通过命令行的方式启动Vue项目 四.Vue项目的基础使用 常用指令 v-bind 和 v-model v…