MySql:多表设计-关联查询

目录

多表设计 

代码

运行 

数据库设计范式

设计三范式

1、第一范式:

2、第二范式:

3、第三范式:

多表设计_关联查询

外键

外键约束

代码

运行

注意:

应用

代码

运行

代码 

运行

关联查询

含义:

笛卡尔乘积现象:

代码

运行

代码 

运行

功能分类:

内关联(inner join)

代码 

 运行

外关联

左外关联(left join)

代码 

运行

右外关联(right join)

代码 

运行

应用

代码

 运行

代码

运行

DQL-基础查询

子查询

含义:

代码 

运行

分类:

按子查询出现的位置:

按功能、结果集的行列数不同:

三种查询 

量子查询(一行一列)

代码

运行

列子查询(一列多行)

代码

运行 

表子查询

代码

运行  


多表设计 

 专业信息表
     专业编号(主键)
     专业名称 
 学生与专业是有关系的,如何建立学生和专业表的关系 

代码

CREATE TABLE major(
     id  INT PRIMARY KEY AUTO_INCREMENT,
     NAME VARCHAR(20)
)     

-- 修改表  为表添加一个列  一对多 多对一
ALTER TABLE student ADD majorid INT

运行 

数据库设计范式

(数据库设计规则)如何将多个信息合理的进行组织 

设计三范式

1、第一范式:

满足列的原子性(不可再拆分)

例:联系方式——>邮箱,电话,qq  可再拆分

2、第二范式:

数据库表中必须要有主键,能唯一的表示某条记录的列(有些表中可以没有主键),要求其他字段都依赖于主键。

3、第三范式:

一张表中存储一类信息,在一张表中关联其他表中的数据时,只需要关联主键列即可

一个系统中会用到多张表,每张表之间都存在关联关系

多表设计_关联查询

数据表之间的关联/引用关系是依靠具体的主键(primary key)和外键 (foreign key)建立起来的。

外键

引用另外一个数据表的某条记录。

外键列类型与主键列类型保持一致

外键约束

约束名规则:

-- 外键 在一个表中外键是用来与另一个表的主键关联的
-- 主键 不能为空 唯一 检查
-- 外键有两种情况
-- 1、不加外键约束
   -- 可以任意的对表数据进行操作,即使两个 表中的数据对应不上也没有问题
-- 2、添加外键约束 
   -- 添加外键约束后两张表操作时,`student``student`不能导致外键列和主键列对应关系不成立

代码
ALTER TABLE student ADD CONSTRAINT fk_student_major_majorid FOREIGN KEY(majorid) REFERENCES major(id)

-- 删除外键约束
ALTER TABLE student DROP FOREIGN KEY	fk_student_major_majorid

运行

注意:

1、当主表中没有对应的记录时,不能将记录添加到从表

2、不能更改主表中的值而导致从表中的记录孤立

3、从表存在与主表对应的记录,不能从主表中删除该行

4、删除主表前,先删从表

应用

多对一   球员与球队  学生与专业

一对多  球队与球员  专业与学生

多对多  学生选课,一个学生可以选择多个课程 

-- 学生选课  一个学生至少选择两个课程
-- 课程信息表  多对多关系设计

代码
CREATE TABLE course(
     id INT PRIMARY KEY AUTO_INCREMENT,
     NAME VARCHAR(20)
) 
运行

 

 -- 添加一个学生选课表  学生和课程关系表  放一个学生的学号外键,放一个课程外键

代码 

CREATE TABLE student_course(
     stunumber INT,
     courseid INT
) 

ALTER TABLE student_course ADD CONSTRAINT fk_student_course_stunumber FOREIGN KEY(stunumber) REFERENCES student(number)
ALTER TABLE student_course ADD CONSTRAINT fk_student_major_courseid FOREIGN KEY(courseid) REFERENCES course(id)
运行

 

关联查询

关联查询 多表关联在一起查询
学号 姓名 性别 电话 专业名称 (信息来自与两张表中)

含义:

又称多表查询,当查询的字段来自于多个表时,就会用到连接查询

笛卡尔乘积现象:

表1(m)和表2(n)行列不相同,相乘会出现结果=m*n

发生原因:没有有效的连接条件

如何避免:添加有效的连接条件

代码
-- 关联时没有任何的限制,会产生笛卡尔乘积现象,这并不是为我们想要的效果
SELECT * FROM student,major 
运行

代码 
-- 先产生一个笛卡尔乘积 然后在条件筛选    
SELECT
  s.number,s.name,s.gender,s.phone,m.name 
FROM student s, major m
WHERE s.majorid = m.id
运行

功能分类:

内关联(inner join)

把满足条件关联在一起

把满足了条件的两张表中的交集数据查询出来

Select 结果 from 表1,表2 where 表1.column1 = 表2.column2

代码 
select number,name,gender,phone,name from student inner join major on majorid = id

SELECT s.number,s.name,s.gender,s.phone,m.name 
FROM student s
  INNER JOIN major m ON s.majorid = m.id
 运行

外关联

左外关联(left join)

特点 即使不满足连接条件,也会把左边表中的所有数据查询出来

select 结果 from 表1 left join 表2 on 表1.column1 = 表2.column2

代码 
SELECT
  s.number,
  s.name,
  s.gender,
  s.phone,
  m.name
FROM
  student s LEFT JOIN major m ON s.majorid = m.id   
运行

右外关联(right join)

特点 即使不满足条件,也要把右边表中的所有数据查询出来

select 结果 from 表1 right join 表2 on 表1.column1 = 表2.column2

代码 
SELECT
  s.number,
  s.name,
  s.gender,
  s.phone,
  m.name 
FROM
  student s RIGHT JOIN major m ON s.majorid = m.id 
运行

应用

统计每一个专业下有多少学生

代码
SELECT
  COUNT(number),
  m.name mname
FROM
  student s RIGHT JOIN major m ON s.majorid = m.id    
  GROUP BY m.name

 运行

查询学生,以及学生选择了哪些课程(课程名称)
多对多关联查询时,分组合并 group_concat(c.name) cname 在多对多情况下,可以将同一组中多个名字连接起来

代码
SELECT
  s.number,
  s.name,
  m.name mname,
  GROUP_CONCAT(c.name) cname
FROM
  student s LEFT JOIN student_course sc ON s.number = sc.stunumber    
            LEFT JOIN course c ON sc.courseid = c.id
            LEFT JOIN major m ON s.majorid = m.id        
GROUP BY s.number,s.name,m.name
运行

DQL-基础查询

子查询

含义:

出现在其他语句中的select语句,称为子查询或内查询;外部的查询语句,称为主查询或 外查询

代码 
-- 查询身高最高的学生    最高身高不知道,不知道可以通过sql进行查询
SELECT * FROM student WHERE height = (SELECT MAX(height) FROM student)
运行

 

分类:

按子查询出现的位置:

from后面:支持表子查询

where:支持标量子查询,列子查询

按功能、结果集的行列数不同:

标量子查询(结果集只有一行一列)

列子查询(结果集只有一列多行)

表子查询(结果集一般为多行多列

三种查询 

例:男生和女生谁的人数大于2  首先统计出男生女生各自的人数 

量子查询(一行一列)
代码
SELECT * FROM student WHERE height = (SELECT MAX(height) FROM student) 
运行

列子查询(一列多行)
代码
-- 在where后面 使用标列子查询(一列多列)
SELECT * FROM student WHERE height IN (SELECT height FROM student WHERE height IN (1.81,1.98))
运行 

表子查询

把子查询的结果当作另一个表的数据来源

代码
SELECT * FROM (SELECT COUNT(*) c,gender FROM student GROUP BY gender) t
         WHERE t.c>2
运行  

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

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

相关文章

Android14之Binder调试(二百一十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

服务器数据恢复—服务器正常断电重启后raid信息丢失的数据恢复案例

服务器数据恢复环境: 一台某品牌DL380 G4服务器,服务器通过该服务器品牌smart array控制器挂载了一台国产的磁盘阵列,磁盘阵列中有一组由14块SCSI硬盘组建的RAID5。服务器安装LINUX操作系统,搭建了NFSFTP,作为内部文件…

【LeetCode】【1】两数之和(1141字)

文章目录 [toc]题目描述样例输入输出与解释样例1样例2样例3 提示进阶Python实现哈希表 个人主页:丷从心 系列专栏:LeetCode 刷题指南:LeetCode刷题指南 题目描述 给定一个整数数组nums和一个整数目标值target,请在该数组中找出…

传感器通过Profinet转Modbus网关与PLC通讯在生产线的应用

Profinet转Modbus(XD-MDPN100/300)网关可视作一座桥梁,能够实现Profinet协议与Modbus协议相互转换,支持Modbus RTU主站/从站,并且Profinet转Modbus网关设备自带网口和串口,既可以实现协议的转换&#xff0c…

【Java基础】IO流(4) —— 转换流、打印流

【Java基础】IO流(1) —— 简介 【Java基础】IO流(2) —— 字符流 【Java基础】IO流(3) —— 字节流 【Java基础】IO流(4) —— 转换流、打印流 【Java基础】IO流(5) —— 序列流、内存流 【Java基础】IO流(6) —— 随机访问文件流、数据流 转换流 InputStreamReader 是字节输…

VUE H5字体在安卓手机偏上解决

安卓手机展示样式,数字偏上,展示效果如图: 项目内添加新字体,引用新字体 vue 项目需要引入字体的话, 可以移步到这篇文章(无需下载依赖包)Vue3中引入外部自定义字体 项目文件assets内创建font文件夹, 粘贴你想用的字体, 创建对应的css文件; scss代码: font-face {/* 自定义的…

前端学习-day08

文章目录 01-相对定位02-绝对定位03-绝对定位居中04-固定定位05-堆叠顺序06-CSS精灵-基本使用07-案例-京东服务08-字体图标10.垂直对齐方式11-过度12-透明度13-光标类型14-轮播图 01-相对定位 <!DOCTYPE html> <html lang"en"> <head><meta ch…

k8s 声明式资源管理

一、资源配置清单的管理 1.1 查看资源配置清单 声明式管理方法&#xff1a; 1.适合于对资源的修改操作 2.声明式资源管理方法依赖于资源配置清单文件对资源进行管理 资源配置清单文件有两种格式&#xff1a;yaml&#xff08;人性化&#xff0c;易读&#xff09;&#xff0c;j…

高性能负载均衡的分类及架构分析

如何选择与部署适合的高性能负载均衡方案&#xff1f; 当单服务器性能无法满足需求&#xff0c;高性能集群便成为提升系统处理能力的关键。其核心在于通过增加服务器数量&#xff0c;强化整体计算能力。而集群设计的挑战在于任务分配&#xff0c;因为无论在哪台服务器上执行&am…

【C++初阶】--- C++入门(上)

目录 一、C的背景及简要介绍1.1 什么是C1.2 C发展史1.3 C的重要性 二、C关键字三、命名空间2.1 命名空间定义2.2 命名空间使用 四、C输入 & 输出 一、C的背景及简要介绍 1.1 什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&…

看看汉朝有庙号的七位皇帝,你就知道含金量有多高?

汉朝拥有庙号的七位皇帝你们知道是谁吗&#xff1f; 相比于后世皇帝人手一个庙号的景象&#xff0c;汉朝皇帝庙号的使用是相当严谨的。很多原本拥有庙号的皇帝&#xff0c;最后因为功绩不多或者无功无德&#xff0c;最终被废除庙号。因此&#xff0c;汉朝谨遵“祖有功宗有德”…

LeetCode:78.子集

解答 class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:res[[]]for i in nums:res[[i]num for num in res]return res代码解释 这段代码定义了一个名为Solution的类&#xff0c;并在其中定义了一个名为subsets的方法。该方法接受一个整数列表nums作…

Easy-poi 和 EasyExcel 选型

目录 共同点地址如何选 共同点 easy-poi 和 easyexcel 都是基于 apache poi 进行二次开发的&#xff0c;底层都是依赖的 apache poi使用简单&#xff0c;都可以通过简单的注解实现excel文件的导入导出 地址 esay poi 是一个开源的 excel,word 处理框架。链接 easy excel 是…

Vue 3入门指南

title: Vue 3入门指南 date: 2024/5/23 19:37:34 updated: 2024/5/23 19:37:34 categories: 前端开发 tags: 框架对比环境搭建基础语法组件开发响应式系统状态管理路由配置 第1章&#xff1a;Vue 3简介 1.1 Vue.js的历史与发展 Vue.js由前谷歌工程师尤雨溪&#xff08;Eva…

Java NIO 基础

Java NIO 基础 1. NIO 介绍2. NIO 三大组件2.1 Channel2.1.1 常见的 Channel2.1.2 常用方法 2.2 Buffer2.2.1 常见的 Buffer2.2.2 重要属性2.2.3 常用方法 2.3 Selector2.3.1 四种事件类型 1. NIO 介绍 NIO&#xff08;non-blocking io&#xff09;&#xff1a;非阻塞IO&#…

无网环境禁止 WPS 提示登录,且基本功能按钮可用

目前 WPS 升级后&#xff0c;每次打开都会提示你登录 WPS&#xff0c;并且在未登录之前所有基本功能按钮是置灰状态&#xff0c;无法使用。 如此一来&#xff0c;在内网或无网环境&#xff0c;我们无法登陆 WPS &#xff0c;就给我们的使用带来了极大的不便&#xff0c;那么有没…

go升级后 编译的exe在win7上无法正常运行

D:/Go/src/runtime/sys_windows_amd64.s:65 x75 fpx22fca sp-0x22fc8日 升级到go 1.21后报一堆错误&#xff0c;要死了啊 原来是go 1.21不支持win7了&#xff0c;必须把go退回到1.20版本 谷歌发布编程语言 Go 1.21 版本&#xff1a;取消支持微软 Win7/8 及苹果 macOS 10.13/10…

Vue3实战笔记(33)—组件传值props终章

文章目录 前言一、运行时声明、基于类型的声明二、一个小小的好奇心三、非 script setup场景下总结 前言 在 Vue 3 中&#xff0c;组件的声明方式主要有两种&#xff1a;运行时声明和基于类型的声明。这两种方式在 Vue 3 的 Composition API 中体现得尤为明显。 一、运行时声明…

如何使用Docker快速运行Firefox并实现远程访问本地火狐浏览器

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器&#xff0c;由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

基于manifest文件批量将coding的仓库导入gitlab中

文章目录 写在前面的话背景编写manifest文件最终效果 写在前面的话 前面有讲过通过manifest清单导入项目到gitlab中&#xff0c;但是实际的操作是不同gitlab实例之间的操作&#xff0c;然而对于在不同gitlab实例的repo迁移而言&#xff0c;显然direct transfer会更合适。 背景…