mySql数据库学习003-多表查询

多表查询

创建数据表:班级表与学生表

create table if not exists class(id tinyint unsigned primary key auto_increment,name varchar(20) not null,description varchar(255),createAt timestamp default current_timestamp,updateAt timestamp default current_timestamp on update current_timestamp
);insert into class (name, description) values ('一班','火箭班');
insert into class (name, description) values ('二班','平行班');
insert into class (name, description) values ('三班','实验班');
insert into class (name, description) values ('四班','待定班');create table if not exists student (id int unsigned primary key auto_increment,name varchar(20) not null,age tinyint unsigned not null,gender enum('男','女','保密') default '保密',class_id tinyint unsigned,createAt timestamp default current_timestamp,updateAt timestamp default current_timestamp on update current_timestamp,foreign key(class_id) references class(id) on update cascade on delete set null
);insert into student (name,age,gender,class_id) values ('张三',20,'男',1);
insert into student (name,age,gender,class_id) values ('李四',19,'女',1);
insert into student (name,age,gender,class_id) values ('王五',21,'女',2);
insert into student (name,age,gender,class_id) values ('赵六',18,'女',2);
insert into student (name,age,gender,class_id) values ('孙七',19,'男',3);
insert into student (name,age,gender,class_id) values ('周八',19,'男',3);
insert into student (name,age,gender) values ('张三丰',15,'男');

解释

  • student 表设置外键 class_id, 在进行 update 操作时,级联变动(即从表也跟随更新)。delete 操作时,设置为 null

一、直接查询
select * from student, class

查询结果:

idnamedescriptioncreateAtupdateAtid(1)name(1)agegenderclass_idcreateAt(1)updateAt(2)
1一班火箭班2024-04-09 19:05:392024-04-09 19:05:391张三2012024-04-09 19:10:012024-04-09 19:10:01
2二班平行班2024-04-09 19:05:392024-04-09 19:05:391张三2012024-04-09 19:10:012024-04-09 19:10:01

……

解释

  • 通过查询发现,查询的数据总量为 4 * 7 = 28 条,是 class 表与 student 表的组合。

select * from student, class where student.class_id = class.id

查询结果:

idnameagegenderclass_idcreateAtupdateAtid(1)name(2)descriptioncreateAt(1)updateAt(1)
1张三2012024/4/9 19:10:012024/4/9 19:10:011一班火箭班2024/4/9 19:05:392024/4/9 19:05:39
2李四1912024/4/9 19:10:012024/4/9 19:10:011一班火箭班2024/4/9 19:05:392024/4/9 19:05:39
3王五2122024/4/9 19:10:012024/4/9 19:10:012二班平行班2024/4/9 19:05:392024/4/9 19:05:39
4赵六1822024/4/9 19:10:012024/4/9 19:10:012二班平行班2024/4/9 19:05:392024/4/9 19:05:39
5孙七1932024/4/9 19:10:012024/4/9 19:10:013三班实验班2024/4/9 19:05:392024/4/9 19:05:39
6周八1932024/4/9 19:10:012024/4/9 19:10:013三班实验班2024/4/9 19:05:392024/4/9 19:05:39

解释:

  • 因为 student 表中 name 为“张三丰”的数据,class_idnull,故没有被查询出来;

二、连接查询
1. 内连接查询 (inner join 或 join)
select * from student join class on student.class_id = class.id;

查询结果:

idnameagegenderclass_idcreateAtupdateAtid(1)name(2)descriptioncreateAt(1)updateAt(1)
1张三2012024/4/9 19:10:012024/4/9 19:10:011一班火箭班2024/4/9 19:05:392024/4/9 19:05:39
2李四1912024/4/9 19:10:012024/4/9 19:10:011一班火箭班2024/4/9 19:05:392024/4/9 19:05:39
3王五2122024/4/9 19:10:012024/4/9 19:10:012二班平行班2024/4/9 19:05:392024/4/9 19:05:39
4赵六1822024/4/9 19:10:012024/4/9 19:10:012二班平行班2024/4/9 19:05:392024/4/9 19:05:39
5孙七1932024/4/9 19:10:012024/4/9 19:10:013三班实验班2024/4/9 19:05:392024/4/9 19:05:39
6周八1932024/4/9 19:10:012024/4/9 19:10:013三班实验班2024/4/9 19:05:392024/4/9 19:05:39

解释:

  • 查询语句中,join 表示连接,条件语句采用关键词 on,功能类似 where
  • 内连接查询的结果与直接查询的结果是一样的。相关sql语句如下:
select * from student, class where student.class_id = class.id
  • 如果需要查询出指定字段,需要设置具体哪个表的哪个字段。sql 语句如下:
select student.id, student.name,class.name, from student, class where student.class_id = class.id
  • 同时,可以设置别名,具体的 sql语句如下:
select stu.id, stu.name, cls.name className from student stu, class cls where stu.class_id = cls.id;
-- 注意:stu 为 student 的别名,cls 为 class 的别名,className 为 class 表的 name 的别名;
idnameclassName
1张三一班
2李四一班
3王五二班
4赵六二班
5孙七三班
6周八三班

2. 外连接查询
2.1 左外连接查询(left outer join 或 left join)
select * from student left join class on student.class_id = class.id;

查询结果:

idnameagegenderclass_idcreateAtupdateAtidnamedescriptioncreateAtupdateAt
1张三2012024/4/9 19:10:012024/4/9 19:10:011一班火箭班2024/4/9 19:05:392024/4/9 19:05:39
2李四1912024/4/9 19:10:012024/4/9 19:10:011一班火箭班2024/4/9 19:05:392024/4/9 19:05:39
3王五2122024/4/9 19:10:012024/4/9 19:10:012二班平行班2024/4/9 19:05:392024/4/9 19:05:39
4赵六1822024/4/9 19:10:012024/4/9 19:10:012二班平行班2024/4/9 19:05:392024/4/9 19:05:39
5孙七1932024/4/9 19:10:012024/4/9 19:10:013三班实验班2024/4/9 19:05:392024/4/9 19:05:39
6周八1932024/4/9 19:10:012024/4/9 19:10:013三班实验班2024/4/9 19:05:392024/4/9 19:05:39
7张三丰15Null2024/4/9 19:11:172024/4/9 19:11:17NullNullNullNullNull

解释:

  • 结果集中,把左表 student 的数据全部查询出来了,包括 class_id = null 的数据(name = '张丰' );
  • 左外连接查询,on 后的条件是不约束 左表 student 的,只 约束 右表 class
  • 简单来说,左外连接的特点是:会将左表的数据全部查询出来,并把右表符合条件的数据查询出来
2.2 右外连接查询
select * from student right join class on student.class_id = class.id;

查询结果:

idnameagegenderclass_idcreateAtupdateAtidnamedescriptioncreateAtupdateAt
1张三2012024/4/9 19:10:012024/4/9 19:10:011一班火箭班2024/4/9 19:05:392024/4/9 19:05:39
2李四1912024/4/9 19:10:012024/4/9 19:10:011一班火箭班2024/4/9 19:05:392024/4/9 19:05:39
3王五2122024/4/9 19:10:012024/4/9 19:10:012二班平行班2024/4/9 19:05:392024/4/9 19:05:39
4赵六1822024/4/9 19:10:012024/4/9 19:10:012二班平行班2024/4/9 19:05:392024/4/9 19:05:39
5孙七1932024/4/9 19:10:012024/4/9 19:10:013三班实验班2024/4/9 19:05:392024/4/9 19:05:39
6周八1932024/4/9 19:10:012024/4/9 19:10:013三班实验班2024/4/9 19:05:392024/4/9 19:05:39
NullNullNullNullNullNullNull4四班待定班2024/4/9 19:05:392024/4/9 19:05:39

解释:

  • 左外连接查询,on 后的条件是不约束 右表 class 的,只 约束 左表 student
  • 简单来说,右外连接的特点是:会将右表的数据全部查询出来,并把左表符合条件的数据查询出来

3. UNION 查询
select id, name from student union select id, name from class;

查询结果:

idname
1张三
2李四
3王五
4赵六
5孙七
6周八
7张三丰
1一班
2二班
3三班
4四班

解释

  • union 查询的作用是:在纵向上将多张表的查询结果拼接起来。同时条件是,两张表的查询字段个数形同,如都是 id, name 字段。

4. 子查询
4.1 将一个查询语句的查询结果作为另外一个查询语句的条件来使用
select name from class where id = (select class_id from student where id = 3)

查询结果:

name
二班
select name from class where id in (select class_id from student where id >= 3)

查询结果:

name
二班
三班

解释

  • 做为条件的查询语句的结果是一个值,可以使用 = 做为另外查询语句的条件;如果做为条件的查询语句的结果是多个值,需要使用 in 做为另外查询语句的条件。
4.2 将一个查询语句的查询结果作为另外一个查询语句的表来使用
select * from (select name from class where id >= 2) t

查询结果:

name
二班
三班
四班

解释

  • 将一个查询语句的查询结果作为另外一个查询语句的表来使用,必须对条件(表)设置别名,如示例中的 t

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

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

相关文章

面试算法-171-翻转二叉树

题目 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 解 class Solution {public TreeNode invertTree(TreeNode root) {if (root n…

Leetcode【双指针法】

目录 一、left right在一个循环里 二、两个指针在各自的循环里 三、slow fast追逐型 四、slow fast条件型 双指针法常用与题型:数组、字符串、链表、N数之和 一、left right在一个循环里 left right在一个循环里。 left和right移动需要条件,一般是向…

腾讯云4核8G服务器多少钱?4核8G能干啥?

腾讯云4核8G服务器多少钱?腾讯云4核8G轻量应用服务器12M带宽租用价格646元15个月,活动页面 txybk.com/go/txy 活动链接打开如下图所示: 腾讯云4核8G服务器优惠价格 这台4核8G服务器是轻量应用服务器,详细配置为:轻量4核…

【2024年5月备考新增】冲刺(1)《第四版教材十五矩阵》

所谓十五矩阵,就是十大管理,五大过程组 【高项】信息系统项目管理师教程(第4版)十五矩阵知识领域项目管理过程组启动过程组规划过程组执行过程组监控过程组收尾过程组项目整合管理制定项目章程制订项目管理计划指导与管理项目工作监控项目工作结束项目或阶段管理项目知识实…

前端代码优化--computed

随便记录一下 主要是通过计算属性来简化和优化代码。在 Vue 中,计算属性是一种方便的工具,可以让你根据依赖状态的变化来动态计算衍生值。在这个例子中,我们使用计算属性 formattedCommunicationType 来根据 workDetail.realTimeItemDeviceDT…

node.js常用命令大全

命令用法nodenode [文件名]:运行指定的 Node.js 脚本文件; node --version:显示当前安装的 Node.js 版本号; node -h 或 node --help:显示 Node.js 的帮助信息。npmnpm install [模块名]:安装指定的 Node.j…

Scala之函数Day-2

Scala 函数(Function) 概述 将一段逻辑进行封装便于进行重复使用,被封装的这段逻辑就是函数。在Scala中,必须通过def来定义函数 基本语法 def 函数名(参数列表) : 返回值类型 {函数体return 返回值 }案例 // 案例:定义函数计算两个整数的…

openlayer实现webgis端绘制制图及编辑

在WebGIS端制图是指通过Web浏览器界面实现地理信息数据的可视化、编辑、分析以及地图产品的制作。这一过程通常涉及以下几个关键环节: **1. 前端技术栈: •HTML/CSS/JavaScript:作为Web开发的基础,用于构建用户界面布局、样式设…

Win11又来「重大」更新!

ChatGPT狂飙160天,世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站ai人工智能工具 更多资源欢迎关注 Windows 11预览通道的22635.3420版本迎来了几个比较大的改进,主要有三个方面: …

一种快速移植 OpenHarmony Linux 内核的方法

移植概述 本文面向希望将 OpenHarmony 移植到三方芯片平台硬件的开发者,介绍一种借助三方芯片平台自带 Linux 内核的现有能力,快速移植 OpenHarmony 到三方芯片平台的方法。 移植到三方芯片平台的整体思路 内核态层和用户态层 为了更好的解释整个内核…

python-study-day1-(病人管理系统-带sql)

MainWindow代码 from tkinter import * from tkinter import messagebox from tkinter.ttk import Comboboxclass MianWindow(Frame):def __init__(self, masterNone):super().__init__(master, padx30, pady20)self.flag 0self.pack(expandTrue, fillBOTH)self.id StringVa…

深入OceanBase内部机制:系统架构与组件精讲

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 目录 1️⃣OceanBase 整体架构1.1 分区1.2 分片1.3 日志流1.4 对等节点1.5 多租户 2️⃣OceanBase 架构与组件详解2.1 存储层2.2 …

Disk Drill Enterprise for Mac v5.5.1515数据恢复软件中文版

Disk Drill 是 Mac 操作系统固有的Mac数据恢复软件:使用 Recovery Vault 轻松保护文件免遭意外删除,并从 Mac 磁盘恢复丢失的数据。支持大多数存储设备,文件类型和文件系统。 软件下载:Disk Drill Enterprise for Mac v5.5.1515激…

keepalived2.2.8+drbd9+nfs高可用存储部署

目录 一.本文基于上一篇文章keepalived环境来做的,主机信息如下 二.为两台虚拟机准备添加一块新硬盘设备 三.安装drbd9 1.使用扩展源的rpm包来下载 2.创建资源并挂载到新增的硬盘 3.主设备升级身份 4.主备两个设备手动切换身份演示 四.安装配置nfs 五.安装…

【YOLOv8】Yolov5和Yolov8网络结构的分析与对比

目录 一 YOLOv5 二 YOLOv8 yolo通常采用backbone-neck-head的网络结构。 Backbone 主要负责从输入图像中提取高层次的语义特征,常包含多个卷积层和池化层,构建了一个深层次的特征提取器。Neck通常用来进一步整合与调整backbone提取的特征,有利于将不同…

大话设计模式——24.迭代器模式(Iterator Pattern)

简介 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部实现。(Java中使用最多的设计模式之一) UML图 应用场景 Java的集合对象:Collection、List、Map、Set等都有迭代器Java ArrayList的迭代器源码 示例 简…

uniapp的h5项目 用命令起这个项目(vue-cli)

这里其实就相当于给uniapp h5套了一个vue-cli的壳(纯属个人感觉) 首先需要安装vue-cli 脚手架 npm install -g vue/cli然后创建项目(这里需要在hbuilder创建) vue create -p dcloudio/uni-preset-vue uniapp安装成功后它的结构…

python 用requests.get 把远程文件下载到本地

def download_file(url, save_path):response requests.get(url, streamTrue)if response.status_code 200:with open(save_path, wb) as f:for chunk in response.iter_content(chunk_size8192):if chunk:f.write(chunk)print(f"文件已成功下载到 {save_path}")el…

OSCP靶场--Dibble

OSCP靶场–Dibble 考点(前端鉴权参数修改node.js代码注入 suid cp提权 ) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.173.110 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-09 06:36 EDT Nmap scan repor…

Jackson配置处理LocalDateTime、LocalDate等java8时间类型失效的问题解决

目录 前言 一、问题排查过程 1.1 SpringMvc是如何处理请求报文和响应报文 1.2 JacksonConfig配置排查 二、导致Jackson配置失效的原因 2.1 没有addSerializer 2.2 添加了EnableMvc注解 2.3 另外有地方配置了Jacksonhttpconver覆盖了配置 总结 前言 上一篇文章《使用Ja…