MySQL表的增删改查---多表查询和联合查询

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱
ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客
本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶
个人主页:xiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客

系列专栏:xiaoxie的MySql学习系列专栏——CSDN博客●'ᴗ'σσணღ
我的目标:"团团等我💪( ◡̀_◡́ ҂)" 

( ⸝⸝⸝›ᴥ‹⸝⸝⸝ )欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​+关注(互三必回)!

一. 数据库约束 

1.NOT NULL - 指示某列不能存储 NULL 值。

2.UNIQUE - 保证某列的每行必须有唯一的值。

3.DEFAULT - 规定没有给列赋值时的默认值。

4.PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标 识,有助于更容易更快速地找到表中的一个特定的记录。

5.FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。

6.CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略 CHECK子句。

这些约束条件在数据库中起着非常重要的作用,可以确保数据的完整性和一致性。在设计数据库表结构时,合理地运用这些约束条件可以有效地避免数据错误和不一致性。

案例示范:

 create table student(-> id int primary key auto_increment,--主键约束,并且自动加1-> name varchar(20) not null,--不能为空-> qq int unique,--值唯一-> age int default 18,--赋值默认值-> gender varchar(2) check (gender = '男生' or gender = '女生'),--保证性别为男生或女生-> classid int,-> foreign key (classid) references class(id) -- 外键基于外键 classid和class表的主键 id在两个表之间建立联系-> );

结果:

使用 desc 表名 查看表结构

desc student

这时候我们插入表的数据就受到数据库的约束了例如我们可以插入一条不符合数据库的约束的数据查看一下

insert into student values(1,"张三",1234,null,"未知",2);

例如我们插入一条性别为未知的数据可以看到 

不符合CHECK条件的数据无法插入.博主在这里就验证这一条约束,别的就不过多的赘述了.

注意实现

  1. NOT NULL

    • NOT NULL 约束用于确保指定列不能存储NULL值。这意味着,在插入新记录或更新现有记录时,该列必须包含有效数据。
    • 注意:在设计表结构时应谨慎使用NOT NULL约束,特别是在考虑业务逻辑和未来扩展性时,要确保所有必要的数据都能在任何时候提供。
  2. UNIQUE

    • UNIQUE 约束强制某一列(或多个列组合)中的每行都具有唯一的值,不允许重复。
    • 注意:对于多列组成的唯一键,只要这些列的组合不重复即可,单个列可以有重复值。另外,每个表只能有一个主键约束,但可以有多个UNIQUE约束。
  3. DEFAULT

    • DEFAULT 约束为指定列定义一个默认值,当插入新记录时如果没有明确为该列赋值,则自动填充这个预设值。
    • 注意:默认值的选择应该符合业务逻辑,并且对于可能需要特殊处理的值(如时间戳、序列号等),需要考虑是否需要触发器或者程序逻辑来动态生成更复杂的默认值。
  4. PRIMARY KEY

    • PRIMARY KEY 是一种特殊的约束,它结合了NOT NULL 和 UNIQUE 的特点,即主键列的值不能为空,并且每一行的主键值在整个表中必须是唯一的。
    • 注意:每个表只能有一个主键,它可以是一个单列或多列的组合(复合主键)。主键通常被用作索引,有助于快速定位和查询特定记录。
  5. FOREIGN KEY:(特别关注)

    • FOREIGN KEY 约束用于维护两个表之间的引用完整性,确保一个表中的列(外键列)的值必须匹配另一个表(参照表)的主键列的值。
    • 注意:在设置外键约束时,要考虑删除规则(ON DELETE CASCADE, SET NULL, NO ACTION等)和更新规则(ON UPDATE CASCADE等),以避免违反引用完整性和级联操作带来的影响。
  6. CHECK

    • CHECK 约束理论上允许你限制列的值必须满足特定条件,例如年龄必须在0到120之间这样的范围检查。
    • 注意:在MySQL中,默认情况下并不支持标准SQL的CHECK约束进行行级的数据验证。尽管可以在创建表时编写CHECK子句,但MySQL会忽略执行这些约束,除非在某些特定存储引擎下或通过触发器模拟实现类似功能。在其他数据库系统如Oracle、PostgreSQL中,CHECK约束会被正常执行并用于保证列值符合特定条件。

总之,在实际应用中合理使用这些约束能够有效地维护数据库的一致性和完整性,但在MySQL中尤其要注意其对CHECK约束的支持情况,以确保数据验证机制的有效实施。

 二.表的设计

1.1对1

在一对一关系中,一个表中的每一行只与另一个表中的一行相关联,反之亦然。

例如:每个员工(Employee)可能有一个唯一的身份证记录(IDCard)。在这种情况下,可以有两种设计方式:

方式一(共享主键)

CREATE TABLE Employee (ID INT PRIMARY KEY AUTO_INCREMENT,Name VARCHAR(50),-- 其他字段...
);CREATE TABLE IDCard (ID INT PRIMARY KEY, -- 使用相同的主键CardNumber VARCHAR(20),EmployeeDetails VARCHAR(100), -- 其他与身份证相关的字段FOREIGN KEY (ID) REFERENCES Employee(ID)
);

这种方式下,Employee表和IDCard表共享同一个主键,即Employee的ID也是IDCard的主键。

方式二(独立主键,但使用唯一外键约束)

CREATE TABLE Employee (EmployeeID INT PRIMARY KEY AUTO_INCREMENT,Name VARCHAR(50),-- 其他字段...
);CREATE TABLE IDCard (ID INT PRIMARY KEY AUTO_INCREMENT,EmployeeID INT UNIQUE,CardNumber VARCHAR(20),EmployeeDetails VARCHAR(100),FOREIGN KEY (EmployeeID) REFERENCES Employee(EmployeeID)
);

在这种设计中,两个表各自有自己的主键,并且通过EmployeeID字段建立外键约束,确保IDCard表中每张身份证只对应一个Employee。

2.1对多

在一对多关系中,一个表的一行可以与另一个表的多行关联,但反过来不行。

例如:一个部门(Department)可以有多个员工(Employee),但每个员工只能属于一个部门。

CREATE TABLE Department (DeptID INT PRIMARY KEY AUTO_INCREMENT,DeptName VARCHAR(50)
);CREATE TABLE Employee (EmployeeID INT PRIMARY KEY AUTO_INCREMENT,Name VARCHAR(50),DeptID INT,FOREIGN KEY (DeptID) REFERENCES Department(DeptID)
);

在这个例子中,Department表的每一个DeptID在Employee表中作为外键出现多次,表明了一个部门可以拥有多个员工。

3.多对多

在多对多关系中,一个表的每一行都可以与另一个表的多行关联,反之亦然。

例如:一个老师(Teacher)可以教多个学生(Student),而一个学生也可以被多个老师教授。

CREATE TABLE Teacher (TeacherID INT PRIMARY KEY AUTO_INCREMENT,Name VARCHAR(50)
);CREATE TABLE Student (StudentID INT PRIMARY KEY AUTO_INCREMENT,Name VARCHAR(50)
);CREATE TABLE TeacherStudent (TeacherID INT,StudentID INT,PRIMARY KEY (TeacherID, StudentID),FOREIGN KEY (TeacherID) REFERENCES Teacher(TeacherID),FOREIGN KEY (StudentID) REFERENCES Student(StudentID)
);

在这种情况下,需要创建一个中间表(TeacherStudent),它包含两个外键分别引用Teacher和Student表的主键,以此来存储这种多对多的关系信息。

 三.查询

1.聚合查询

函数说明
count(数据)返回查询到的数据的 数量
sum(数据)返回查询到的数据的 总和,不是数字没有意义
avg(数据)返回查询到的数据的 平均值,不是数字没有意义
max(数据)返回查询到的数据的 最大值,不是数字没有意义
min(数据)返回查询到的数据的 最小值,不是数字没有意义

语法:

select 聚合函数(数据) from + 表名 + where 条件

2.GROUP BY子句

SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询。需要满足:使用 GROUP BY 进行分组查 询时,SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT 中则必须包含在聚合函 数中。 

语法:

select 列名1,列名2....from 表名 group by 列名1....

案例:

create table emp(id int primary key auto_increment,name varchar(20) not null,role varchar(20) not null,salary numeric(11,2)
);
insert into emp(name, role, salary) values
('马云','服务员', 1000.20),
('马化腾','游戏陪玩', 2000.99),
('孙悟空','游戏角色', 999.11),
('猪无能','游戏角色', 333.5),
('沙和尚','游戏角色', 700.33),
('隔壁老王','董事长', 12000.66);

 查询每个角色的最高工资、最低工资和平均工资

select name,role,max(salary),min(salary),avg(salary) from emp group by role;

结果:

 3 HAVING

GROUP BY 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用 HAVING

案例:

显示平均工资低于1500的角色和它的平均工资

select name,role,avg(salary) from emp group by role having avg(salary) < 1500;

 四.多表查询

实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积:

准备实验数据

创建班级表:

create table class(id int primary key auto_increment,name varchar(20));

创建学生表:

 create table student(id int primary key auto_increment,sn int unique,name varchar(20) default "unkown",qq_mail varchar(20),class_id int,foreign key(class_id) references class(id));

创建课程表:

create table course(id int primary key auto_increment,name varchar(20));

创建学生课程中间表,考试成绩表:

 create table score(id int primary key auto_increment,score decimal(3,1),student_id int,course_id int,foreign key(student_id) references student(id),foreign key(course_id) references course(id));

插入数据:

insert into class(name)values("计科"),("软工"),("网络");insert into student(sn, name, qq_mail, class_id) values('09982','黑旋风李逵','xuanfeng@qq.com',1),('00835','菩提老祖',null,1),('00391','白素贞',null,1),('00031','许仙','xuxian@qq.com',1),('00054','不想毕业',null,1),('51234','好好说话','say@qq.com',2),('83223','tellme',null,2),('09527','老外学中文','foreigner@qq.com',2);
insert into course(name) values('Java'),('中国传统文化'),('计算机原理'),('语文'),('高阶数学'),('英文');insert into score(score, student_id, course_id) values-- 黑旋风李逵(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),-- 菩提老祖(60, 2, 1),(59.5, 2, 5),-- 白素贞(33, 3, 1),(68, 3, 3),(99, 3, 5),-- 许仙(67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),-- 不想毕业(81, 5, 1),(37, 5, 5),-- 好好说话(56, 6, 2),(43, 6, 4),(79, 6, 6),-- tellme(80, 7, 2),(92, 7, 6);

4.1内连接

语法:

select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;

案例:1)查询“许仙”同学的 成绩 

select student.name,score.score from student,score where student.id = score.student_id and student.name = "许仙";
 select student.name,score.score from student join score on student.id = score.student_id and student.name = "许仙";

(2)查询所有同学的总成绩,及同学的个人信息:

select student.sn,student.name,student.qq_mail,sum(score) as totalfrom student join scoreon student.id = score.student_idgroup by score.student_id;

 

总结来说:内连接我们一开始不熟练可以以下几步来做

1.先确定我们要查询的信息,来自那几张表

2.针对这几张表进行笛卡尔积

3.加上连接条件,去除无效数据

4.在根据题目要求,加上其他条件

5.继续根据题目要求看需要查询的是那些列,把不需要的去除即可,例如案例一,我们只需要知道许仙的名字和成绩, select student.name,score.score 这样即可

4.2外连接

语法:

-- 左外连接,表1完全显示
select 字段名  from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显示
select 字段 from 表名1 right join 表名2 on 连接条件;

案例:查询所有同学的成绩,及同学的个人信息,如果该同学没有成绩,也需要显示

select * from student left join score on student.id = score.student_id;

 

 4.3自连接

自连接是指在同一张表连接自身进行查询。也就是自己对自己进行笛卡尔积,属于是对待特殊问题的特殊技巧

案例:显示所有“计算机原理”成绩比“Java”成绩高的成绩信息

 SELECTs1.*FROMscore s1JOIN score s2 ON s1.student_id = s2.student_idAND s1.score < s2.scoreAND s1.course_id = 1 --java的课程号AND s2.course_id = 3;--计算机原理的课程号

这个SQL查询从“score”表中选择所有记录,其中学生在Java课程(course_id = 1)中的分数高于计算机原理课程(course_id = 3)中的分数。该查询在“score”表上使用自连接来比较同一学生在两门课程中的分数。

自连接是指在同一个表中进行连接操作。在这种情况下,我们使用表的别名来区分不同的实例。以下是自连接的步骤:

  1. 为表分配别名:在查询中为同一张表分配不同的别名,以便区分它们。在这个例子中,我们使用了s1和s2作为score表的别名。

  2. 指定连接条件:在JOIN子句中指定连接条件,以便确定两个表之间的关联。在这个例子中,连接条件是s1.student_id = s2.student_id,表示两个实例具有相同的学生ID。

  3. 添加过滤条件:在ON子句中添加额外的条件来过滤出符合特定条件的记录。在这个例子中,过滤条件是s1.score < s2.score,s1.course_id = 1和s2.course_id = 3。

  4. 选择需要的列:在SELECT子句中指定要检索的列。在这个例子中,我们选择了s1.*,表示选择s1表中的所有列。

  5. 执行查询:执行SQL查询以获取符合条件的结果集。

4.4 子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询 

1.单行子查询:返回一行记录的子查询 查询与“不想毕业” 同学的同班同学:

 select * from student where class_id=(select class_id from student wherename='不想毕业');

 多行子查询:返回多行记录的子查询 案例:查询“语文”或“英文”课程的成绩信息:

(not)in关键字

 -- 使用INselect * from score where course_id in (select id from course wherename='语文' or name='英文');

 (not)exists关键字

-- 使用 EXISTS
select * from score sco where exists (select sco.id from course cou 
where (name='语文' or name='英文') and cou.id = sco.course_id)

 

4.5 合并查询 

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用UNION 和UNION ALL时,前后查询的结果集中,字段需要一致。

1.union

该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。 案例:查询id小于3,或者名字为“英文”的课程:

select * from course where id<3
union
select * from course where name='英文';
-- 或者使用or来实现
select * from course where id<3 or name='英文';

 2.union all

该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。 案例:查询id小于3,或者名字为“Java”的课程

-- 可以看到结果集中出现重复数据Java
select * from course where id<3
union all
select * from course where name='Java';

 

 以上就是博主关于MySQL的多表查询和联合查询的全部类型了,感谢您的阅读

 

 

 

 

 

 

 

 

 

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

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

相关文章

冰岛人[天梯赛]

文章目录 题目描述思路AC代码 题目描述 输入样例 15 chris smithm adam smithm bob adamsson jack chrissson bill chrissson mike jacksson steve billsson tim mikesson april mikesdottir eric stevesson tracy timsdottir james ericsson patrick jacksson robin patrickss…

ORA-600 2662快速恢复之Patch scn工具---惜分飞

有客户数据库启动报ORA-600 2662错误 SQL> recover database; 完成介质恢复。 SQL> alter database open ; alter database open * 第 1 行出现错误: ORA-00603: ORACLE server session terminated by fatal error ORA-00600: internal error code, arguments: [2662], […

AI如何支持慈善组织

为各种有意义的事业提供支持&#xff0c;无论是努力寻找治愈疾病的方法、研发使生活更轻松的技术&#xff0c;还是为有需要的人提供服务&#xff0c;都是无比崇高的使命。提供捐款或是投入时间支持的捐助者和志愿者往往对他们选择支持的事业的目标、服务和资源分配存有诸多疑虑…

Linux系统如何使用tcpdump实时监控网络速度:方法与技巧解析

在网络管理和故障排查中&#xff0c;了解网络速度是一个重要的环节。而tcpdump&#xff0c;作为一个强大的网络数据包分析工具&#xff0c;不仅可以用于分析数据包的内容&#xff0c;还能用于实时监控网络速度。本文将介绍Linux系统如何使用tcpdump来实时监控网络速度。 首先&…

工大智信智能听诊智慧医疗的创新

智能听诊器&#xff0c;智慧医疗的新突破 工大智信智能听诊器是一款结合了先进技术和医疗专业知识的创新产品。它以其独特的优势&#xff0c;为医疗行业带来了前所未有的突破和变革。 传统听诊器依赖于医生的主观判断和经验&#xff0c;而工大智信智能听诊器采用了先进的传感技…

CV论文--2024.3.21

1、Chain-of-Spot: Interactive Reasoning Improves Large Vision-Language Models 中文标题&#xff1a;Chain-of-Spot&#xff1a;交互式推理改进大型视觉语言模型 简介&#xff1a;在视觉语言理解领域&#xff0c;模型在解释和推理视觉内容方面的熟练程度已经成为许多应用的…

vue学习笔记27-组件生命周期⭐

每个vue组件实例在创建时都需要经历一系列初始化步骤&#xff0c;比如设置好数据侦听&#xff0c;编译模板&#xff0c;挂载实列到DOM&#xff0c;以及在数据改变时更新DOM。在此过程中&#xff0c;它也会运行称为生命周期钩子的函数&#xff0c;让开发者有机会在特定阶段运行自…

⾃定义类型:结构体

大家好我们今天学习的是结构体&#xff0c;话不多说。上车吧&#xff01;&#xff01;&#xff01; 文章目录 1. 结构体类型的声明2. 结构体变量的定义创建和初始化3. 结构成员访问操作符4. 结构体内存对⻬5. 结构体传参6. 结构体实现位段 前言 C语言中类型有很多&#xff0c;…

【Linux】Bash支持各种指令选项的原理:命令行参数

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《…

Linux常用命令之文件权限类

1.1 Linux的文件属性 在Linux里使用ll或者ls-l命令来显示一个文件的属性以及文件所属的用户和组。 以-开头&#xff1a;普通文件 以d开头&#xff1a;目录 以l开头&#xff1a;链接 以c开头&#xff1a;字符类型的设备文件(例如&#xff1a;鼠标、键盘&#xff0c;他们输入…

排序算法:归并排序(递归)

文章目录 一、归并排序的思路二、代码编写 先赞后看&#xff0c;养成习惯&#xff01;&#xff01;&#xff01;^ _ ^<3 ❤️ ❤️ ❤️ 码字不易&#xff0c;大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦&#xff01; 所属专栏:排序算法 一、归并排序的思路 单…

nRF Sniffer 在Wireshark中的使用

一、简介 使用nRF Sniffer在wireshark中抓包是经常使用的。但是每次抓包会获取到空气中所有的数据包&#xff0c;数据量非常大。而对于开发人员而言&#xff0c;只需要其中特定的信息。此时就需要掌握数据的过滤语句。 二、过滤 1.根据MAC地址进行过滤 btle.advertising_add…

2023年蓝桥杯省赛——平方差

目录 题目链接&#xff1a;1.平方差 - 蓝桥云课 (lanqiao.cn) 思路 暴力偷分 发现规律 发现蹊跷 总结 题目链接&#xff1a;1.平方差 - 蓝桥云课 (lanqiao.cn) 思路 咱就是说&#xff0c;写蓝桥杯的题目的第一件事情是什么&#xff0c;那就是不管三七二十一先暴力一下把能…

【爬虫】web自动化和接口自动化

专栏文章索引&#xff1a;爬虫 目录 一、介绍 二、推荐 1.接口自动化 2.Web自动化 一、介绍 爬虫技术一般可以分为两种类型&#xff1a;接口自动化和web自动化。下面是它们的简要介绍&#xff1a; 1.接口自动化 接口自动化技术的主要目的是通过模拟HTTP请求来实现自动化…

Docker在Mac上轻松部署RabbitMQ:从拉取镜像到创建运行带管理界面的容器全攻略

1、去官网下载docker 安装&#xff1a;把图标拉到应用程序即可 https://docs.docker.com/desktop/install/mac-install/ 2、拉取rabbitmq镜像 docker pull rabbitmq:3.8-management 3、创建并启动容器&#xff0c;同时设置环境变量以创建用户和密码 docker run -d --name m…

axure和蓝湖上查看页面的说明和上传文件

蓝湖上传文件 入口 可添加链接和文件 文件可添加 PDF&#xff0c;word&#xff0c;Excel等&#xff0c;不能添加压缩包&#xff0c;可在线预览文件内容 axure元件说明 在原型上添加说明 axure发布页 axure预览页或发布到axure的服务器上&#xff0c;查看页面说明的方法 点…

C++之模版详解

一.array与vector对比 由图发现&#xff0c;使用array数组是必须提前开好空间&#xff0c;而vector是顺序表&#xff0c;可以实现动态开辟空间 array也支持迭代器&#xff0c;如下&#xff1a; int main() {array<int, 10> arr{ 1,2,3,4,5,6,7,8,9,10 };auto it arr.be…

【感悟《剑指offer》典型编程题的极练之路】01数组篇!

​​​​​​​ ​​​​​​​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ ​​​​​​​ 文章所属专栏&#xff1a;《剑指offer》典型编程题的极练之路 ​​​​​​​ ​​​​​​​ …

内网横向1

IPC$详解 IPC( Internet Process Connection) 共享 “ 命名管道 ” 的资源 , 是为了实现进程间通信而开放的命名管道。 IPC 可以通过验证用户名和密码获得相应的权限&#xff0c;通常在远程管理计算机和查看计算机的共享资源时使用 通过 ipc$ &#xff0c;可以与目标机器建立连…

第六十一回 放冷箭燕青救主 劫法场石秀跳楼-编译安装飞桨paddlepaddle@openKylin+RISCV

卢俊义在水里被张顺抓住&#xff0c;用轿子抬到了梁山。宋江等人下马跪在地上迎接&#xff0c;请他坐第一把交椅。卢俊义宁死不从&#xff0c;大家只好说留他在山寨几天&#xff0c;先让李固带着马车货物回去。吴用对李固说&#xff0c;你的主人已经答应坐第二把交椅了&#xf…