mysql的多表查询和子查询

news2024/7/6 19:36:12

多表查询:查询数据时,需要使用多张表来查询

多表查询分类:

1.内连接查询

2.外连接查询

3.子查询

笛卡尔积: 

create table class
(
    id int primary key auto_increment,
    name varchar(10)
);
create table student
(
    id int primary key auto_increment,
    name varchar(10),
    class_id int,
    constraint FK_student_class_id foreign key(class_id) references class(id)
);

insert into class(name) values ('清北班'),('冲刺班');
insert into student(name,class_id) values ('aaa',1),('bbb',1),('ccc',2),('ddd',2);

-- 多表查询:查询所有学生信心和所属的班级
select student.id, student.name, class_id ,class.id, class.name from student,class;

 

根据图片我们发现两张表相互查询,导致数据出现问题,这种问题叫笛卡尔积(多张表的每行数据进行了交叉查询)

解决方案:在进行多表查询时,消除笛卡尔积

查询时添加条件:主表.主表主键=从表.从表外键 

select student.id, student.name, class_id ,class.id, class.name from student,class where class_id=class.id
order by student.id ASC;

 

练习:查询id为1的学生一级班级信息

select student.id, student.name, class_id,class.id,class.name from student,class
where class_id=class.id -- 消除笛卡尔积
and student.id=1;

 内连接查询

1.内连接查询语法

内连接操作的目的是把多张表中互相关联的数据查询出来

1.隐式内连接

select 列名 from 左表,右表 where 从表.外键=主键.主键

2.显示内连接

select 列名 from 左表 [inner] join 右表 on 从表.外键=主键.主键

-- 查询 aaa 学生,并显示学生id,姓名,班级名
-- 语法1:
select student.id,student.name,class.name
from student,class
where class_id=class.id and student.name ='aaa';

-- 语法2:
select student.id,student.name,class.name
from student inner join class
on student.class_id = class.id #消除笛卡尔积
-- on的优先级高于where
where student.name='aaa';


-- 使用别名的用法
select s.id,s.name,c.name
from student AS s inner join class AS c
on s.class_id = c.id
where s.name='aaa';

 外连接查询

外连接查询有两种方式:
1.左外连接:左表中所有记录都出现在结果中,如果右表没有匹配的记录,使用null填充

select 列名 from 左表 left join 右表 on 从表.外键=主表.主键

2.右表连接:右表中所有记录都出现在结果中,如果左表没有匹配的记录,使用null填充

select 列名 from 左表 right join 右表 on 从表.外键=主表.主键
-- 这时候添加一个新班级,没有添加学生
insert into class (id, name) values (null,'补差班');
-- 查询,不会显示新班级
select c.name,s.id AS studentId,s.name
from class AS c inner join student AS s
on c.id = s.class_id;

所以我们要使用外连接 

select c.name,s.id AS studentId,s.name
from class AS c left join student AS s
on c.id = s.class_id;

 子查询

根据子查询的结果,可以分为单行单列,多行单列,多行多列

单行单列

如果子查询时单行单列,父查询使用比较运算符  ><=

练习:
 

-- 查询学生id最大的学生信息
select
id, name
from student
where id=(select max(id) from student);

子查询  select max(id) from student  结果:

结果是单行单列,使用><= 

-- 查询学生id大于bbb的id的学生信息
select
id,name
from student
where id>(select id from student where name='bbb');

 多行单列

如果子查询的结果是多行单列,可以认为是数组,父查询使用in,all.any关键字

关键字说明
in查询包含在in条件的所有数据
all可以与> <号结合起来,分别表示大于或小于其中的所有数据为真
any可以与> <号结合起来,分别表示大于或小于其中的任意一个数据为真
-- 查询 所有学生id>2的学生的班级信息
-- 1. 查询学生id>2的学生的班级id
select class_id from student where id>2;
-- 2.查询 所有学生id>2的学生的班级信息
select id, name from class
where id in (select class_id from student where id>2);

select class_id from student where id>2;的结果是多行单列

 select id, name from class
where id in (select class_id from student where id>2);的结果

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

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

相关文章

2024软件测试面试题总结

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 测试技术面试题 1、什么是兼容性测试&#xff1f;兼容性测试侧…

2024年Java JDK下载安装教程,附详细图文

文章目录 简介一、JDK的下载二、JDK的安装三、设置环境变量(不一定需要执行&#xff09; 简介 博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f34…

打印机连接电脑后打印无反应解决小方法

测试页打印失败是否参阅打印疑难解答已或得帮助 一台刚购买的新惠普打印机&#xff0c;拆箱后正常安装&#xff0c;接通电源、USB线连接电脑&#xff0c;正常安装驱动光盘&#xff1b;然后打印测试页来测试打印机&#xff0c;这个时候你点打印测试页&#xff0c;在打印任务里会…

国家级会议报道:贝锐蒲公英异地组网高效实现前方数据回传

作为市委宣传部的国有新闻媒体&#xff0c;在日常工作中会派遣大量人员外出进行采访、报道&#xff0c;还经常面临国家级重要会议或活动的报道任务。 在这些工作中&#xff0c;前方人员往往需要和后方人员协同、保证内容的时效性&#xff0c;及时反馈现场的相关资料和信息、访…

docker入门级命令

基本概念 docker的连个基本概念&#xff1a;镜像、容器。 docker镜像可以理解为是存储docker安装包的地方&#xff0c;比如&#xff1a;mcr.microsoft.com/mssql/server:2017-latest是sqlserver的docker镜像。 可以通过docker pull命令拉取远程镜像到本地。比如&#xff1a;…

JWT原理解析

一、概述 虽然现在很多的开发框架会支持JWT的使用&#xff0c;但是对JWT还是没有一个详细的了解&#xff0c;有很多疑惑&#xff1a; JWT比之前的session或者token有什么好处&#xff1f;JWT的构成元素是什么&#xff1f;JWT从生成到使用的详细流程&#xff1f; 二、 JWT 2…

PLL深度解析第一篇——PLL的知识图谱

在硬件电路中&#xff0c;时钟就像心脏一样&#xff0c;在时钟的节拍下&#xff0c;不同的芯片、不同的电路、不同的接口都可以有序的进行工作或者通信&#xff08;类似流水线一样&#xff0c;必须有节奏的运行&#xff09;。 但是在芯片中&#xff0c;不同的模块和接口工作的频…

chrome浏览器安装elasticsearch的head可视化插件

head插件简介 elasticsearch-head被称为是弹性搜索集群的web前端&#xff0c;head插件主要是用来和elastic Cluster交互的Web前端 head插件历史 elasticsearch-head插件在0.x-2.x版本的时候是集成在elasticsearch内的&#xff0c;由elasticsearch的bin/elasticsearch-plugin…

详细介绍gnomAD

字段含义介绍&#xff1a; https://www.biorxiv.org/content/biorxiv/early/2020/04/08/531210/DC1/embed/media-1.pdf?downloadtrue 版本更新 gnomAD v3.0 | MacArthur Lab

vue 实现项目进度甘特图

项目需求&#xff1a; 实现以1天、7天、30天为周期&#xff08;周期根据筛选条件选择&#xff09;&#xff0c;展示每个项目不同里程碑任务进度。 项目在Vue-Gantt-chart: 使用Vue做数据控制的Gantt图表基础上进行了改造。 有需要的小伙伴也可以直接引入插件&#xff0c;自己…

C++中的继承与多态

一、继承&#xff1a; 1.什么是继承&#xff1f; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象…

行为学学习记忆实验和抗焦虑实验两款硬件

安徽耀坤XWX-BM八臂迷宫实验&#xff08;Eight-arm Maze Test&#xff0c;RMT&#xff09;由八个完全相同的臂组成&#xff0c;这些臂从一个中央平台放射出来&#xff0c;所以又被称为放射迷宫。其基本方式是&#xff1a;训练动物受食物的驱使对迷宫的各臂进行探究&#xff0c;…

《第二行代码》第二版学习笔记(6)——内容提供器

文章目录 一 运行时权限2.权限分类3 运行时申请权限 二、内容提供器1、 ContentResolver的基本用法2、现有的内容提供器3、创建自己的内容提供器2.1 创建内容提供器的步骤2.2 跨程序数据共享 内容提供器&#xff08;Content Provider&#xff09;主要用于在不同的应用程序之间实…

用VMware虚拟机安装Centos7

用VMware虚拟机安装Centos7&#xff0c;无需废话&#xff0c;下面直接给步骤。 目录 1.下载VMware2.下载CentOS 73.安装VMware4.安装虚拟机 1.下载VMware VMware官方下载地址 里面可以选择你喜欢的一个版本&#xff0c;然后选择Windows64位的来下载。 2.下载CentOS 7 Cent…

ssm082基于java斗车交易系统设计与实现+vue

斗车交易系统 摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&…

冯唐成事心法笔记 —— 知世

系列文章目录 冯唐成事心法笔记 —— 知己 冯唐成事心法笔记 —— 知人 冯唐成事心法笔记 —— 知世 冯唐成事心法笔记 —— 知智慧 文章目录 系列文章目录PART 3 知世 成事者的自我修养怎样做一个讨人喜欢的人第一&#xff0c;诚心第二&#xff0c;虚心 如何正确看待别人的评…

[Android]修改应用包名、名称、版本号、Icon、启动页以及环境判断和打包

1.修改包名 在Android Studio中更改项目的包名涉及几个步骤&#xff1a; 打开项目结构: 在Android Studio中&#xff0c;确保您处于Android视图模式&#xff08;在左侧面板顶部有一个下拉菜单可以选择&#xff09;。 重命名包名: 在项目视图中&#xff0c;找到您的包名&…

挑战一周完成Vue3实战项目硅谷甄选Day1:项目初始化、项目配置、项目集成

一、项目初始化 node v16.4.0以上&#xff08;查看node版本 : node -v&#xff09; pnpm 8.0.0&#xff08;npm i -g pnpm8.0.0&#xff09; 在想创建的位置新建文件夹自己命名 在此文件夹下cmd:pnpm create vite 选择如下配置 Project name&#xff08;项目名称&#xff0…

【网络编程】TCP流套接字编程 | Socket类 | ServerSocket类 | 文件资源泄露 | TCP回显服务器 | 网络编程

文章目录 TCP流套接字编程1.ServerSocket类2.Socket类3.文件资源泄露4.**TCP回显服务器** TCP流套接字编程 ​ ServerSocket类和Socket类这两个类都是用来表示socket文件&#xff08;抽象了网卡这样的硬件设备&#xff09;。 TCP是面向字节流的&#xff0c;传输的基本单位是b…

这样狠心的女人,不配当妈!

男人小时候经常受父亲虐待&#xff0c;初中毕业就到深圳打拼&#xff0c;基本与父母再无联系。 因为心有创伤&#xff0c;他没有考虑过结婚的事情&#xff0c;也不希望自己的娃成为受苦的一代。 然而&#xff0c;机缘巧合&#xff0c;他偶然之间认识了自己的爱人。 在妻子小的时…