数据库(MySQL)基础:多表查询(一)

news2024/11/23 17:05:12

一、多表关系

概述

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:

  • 一对多(多对一)
  • 多对多
  • 一对一
1.1一对多(多对一)
  • 案例:部门与员工的关系
  • 关系:一个部门对应多个员工,一个员工对应一个部门
  • 实现:在多的一方建立外键,指向一的一方的主键 

 具体的实例可以参考我的上一篇博客(数据库(MySQL)基础:约束-CSDN博客),我在这里就不进行赘述了。

1.2多对多
  • 案例:学生与课程之间的关系
  • 关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择
  • 实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

实例:

在开始之前,我先来进行表结构的创建,代码如下,大家可以自行参考

create table if not exists student(
    id int auto_increment comment 'ID' primary key,
    name varchar(50) not null comment '姓名',
    no varchar(10) comment '学号'
)comment '学生表';
insert into student(name,no) values('黛绮丝','2000100101'),
                                ('谢逊','2000100102'),
                                ('殷天正','2000100103'),
                                ('韦一笑','2000100104');

create table if not exists course(
    id int auto_increment comment 'ID' primary key,
    name varchar(50) not null comment '课程'
)comment '课程表';

insert into course(name) values
        ('Java'),
        ('PHP'),
        ('MySQL'),
        ('Hadoop');

此时,我们发现学生表和课程表没有关系,那么我们再建立一张学生课程中间表

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

insert into student_course(studentid,courseid) values (1,1),(1,2),(1,3),(2,2),(2,3),(3,4);

三表关系如下图:

 1.3一对一 
  • 案例:用户 与 用户详情的关系
  • 关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率
  • 实现:在任意一方加入外键,关联另外一方的外键,并且设置外键为唯一的(unique)

简单示例如下,如有不懂,欢迎来评论区我们一起探讨

create table if not exists tb_user(
    id int auto_increment comment 'ID' primary key,
    name varchar(50) not null comment '姓名',
    age int comment '年龄',
    gender char(1) comment '1:男,2:女',
    phone char(11) comment '手机号码'
)comment '用户基本信息表';

insert into tb_user(name,age,gender,phone) values
                                ('黄渤',45,'1','18800001111'),
                                ('冰冰',35,'1','18800002222'),
                                ('码云',55,'1','18800008888'),
                                ('李彦宏',50,'1','18800009999');

create table if not exists tb_user_edu(
    id int auto_increment comment 'ID' primary key,
    degree varchar(5) not null comment '学历',
    major varchar(5) not null comment '专业',
    primaryschool varchar(50) comment '小学学校',
    middleschool varchar(50) comment '中学学校',
    university varchar(50) comment '大学学校',
    userid int unique comment '用户ID'
)comment '用户教育信息表';

insert into tb_user_edu(degree,major,primaryschool,middleschool,university,userid) values
        ('本科','舞蹈','静安区第一小学','静安区第一中学','北京舞蹈学院','1'),
        ('硕士','表演','朝阳区第一小学','朝阳区第一中学','北京电影学院','2'),
        ('本科','英语','杭州市第一小学','杭州市第一中学','杭州师范大学','3'),
        ('本科','应用数学','阳泉第一小学','阳泉区第一中学','清华大学 ','4');

二、多表查询概述

  • 概述:指从多表中查询数据
  • 笛卡尔积:笛卡尔积是指在数学中,两个集合A 和 B 集合的所有组合情况。(在多表查询中,需要消除笛卡尔积)。

 即

select * from emp,dept where emp.dept_id = dept.id;
  • 多表查询分类

1.连接查询

内连接:相当于查询A、B 交集部分数据

外连接:

            左外连接:查询左表所有数据,以及两张表交集部分数据

            右外连接:查询右表所有数据,以及两张表交集部分数据

自连接:当前表与自身的连接查询,自连接必须使用表别名

2.子查询

本期知识点就分享到这里了,我们下期再见!

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

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

相关文章

npm install digital envelope routines::unsupported解决方法

目录 一、问题描述二、问题原因三、解决方法 一、问题描述 执行命令 npm install 报错:digital envelope routines::unsupported 二、问题原因 Node.js 17 版本引入了 OpenSSL 3.0,它在算法和密钥大小方面实施了更为严格的限制。这一变化导致 npm 的升…

badKarma:一款功能强大的网络侦查GUI工具

关于badKarma badKarma是一款开源的网络侦查工具,该工具基于Python 3开发,提供了友好的图形化用户接口,可以帮助广大渗透测试人员在网络基础设施安全审计过程中执行网络侦查任务。 badKarma是一个模块化工具,基于python3 GTK套件…

【研发管理】产品经理知识体系-产品创新流程

导读:产品创新流程是一个系统性的过程,旨在通过创造和引入新的产品或改进现有产品来满足市场需求、解决用户问题或实现竞争优势。 目录 1、产品创新引论 2、决策基本框架 3、模糊前端 4、产品创新流程模型概论 5、门径管理流程 6、并行工程和集成产…

基于ssm+jsp+mysql+java的人事管理系统

💞文末获取源码联系🙉 👇🏻 精选专栏推荐收藏订阅👇🏻 🎀《Java精选实战项目-计算机毕业设计题目推荐-期末大作业》😘更多实战项目~ https://www.yuque.com/liuyixin-rotwn/ei3euo/d…

设计模式: 工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。 工厂模式属于创建型…

Linux的Shell脚本详解

本文目录 一、什么是 Shell 脚本文件 ?二、编写Shell脚本1. 基本规则2. shell 变量(1)创建变量(2)引用变量(3)删除变量(4)从键盘读取变量(5)特殊变…

PHP的数组练习实验

实 验 目 的 掌握索引和关联数组,以及下标和元素概念; 掌握数组创建、初始化,以及元素添加、删除、修改操作; 掌握foreach作用、语法、执行过程和使用; 能应用数组输出表格和数据。 任务1:使用一维索引数…

一键实现在VS Code中绘制流程图

VS Code是一款常用的IDE,受到许多用户的欢迎和喜爱。而其较为出众的一点,就是较好的可拓展性,即丰富的插件应用,这些应用可以极大地提高生产效率,并优化日常使用。 流程图是一种直观的图示方法,可以用简明…

富文本编辑器 iOS

https://gitee.com/klkxxy/WGEditor-mobile#wgeditor-mobile 采用iOS系统浏览器做的一款富文本编辑器工具。 原理就是使用WKWebView加载一个本地的一个html文件,从而达到编辑器功能的效果! 由于浏览器的一些特性等,富文本编辑器手机端很难做…

wordpress子比主题美化-为图文列表封面添加动态缩略图特效 多种效果演示

wordpress子比主题-为图文列表文章封面添加动态缩略图特效 给自己子比主题加一个列表文章封面添加动态缩略图 直接复制以下代码,添加到主题自定义CSS代码中即可,下图为效果演示 wordpress子比主题-为图文列表文章封面添加动态缩略图特效 给自己子比主题…

SpringData JPA - ORM 框架下,打造高效数据访问层

目录 一、SpringData JPA 概述 1.1、什么是 JPA 1.2、什么是 ORM 1.3、什么是 Hibernate 1.4、JPA 和 Hibernate 的关系 1.5、JPA 的优势 二、SpringData JPA 实战开发 2.1、依赖 2.2、配置文件 2.3、启动类 2.4、创建实体 2.5、基于 JpaRepository 的 CRUD 三、…

空闲缓冲区(empty) 和 非空缓冲区(full) 的的概念和区别【操作系统 生产者——消费者进程】

首先,我们得有个环境——通常是个缓冲池,这个池子里可以塞很多缓冲区,它们是用来存放数据的。生产者就是那个不停造东西的家伙,而消费者则是等着用这些东西的人。 1. 空闲缓冲区(empty): 这玩意…

基于SSM的“大学生创新团队管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“大学生创新团队管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 首页页面 团队风采页面 团队招新页面…

《HCIP-openEuler实验指导手册》1.6 Apache静态资源配置(目录访问)

知识点 常用用途: 软件仓库镜像及提供下载服务: 配置步骤 删除网站主目录中的文件(本实验机目录为/home/source ip为192.168.12.137 端口为81) cd /home/source rm -rf *在主目录中新建6个文件夹如下图 mkdir test{1..6}新建…

Log4Qt日志框架 - 日志输出重定向(03)

Log4Qt日志框架 - 日志格式化(02)https://mp.csdn.net/mp_blog/creation/editor/138417616?spm1011.2266.3001.6217 一、Log4Qt输出重定向 Log4Qt继承关系图 AppenderSkeleton:实现一般的功能DebugAppender:将日志附加到平台调…

第Y9周:重要模块解读

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制🚀 文章来源:K同学的学习圈子 目录 以con.py为例: 一、autopad 二、Conv 三、Focus 四、C2f 文件…

C++入门系列-基于范围的for循环(C++11)和指针空值nullptr(C++11)

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 基于范围的for循环 范围for的语法 在C98中如果要遍历一个数组,可以按照以下方式进行: void TestFor() {int array[] { 1,2,3,4,5 };for (int i 1; i …

nuxt3使用记录六:禁用莫名其妙的Tailwind CSS(html文件大大减小)

发现这个问题是因为,今天我突然很好奇,我发现之前构建的自动产生的200.html和404.html足足290k,怎么这么大呢?不是很占用我带宽? 一个啥东西都没有的静态页面,凭啥这么大!所以我就想着手动把他…

JavaEE 初阶篇-深入了解 Junit 单元测试框架和 Java 中的反射机制(使用反射做一个简易版框架)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 Junit 单元测试框架概述 1.1 使用 Junit 框架进行测试业务代码 1.2 Junit 单元测试框架的常用注解(Junit 4.xxx 版本) 2.0 反射概述 2.1 获…

20240502解决ARM32编译器编译quectel-CM时for循环出错的解决

20240502解决ARM32编译器编译quectel-CM时for循环出错的解决 2024/5/2 17:17 缘起:QMIThread.c:2100:9: error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode 1、修改Makefile为ARM32架构: Z:\quectel-CM\Makefile ifneq ($…