数据库学习记录(二)多表设计与多表查询

一对多

一对多时候,一张表内的一个数据可能对应着其他表内的多个数据,例如一个部门内有多个员工,但是公司里不只一个部门,也不止一个员工,这个时候就是一对多的情况,这个时候可以绑定一个外键,让同一个部门内的员工与该部门实现绑定(该外键叫物理外键,不推荐使用,会影响数据库的使用效率和操作灵活性,一般在开发中使用逻辑外键处理该类问题

多对多

多对多表示一张表内的一个数据对应着另一张表内的多个数据,另一张表内的一个数据也对应着这张表内的多个数据,例如学生选课 ,一个学生能选多门课,而一门课也能被多个学生所选,所以这时候就需要一个中间表来解决这个问题,将一个学生的id键绑定给中间表的学生id上,课程绑定给中间表的课程id,这样就能实现多个学生对应多门课程,多门课程对应多个学生。

多表查询 

多表查询主要是在多表查询之后加上限制条件从而得到我们想要的数据

内连接

相当于查询下图的A,B之间的交集

隐式内连接主要是将限制条件写在where之后,从而实现多表查询数据的目的,例如:我需要在员工表和部门表中查询所有员工的姓名以及对应的部门信息 ,如下:

-- 查询员工的姓名,及其所属的部门名称
select tb_dept.name,tb_emp.name from tb_emp,tb_dept where tb_dept.id = tb_emp.job;

显式内连接就是将from后面的表信息用join相关字段进行替换,并在最后添加上on加连接条件

还是上面的例子,sql语句如下:

-- 使用内连接
select tb_dept.name,tb_emp.name from tb_emp inner join tb_dept  on tb_dept.id = tb_emp.dept_id;

 外连接(需要谁完全显示就将谁设置为相关连接的相关表)

左外连接就是会完全包括左边的数据,右外连接就是会完全包含右边的数据,所以在使用相关外连接时需要注意哪些数据是被完全包含的

左外连接就会显示所有的左边表的数据,且与右边表与之对应,如果左表没有与右表对应的数据,会自动将全部左表的数据打印出,右表相关数据显示为空 ,如下:

而同理,右外连接就是会显示所有的右边表的数据,如果右表中有左表没有对应的数据,则会将没有相关对应的左表数据显示为空

再例如我想查询员工表里的所有员工名字,以及对应的部门信息,但员工表内存在没有部门的员工,这时就将员工表作为左连接的左表,部门表作为左连接的右表,这时员工就算没有被分配部门,因为员工表是左连接的左表,所以所有的员工姓名会显示出,没有分配部门的员工部门为空

-- 使用左外连接查询所有员工的姓名,和对应的部门
select e.name,d.name from tb_emp e left join tb_dept d on e.dept_id = d.id

同理,我想查询所有部门的名字,即使部门里没有员工,也能被查询到,这个时候能将部门表作为左连接的左表或者右连接的右表,这样也能完全显示部门名字,这样的话也能将相关的数据完全显示在数据库的查询界面中。 

-- 使用右连接查询所有部门的名字,和对应的员工姓名
select e.name,d.name from tb_emp e right join tb_dept d on e.dept_id = d.id

子查询

子查询主要是sql语句的嵌套

就是先将一部分限制使用查询语句查出,再通过替代的方式将该部分语句放入查询语句中 

列子查询

例如:我需要查询教研部下的所有员工信息,因为我在员工表中保存部门是以数字的形式,那么我首先需要先在部门表中查询到教研部对应的数字,再在员工表里去查询部门为该数字的员工信息,此时就可以使用嵌套查询来结合这两个步骤,代码具体实现如下:

-- 查询教研部下所有员工的信息

select * from tb_emp where dept_id = (select id from tb_dept where name = '教研部');

如果需要多个查询限制的嵌套的话,需要使用in关键字来确定相关限制,因为=只能匹配一个限制条件,所以需要使用in来确定是否在一个范围中,如下:这样的话就能实现在一个限制条件范围内进行带有多个限制条件的查询

-- 查询教研部和咨询部所有的员工信息
select * from tb_emp where dept_id in (select id from tb_dept where name = '教研部'or name = '咨询部');

行子查询

例如在多个查询要求时,我们可以将多个条件绑定到一起进行查询,例如要求查询员工表里入职时间与工作职位与韦一笑相同的员工信息,先查询韦一笑的入职时间和工作职位,再查询员工表里与这些信息相匹配的员工信息。这样可以只执行一次子查询就能查询到相关的职工信息

-- 只出现一次的行子查询
select * from tb_emp where (entrydate,job) = (select entrydate,job from tb_emp where name = '韦一笑');

表查询

表查询返回的是多行多列,可以理解为一个临时表,使用代码如下,先将部分限制查询条件使用了之后,将查询出来的数据当表使用

-- 表子查询,查询入职日期是“2006-01-01'之后的员工信息,及其部门名称

select e.*,d.name from (select * from tb_emp where entrydate>'2006-01-01')e , tb_dept d where e.dept_id = d.id;

总结:

在实际开发中,经常使用多表查询,而不是简单的单一表查询,所有在一些查询操作中,多思考各个表之间的关系,以及题目的要求(例如分别对某个属性,表示就需要将表中的数据根据该属性进行分组),这样的话才能写出切合题目要求的查询语句。

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

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

相关文章

递归与回溯

先来看问题,其实问题不难理解: n 皇后问题研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 上图为 8 皇后问题的一种解法。 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。 每一种解法包…

基于Springboot的在线装修管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的在线装修管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…

elk7.11.2离线安装

elk与jdk自行搜索下载 package(离线安装包)目录:/home/elk-pak /home/jdk8-pak 安装目录:/usr/local/ jdk8安装 最好查看一下是否存在原服务器自带openJDK rpm -qa|grep java # 有就执行下边卸载命令 无拉倒 rpm -e --nodeps jdk-xxx# 解压jdk8安装包…

你的电脑打不开摄像头问题

我一直以为我电脑上的摄像头老是打不开是因为硬件不匹配的问题。知道我发现了我的拯救者Y7000的机身盘边的“摄像头开关”按钮。。。 我去,你的摄像头开关按钮怎么设置在机身旁边啊。。。。 —————————————————————— 2024年3月21日更新记录&a…

zookeeper快速入门二:zookeeper基本概念

本文是zookeeper系列之快速入门中的第二篇,欢迎大家观看与指出不足。 目录 一、zookeeper的存储结构 二、什么是znode 三、znode节点的四种类型 四、权限控制ACL(Access Control List) 五、事件监听watcher 一、zookeeper的存储结构 z…

【C++】---string的模拟

【C】---string的模拟 一、string类实现1.string类的构造函数2.swap()函数3.拷贝构造函数4.赋值运算符重载5.析构6.迭代器7.operator[ ]8.size9.c_str()10.reserve()11.resize()12.p…

利用python进行接口测试及类型介绍

前言 其实我觉得接口测试很简单,比一般的功能测试还简单(这话我先这样说,以后可能会删O(∩_∩)O哈!),现在找工作好多公司都要求有接口测试经验,也有好多人问我(也就两三个人&#x…

搜维尔科技:利用增强现实改进检验和质量控制流程

直接在工作环境中显示数字指令 DELMIA 质量检查增强体验通过工作环境中的数字指令指导操作员完成检查过程,从而有效地识别、鉴定和报告不合格项。使用增强现实可以显着提高质量控制和检查过程的准确性和速度。由于技术人员可以访问实时信息,因此他们会减…

揭秘爆红AI图像增强神器:Magnific AI如何做到1亿像素放大?

最近有个很火的AI图像增强应用,叫Magnific AI。 你知道吗,它发布一个多月就有40万人注册了! 这个应用确实非常实用,它不仅利用AI技术放大了图像,还能提升分辨率,从而使图片呈现得更加清晰。 值得一提的是…

EpiCypher欣博盛生物:染色质研究有望推进精准医疗

精准医疗,也被称为个性化医学,是指使用病人特定的分子特征来指导疾病诊断、监测病情发展与治疗应答、或用于确定药物开发新靶点的医疗模式。 精准医疗原则的应用使癌症治疗领域取得了长足的进步,并有望显著改变多种病症的治疗,包括…

关于OceanBase中旁路导入的应用分享

背景 前段时间,在用户现场协助进行OceanBase的性能测试时,我注意到用户常常需要运用 insert into select 将上亿行的数据插入到一张大宽表里,这样的批量数据插入操作每次都需要耗时半个小时左右。对这一情况,我提议用户尝试采用旁…

基于springboot+vue的失物招领平台

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

【软考】生成树

目录 1. 概念2. 图解3. 例题3.1 例题1 1. 概念 1.对于有n个顶点的连通图,至少有n-1条边,而生成树中恰好有n-1条边2.连通图的生成树是该图的极小连通子图3.若在图的生成树中任意加一条边,则必然形成回路4.图的生成树不是唯一的5.从不同的顶点…

python3+requests+unittest:接口自动化测试(一)

简单介绍框架的实现逻辑,参考代码的git地址: GitHub - zhangying123456/python_unittest_interface: pythonunittest接口自动化测试脚本 1.环境准备 python3 pycharm编辑器 2.框架目录展示 (该套代码只是简单入门,有兴趣的可…

UE4 面试题整理

1、new与malloc的区别 new: new首先会去调用operator new函数,申请足够的内存(大多数底层用malloc实现),然后调用类型的构造函数来初始化变量,最后返回自定义类型的指针,delete先调用析构函数&…

HCIP—BGP路由聚合

在大型网络中,路由条目通常多达成千上万条,甚至几十万条,这给路由设备带来的挑战是:如何存储并有效管理如此众多的路由信息? BGP是一种无类路由协议,支持CIDR、VLSM和路由聚合。路由聚合技术的使用…

【微服务】Nacos配置管理

📝个人主页:五敷有你 🔥系列专栏:微服务 ⛺️稳中求进,晒太阳 Nacos除了可以做注册中心,同样可以做配置管理来使用。 1.统一配置管理 当微服务部署的实例越来越多,达到数十、数百时&am…

JVM垃圾回收之内存分配,死亡对象判断方法

Java 堆是垃圾收集器管理的主要区域,因此也被称作 GC 堆。 堆划分为新生代 老生代 永久代。 下图所示的 Eden 区、两个 Survivor 区 S0 和 S1 都属于新生代,中间一层属于老年代,最下面一层属于永久代。 内存分配原则 对象优先在Eden区域分…

jupyter notebook设置代码提示方法

在命令行运行以下代码: pip install jupyter_contrib_nbextensionsjupyter contrib nbextension install --userpip install jupyter_nbextensions_configuratorjupyter nbextensions_configurator enable --user (有时安装第一行后会自动执行第二行&a…

Redis监控工具

Redis 是一种 NoSQL 数据库系统,以其速度、性能和灵活的数据结构而闻名。Redis 在许多领域都表现出色,包括缓存、会话管理、游戏、排行榜、实时分析、地理空间、叫车、聊天/消息、媒体流和发布/订阅应用程序。Redis 数据集完全存储在内存中,这…