01 MySQL之连接

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

在这里插入图片描述

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

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

相关文章

点云数据处理常用外部库(C++/Windows)的项目配置

一、点云数据处理常用外部库(C版本)的下载安装与项目配置 (一)PCL 基于VS2019编程平台的PCL外部库下载安装及项目配置已有大量博客,本文不再赘述。具体下载安装及项目配置流程可参考外部库编译配置参考资料/*1*/ 。需…

redis-RedisTemplate.opsForGeo 的geo地理位置及实现附近的人的功能

redis内部使用的是 zset 数据结构存储,如下 import cn.huawei.VideoApplication; import cn.huawei.domain.Jingqu; import cn.huawei.service.JingquService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired…

Redis 协议与异步方式

redis pipeline 模式 redis pipeline 是一个客户端提供的机制,与 redis 无关。pipeline 不具备事务性。目的:节约网络传输时间。通过一次发送多条请求命令,从而减少网络传输时间。 时间窗口限流 系统限定某个用户的某个行为在指定的时间范围…

SpringBoot项目中如何结合Mybatis进行数据库查询

在Spring Boot项目中使用Mybatis进行数据库操作是一种常见的实现方式。下面我将展示如何在Spring Boot项目中整合Mybatis。这个示例将包括几个主要部分:项目依赖配置、配置文件、实体类、Mapper接口及其XML配置文件、服务类、以及一个简单的控制器。 1. 项目依赖配…

一键安装|卸载 mysql 8.2.0 shell脚本

场景:为了在无网、外网 mysql 安装方便,这里分享一个自己编写得 shell脚本 这里以当前最新版 mysql 8.2.0;centos-7 二进制包下载: 下载地址 mysql_install.sh #!/bin/bash # 解压安装包 tar -xf mysql-8.2.0-linux-glibc2.17-x8…

opencv中两个LSD直线检测算法的区别与应用

opencv中两个LSD直线检测算法的区别与应用 同样是Line Segment Detector(lsd)算法,opencv中提供了两种实现,并且位于不同的模块。下面分别介绍它们的使用方法: 1. LineSegmentDetector 由于源码许可证问题 OpenCV 3.4.6-3.4.15、4.1.0-4.5.…

IDEA类和方法注释模板设置

一、概述 IDEA自带的注释模板不是太好用,我本人到网上搜集了很多资料系统的整理了一下制作了一份比较完整的模板来分享给大家,我不是专业玩博客的,写这篇文章只是为了让大家省事。 这里设置的注释模板采用Eclipse的格式,下面先贴…

【深度优先搜索】【图论】【推荐】332. 重新安排行程

作者推荐 动态规划的时间复杂度优化 本文涉及知识点 深度优先搜索 图论 LeetCode332. 重新安排行程 给你一份航线列表 tickets ,其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK&a…

C++:常量表达式

C11开始constexpr作为一种声明,为编译器提供了在编译期间确认结果的优化建议,满足部分编译期特性的需求 constexpr和const区别 int b10; const int ab; //运行成功 constexpr int cb; //编译器报错,b的值在编译期间不能确定 const int size1…

研发日记,MatlabSimulink开箱报告(九)——Simulink Test模块

文章目录 前言 Simulink Test模块 静态测试 动态测试 逻辑测试 前言 见《开箱报告,Simulink Toolbox库模块使用指南(四)——S-Fuction模块》 见《开箱报告,Simulink Toolbox库模块使用指南(五)——S-F…

vue a-table 实现指定字段相同数据合并行

vue a-table 实现相同数据合并行 实现效果代码实现cloums数据格式数据源格式合并代码 实现效果 代码实现 cloums数据格式 const getColumns function () {return [{title: "分类",dataIndex: "checked",width: "150px",customRender: (text, …

有哪些视频媒体?邀请视频媒体报道活动的好处

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 视频媒体在当今的媒体生态中占据了重要的地位。以下是一些主要的视频媒体类型: 电视台:如中央电视台、各省级卫视台、地方电视台等,他们拥有专业的视…

mac命令行下计算文件SHA-256散列值

源起 从国内的第三方网站下载了Android sutiod的zip包下载地址,为了安全起见还是得跟Android官网上的对应的zip包的SHA值做下对比。以前是经常使用md5命令的,所以理论在命令行下应该是有对应的命令行工具可以计算SHA值的。后来搜索到可以用 shasum命令来…

yolov8训练目标检测模型

1.环境安装 conda安装(miniconda),配置环境变量 创建环境 conda create -n yolo python3.8安装ultralytics conda activate yolopip install ultralytics2.数据集标注 使用labelimg标注工具对图片进行标注:将标注产生的xml转为t…

表格图片太大怎么批量压缩?快速处理图片大小的方法

在工作或者学习中制作表格的时候,经常需要插入一些图片来修饰内容,当遇到图片太大无法导入的情况就比较麻烦,尤其是多张图片处理的时候,那么表格图片太大怎么批量压缩呢?接下来小编就分享给大家一个快速图片压缩的方法…

HTTP详解(HTTP的特点,状态码,工作原理,GET和POST的区别,如何解决无状态通信)!!!

文章目录 一、HTTP协议简介二、HTTP的主要特点三、HTTP之URL四、Request和Respons五、HTTP的状态码六、HTTP工作原理七、GET和POST请求的区别八、解决HTTP无状态通信——Cookie和Session 一、HTTP协议简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议&…

92. 递归实现指数型枚举 刷题笔记

思路 dfs 考虑选或者不选每个位置 用0表示未考虑 1表示选 2表示不选 用u表示搜索状态 u>n时 已经搜到底层了 需要输出当前方案 遍历 如果选了则输出 #include<iostream> using namespace std; int n; const int N16; int st[N]; void dfs(int u){ //u来记…

JVM运行时数据区——程序计数器

1、程序计数器介绍 JVM中的程序计数器英文全称是Program Counter Register&#xff0c;其中Register的命名源于CPU的寄存器&#xff0c;寄存器用于存储指令相关的现场信息&#xff0c;CPU只有把数据装载到寄存器才能够运行。 程序计数器中的寄存器并非是广义上所指的物理寄存…

音频提取使用什么方法?视频提取音频

在数字技术与多媒体日益普及的今天&#xff0c;音频提取已成为一个常见且重要的任务。无论是为了制作视频、编辑音乐&#xff0c;还是进行语音识别和分析&#xff0c;我们都需要从原始材料中提取音频。那么&#xff0c;音频提取通常使用什么方法呢&#xff1f; 1. 使用专业的音…

vue-router4 (六) 路由嵌套

应用场景&#xff1a; ①比如京东页面的首页、购物车、我的按钮&#xff0c;可以点击切换到对应的页面&#xff1b; ② 比如 Ant Design左侧这些按钮点击就会切到对应的页面&#xff0c;此时可以把左侧按钮放在父路由中&#xff0c;右侧的子路由 1.路由配置&#xff0c;子路由…