MySQL基础-多表查询

目录

简单概述

1.多表之间的关系

1.1 一对多/多对一

1.2 多对多

 1.3 一对一

2. 多表查询-内连接

2.1 隐式内连接

2.2 显式内连接

2.3 内连接小结

 3.多表查询-外连接

3.1 左外连接

 3.2 右外连接

 4.多表查询-自连接

4.1 应用

5.多表查询-联合查询

 6.子查询

6.1 标量子查询

6.2 列子查询

 6.3 行子查询

7.小结


简单概述

在MySQL中,多表查询是指在一个查询中同时涉及多个表的操作。它可以帮助我们从多个表中检索相关数据,并将它们结合在一起进行分析和展示。

1.多表之间的关系

1.1 一对多/多对一

典型的案例就像我上一篇中所写的:MySQL基础篇-约束-CSDN博客

外键约束的案例

也就是利用外键约束来将表之间建立联系

1.2 多对多

案例:学生与课程之间的关系

关系:一个学生可以选修多门课程,一个课程可以供多名学生选择

建立关系:这时候就要建立一张中间表,中间表中至少包含二个外键,分别关联二张表的主键

 创建对应的表

create table student(id int auto_increment primary key ,name varchar(10),no varchar(10)
) comment '学生表';insert into student values (null,'zs','2001010202'),(null,'ls','2001010202'),(null,'kk','2001010202'),(null,'ww','2001010202');create table course(id int auto_increment primary key ,name varchar(10)
) comment '课程表';insert into course values (null,'Java'),(null,'PHP'),(null,'C++');

创建关系表

create table student_course(id int auto_increment primary key ,studentid int not null comment '学生id',courseid int not null comment '课程id',constraint fk_courseid foreign key (courseid) references course (id),constraint fk_studentid foreign key (studentid) references student (id)
) comment '学生课程中间表';

此时学生表和课程表已经与其中的第三张表建立了联系

 1.3 一对一

案例:用户与用户详情的关系

关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率。

这是一张用户的详情表

此时我们需要将用户的基本信息和受教育信息拆分出来,就可以使用这种一对一的关系来管理用户数据

 

在其中的一张表中使用约束外键将二者联系起来,这样就可以方便的管理了。

2. 多表查询-内连接

内连接返回的数据

使用内连接查询返回的数据必须要有强制条件那就是建立连接,二张表之间有外键约束建立了连接的数据才会返回。

2.1 隐式内连接

语法结构:

select * from 表名,表名 where 条件;

这里有二张表,他们之间通过 :dept_id 这个约束外键来建立了联系

现在要查询其中建立了联系且对应的数据

select spm.name,dept.name from spm,dept where spm.dept_id = dept.id;

结果: 这样就可以查找到员工对应的部门了

 扩展:通过上面的sql,可以看到where条件以及前面需要查询的字段,其中都需要涉及到

表名.某个字段,所以可以另起别名来简化

select s.name,d.name from spm s,dept d where s.dept_id = d.id;

这个sql的运行结果跟上面的结果是一样的

2.2 显式内连接

语法:

select * from 表名1 INNER JOIN 表名2 ON 条件;

跟上面一样的需求,求出对应的员工的部门

select e.name,d.name from spm e inner join dept d on e.dept_id = d.id;

2.3 内连接小结

显式内连接和隐式内连接的区别在于二点

一:语法不同,这个显而易见

二:sql代码可读性

总的来说,虽然两种方式都可以执行内连接操作,但显式内连接更为推荐,因为它具有更好的可读性和可维护性,能够清晰地展示查询中的连接关系,特别是在处理复杂查询时。而隐式内连接虽然有效,但容易让查询变得混乱和难以理解。因此,建议优先选择显式内连接的方式来编写SQL查询。

 3.多表查询-外连接

外连接返回的数据

外连接和内连接返回的数据基本差不多,但是外连接返回的数据包括没有匹配上的数据,比如绑定的外键是NULL值,外连接也可以查询的到。

3.1 左外连接

返回的数据:

  • 返回左表中的所有数据行,不论是否在右表中有匹配。
  • 如果有匹配,将返回右表中匹配的数据行。
  • 如果没有匹配,右表的列将包含NULL值。
  • 左表中没有匹配的数据行仍然会包含在结果中。

语法: 

select 字段 from  表名1 left join 表名2 on 条件;

例如现在要查询所有的员工信息以及他们的部门信息

select s.*,d.name from spm s left join dept d on d.id = s.dept_id

结果,可以即使是null,依然能够返回

 3.2 右外连接

返回的数据:

  • 返回右表中的所有数据行,不论是否在左表中有匹配。
  • 如果有匹配,将返回左表中匹配的数据行。
  • 如果没有匹配,左表的列将包含NULL值。
  • 右表中没有匹配的数据行仍然会包含在结果中。

语法:

select 字段 from  表名1 right join 表名2 on 条件;

 没错,它跟左外连接只相差了一个单词

案例:现在我们要查询部门表的所有信息以及对应的员工信息

select d.*,s.* from spm s right join dept d on d.id = s.dept_id;

结果,没有建立连接的则会返回null

 4.多表查询-自连接

语法:

select 字段 from 表名1 join 表名2 on 条件;

4.1 应用

自连接顾名思义就是自己连接自己,在一张表中通过某个字段来将其中的数据建立联系。

例如这种情况:

通过managerid字段,来查询到对应员工的上级

自连接的常见的应用场景:

  1. 组织结构:自连接可用于表示组织结构,例如公司的部门和子部门之间的层次关系。在一个表中存储部门信息,使用自连接可以轻松地查找部门的上级部门或子部门。

  2. 朋友关系:在社交网络或朋友关系管理系统中,自连接可用于查找用户之间的朋友关系。通过在同一用户表中存储用户信息,并使用自连接来建立用户之间的联系,可以轻松地查找用户的朋友或关注者。

  3. 评论和回复:在博客、论坛或社交媒体应用中,自连接可用于构建评论和回复的层次结构。每个评论可以与其父评论相关联,形成回复链。

  4. 员工管理:在员工管理系统中,自连接可用于表示员工与其直接上级的关系。这对于构建组织结构图以及查询员工的管理链非常有用。

  5. 产品和分类:自连接可以用于表示产品与其父产品或分类之间的关系。这在创建产品目录或层次结构时非常有用。

  6. 文件系统:自连接可以用于表示文件系统中的文件和文件夹之间的关系。每个文件夹可以包含文件和子文件夹,形成层次结构。

  7. 图形数据库:自连接是图形数据库中的常见操作,用于表示图形中节点之间的关系,例如社交网络图、地理信息系统等。

自连接在处理具有层次结构或复杂关系的数据时还是挺有作用的。它允许在同一表中查找相关数据,简化了数据检索和操作。在设计数据库模型时,考虑数据的层次结构和关系时,自连接是很有用的。

 案例1:查询员工及其对应上级

select a.name ,b.name 上级 from spm a,spm b where a.managerid = b.id;

结果

案例2:查询员工及其对应上级,没有上级的也要查询出来

这个时候需要查询没有关联的数据,要用到外连接

select a.name ,b.name 上级 from spm a left join spm b on a.managerid = b.id;

结果

5.多表查询-联合查询

它用于合并两个或多个具有相同列结构的查询结果集,生成一个包含所有结果的单个结果集。联合查询通常用于将多个查询结果组合成一个单一的结果集,以便在应用程序中进行更方便的处理和显示。

 案例:查询员工表中age<30 和 salary < 5000 的员工

select * from spm where age < 30
union all
select * from spm where salary < 5000;

结果

可以看到游侠出现了2次,因为并没有做去重处理

select * from spm where age < 30
union 
select * from spm where salary < 5000;

 将 all 去掉就可以达到去重的效果了

 6.子查询

6.1 标量子查询

标量子查询的返回结果只包含单个值(数字,字符串,日期),而不是一组行或多列值。

常见的操作符:=, <>, >, >= , <, <=

案例:查询 “研发部” 的所有员工信息

select * from spm where dept_id = (select id from dept where name = '研发部')

其中括号内的sql返回结果为单一值

6.2 列子查询

列子查询返回的结果是一列(可以是多行)。

常用的操作符:IN (包含), NOT IN , ANY (任一个), SOME , ALL(所有的)

案例:查询研发部和财务部的所有员工信息

select * from spm where dept_id in (select id from dept where name = '研发部' or name = '财务部')

 6.3 行子查询

行子查询返回的结果是一行(可以是多列)。

常见操作符:= ,<> , IN , NOT IN

案例:查询与 ‘游侠’ 的薪资和上级相同的员工信息

 

select * from spm where (salary,managerid) = (select salary,managerid from spm where name = '游侠') and name != '游侠';

结果

7.小结

多表关系

  • 一对多:在多的一方设置外键,关联一的一方的主键
  • 多对多:建立中间表,中间表包含两个外键,关联两张表的主键
  • 一对一:用于表结构拆分,在其中任何一方设置外键(UNIQUE),关联另一方的主键

 多表查询

  • 内连接
  1. 隐式    where
  2. 显式    inner join ...  on ...
  • 外连接
  1. 左外    left join ....   on ...
  2. 右外    right join ... on ...
  • 自连接
  • 子查询

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

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

相关文章

黑马JVM总结(二十五)

&#xff08;1&#xff09;字节码指令-cinit 构造方法可以分为两类&#xff0c;一类是cinit 一类init cinit是整个类的构造方法 putstatic&#xff1a;进行static变量的赋值&#xff0c;是到常量池里找到名字一个叫做i的变量 &#xff08;2&#xff09;字节码指令-init in…

漫谈:C语言 C++ 左值、右值、类型转换

编程不是自然语言&#xff0c;编程自有其内在逻辑。 左值引起的BUG 编译器经常给出类似这样的BUG提示&#xff1a; “表达式必须是可修改的左值” “非常量引用的初始值必须是左值” 看一下示例&#xff1a; #include <iostream>void f(int& x) {} int main() {sho…

C#中实现单元测试的示例流程_MSTest测试项目

一、单元测试简介 1.1、单元测试简介 在《单元测试艺术》一书中对于单元测试的定义是&#xff1a;【一个单元测试是一段代码&#xff0c;这段代码调用一个工作单元&#xff08;指&#xff1a;调用软件中的一个方法&#xff0c;这个方法执行过程中所发生的所有行为以及最后产生…

Inno Setup安装中文语言

以版本6.2.2为例&#xff1a; 默认安装的Inno Setup是不支持中文语言的&#xff0c;需要我们自行下载安装。 一、打开官网Inno Setup Translations (jrsoftware.org) 下载的文件如下 二、然后重命名放到Inno Setup的如下安装目录中 三、然后重启Inno Setup即可。 打包后的…

家电行业 EDI:Miele EDI 需求分析

Miele是一家创立于1899年的德国公司&#xff0c;以其卓越的工程技术和不懈的创新精神而闻名于世。作为全球领先的家电制造商&#xff0c;Miele的经营范围覆盖了厨房、洗衣和清洁领域&#xff0c;致力于提供高品质、可持续和智能化的家电产品。公司的使命是为全球消费者创造更美…

SpringMVC 学习(二)Hello SpringMVC

3. Hello SpringMVC (1) 新建 maven 模块 springmvc-02-hellomvc (2) 确认依赖的导入 (3) 配置 web.xml <!--web/WEB-INF/web.xml--> <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee…

maven清理本地仓库。删除_remote.repositories文件和删除失败的jar包

1.图预览 .bat文件要和仓库在同一平级目录 REPOSITORY_PATH要改成你自己仓库的地址 2、删除.lastUpdated文件(失败的jar包) 使用.bat文件 注明&#xff1a;REPOSITORY_PATHD:\software\Java\maven\repository 改成你仓库的地址 set REPOSITORY_PATHD:\software\Java\maven\rep…

河北吉力宝以步力宝健康鞋引发的全新生活生态商

在当今瞬息万变的商业世界中&#xff0c;成功企业通常都是那些不拘泥于传统、勇于创新的先锋之选。河北吉力宝正是这样一家企业&#xff0c;通过打造一双步力宝健康鞋&#xff0c;他们以功能性智能科技穿戴品为核心&#xff0c;成功创造了一种结合智能康养与时尚潮流的独特产品…

Zotero同步论文、笔记

之前用 Mendeley[1]看论文&#xff0c;看中几个功能&#xff1a; tags&#xff0c;多标签分类&#xff0c;类似微信分组&#xff0c;用来快速筛&#xff08;已添加的&#xff09;某一类文献&#xff1b;同步&#xff0c;包括 pdf 和笔记&#xff08;高亮、便签、tags&#xff…

数链科技基于PP-ChatOCR实现合同信息抽取,准确率达98%

传统大宗商品供应链领域数字化程度低&#xff0c;存在交易环节不透明、业务流程不标准、依赖主体信用评价等问题&#xff0c;业务中存在大量营业执照、身份证、终端合同等线下单据&#xff0c;严重依赖人工线下审核&#xff0c;且数字化难度大。 不同终端、机构、仓库的单据格式…

python使用websocket实现多端数据同步,多个websocket同步消息,断开链接自动清理

我使用的是flask_sock这个模块&#xff0c;我的使用场景是&#xff1a;可以让数据多端实时同步。在游戏控制后台和游戏选手的ipad上都可以实时调整角色的技能和点数什么的&#xff0c;所以需要这样的一个功能来实现数据实时同步。 下面是最小的demo案例&#xff1a; from fla…

LoadLibraryEx调用dll时有未经处理的异常,发生访问冲突

0x000000000006A220 处的第一机会异常(在 testHFHZDll.exe 中): 0xC0000005: 执行位置 0x000000000006A220 时发生访问冲突。 0x000000000006A220 处有未经处理的异常(在 testHFHZDll.exe 中): 0xC0000005: 执行位置 0x000000000006A220 时发生访问冲突。 最近做一个测试&#…

[C++随笔录] stack queue使用

stack && queue使用 stackqueue题目训练 stack 栈的特点是 先进后出(first in last out) 我们可以看出, stack的接口相比 vector/string/list 的接口少的太多了 构造函数 && 容器适配器 容器适配器的含义: 首先, 适配器 — — 用户传数据进来, 我们用合适的…

mac安装python2

Python 2 于 2020 年 1 月 1 日宣布结束支持&#xff0c;包括 Homebrew 在内的许多项目和包管理器已经停止支持 Python 2。 如果现在你还要安装 Python 2&#xff0c;需要从 Python 官网下载安装包&#xff1a; 访问 Python 的发布页面。从页面底部找到 Python 2 的最后一个版…

DeepSpeed简单教程

DeepSpeed github地址、DeepSpeed 官网 、DeepSpeed API文档、huggingface DeepSpeed文档、知乎deepspeed入门教程、微软deepspeed博客示例代码&#xff1a;《Using DeepSpeed with HF&#x1f917; Trainer》、 BLOOM_LORA&#xff08;运行示例见《Running_Deepspeed》&#x…

C++标准模板(STL)- 输入/输出操纵符-(std::setbase,std::setfill)

操纵符是令代码能以 operator<< 或 operator>> 控制输入/输出流的帮助函数。 不以参数调用的操纵符&#xff08;例如 std::cout << std::boolalpha; 或 std::cin >> std::hex; &#xff09;实现为接受到流的引用为其唯一参数的函数。 basic_ostream::…

人工智能AI 全栈体系(七)

第一章 神经网络是如何实现的 神经网络不仅仅可以处理图像&#xff0c;同样也可以处理文本。由于处理图像讲起来比较形象&#xff0c;更容易理解&#xff0c;所以基本是以图像处理为例讲解的。 七、词向量 图像处理之所以讲起来比较形象&#xff0c;是因为图像的基本元素是像…

Ctfshow web入门 代码审计篇 web301-web310 详细题解 全

CTFshow 代码审计 web301 下载的附件的目录结构如下&#xff1a; 开题后界面&#xff0c;看见输入框&#xff0c;感觉是sql。 大概浏览一遍源码&#xff0c;我们可以发现在checklogin.php文件中有无过滤的SQL语句&#xff0c;SQL注入没得跑了。 这题SQL注入有三种做法。 方法一…

信息安全:网络物理隔离技术原理与应用.

信息安全&#xff1a;网络物理隔离技术原理与应用. 随着网络攻击技术不断增强&#xff0c;恶意入侵内部网络的风险性也相应急剧提高。满足内外网信息及数据交换需求&#xff0c;又能防止网络安全事件出现的安全技术就应运而生了&#xff0c;这种技术称为“物理隔离技术” 基本原…

使用Vue、ElementUI实现登录注册,配置axios全局设置,解决CORS跨域问题

目录 引言 什么是ElementUI&#xff1f; 步骤1&#xff1a;创建Vue组件用于用户登录和注册 1. 基于SPA项目完成登录注册 在SPA项目中添加elementui依赖 在main.js中添加elementui模块 创建用户登录注册组件 配置路由 修改项目端口并启动项目 静态页面展示图 步骤2&#x…