MYSQL的主键和外键,内连接和外连接,关联子查询

news2024/11/18 5:57:20

目录

  • 友情提醒
  • 第一章:MYSQL数据库多表主键和外键
    • 1)外键介绍(FOREIGN KEY)
    • 2)外键约束作用
    • 2)三种情况下添加外键约束
      • ①一对一关系
      • ②一对多关系
      • 多对多关系
    • 4)删除外键约束
  • 第二章:MYSQL数据库表之间的连接
    • 1)内连接,外连接等
    • 2)关联子查询

友情提醒

先看文章目录,大致了解知识点结构,直接点击文章目录可以跳转到文章指定位置。

第一章:MYSQL数据库多表主键和外键

1)外键介绍(FOREIGN KEY)

①外键是表格中的特殊字段但不是主键,外键用来建立主表与从表的关联关系,添加了外键的表我们称为从表,被引用主键的表我们称为主表。默认情况下主表和从表是相互约束的关系。
②外键约束的作用:避免多表中垃圾数据的产生,约束两个表中数据的一致性和完整性。
图片来自:http://cd.itheima.com/news/20220810/170702.html
在这里插入图片描述

③一个表可以有一个或多个外键,必须为主表定义主键,主表中的主键不能包含空值,但是外键可以是空值,如果不是空值,则每个外键的值必须等于主表中主键的某个值。
举例:每个外键的值必须等于主表中主键的某个值
主键的id字段数据是1,这时候从表的外键字段可以是1,如果想添加tid=2会报错。
在这里插入图片描述

tid不能值=2,因为外键的值必须等于主表中主键的某个值:
在这里插入图片描述

④父表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则父表与子表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
⑤写SQL语句时,需要在父表的表名后面指定列名或列名的组合。这个列或列的组合必须是父表的主键或候选键。
⑥外键中列的数目和数据类型必须和主表的主键中的相同。也就是:如果父表的主键是个复合主键有三个列I’d name general三个列联合作为主键,当它被reference的时候,那这个外键也必须是三个列

2)外键约束作用

第一种:阻止执行
①从表插入新行,其外键值不是主表的主键值便阻止插入;
②从表修改外键值,新值不是主表的主键值便阻止修改;
③主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行);
④主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。

第二种:级联操作
在外键约束中,主表和从表是相互约束,如果想通过主表去影响从表的数据,需要使用级联操作。

主表删除行,连带从表的相关行一起删除;

#级联删除:外键约束 on delete cascade;
alter table emp add foreign key(did) references dept(id) on update cascade ;

主表修改主键值,连带从表相关行的外键值一起修改。

#级联更新:外键约束 on update cascade;
alter table emp add foreign key(did) references dept(id) on delete cascade

2)三种情况下添加外键约束

①一对一关系

在任何一方添加外键,引用到另外一方的主键。
一般一对一关系很少见,遇到一对一关系的表最好是合并表。

-- 新添加一列字段:
alter table 从表 add 新列 int;
-- 将新列设为外键援引主表的主键
alter table 从表 add foreign key(外键) references 主表(主键);

②一对多关系

在多的一方添加外键,引用到一的一方的主键。

-- 表已经创建完成:alter table 从表 add foreign key(外键) references 主表(主键);
alter table 从表 add foreign key(外键) references 主表(主键);

--创建表时:在从表中
 foreign key(did) references dept(id);

多对多关系

创建第三张表,在第三张表中添加两个外键,分别援引另外两个表的主键。
已有coder,project表,创建第三张表分别援引这两个表的主键。

-- 创建第三张表分别指令另外两个表的主键。
create table coder_project(
	cid int,
	pid int,
	foreign key(cid) references coder(id),
	foreign key(pid) references project(id)
);

4)删除外键约束

查询外键约束名使用:show create table 数据表名 ;

-- 语法:alter table emp drop foreign key 外键约束名;
alter table emp drop foreign key emp_ibfk_1;

第二章:MYSQL数据库表之间的连接

1)内连接,外连接等

看这个大佬写的就好了,他写的太好了我就不献丑了

2)关联子查询

SQL关联子查询
子查询:把一个SQL语句的查询结果作为另外一个SQL语句查询的参数存在。

关联子查询—>查询价格最贵的水果名称 — >水果A表,价格B表。
分析:

-- 建立A表水果表
create table A(
    A_id int primary key auto_increment,
    A_name varchar(20) not null
);
insert into A values(1,'苹果');
insert into A values(2,'橘子');
insert into A values(3,'香蕉');
-- 建立B表水果价格表
create table B(
    B_id int primary key auto_increment,
    B_price double
);
insert into B values(1,2.3);
insert into B values(2,3.5);
insert into B values(4,null);
-------------------------------------------------------------------------
-- 1.B表保存的价格,在B表中查询出最高价格。b_price
select max(b_price) from b;
-- 2.通过最高的价格,找对应的id。 b_id
select b_id from b where b_price = (select max(b_price) from b);
--3.通过第二步查询到的最贵水果价格的id,到水果表中找对应的水果名称
select * from a where a_id = (select b_id from b where b_price = (select max(b_price) from b));

多表查询练习

-- 建表素材
create table teacher(
    id int not null primary key auto_increment,
    tname varchar(20) not null unique
);create table student(
    id int not null primary key auto_increment,
    sname varchar(20) not null unique,
    addr varchar(40) not null,
    age int
);create table course(
    id int not null primary key auto_increment,
    cname varchar(20) not null unique,
    t_id int not null,
    foreign key (t_id) references teacher(id)
);create table student_course(
    s_id int not null,
    c_id int not null,
    score double,
    foreign key (s_id) references student(id),
    foreign key (c_id) references course(id)
);insert into teacher values(null,'关羽');
insert into teacher values(null,'张飞');
insert into teacher values(null,'赵云');insert into student values(null,'小王','北京',20);
insert into student values(null,'小李','上海',18);
insert into student values(null,'小周','北京',22);
insert into student values(null,'小刘','北京',21);
insert into student values(null,'小张','上海',22);
insert into student values(null,'小赵','北京',17);
insert into student values(null,'小蒋','上海',23);
insert into student values(null,'小韩','北京',25);
insert into student values(null,'小孙','上海',18);
insert into student values(null,'小吴','北京',20);
insert into student values(null,'小郑','广州',21);
insert into student values(null,'小冯','深圳',22);
insert into student values(null,'小楚','深圳',21);insert into course values(null,'语文',1);
insert into course values(null,'数学',1);
insert into course values(null,'生物',2);
insert into course values(null,'化学',2);
insert into course values(null,'物理',2);
insert into course values(null,'英语',3);insert into student_course values(1,1,80);
insert into student_course values(1,2,90);
insert into student_course values(1,3,85);
insert into student_course values(1,4,78);
insert into student_course values(2,2,53);
insert into student_course values(2,3,77);
insert into student_course values(2,4,80);
insert into student_course values(3,1,72);
insert into student_course values(3,2,70);
insert into student_course values(3,4,80);
insert into student_course values(3,5,65);
insert into student_course values(3,6,75);
insert into student_course values(4,2,80);
insert into student_course values(4,3,90);
insert into student_course values(4,4,70);
insert into student_course values(4,6,95);
insert into student_course values(5,1,60);
insert into student_course values(5,2,70);
insert into student_course values(5,5,80);
insert into student_course values(5,6,69);
insert into student_course values(6,1,76);
insert into student_course values(6,2,88);
insert into student_course values(6,3,87);
insert into student_course values(7,4,80);
insert into student_course values(8,2,71);
insert into student_course values(8,3,58);
insert into student_course values(8,5,68);
insert into student_course values(9,2,88);
insert into student_course values(10,1,77);
insert into student_course values(10,2,76);
insert into student_course values(10,3,80);
insert into student_course values(10,4,85);
insert into student_course values(10,5,83);
insert into student_course values(11,3,80);
insert into student_course values(12,4,99);
insert into student_course values(13,5,74);

练习以及答案

#1. 查询平均成绩大于70分的同学的学号和平均成绩
    # 成绩和学号在student_course表中 
    select * from student_course;
    # 查询平均成绩
    select avg(score) from student_course;
    # 学号分组查询学生的平均成绩
    select avg(score) from student_course group by s_id having avg(score) > 70;
    # 查询学号和平均成绩大于70分的学生信息
    select s_id , student.* , avg(score) 
    from student_course,student 
    where s_id = student.id group by s_id having avg(score) > 70 
    order by s_id;
    
#2. 查询所有学生的学号,姓名,选课数,总成绩
    # 学号,姓名在student表中  学号 选课数 总成绩 在student_course表中 
    
    # 查询 学号 选课数 总成绩 
    select s_id,count(c_id),sum(score) 
    from student_course group by s_id;
    # 将上述的查询结果 当做一个临时 和 student表联合查询
    select sname ,  temp.* 
    from student , (select s_id,count(c_id),sum(score) from 
    student_course group by s_id) as temp 
    where temp.s_id = student.id order by s_id;
        
    # 优化查询结果
    select temp.s_id , sname ,  temp.count , temp.sum  
    from student , (select s_id,count(c_id) as count,sum(score) as sum 
    from student_course group by s_id) as temp 
    where temp.s_id = student.id order by s_id;#3.查询没有学过关羽老师课程的同学的学号和姓名
    # 通过关羽老师找到对应的id
    select id from teacher where tname = '关羽'; 
    # 通过关羽老师的id,找到关羽老师课程的id
    select id from course 
    where t_id = (select id from teacher where tname = '关羽');
    # 通过课程id找到学过对应课程学的id
    select s_id from student_course 
    where c_id in(select id from course 
    where t_id = (select id from teacher where tname = '关羽')); 
    # 找到所有学的id,从中把学习过的学生的id除去
    select s_id from student_course 
    where s_id not in(select s_id from student_course 
    where c_id in(select id from course 
    where t_id = (select id from teacher where tname = '关羽')));
    # 综合查出最后的结果
    select id,sname from student 
    where id in(select s_id from student_course 
    where s_id not in(select s_id from student_course 
    where c_id in(select id from course 
    where t_id = (select id from teacher 
    where tname = '关羽')))) order by id;
    
#4.查询学过赵云老师课程的同学的学号和姓名
#5.查询没有学习三门课程以上的同学学号和姓名
    # 学习的课程在student_course  姓名在student表中
    # 在student_course表中找到低于3门课程的学生的id
    select s_id from student_course group by s_id having count(c_id) < 3;
    # 通过上述查询的id结果,到student表中查询学生姓名
    select * from student 
    where id in(select s_id from student_course group by s_id 
    having count(c_id) < 3);
    
    # 两张表联合查询
    select s_id,sname from student_course,student 
    where student_course.s_id = student.id group by s_id 
    having count(c_id) < 3;
    
    
#6.查询各科成绩的最高分和最低分。  
    select c_id,max(score),min(score) 
    from student_course group by c_id;
    # 查询课程名称
    select c_id, cname, max(score),min(score) 
    from student_course,course 
    where student_course.c_id = course.id group by c_id 
    order by c_id;
    
#7. 查询学生信息和平均成绩 
    select sname,avg(score) from student,student_course 
    where student.id = student_course.s_id group by s_id;#8. 查询上海和北京学生数量
    select addr,count(addr) from student 
    where addr in('北京','上海') group by addr;#9. 查询不及格的学生信息和课程信息
    # 查询学生和课程的id
    select s_id,c_id from student_course where score < 60;
    # 通过学生的id和课程的id找到学生和课程的信息
    select * from student,course,(select s_id,c_id from student_course 
    where score < 60) as temp
    where student.id = temp.s_id and course.id = temp.c_id;
#10. 统计每门课程的学生选修人数(超过4人的进行统计)
    select c_id ,count(s_id) from student_course group by c_id 
    having count(s_id) > 4;

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

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

相关文章

scitb5函数1.4版本(交互效应函数P for interaction)发布----用于一键生成交互效应表

在SCI文章中&#xff0c;交互效应表格&#xff08;通常是表五&#xff09;能为文章锦上添花&#xff0c;增加文章的信服力&#xff0c;增加结果的可信程度&#xff0c;还能进行数据挖掘。 交互效应表我在既往文章《R语言手把手教你制作一个交互效应表》已经介绍怎么制作了&…

提效新纪元-组件化开发在转转App中的应用-后端篇

1 前言 组件化开发是一种利用可重用的软件构件来设计和开发计算机系统的过程。借助组件化开发可以实现最小化、高效交付。 平台基础体验部将业务逻辑抽象为组件&#xff0c;通过组合组件快速构建商品Feed流&#xff0c;研发效率整体提升2倍。组件化开发不仅带来效率的提升&am…

【AI大模型智慧办公】教你用讯飞星火大模型5分钟写一个转正述职ppt

文章目录 前言SparkDesk讯飞星火认知大模型简介利用讯飞星火写一个转正述职ppt1.告诉讯飞星火我想写一篇转正述职ppt2.利用MindShow一键生成ppt 申请体验写在最后 前言 随着ChatGPT迅速走红,国内各大企业纷纷发力认知大模型领域。经过一段时间的酝酿,讯飞“星火认知大模型”于…

解决matplotlib画图去除非常多的白色边框

文章目录 解决matplotlib画图去除非常多的白色边框本文说明为什么matplotlib画图会默认有很多白色边框&#xff1f;绘图默认绘图去除白边方法一&#xff0c;修改保存图像的代码取消白边略微增加白边 去除白边方法二&#xff0c;修改显示图像的代码 总结 解决matplotlib画图去除…

Maven构建生命周期

目录 Default (Build) 生命周期 命令行调用 Site 生命周期 如何清除本地 Maven 仓库并重新构建项目 Maven 构建配置文件 mvn dependency:purge-local-repository 这个命令是干什么的&#xff1f; mvn clean install这个命令是干什么的&#xff1f; 配置文件激活 1、配…

自从外包三年半,程序员人废了一半

如果不是女朋友和我提分手&#xff0c;我估计现在还没醒悟。大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了3年多的CRUD&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企…

HBase入门 修改表字段类型(十一)

一、查询看 自己表的DATA_TYPE select TENANT_ID,TABLE_SCHEM,TABLE_NAME,COLUMN_NAME,COLUMN_FAMILY,DATA_TYPE,TYPE_NAME,COLUMN_SIZE,DECIMAL_DIGITS from system.catalog where TABLE_NAME表名2、修改为varchar类型 upsert into SYSTEM.CATALOG (TENANT_ID,TABLE_SCHEM,TA…

如何高清视频录制?您只需要这样操作!

案例&#xff1a;如何录制画质高清的视频&#xff1f; 【我录制了一个视频课程&#xff0c;上传到网上&#xff0c;但是我录制的视频画质不好&#xff0c;影响观感。有没有支持高清录制的录屏工具&#xff1f;有没有小伙伴可以推荐一下&#xff01;在线等&#xff01;】 无论…

ChatGpt与AI交谈的未来到来,你准备好了吗?

ChatGpt已经成为了人工智能领域中的一颗明珠&#xff0c;它可以根据用户提出的问题进行分析和回答&#xff0c;帮助用户解决问题和获取信息。而未来&#xff0c;随着人工智能技术的进一步发展&#xff0c;ChatGpt与AI交谈将成为一种更加普遍和重要的交流方式。你准备好了吗&…

7 文件操作、单元测试、goroutine【Go语言教程】

7 文件操作、单元测试、goroutine【Go语言教程】 1 文件操作 1.1 介绍 os.File 封装所有文件相关操作&#xff0c;File 是一个结构体 常用方法&#xff1a; 打开文件 关闭文件 package mainimport ("fmt""os" )func main(){//打开文件//file又叫做&…

VPGTrans: 10%的成本定制你自己的类GPT-4多模态大模型

作者 | 张傲 最近的多模态&#xff08;对话&#xff09;大模型将基于文本的ChatGPT的强大能力扩展到了多模态输入&#xff0c;实现强大的多模态语义理解&#xff0c;比如GPT-4、BLIP-2、Flamingo等。但咱们普通玩家训练一个多模态GPT代价非常昂贵。来自于新加坡国立大学和清华大…

基于SSM框架的核酸检测管理系统

基于SSM框架的核酸检测管理系统 快速查看 基于SSM框架的核酸检测管理系统功能需求开发工具模块相关技术系统相关图片 功能需求 用户模块&#xff1a; 注册功能&#xff1a;普通用户可以访问本系统进行账户注册&#xff0c;个人资料&#xff1a;登录系统对自己的个人资料&…

Parker派克伺服电机有哪些优势特点?如何选型?

一、什么是伺服电机&#xff1f; 伺服电机是一种可以通过控制器精确地控制位置、速度和加速度的电机&#xff0c;主要由电机、编码器和控制器三部分组成&#xff0c;具有高转矩、高精度、快速响应和低转速稳定特性&#xff0c;能够在负载扰动、电压变化及机械特性变化下保持较…

springboot整合邮箱功能二(普通邮件, html邮件, thymleaf邮件)

【SpringBoot整合Email发送邮件】_ζั͡ ั͡空 ั͡ ั͡白&#xfffd;的博客-CSDN博客 https://www.cnblogs.com/erlou96/p/16878192.html#_label1_5 1. 准备工作 1.1 qq邮箱设置 本文默认使用qq邮箱来发送邮件,然后使用一个在线临时邮箱来接收邮件。为了让程序能够通过…

srs one2one,one2many通话环境搭建

一、简介 二、go环境配置 三、srs编译配置 四、信令服务器编译 4.1 signaling8 4.2 web服务器 五、测试 六、附录 官⽅⽂档参考地址&#xff1a;https://github.com/ossrs/srs/wiki/v4_CN_WebRTC#sfu-one-to-one 一、简介 srs的webrtc能力和两个信令服务器不管是逻辑上还是代码…

Linux 进程基础

目录 1、进程的概念 2、进程与线程的区别、进程与程序的区别 2.1 进程与线程的区别 2.2 进程与程序的区别 3、进程相关 shell 命令 3.1 ps 3.3.1 参数说明 3.3.2 结果说明 3.2 pidof 3.3 pstree 3.4 top 3.5 kill 4、进程相关函数 4.1 fork 4.1.1 fork的函数原型…

医院内导航及智能导医,医院导诊图怎么制作?

在大型综合性医院&#xff0c;由于专业分工精细&#xff0c;一个诊疗过程涉及的功能单元往往分布在不同的楼宇、不同楼层的不同位置&#xff0c;再加上多数患者对医院环境不熟悉&#xff0c;导致滞院的时间长、诊疗效率低、患者对服务的满意度下降。为解决这一问题&#xff0c;…

VMware Aria Operations for Logs 8.12 - 集中式日志管理

VMware Aria Operations for Logs 8.12 - 集中式日志管理 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-aria-operations-for-logs/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 集中式日志管理 VMware Aria …

蓝牙mesh数据包格式解析

蓝牙mesh数据包的结构如下图&#xff1a; 总长31个字节。 Length (1Byte)&#xff1a;数据长度 Type (1Byte)&#xff1a;广播类型 IVI (1bit)&#xff1a;用来认证加密Network PDU的IV index的最低位 NID (7bits)&#xff1a;网络ID&#xff0c;network ID。从网络密钥(Ne…

学习了两个多月就进了我们公司,顺利过了试用期,我心塞了...

转行起因 公司前段时间来了个大专机械专业毕业的&#xff0c;挺好奇他在如今这个环境下怎么进来的而且非本科非科班&#xff0c;后面我请他喝了一次酒&#xff0c;我才了解到他的故事&#xff0c;写出来与大家分享&#xff0c;希望对各位有点启迪。 他以前在一个大厂做售后工…