【JavaWeb学习Day15】

Tlias智能学习系统

员工管理:

多表关系:

1.一对多

场景:部门与员工的关系(一个部门下有多个员工)

体现:需要在多的一方添加字段,关联一的一方的主键

多表问题分析:

现象:部门数据可以直接删除,然而还有部分员工归属于该部门下,此时就出现了数据的不完整、不一致问题。

原因:目前上述的两张表,在数据库层面,并未建立关联,所以是无法保证数据的一致性和完整性。

解决办法:外键约束。

外键约束的语法:

-- 创建表时指定
create table 表名(字段名    数据类型,...[constraint]   [外键名称]  foreign  key (外键字段名)   references   主表 (主表列名)        
);
​
​
-- 建完表后,添加外键
alter table  表名  add constraint  外键名称  foreign key(外键字段名) references 主表(主表列名);
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);

外键约束:

物理外键:使用foreign key 定义外键关联另一张表。缺点:1.影响增、删、改的效率(需要检测外键关系)。2.仅用于单节点数据库,不适用于分布式、集群场景。3.容易引发数据库的死锁问题,消耗性能。

逻辑外键:在业务层逻辑中,解决外键关联。优点:通过逻辑外键,就可以很方便的解决上述问题。

2.多对多

案例:学生 与 课程的关系

关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择

实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

3.一对一

案例:用户 与 身份证信息 的关系。

关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率。

实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)。

案例:根据页面原型以及需求文档分析并设计表结构

1.需求:请根据资料中提供的页面原型,设计 员工模块 涉及到的表结构。

2.步骤:

阅读页面原型以及需求文档,分析各个模块涉及到表结构,以及表结构之间的关系。

根据页面原型以及需求文档,分析各个表结构中具体的字段以及约束。

多表查询:

1.多表查询:指从多张表中查询数据。

2.笛卡尔积:指在数学中,两个集合(A集合 和 B集合)的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)

3.连接查询:

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

具体实现:

-- ============================= 内连接 ==========================
-- A. 查询所有员工的ID, 姓名 , 及所属的部门名称 (隐式、显式内连接实现)
-- 隐式
select emp.id,emp.name,dept.name from dept , emp where emp.dept_id=dept.id;
-- 显式(inner可以省略)
select emp.id,emp.name,dept.name from dept inner join emp on emp.dept_id=dept.id;
select emp.id,emp.name,dept.name from dept  join emp on emp.dept_id=dept.id;
​
​
-- B. 查询 性别为男, 且工资 高于8000 的员工的ID, 姓名, 及所属的部门名称 (隐式、显式内连接实现)
-- 隐式
select emp.id,emp.name,dept.name from dept , emp where emp.dept_id=dept.id and emp.gender=1 and emp.salary>8000;
-- 显式(inner可以省略)
select emp.id,emp.name,dept.name from dept  join emp on emp.dept_id=dept.id where emp.gender=1 and emp.salary>8000;
​
-- 为表起别名
select e.id,e.name,d.name from dept d join emp e on e.dept_id=d.id where e.gender=1 and e.salary>8000;

外连接:左外连接:查询左表所有数据(包括两张表交集部分数据)右外连接:查询右表所有数据(包括两张表交集部分数据)

具体实现:

-- =============================== 外连接 ============================
-- A. 查询员工表 所有 员工的姓名, 和对应的部门名称 (左外连接)
select e.name , d.name from  emp e left  outer join dept d on e.dept_id = d.id;
​
-- B. 查询部门表 所有 部门的名称, 和对应的员工名称 (右外连接)
select d.name , e.name from  emp e right  join dept d on e.dept_id = d.id;
​
-- C. 查询工资 高于8000 的 所有员工的姓名, 和对应的部门名称 (左外连接)
select e.name,d.name from emp e left join dept d on d.id = e.dept_id where e.salary>8000;

提示:对于外连接,常用的是左外连接,因为右外连接的SQL也可以改造成为左外连接(两张表调换个顺序)。

4.子查询:

介绍:SQL语句中嵌套select语句,称为嵌套查询,又称为子查询。

形式:select * from t1 where column1 = (select column1 from t2 ...);

说明:子查询外部的语句可以是insert、update、delete、select的任何一个,最常见的是select。

分类:

1.标量子查询:子查询返回的结果为单个值。

2.列子查询:子查询返回的结果为一列。

3.行子查询:子查询返回的结果为一行。

4.表子查询:子查询返回的结果为多行多列。

(提示:子查询的要领是,先对需求做拆分,明确具体的步骤,然后再逐步编写SQL语句。)

-- ========================= 子查询 ================================
-- 标量子查询
-- A. 查询 最早入职 的员工信息
-- a. 获取到最早入职时间select min(entry_date) from emp;
-- b.查询最早入职的员工信息select * from emp where entry_date='2000-01-01';
​select * from emp where entry_date=(select min(entry_date) from emp);
-- B. 查询在 "阮小五" 入职之后入职的员工信息
-- a. 查询“阮小五”入职的时间select entry_date from emp where name = '阮小五';
-- b. 查询在该时间之后入职的员工信息select * from emp where entry_date > '2015-01-01';
​select * from emp where entry_date > (select entry_date from emp where name = '阮小五');
​
​
-- 列子查询
-- A. 查询 "教研部" 和 "咨询部" 的所有员工信息
-- a.查询“教研部”和“咨询部”的部门IDselect id from dept where name='教研部' or name='咨询部';
-- b.查询指定部门ID的员工信息select * from emp where dept_id in (2,3);
​select * from emp where dept_id in (select id  from dept where name='教研部' or name='咨询部');
​
-- 行子查询
-- A. 查询与 "李忠" 的薪资 及 职位都相同的员工信息 ;
-- a. 查询 "李忠" 的薪资 及 职位select salary,job from emp where name = '李忠';
-- b. 查询指定薪资和职位的员工信息select * from emp where job = 5 and salary = 5000;
​select * from emp where job = (select job from emp where name = '李忠') and salary = (select salary from emp where name = '李忠');
​
-- 优化:select * from emp where (salary,job) = (select salary,job from emp where name = '李忠');
​
-- 表子查询
-- A. 获取每个部门中薪资最高的员工信息
-- a. 获取每个部门的最高薪资select dept_id,max(salary) from emp group by dept_id;
​
-- b. 查询每个部门中薪资最高的员工信息select * from emp e,(select dept_id,max(salary) max_salary from emp group by dept_id) awhere e.salary = a.max_salary and e.dept_id = a.dept_id;

案例:

-- 需求:
-- 1. 查询 "教研部" 性别为 男,且在 "2011-05-01" 之后入职的员工信息 。select * from emp where entry_date>'2011-05-01'and id in (select id from emp where gender = 1 and dept_id = ( select id from dept where name = '教研部'));
-- 答案:select e.* from emp as e , dept as d where e.dept_id = d.id and d.name = '教研部' and e.gender = 1 and e.entry_date > '2011-05-01';
-- 2. 查询工资 低于公司平均工资的 且 性别为男 的员工信息 。select avg(salary) from emp;select * from emp where salary<(select avg(salary) from emp) and gender = 1;
​
-- 3. 查询部门人数超过 10 人的部门名称 。
-- 答案:select d.name,count(*) from emp e,dept d where e.dept_id = d.id  group by d.name having count(*)>10;
​
-- 4. 查询在 "2010-05-01" 后入职,且薪资高于 10000 的 "教研部" 员工信息,并根据薪资倒序排序。select * from emp where entry_date>'2010-05-01' and salary>10000and dept_id=(select id from dept where name='教研部') order by salary desc ;
-- 答案:select * from emp e , dept d where e.dept_id = d.id and e.entry_date > '2010-05-01'and e.salary > 10000 and d.name = '教研部' order by e.salary desc;
​
-- 5. 查询工资 低于本部门平均工资的员工信息select dept_id,avg(salary) from emp group by dept_id;
-- 答案;
-- 5.1 查询每个部门的平均工资select dept_id, avg(salary) avg_sal from emp group by dept_id;
​
-- 5.2 查询工资 低于本部门平均工资 的员工信息 。select e.* from emp e , (select dept_id, avg(salary) avg_sal from emp group by dept_id) as awhere e.dept_id = a.dept_id and e.salary < a.avg_sal;

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用grafana v11 建立k线(蜡烛图)仪表板

先看实现的结果 沪铜主力合约 2025-02-12 的1分钟k线图 功能介绍: 左上角支持切换主力合约,日期,实现动态加载数据. 项目背景: 我想通过前端展示期货指定品种某1天的1分钟k线,类似tqsdk 的web_gui 生成图形化界面— TianQin Python SDK 3.7.8 文档 项目架构: 后端: fastap…

我们来学HTTP/TCP -- 另辟蹊径从响应入手

从响应入手 题记响应结语 题记 很多“废话”&#xff0c;在很多文章中出奇的一致那种感觉是&#xff0c;说了好像又没说一样&#xff0c;可以称之为“电子技术垃圾”当然&#xff0c;是从个人主观的感受&#xff0c;这该死的回旋镖估计也会打在自己头上但咱也学学哪吒精神“我…

Golang官方编程指南

文章目录 1. Golang 官方编程指南2. Golang 标准库API文档 1. Golang 官方编程指南 Golang 官方网站&#xff1a;https://go.dev/ 点击下一步&#xff0c;查看官方手册怎么用 https://tour.go-zh.org/welcome/1 手册中的内容比较简单 go语言是以包的形式化管理函数的 搜索包名…

开源语音克隆项目 OpenVoice V2 本地部署

#本机环境 WIN11 I5 GPU 4060ti 16G 内存 32G #开始 git clone https://github.com/myshell-ai/OpenVoice.git conda create -n opvenv python3.9 -y conda activate opvenv pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/…

Java8适配的markdown转换html工具(FlexMark)

坐标地址&#xff1a; <dependency><groupId>com.vladsch.flexmark</groupId><artifactId>flexmark-all</artifactId><version>0.60.0</version> </dependency> 工具类代码&#xff1a; import com.vladsch.flexmark.ext.tab…

Linux-文件IO

1.open函数 【1】基本概念和使用 #include <fcntl.h> int open(const char *pathname&#xff0c;int flags); int open(const char *pathname&#xff0c;int flags&#xff0c;mode_t mode); 功能: 打开或创建文件 参数: pathname //打开的文件名 f…

flutter 专题四十八 Google发布Flutter 2.0正式版,支持全平台程序构建

今天&#xff0c;Google发布了 Flutter 2.0的正式版本&#xff0c;至2018年Flutter 1.0版本发布以来&#xff0c;在最近的3年的时间礼&#xff0c;Flutter进行了大量的升级以支持更多平台的开发需求。作为 Flutter 的重大升级&#xff0c;Flutter 2.0 增加了对桌面和 Web 应用程…

PowerBI 矩阵 列标题分组显示(两行列标题)

先看效果 数据表如下&#xff1a; 我们在powerbi里新建一个矩阵&#xff0c;然后如图加入字段&#xff1a; 我们就会得到这样的矩阵&#xff1a; 我们在“可视化”->“列”&#xff0c;上双击&#xff0c;输入空格&#xff0c;就能消除左上角的"类别"两字 同理修…

Springboot 中如何使用Sentinel

在 Spring Boot 中使用 Sentinel 非常方便&#xff0c;Spring Cloud Alibaba 提供了 spring-cloud-starter-alibaba-sentinel 组件&#xff0c;可以快速将 Sentinel 集成到你的 Spring Boot 应用中&#xff0c;并利用其强大的流量控制和容错能力。 下面是一个详细的步骤指南 …

LLaMA-Factory DeepSeek-R1 模型 微调基础教程

LLaMA-Factory 模型 微调基础教程 LLaMA-FactoryLLaMA-Factory 下载 AnacondaAnaconda 环境创建软硬件依赖 详情LLaMA-Factory 依赖安装CUDA 安装量化 BitsAndBytes 安装可视化微调启动 数据集准备所需工具下载使用教程所需数据合并数据集预处理 DeepSeek-R1 可视化微调数据集处…

kubernetes源码分析 kubelet

简介 从官方的架构图中很容易就能找到 kubelet 执行 kubelet -h 看到 kubelet 的功能介绍&#xff1a; kubelet 是每个 Node 节点上都运行的主要“节点代理”。使用如下的一个向 apiserver 注册 Node 节点&#xff1a;主机的 hostname&#xff1b;覆盖 host 的参数&#xff1…

【已解决】TypeError: AsyncConnectionPool.__init__(), new install bug, httpx==0.24.1

1&#xff0c;参考社区链接&#xff0c;首先降低gradio版本&#xff0c;降低到4以下&#xff0c;但是也不能降太低&#xff0c;也不能太高&#xff0c;要适中&#xff0c;推荐版本3.39.0 pip install gradio3.39.0 2&#xff0c;下载正确的httpx版本 参考社区链接&#xff0…

基于fastadmin快速搭建导航站和API接口站点系统源码

源码介绍 基于fastadmin快速搭建导航站和API接口站点系统源码 上传源码 设置运行目录为/public 导入 数据库.sql到数据库 设置配置文件application/database.php 后台admin.php 可以自己随意修改本文件名称为后台地址 推荐越复杂越好 账号admin 密码 123456 效果预览

Spring Web MVC入门

目录 学习Spring MVC 一、建立连接 RestController和RequestMapping RequestMapping 使用 访问地址&#xff1a;类路径方法路径 既支持Get请求又支持Post请求 ⭐️指定GET方法类型 &#x1f319;指定POST方法类型 二、请求 1️⃣传递单个参数 2️⃣传递多个参数 ​…

案例-04.部门管理-删除

一.功能演示 二.需求说明 三.接口文档 四.思路 既然是通过id删除对应的部门&#xff0c;那么必然要获取到前端请求的要删除部门的id。id作为请求路径传递过来&#xff0c;那么要从请求路径中获取&#xff0c;id是一个路径参数。因此使用注解PathVariable获取路径参数。 请求方…

mysql的rpm包安装

(如果之前下载过mariadb&#xff0c;使用yum remove mariadb卸载&#xff0c;因为mariadb与rpm包安装的mysql有很多相似的组件和文件&#xff0c;会发生冲突&#xff0c;而源码包安装的mysql不会&#xff0c;所以不用删除源码包安装myqsl&#xff0c;只删除mariadb就可以&#…

内容中台重构企业内容管理流程驱动智能协作升级

内容概要 内容中台作为企业数字化转型的核心基础设施&#xff0c;通过技术架构革新与功能模块整合&#xff0c;重构了传统内容管理流程的底层逻辑。其核心价值在于构建动态化、智能化的内容生产与流转体系&#xff0c;将分散的创作、存储、审核及分发环节纳入统一平台管理。基…

haproxy实现MySQL服务器负载均衡

1.环境准备 准备好下面四台台服务器&#xff1a; 主机名IP角色open-Euler1192.168.121.150mysql-server1openEuler-2192.168.121.151mysql-server2openEuler-3192.168.121.152clientRocky8-1192.168.121.160haproxy 2.mysql服务器配置 1.下载mariadb #下载mariadb [rootop…

数据大屏炫酷UI组件库:B端科技风格PSD资源集

一个既精准传达数据内涵&#xff0c;又极具视觉冲击力的UI设计&#xff0c;无疑是提升用户体验、彰显品牌科技实力的关键。但面对如此高要求&#xff0c;UI设计师们往往面临着寻找高质量设计素材的巨大挑战。为此&#xff0c;我们精心打造了这款数据大屏炫酷UI组件库&#xff0…

强化学习笔记7——DDPG到TD3

前提&#xff1a;基于TD 的方法多少都会有高估问题&#xff0c;即Q值偏大。原因两个&#xff1a;一、TD目标是真实动作的高估。 二&#xff1a;自举法高估。 DDPG 属于AC方法&#xff1a;异策略&#xff0c;适合连续动作空间&#xff0c;因为他的策略网络直接输出的动作&#…