数据库->联合查询

目录

一、联合查询

1.联合查询

2.多表联合查询时MYSQL内部是如何进⾏计算的

3.多表联合查询

3.1语法

3.2指定多个表,进行联合查询 

 3.3通过表与表中的链接条件过滤掉无效数据

3.4通过指定列查询,精简查询结果​编辑

3.5可以通过给表起别名的方式,来简化查询SQL语句

二、内连接

1.语法

2.示例

2.1查询 唐三藏 同学的成绩

2.2查看所有同学的总成绩,及同学的个人信息

2.3查询所有同学每⻔课的成绩,及同学的个⼈信息

三、外连接

1.语法

2.示例

2.1查询没有参加考试的同学信息

2.2查询没有学⽣的班级

四、自连接

1.应用场景

2.示例

2.1显⽰所有"MySQL"成绩⽐"JAVA"成绩⾼的成绩信息

2.2表连接练习

 五、子查询

1.语法

2.示例

2.1查询与"不想毕业"同学的同班同学(单行子查询)

2.2查询"MySQL"或"Java"课程的成绩信息(多行子查询)

2.3查询重复录⼊的分数(多列子查询)

六、合并查询

1.创建新表并初始化数据

2.Union

2.1作用

2.2示例

3.Union all

3.1作用

3.2示例

七、插入查询结果

1.语法

2.示例


一、联合查询

1.联合查询

在数据设计时由于范式的要求,数据被拆分到多个表中,那么要查询⼀个条数据的完整信息,就
要从多个表中获取数据,如下图所⽰:要获取学⽣的基本信息和班级信息就要从学⽣表和班级表中获取,这时就需要使⽤联合查询,这⾥的联合指的是多个表的组合

在工作中单独查询这两张表,都得不到一个完整的数据

一次查询涉及到两张或两张以上的表,就称为联合查询或(表关联查询)

2.多表联合查询时MYSQL内部是如何进⾏计算的

参与查询的所有表取笛卡尔积,结果集在临时表中

3.多表联合查询

drop table if exists class;
create table class(
  id bigint primary key auto_increment,
  name varchar(20)
);

drop table if exists student;
create table student(
  id bigint primary key auto_increment,
  name varchar(20) not null,
  sno varchar(10) not null,
  age int default 18,
  gender tinyint(1),
  enroll_date date,
  class_id bigint not null,
  foreign key (class_id) references class(id)
);

drop table if exists course;
create table course(
  id bigint primary key auto_increment,
  name varchar(20)
);

drop table if exists score;
create table score(
  id bigint primary key auto_increment,
  score float,
  student_id bigint,
  course_id bigint,
  foreign key (student_id) references student(id),
  foreign key (course_id) references course(id)
);

insert into course (name) values ('Java'), ('C++'), ('MySQL'), ('操作系统'), ('计算机网络'), ('数据结构');

insert into class(name) values ('Java001班'), ('C++001班'), ('前端001班');

insert into student (name, sno, age, gender, enroll_date, class_id) values
('唐三藏', '100001', 18, 1, '1986-09-01', 1),
('孙悟空', '100002', 18, 1, '1986-09-01', 1),
('猪悟能', '100003', 18, 1, '1986-09-01', 1),
('沙悟净', '100004', 18, 1, '1986-09-01', 1),
('宋江', '200001', 18, 1, '2000-09-01', 2),
('武松', '200002', 18, 1, '2000-09-01', 2),
('李逹', '200003', 18, 1, '2000-09-01', 2),
('不想毕业', '200004', 18, 1, '2000-09-01', 2);

insert into score (score, student_id, course_id) values
(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),
(60, 2, 1),(59.5, 2, 5),
(33, 3, 1),(68, 3, 3),(99, 3, 5),
(67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),
(81, 5, 1),(37, 5, 5),
(56, 6, 2),(43, 6, 4),(79, 6, 6),
(80, 7, 2),(92, 7, 6);

3.1语法
select * from 表一, 表二
3.2指定多个表,进行联合查询 

通过观察,两张表联合后的结果集中,有些是无效数据

 3.3通过表与表中的链接条件过滤掉无效数据

class_id 在 student 表中, 但两张表里都有 id 列,不指定表名时,MYSQL 无法分清要使用那张表中的 id 列

3.4通过指定列查询,精简查询结果
3.5可以通过给表起别名的方式,来简化查询SQL语句

在工作中两张表的关联,尽量使用联合和查询

二、内连接

1.语法

select 字段 from 表1 别名1, 表2 别名2 where 连接条件 and 其他条件; -- 精简写法
select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 where 其他条件; -- 规范写法

2.示例

2.1查询 唐三藏 同学的成绩

2.2查看所有同学的总成绩,及同学的个人信息

2.3查询所有同学每⻔课的成绩,及同学的个⼈信息

三、外连接

外连接分为左外连接、右外连接和全外连接三种类型,MySQL不⽀持全外连接。

左外连接:返回左表的所有记录和右表中匹配的记录。如果右表中没有匹配的记录,则结果集中对应字段会显⽰为NULL。

右外连接:与左外连接相反,返回右表的所有记录和左表中匹配的记录。如果左表中没有匹配的记录,则结果集中对应字段会显⽰为NULL。

全外连接:结合了左外连接和右外连接的特点,返回左右表中的所有记录。如果某⼀边表中没有匹配的记录,则结果集中对应字段会显⽰为NULL。

1.语法

-- 左外连接,表1完全显⽰
select 字段名 from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显⽰
select 字段 from 表名1 right join 表名2 on 连接条件;

2.示例

2.1查询没有参加考试的同学信息

2.2查询没有学⽣的班级

四、自连接

1.应用场景

⾃连接是⾃⼰与⾃⼰取笛卡尔积,可以把⾏转化成列,在查询的时候可以使⽤where条件对结果进⾏过滤,或者说实现⾏与⾏之间的⽐较。在做表连接时为表起不同的别名

2.示例

2.1显⽰所有"MySQL"成绩⽐"JAVA"成绩⾼的成绩信息

  两个表名重复

精简查询结果 用别名表示表头

2.2表连接练习

显⽰所有"MySQL"成绩⽐"JAVA"成绩⾼的学⽣信息和班级以及成绩信息

动态接收的条件放最后

 五、子查询

⼦查询是把⼀个SELECT语句的结果当做别⼀个SELECT语句的条件,也叫嵌套查询

1.语法

select * from table1 where col_name1 {= | IN} (
    select col_name1 from table2 where col_name2 {= | IN} [(
        select ...)
    ] ...
)

子查询是由很多条SQL语句组成的 可以把子查询中的SQL一条一条的执行 最终拿到想要的结果

由于嵌套的层级数没有固定的限制 如果多层嵌套的话查询的效率不可控 工作中谨慎使用

2.示例

2.1查询与"不想毕业"同学的同班同学(单行子查询)

在子查询中先执行内层的SQL,内层的SQL会产生一个值,做为外层查询的条件

2.2查询"MySQL"或"Java"课程的成绩信息(多行子查询)

子查询中返回的多个数据行

不包含MYSQL和Java:

2.3查询重复录⼊的分数(多列子查询)

过滤重复

解题思路:

1.对重复的列进行分组

2.统计下每个分组数

3.如果分组数大于1  则表示有重复记录

2.4查询所有⽐"Java001班"平均分⾼的成绩信息(在from⼦句中使⽤⼦查询)

解题思路:

1.先算出平均分

2.再用成绩表中的真实成绩与平均分做比较

temp:为临时表起一个别名 以便再条件过滤中使用临时表

六、合并查询

合并多个select操作返回的结果 最终返回一个结果集

1.创建新表并初始化数据

create table student1 like student;
insert into student1 (name, sno, age, gender, enroll_date, class_id) values
('唐三藏', '100001', 18, 1, '1986-09-01', 1),
('刘备', '300001', 18, 1, '1993-09-01', 3),
('张⻜', '300002', 18, 1, '1993-09-01', 3),
('关⽻', '300003', 18, 1, '1993-09-01', 3);

2.Union

2.1作用

该操作符⽤于取得两个结果集的并集。当使⽤该操作符时,会⾃动去掉结果集中的重复⾏

2.2示例

查询student表中 id < 3 的同学和student1表中的所有同学

单独查询单表也是可以的 

3.Union all

3.1作用

该操作符⽤于取得两个结果集的并集。当使⽤该操作符时,不会去掉结果集中的重复⾏

3.2示例

查询student表中 id < 3 的同学和student1表中的所有同学

七、插入查询结果

1.语法

INSERT INTO table_name [(column [, column ...])] SELECT ...

2.示例

-- 将student表中的C++001班的学生复制到student1表中
insert into student1 (name, sno, age, gender, enroll_date, class_id)
select s.name, s.sno, s.age, s.gender, s.enroll_date, s.class_id
from student s, class c where s.class_id = c.id and c.name = 'C++001班';

为重复的列指定表名.列号  不重复的列可以不加表名   推荐还是用表名.列名的方式指定查询结果

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

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

相关文章

k8s知识点总结

docker 名称空间 分类 Docker中的名称空间用于提供进程隔离&#xff0c;确保容器之间的资源相互独立。主要分类包括&#xff1a; PID Namespace&#xff1a;进程ID隔离&#xff0c;使每个容器有自己的进程树&#xff0c;容器内的进程不会干扰其他容器或主机上的进程。 NET Nam…

C++11(1)——右值引用、统一初始化、C++发展史

一、C的发展史 1.C的产生 C的起源可以追溯到1979年&#xff0c;当时本贾尼&#xff08;C创始人&#xff09;在贝尔实验室从事计算机科学与软件工程的研究工作。面对项目中复杂的软件开发任务&#xff0c;特别是模拟和操作系统的开发工作&#xff0c;他感受到了现有语言&#…

计算机毕业设计Spark+大模型知识图谱中药推荐系统 中药数据分析可视化大屏 中药爬虫 机器学习 中药预测系统 中药情感分析 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

javascript-Web APLs (三)

事件流 指的是事件完整执行过程中的流动路 说明&#xff1a;假设页面里有个div&#xff0c;当触发事件时&#xff0c;会经历两个阶段&#xff0c;分别是捕获阶段、冒泡阶段 简单来说&#xff1a;捕获阶段是 从父到子 冒泡阶段是从子到父 实际工作都是使用事件冒泡为主 事件…

11.Three.js使用indexeddb前端缓存模型优化前端加载效率

11.Three.js使用indexeddb前端缓存模型优化前端加载效率 1.简述 在使用Three.js做数字孪生应用场景时&#xff0c;我们常常需要用到大量模型或数据。在访问我们的数字孪生应用时&#xff0c;每次刷新都需要从web端进行请求大量的模型数据或其他渲染数据等等&#xff0c;会极大…

keepalive+mysql8双主

1.概述 利用keepalived实现Mysql数据库的高可用&#xff0c;KeepalivedMysql双主来实现MYSQL-HA&#xff0c;我们必须保证两台Mysql数据库的数据完全一致&#xff0c;实现方法是两台Mysql互为主从关系&#xff0c;通过keepalived配置VIP&#xff0c;实现当其中的一台Mysql数据库…

C++ 实现俄罗斯方块游戏

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

项目实战:基于Linux的Flappy bird游戏开发

一、项目介绍 项目总结 1.按下空格键小鸟上升&#xff0c;不按小鸟下落 2.搭建小鸟需要穿过的管道 3.管道自动左移和创建 4.小鸟撞到管道游戏结束 知识储备 1.C语言 2.数据结构-链表 3.Ncurses库 4.信号机制 二、Ncurses库介绍 Ncurses是最早的System V Release 4.0 (SVr4)中…

nginx上传文件超过限制大小、响应超时、反向代理请求超时等问题解决

1、文件大小超过限制 相关配置&#xff1a; client_max_body_size&#xff1a; Syntax:client_max_body_size size;Default:client_max_body_size 1m;Context:http, server, location 2、连接超时: proxy_read_timeout&#xff1a; Syntax:proxy_read_timeout time;Default…

C++ --- 多线程的使用

目录 一.什么是线程&#xff1f; 线程的特点&#xff1a; 线程的组成&#xff1a; 二.什么是进程&#xff1f; 进程的特点&#xff1a; 进程的组成&#xff1a; 三.线程与进程的关系&#xff1a; 四.C的Thread方法的使用&#xff1a; 1.创建线程&#xff1a; 2.join(…

基于Spring Boot的医疗陪护系统设计与实现(源码+定制+开发)病患陪护管理平台、医疗服务管理系统、医疗陪护信息平台

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

ViT面试知识点

文章目录 VITCLIPSAMYOLO系列问题 VIT 介绍一下Visual Transformer&#xff1f; 介绍一下自注意力机制&#xff1f; 介绍一下VIT的输出方式 介绍一下VIT做分割任务 VIT是将NLP的transformer迁移到cv领域&#xff0c;他的整个流程大概如下&#xff1a;将一张图片切成很多个pat…

【Comsol教程】计算流道中的流量

在进行微流控方面的仿真的时候可能需要计算某一流道中流量的大小&#xff0c;下面展示如何计算。 流量分为质量流量和体积流量&#xff0c;我们常采用体积流量。在COMSOL中有两种方法计算&#xff0c; 1.使用Comsol内置的函数 这里我使用的是蠕动流模块【spf】,定义了3个开放边…

LeetCode 3226. 使两个整数相等的位更改次数

. - 力扣&#xff08;LeetCode&#xff09; 题目 给你两个正整数 n 和 k。你可以选择 n 的 二进制表示 中任意一个值为 1 的位&#xff0c;并将其改为 0。 返回使得 n 等于 k 所需要的更改次数。如果无法实现&#xff0c;返回 -1。 示例 1&#xff1a; 输入&#xff1a; n …

项目升级到.Net8.0 Autofac引发诡异的问题

前两天把项目升级到.Net8.0了&#xff0c;把.Net框架升级了&#xff0c;其他一些第三方库升级了一部分&#xff0c;升级完以后项目跑不起来了&#xff0c;报如下错误&#xff1a; An unhandled exception occurred while processing the request. DependencyResolutionExcepti…

RabbitMQ 七种工作模式介绍

目录 1.简单模式队列 2.WorkQueue(⼯作队列) 3 Publish/Subscribe(发布/订阅) 4 Routing(路由模式) 5.Topics(通配符模式) 6 RPC(RPC通信) 7 Publisher Confirms(发布确认) RabbitMQ 共提供了7种⼯作模式供我们进⾏消息传递,接下来一一介绍它的实现与目的 1.简单模式队列…

自动化测试类型与持续集成频率的关系

持续集成是敏捷开发的一个重要实践&#xff0c;可是究竟多频繁的集成才算“持续”集成&#xff1f; 一般来说&#xff0c;持续集成有3种常见的集成频率&#xff0c;分别是每分钟集成、每天集成和每迭代集成。项目组应当以怎样的频率进行集成&#xff0c;这取决于测试策略&…

操作系统期中复习2-4单元

Chapter-2 第一个图形界面——Xerox Alto 早期操作系统&#xff1a;规模小&#xff0c;简单&#xff0c;功能有限&#xff0c;无结构(简单结构)。&#xff08;MS-DOS,早期UNIX&#xff09; 层次结构&#xff1a;最底层为硬件&#xff0c;最高层为用户层&#xff0c;自下而上构…

2-141 怎么实现ROI-CS压缩感知核磁成像

怎么实现ROI-CS压缩感知核磁成像&#xff0c;这个案例告诉你。基于matlab的ROI-CS压缩感知核磁成像。ROI指在图像中预先定义的特定区域或区域集合&#xff0c;选择感兴趣的区域&#xff0c;通过减少信号重建所需的数据来缩短信号采样时间&#xff0c;减少计算量&#xff0c;并在…

Android中同步屏障(Sync Barrier)介绍

在 Android 中&#xff0c;“同步屏障”&#xff08;Sync Barrier&#xff09;是 MessageQueue 中的一种机制&#xff0c;允许系统临时忽略同步消息&#xff0c;以便优先处理异步消息。这在需要快速响应的任务&#xff08;如触摸事件和动画更新&#xff09;中尤为重要。 在 An…