DAY47 多表外键联系

news2024/11/20 10:40:33

一、表设计之关联关系

  • 外键:主键是用于表示数据的唯一性字段,外键是用于建立关联关系的字段,值通常指向另一张表的主键

  • 一对一

    1. 什么是一对一的关系:有A,B两张表,A表中一条数据对应B表中的一条数据,称之为一对一的关系

    2. 应用场景:用户表和用户详情表,商品表和商品信息扩展表

    3. 如何建立关系:在从表中添加外键执行主表的主键

    4. 练习:创建User(id,username,password)和user_info表(uid,nick,age,phone,address)然后插入以下数据

      1 李白  libai123  太白  28  13838283388  四川江邮
      2 杜甫  dufu123   子美  24  13232323322  四川成都
      3 白居易 bai123   乐天  27  13131313311  河南郑州
      -- 创建表
      create table user(
          id int primary key auto_increment, #主表的主键
          username varchar(50),
          password varchar(50)
      );
      ​
      create table user_info(
              uid int,  #从表的外键,指向主表的主键
              nick varchar(50),
              age int,
              phone varchar(50),
              address varchar(50)
      );
      ​
      -- 添加数据
      insert into user values
      (null,'李白','libai123'),
      (null,'杜甫','dufu123'),
      (null,'白居易','bai123');
      ​
      insert into user_info values
      (1,'太白',28,'13838283388','四川江邮'),
      (2,'子美',24,'13232323322','四川成都'),
      (3,'乐天',27,'13131313311','河南郑州');
      ​
      ​

    5. 查询每一个用户的用户名,昵称和电话

      select
          u.username,ui.nick,ui.phone
      from
          user u
      left join
          user_info ui
      on
          u.id = ui.uid;

    6. 查询太白的用户名和密码

      select
          u.username,u.password
      from
          user u
      left join
          user_info ui
      on
          u.id = ui.uid
      where 
          ui.nick = '太白'

    7. 查询白居易的昵称和家庭住址

      select
          ui.nick,ui.address
      from
          user u
      left join
          user_info ui
      on
          u.id = ui.uid
      where 
          u.username = '白居易'

  • 一对多

    1. 什么是一对多的关系,有A,B两张表,A表中的一条数据对应B表中的多条数据,同时B表中的一条数据对应A表中的一条数据

    2. 应用场景:员工表和部门表,商品表和商品分类表

    3. 如何建立关系:在多的表中添加外键指向另一张表的主键

    4. 练习

      • 创建 t_emp(id,name,sal,dept_id) 和t_dept(id,name, loc)

        create table t_emp(
            id int primary key auto_increment,
            name varchar(50),
            sal double,
            dept_id int # 外键  指向t_dept表的主键
        );
        ​
        create table t_dept(
            id int primary key auto_increment,
            name varchar(50),
            loc varchar(50)
        )   
      • 保存以下数据

        1  诸葛亮 3000  法师部   A国
        2  周瑜   2000  法师部   A国
        3  关羽   1500  战士部   B国
        4  张飞   1000  战士部   B国
        5  孙尚香  5000 射手部   C国
        insert into t_dept values
        (null,'法师部','A国'), #1
        (null,'战士部','B国'), #2
        (null,'射手部','C国'); #3
        ​
        insert into t_emp values
        (null,'诸葛亮',3000,1),
        (null,'周瑜',2000,1),
        (null,'关羽',1500,2),
        (null,'张飞',1000,2),
        (null,'孙尚香',5000,3)
        ​
        1. 查询每个员工的名字和所在部门的名称

          SELECT
              e.name,d.name
          FROM
              t_emp e
          LEFT JOIN
              t_dept d
          ON
              e.dept_id = d.id

        2. 查询A国的员工姓名

          SELECT
              e.name
          FROM
              t_emp e
          LEFT JOIN
              t_dept d
          ON
              e.dept_id = d.id
          WHERE
              d.loc='A国'
          ​

        3. 查询张飞的部门名称

          SELECT
              d.name
          FROM
              t_emp e
          LEFT JOIN
              t_dept d
          ON  
              e.dept_id = d.id
          WHERE
              e.name='张飞'
              

        4. 查询工资在2000以下员工的姓名,所在地

          SELECT
              e.name,d.loc
          FROM
              t_emp e
          LEFT JOIN
              t_dept d
          ON
              e.dept_id = d.id
          WHERE   
              e.sal <2000

  • 多对多

    1. 什么是多对多:A B两张表,A表中的一条数据对应B表中的多条数据,同时B表中的一条数据对应A表中的多条数据

    2. 应用场景:学生表和老师表

    3. 如何建立关系:创建一个关系表,两个字段,分别执行另外两张表的主键

    4. 练习:

      1. 创建student(id,name)表和teacher(id,name) 和关系表

      2. 保存以下数据

        张老师: 张三,李四,刘红,赵小绿,钱小能
        李老师:张三,赵小绿,李小红,江波,西门长海
        孙老师:江波,张三,钱枫,刘红,赵德柱
        王老师:西门长海,赵德柱,江波,钱小能,李菲菲
        ​
      3. 表设计

        创建表并添加数据

        create table student(
            id int primary key auto_increment,
            name varchar(30)
        );
        ​
        insert into student values
        (null,'张三'),(null,'李四'),(null,'刘红'),    
        (null,'赵小绿'),(null,'钱小能'),(null,'李晓红'), 
        (null,'江波'),(null,'西门长海'),(null,'钱枫'),
        (null,'赵德柱'),(null,'李菲菲');
        ​
        ​
        create table teacher(
            id int primary key auto_increment,
            name varchar(50)
        );
        ​
        insert into teacher values
        (null,'张老师'),(null,'李老师'),
        (null,'孙老师'),(null,'王老师');
            
        ​
        create table s_t_table(
            t_id int,
            s_id int
        );
        ​
        insert into s_t_table values
        (1,1),(1,2),(1,3),(1,4),(1,5),
        (2,1),(2,4),(2,6),(2,7),(2,8),
        (3,7),(3,1),(3,9),(3,3),(3,10),
        (4,8),(4,10),(4,7),(4,5),(4,11);
        ​

      4. 查询每个学生对应的老师

        SELECT
            s.name,t.name
        FROM
            student s
        LEFT JOIN
            s_t_table stt
        ON
            s.id = stt.s_id
        LEFT JOIN
            teacher t
        ON
            t.id = stt.t_id;

      5. 查询孙老师的学生有哪些

        SELECT
            s.name
        FROM
            student s
        LEFT JOIN
            s_t_table stt
        ON
            s.id = stt.s_id
        LEFT JOIN
            teacher t
        ON
            t.id = stt.t_id
        WHERE
            t.name = '孙老师'
        ​

      6. 查询江波的老师是谁

        SELECT
                t.name
        FROM
            student s
        LEFT JOIN 
            s_t_table sst
        ON
            s.id = sst.s_id
        LEFT JOIN 
            teacher t
        ON
            t.id = sst.t_id
        WHERE
            s.name = '江波'

二、自关联

  • 当前表的外键指向当前表的主键,这种关联方式叫做自关联

  • 应用场景:需要保存上下级关系的时候( Z-Tree)

  • 查询时使用内连接即可 join on

  • 查询员工姓名和对应的主管名称

    SELECT 
        e.ename,m.ename
    FROM
        emp e
    JOIN
        emp m
    ON
        e.mgr = m.empno

三、连接方式和关联关系

  • 连接方式:包括 等值连接 、内连接,外连接(左外连接,右外连接) 是指查询多张表(等值连接和内连接是把一张表看做两张表的)数据的时候使用的查询方式

  • 关联关系:包括:一对一 , 一对多, 多对多, 是指设计表的时候,两张表之间存在的逻辑关系

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

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

相关文章

Java 设计模式——抽象工厂模式

目录 1.概念2.结构3.实现4.优缺点5.使用场景6.模式扩展7.JDK源码解析——Collection.iterator方法 1.概念 &#xff08;1&#xff09;Java 设计模式——工厂方法模式中考虑的是一类产品的生产&#xff0c;如畜牧场只养动物、电视机厂只生产电视机等。这些工厂只生产同种类产品…

MATLAB m文件格式化

记录一个网上查到的目前感觉挺好用的格式化方法。 原链接&#xff1a; https://cloud.tencent.com/developer/article/2058259 压缩包&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1ZpQ9qGLY7sjcvxzjMPAitw?pwd6666 提取码&#xff1a;6666 下载压缩包&#xf…

【GDB】自定义命令

.gdbinit 文件的使用 gdb自定义命令 自定义命令格式 define <command> <code> end document <command> <help text> end示例 .gdbinit 脚本中输入如下内容 layout asm b 5define print-tyustliecho hello, world\n enddocument print-tyustliusage…

【冒烟测试前置】如何把控提测质量?

你是否碰到过开发提测速度很快&#xff0c;导致项目排队&#xff0c;结果介入测试时&#xff0c;第一条用例都跑不通的情况&#xff1f; 你是否碰到过因为开发提测质量差&#xff0c;导致反复修改&#xff0c;反复提测&#xff0c;反复重复验证的情况&#xff1f; 你是否碰到…

sql数据类型,约束以及单表查询

嘎嘎学撒 数据类型约束条件DML 数据操作语句一、插入数据INSERT二、更新数据UPDATE三、删除数据DELETE四、MySQL单表查询五、关键词 数据类型 常见的数据类型 数值类型&#xff1a; 整数类型 TINYINT SMALLINT MEDIUMINT INT BIGINT 整型可以指定是有符号的和无符号的&#xf…

如何快速做跨业务测试?

当业务任务多且人力资源不充足的情况下&#xff0c;不同业务的同学可能需要去不同的业务进行临时支援&#xff0c;可能在时间方面有长有短&#xff0c;但是如何迈出第一步是很多人需要关心的一件事。 本文以实际跨业务测试经验&#xff08;订单业务测试人员如何测试售后业务&a…

【操作】国标GB28181视频监控EasyGBS平台更新设备信息时间间隔

国标GB28181协议视频平台EasyGBS是基于GB28181协议的视频监控云服务平台&#xff0c;可支持多路设备同时接入&#xff0c;并对多平台、多终端分发出RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。平台可提供视频监控直播、云端录像、云存储、检索回放、智能告警、语音对讲、平台…

[Python进阶] Pyinstaller打包程序时为程序添加图标

5.5 Pyinstaller打包程序时为程序添加图标 5.5.1 程序图标的好处 增强可识别性&#xff1a;图标是一种视觉语言&#xff0c;能够提高应用程序的可识别性&#xff0c;使其在众多应用程序中更容易被用户找到和识别。 帮助用户理解应用程序功能&#xff1a;图标可以快速传达应用…

硬件基本功--电阻/电容/电感/二极管

一、电阻 电阻的主要参数&#xff1a;阻值、精度、封装、功率、耐压 电阻在电路中的作用&#xff1a;分压、限流、采样、偏置等等 阻值&#xff1a;103 10*1000 10KΩ 电阻流过电流&#xff0c;就会有压降&#xff0c;从而产生功率损耗 电阻封装、功率、耐压的关系&#xff1…

青云1000----华为昇腾310 注意事项

青云1000帮助文档 只是一部分&#xff0c;后续遇到的问题会补充 注意事项&#xff01;&#xff01;&#xff01;&#xff01; type-c只用于数据传输不能供电DC供电和锂电池不能同时供电&#xff0c;会烧掉风扇正负级不要插反 账户密码 HwHiAiUser 密码Mind123 TypeC USB …

接口测试——接口协议抓包分析与mock_L2

目录&#xff1a; 抓包工具charles抓包工具fiddler抓包工具证书配置app抓包实战练习接口测试实战练习 1.抓包工具charles 工具介绍 支持 SSL 代理支持流量控制支持重发网络请求&#xff0c;方便后端调试支持修改网络请求参数支持网络请求的截获并动态修改可以自动将 json 或…

七、栈与队列(stack and queue)

文章目录 一、栈与队列基础二、例题&#xff08;一&#xff09;栈1.[232. 用栈实现队列](https://leetcode.cn/problems/implement-queue-using-stacks/description/)&#xff08;1&#xff09;思路&#xff08;2&#xff09;代码&#xff08;3&#xff09;复杂度分析 2.[225. …

海大校园学习《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著

海大校园学习《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著

pytorch固定随机数中种子

1、添加到yolov7的utils/general.py文件最下面 import pkg_resources as pkg def check_version(current0.0.0, minimum0.0.0, nameversion , pinnedFalse, hardFalse, verboseFalse):# Check version vs. required versioncurrent, minimum (pkg.parse_version(x) for x in …

【数据结构--八大排序】之归并排序

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

中国社科院与美国杜兰大学完成了我的金融硕士梦

一个人从出生就被赋予着太多的期待&#xff0c;比如爸爸妈妈从小没有完成的梦想&#xff0c;哥哥姐姐失败的课程&#xff0c;为了实现这些期待&#xff0c;人们忙着奋斗、拼搏、追逐&#xff0c;马不停蹄去做有用的事&#xff0c;结交有用的人&#xff0c;不敢虚度半寸光阴&…

第1章 数据结构绪论

1.1 开场白 1.2 你数据结构怎么学的 1.3 数据结构起源 早期人们都把计算机理解为数值计算工具&#xff0c;就是感觉计算机当然是用来计算的&#xff0c;所以计算机解决问题&#xff0c;应该是先从具体问题中抽象出一个适当的数据模型&#xff0c;设计出一个解此数据模型的算…

crypto:丢失的MD5

题目 得到一个md5.py 运行一下&#xff0c;发现报错&#xff0c;修改一下 运行之后又报错 报错原因是算法之前编码 正确的代码为 import hashlib for i in range(32,127):for j in range(32,127):for k in range(32,127):mhashlib.md5()m.update((TASC chr(i) O3RJMV c…

Makerbase SimpleFOC ESP32 例程12 双霍尔电机位置控制

Makerbase SimpleFOC ESP32 例程12 双霍尔电机位置控制 第 1 部分 硬件介绍 1.1 硬件清单 序号品名数量1MKS ESP32 FOC V1.0 主板12LA034-040NN07A 霍尔电机23DC24V电源14USB 线1 硬件清单如下图所示&#xff1a; ESP32 FOC V1.0主板说明书等更多资料请加入企鹅&#xff…

1039 到底买不买

描述 小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串&#xff0c;但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下&#xff0c;某串珠子里是否包含了全部自己想要的珠子&#xff1f;如果是&#xff0c;那么告诉她有多少多余的珠子&#xff1…