01 MySQL之连接

news2024/11/19 9:02:39

1. 连接

1.0 基础认知

多表(主表)和一表(从表的区别):

多表一般是主表,一般存储主要数据,每个字段都可能存在重复值,没有主键,无法根据某个字段定位到准确的记录;
一表一般是从表,一般存储辅助数据,通过主键与主表连接,存储的记录是不重复的,可通过主键定位到记录。

1.1 为什么要用连接(join)

因为大部分情况下,要符合数据库设计规范,数据不可能集中在同一张表里,那样的话会产生数据冗余,但是分成多张表会造成取数比较麻烦,join(连接)就是为解决上述问题的一种语法。

1.2 连接种类和语法

内连接:inner join,最常见的一种连接方式(最常用,查询效率最高)

左连接:也叫左外连接(left [outer] join)

右连接:也叫右外连接(right [outer] join)

全连接:full [outer] join ,MySQL不能直接支持。

默认情况不写outer关键字


以下述表为例子, 详细讲述连接
在这里插入图片描述

1.3 左连接

左连接:left join, 左连接从左表(t1)取出所有记录,与右表(t2)匹配。如果没有匹配,以null值代表右边表的列。
左表的所有行一定会全部出现在查询结果中至少一次

需求: 查询每个学生每科成绩和个人信息

分析: 两种方案

  1. 主表为student表, 每条记录后拼接学生信息即可
  2. 主表为score表.因为它存储每科每个学生成绩,每个学生对应多个成绩,这样就能查询出多条记录,
  3. 最终查出形如sid,name, course_id1, course_score1,course_id2,course_score2的记录, 即每个学生只占一条记录
    但由于MySql不支持动态扩列 , 这一目标实现起来会比较复杂

1.3.1 左连接的第一种情况

左表中独有的数据行:对于左表中存在而右表中不存在(即没有匹配项)的行,它们也会被取出,但右表的列将为NULL。
即取出左表中所有项后排除与右表有匹配项的条目在这里插入图片描述

这里我们使用方案1进行左连接,student表为左表,score表为右表。

select *
from student
         left join score
                   on student.sid = score.sid

由于id 为2的学生梅花 ,在score表中并没有分数记录, 而student表作为主表, 所有条目又必须出现至少一次, 因此结果如下
在这里插入图片描述

1.3.2 左连接的第二种情况

匹配的数据行:即左表和右表中基于连接条件相匹配的行。
即取出主表 + 与主表有交集的从表内容

在这里插入图片描述
这里我们使用方案2进行左连接,score表为左表,student表为右表。

select *
from score
         left join student
                   on student.sid = score.sid

由于score为主表, 因此没有任何成绩的梅花不必出现一次
在这里插入图片描述

1.4 右外连接

右连接从右表(t2)取出所有记录,与左表(t1)匹配。如果没有匹配,以null值代表左边表的列。
右表的所有行一定会全部出现在查询结果中至少一次

实际上,右连接取出的结果和左连接取出的结果是一样的,唯一的不同时字段顺序不同,两者的字段顺序是相反的
对于每种连接来说,哪张表写在前面,哪张表的字段默认就会出现在结果集的左边(select后指定字段的情况除外)。

1.4.1 右连接的第一种情况

在这里插入图片描述

select *
from student
         right join score
                   on student.sid = score.sid

在这里插入图片描述

1.4.1 右连接的第二种情况

在这里插入图片描述

select *
from score
         right join student
                    on student.sid = score.sid

在这里插入图片描述

1.5 内连接

在这里插入图片描述

在左/右外连接中 , 至少有一张的表的全部条目会至少出现一次

内连接中不是, 仅会出现有交集的条目

1. 练习

用户表结构如图 ,
需求: 用户表中的create_by创建人和edit_by编辑人角色是用id字段表示的, 这个id即用户id字段
当我们查询一条用户信息时, 我们希望直接看到创建人和编辑人的名字, 而非仅仅是id
在这里插入图片描述

思路是是同一张表做左外连接, 这样可以在保留原本所有条目的基础上, 为每个条目增加姓名字段

select tu.*,
       tu2.name createByName,
       tu3.name editByName
from dlyk.t_user tu
         left join dlyk.t_user tu2 on tu.create_by = tu2.id
         left join dlyk.t_user tu3 on tu.edit_by = tu3.id
where tu.id = 1

在这里插入图片描述

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

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

相关文章

『Java安全』编译jdk

文章目录 一、源码下载二、环境依赖配置[^1]三、依赖检查及构建编译配置四、编译jdk五、编译完成完 一、源码下载 以OpenJDK为例: jdk<10访问OpenJDK Mercurial Repositories jdk≥10访问子目录jdk/jdk12: log (openjdk.org) 二、环境依赖配置1 i7-…

神经网络结构搜索(NAS)

华为诺亚AI系统工程实验室主任刘文志解读如何使用AutoML预测基站流量 - 知乎讲师介绍:刘文志(花名风辰),华为诺亚AI系统工程实验室主任,异构并行计算专家,毕业于中国科学院研究生院,闻名于并行计…

鸿蒙应用程序包安装和卸载流程

开发者 开发者可以通过调试命令进行应用的安装和卸载,可参考多HAP的调试流程。 图1 应用程序包安装和卸载流程(开发者) 多HAP的开发调试与发布部署流程 多HAP的开发调试与发布部署流程如下图所示。 图1 多HAP的开发调试与发布部署流程 …

全网最详细的接口自动化测试框架实战(Pytest+Allure+Excel)

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号【互联网杂货铺】,回复 1 ,免费获取软件测试全套资料,资料在手,涨薪更快 1. Allure 简介 Allure 框架是一个灵活的、轻量级的、支持多语…

Flink动态分区裁剪

1 原理 1.1 静态分区裁剪与动态分区裁剪 静态分区裁剪的原理跟谓词下推是一致的,只是适用的是分区表,通过将where条件中的分区条件下推到数据源达到减少分区扫描的目的   动态分区裁剪应用于Join场景,这种场景下,分区条件在joi…

【服务发现--ingress】

1、ingress介绍 Ingress 提供从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源所定义的规则来控制。 Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。 Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟…

Nginx网络服务六-----IP透传、调度算法和负载均衡

1.实现反向代理客户端 IP 透传 就是在日志里面加上一个变量 Module ngx_http_proxy_module [rootcentos8 ~]# cat /apps/nginx/conf/conf.d/pc.conf server { listen 80; server_name www.kgc.org; location / { index index.html index.php; root /data/nginx/html/p…

德人合科技 | 天锐绿盾终端安全管理系统

德人合科技提到的“天锐绿盾终端安全管理系统”是一款专业的信息安全防泄密软件。这款软件基于核心驱动层,为企业提供信息化防泄密一体化方案。 www.drhchina.com 其主要特点包括: 数据防泄密管理:天锐绿盾终端安全管理系统能够确保数据在创…

element el-date-picker 日期组件置灰指定日期范围、禁止日期范围日期选择

JS如何将当前日期或指定日期转时间戳_javascript技巧_脚本之家 小于指定日期前的日期置灰 比如这里 指定日期是 2024-02-20 10:48:15 disabledDate(time) time是一个函数提供的时间用于比较 他是一个时间戳↓ 理解为我们想要置灰的时间 time.getTime() < timeStamps- 1 *…

通过一个栗子来看看创建和运行servlet

通过前面一篇文章的介绍&#xff08;搞着搞着对web project是不是有点迷糊&#xff1f;先关注几个问题-CSDN博客&#xff09;大家对于servlet作为中间层接收请求和反馈响应有了概念上的认知&#xff0c;接下来通过一个栗子来加深一下理解&#xff0c;还是基于前面的jsp项目&…

VBA技术资料MF123:程序运行过程中手动切换工作表

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

线程池(ThreadPoolExecutor,as_completed)和scrapy框架初步构建——学习笔记

用法1&#xff1a;map函数 with ThreadPoolExecutor() as pool: results pool.map(craw,utls)for result in results:print(result) 1.Scrapy框架&#xff1a; 五大结构&#xff1a;引擎&#xff0c;下载器&#xff0c;爬虫&#xff0c;调度器&#xff0c;管道&#x…

Opencv实战(3)详解霍夫变换

霍夫变换 Opencv实战系列指路前文&#xff1a; Opencv(1)读取与图像操作 Opencv(2)绘图与图像操作 文章目录 霍夫变换1.霍夫线变换1.1 原理1.2 HoughLines() 2.霍夫圆变换2.1 原理2.2 HoughCircles() 最基本的霍夫变换是从黑白图像中检测直线(线段) 霍夫变换(Hough Transform…

数据界的达克摩斯之剑----深入浅出带你理解网络爬虫(Second)

接上文数据界的达克摩斯之剑----深入浅出带你理解网络爬虫(First)-CSDN博客 一.爬取目标 抓取目标的描述和定义是决定网页分析算法与URL搜索策略如何制订的基础。而网页分析算法和候选URL排序算法是决定搜索引擎所提供的服务形式和爬虫网页抓取行为的关键所在。这两个部分的算…

【零基础入门TypeScript】类 - class

目录 创建类 句法 示例&#xff1a;声明一个类 创建实例对象 句法 示例&#xff1a;实例化一个类 访问属性和函数 示例&#xff1a;将它们放在一起 类继承 句法 示例&#xff1a;类继承 例子 输出 TypeScript ─ 类继承和方法重写 静态关键字 例子 实例操作符…

永磁同步电机MTPA与弱磁控制

文章目录 1、前言2、最大转矩电流比&#xff08;MTPA&#xff09;控制数学推导2.1 拉格朗日乘数法2.2 定义法偏导求解 3、MTPA模型仿真搭建和分析3.1 电机参数与设置3.1.1 模型参数设置3.1.2 参数计算脚本3.1.3 模型参数设置示意图 3.2 模型总览3.3 核心模块-MTPA模块3.4 仿真分…

IntelliJ IDEA下Spring Boot多环境配置教程

&#x1f31f;&#x1f30c; 欢迎来到知识与创意的殿堂 — 远见阁小民的世界&#xff01;&#x1f680; &#x1f31f;&#x1f9ed; 在这里&#xff0c;我们一起探索技术的奥秘&#xff0c;一起在知识的海洋中遨游。 &#x1f31f;&#x1f9ed; 在这里&#xff0c;每个错误都…

【蓝桥杯】包子凑数(DP)

一.题目描述 二.输入描述 三.输出描述 四.问题分析 几个两两互质的数&#xff0c;最大公约数是1&#xff0c;最小公倍数是他们的乘积。 两个互质的数a和b最小不能表示的数就是&#xff08;a-1&#xff09;&#xff08;b-1&#xff09;-1&#xff0c;即&#xff0c;两个互质的数…

Jrebel 使用备忘

背景 Java 开发时修改了代码如果手动中止进行然后重启的话&#xff0c;非常麻烦&#xff0c;所以需要一个热部署的插件&#xff0c;修改代码之后即时生效&#xff0c;无需重启。 之前一直用的 devtools&#xff0c;不过在一个新项目中&#xff0c;devtools 有点问题&#xff0…

用 Famous Face App 实现换脸:一秒变身你喜欢的明星

你是否曾经梦想过与你喜欢的明星同框&#xff1f; 现在&#xff0c;借助 Famous Face App 的强大技术&#xff0c;这个梦想可以轻松实现&#xff01;Famous Face App 是一款基于人工智能的换脸应用&#xff0c;可以让你轻松将自己的脸换到各种视频和图片中。 使用 Famous Face…