MySQL基础-----多表关系与查询概述

目录

前言

一、多表关系

 1.一对多

2.多对多

3.一对一

二、多表查询概述

 1.概述

2.笛卡尔积

3.分类


前言

        本期我们开始学习新的章节,也就是MySQL的多表关系与查询,在本期主要是讲述概念性的东西,大概介绍多表关系是什么,为什么,以及查询方面的相关简要。下面看正文。

一、多表关系

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结
构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:
  • 一对多(多对一)
  • 多对多
  • 一对一

 1.一对多

  • 案例: 部门 与 员工的关系
  • 关系: 一个部门对应多个员工,一个员工对应一个部门
  • 实现: 在多的一方建立外键,指向一的一方的主键

2.多对多

  • 案例: 学生 与 课程的关系
  • 关系: 一个学生可以选修多门课程,一门课程也可以供多个学生选择
  • 实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

对应的 SQL 脚本 :
# 创建学生表
create table student(
    id int auto_increment primary key comment '主键ID',
    name varchar(10) comment '姓名',
    no varchar(10) comment '学号'
) comment '学生表';

#插入学生数据 
insert into student values (null, '黛绮丝', '2000100101'),(null, '谢逊',
'2000100102'),(null, '殷天正', '2000100103'),(null, '韦一笑', '2000100104');

# 创建课程表
create table course(
id int auto_increment primary key comment '主键ID',
name varchar(10) comment '课程名称'
) comment '课程表';

# 插入课程数据 
insert into course values (null, 'Java'), (null, 'PHP'), (null , 'MySQL') ,
(null, 'Hadoop');

# 创建学生与课程联系的外键表
create table student_course(
id int auto_increment comment '主键' primary key,
studentid int not null comment '学生ID',
courseid int not null comment '课程ID',
constraint fk_courseid foreign key (courseid) references course (id),
constraint fk_studentid foreign key (studentid) references student (id)
)comment '学生课程中间表';

# 插入学生与课程关系数据
insert into student_course values (null,1,1),(null,1,2),(null,1,3),(null,2,2),
(null,2,3),(null,3,4);

3.一对一

  • 案例: 用户 与 用户详情的关系
  • 关系: 一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率
  • 实现: 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

对应的SQL脚本:

# 创建用户信息表
create table tb_user(
id int auto_increment primary key comment '主键ID',
name varchar(10) comment '姓名',
age int comment '年龄',
gender char(1) comment '1: 男 , 2: 女',
phone char(11) comment '手机号'
) comment '用户基本信息表';

# 创建用户教育信息表
create table tb_user_edu(
id int auto_increment primary key comment '主键ID',
degree varchar(20) comment '学历',
major varchar(50) comment '专业',
primaryschool varchar(50) comment '小学',
middleschool varchar(50) comment '中学',
university varchar(50) comment '大学',
userid int unique comment '用户ID',
constraint fk_userid foreign key (userid) references tb_user(id)
) comment '用户教育信息表';

# 插入用户信息数据
insert into tb_user(id, name, age, gender, phone) values
(null,'黄渤',45,'1','18800001111'),
(null,'冰冰',35,'2','18800002222'),
(null,'码云',55,'1','18800008888'),
(null,'李彦宏',50,'1','18800009999');

# 插入用户教育信息数据
insert into tb_user_edu(id, degree, major, primaryschool, middleschool,
university, userid) values
(null,'本科','舞蹈','静安区第一小学','静安区第一中学','北京舞蹈学院',1),
(null,'硕士','表演','朝阳区第一小学','朝阳区第一中学','北京电影学院',2),
(null,'本科','英语','杭州市第一小学','杭州市第一中学','杭州师范大学',3),
(null,'本科','应用数学','阳泉第一小学','阳泉区第一中学','清华大学',4);

二、多表查询概述

数据准备

删除之前 emp, dept 表的测试数据
执行如下脚本,创建 emp 表与 dept 表并插入测试数据
-- 创建dept表,并插入数据
create table dept(
id int auto_increment comment 'ID' primary key,
name varchar(50) not null comment '部门名称')comment '部门表';
INSERT INTO dept (id, name) VALUES (1, '研发部'), (2, '市场部'),(3, '财务部'), (4,
'销售部'), (5, '总经办'), (6, '人事部');

-- 创建emp表,并插入数据
create table emp(
id int auto_increment comment 'ID' primary key,
name varchar(50) not null comment '姓名',
age int comment '年龄',
job varchar(20) comment '职位',
salary int comment '薪资',
entrydate date comment '入职时间',
managerid int comment '直属领导ID',
dept_id int comment '部门ID'
)comment '员工表';

-- 添加外键
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references
dept(id);

INSERT INTO emp (id, name, age, job,salary, entrydate, managerid, dept_id)
VALUES
(1, '金庸', 66, '总裁',20000, '2000-01-01', null,5),
(2, '张无忌', 20, '项目经理',12500, '2005-12-05', 1,1),
(3, '杨逍', 33, '开发', 8400,'2000-11-03', 2,1),
(4, '韦一笑', 48, '开发',11000, '2002-02-05', 2,1),
(5, '常遇春', 43, '开发',10500, '2004-09-07', 3,1),
(6, '小昭', 19, '程序员鼓励师',6600, '2004-10-12', 2,1),
(7, '灭绝', 60, '财务总监',8500, '2002-09-12', 1,3),
(8, '周芷若', 19, '会计',48000, '2006-06-02', 7,3),
(9, '丁敏君', 23, '出纳',5250, '2009-05-13', 7,3),
(10, '赵敏', 20, '市场部总监',12500, '2004-10-12', 1,2),
(11, '鹿杖客', 56, '职员',3750, '2006-10-03', 10,2),
(12, '鹤笔翁', 19, '职员',3750, '2007-05-09', 10,2),
(13, '方东白', 19, '职员',5500, '2009-02-12', 10,2),
(14, '张三丰', 88, '销售总监',14000, '2004-10-12', 1,4),
(15, '俞莲舟', 38, '销售',4600, '2004-10-12', 14,4),
(16, '宋远桥', 40, '销售',4600, '2004-10-12', 14,4),
(17, '陈友谅', 42, null,2000, '2011-10-12', 1,null);

 1.概述

多表查询就是指从多张表中查询数据。
原来查询单表数据,执行的SQL 形式为: select * from emp;
那么我们要执行多表查询,就只需要使用逗号分隔多张表即可,如: select * from emp , dept
; 具体的执行结果如下 :
此时 , 我们看到查询结果中包含了大量的结果集,总共 102 条记录,而这其实就是员工表 emp 所有的记录(17) 与 部门表dept 所有记录 (6) 的所有组合情况,这种现象称之为笛卡尔积。接下来,就来简单介绍下笛卡尔积。

2.笛卡尔积

笛卡尔积: 笛卡尔乘积是指在数学中,两个集合A集合 和 B集合的所有组合情况。

 而在多表查询中,我们是需要消除无效的笛卡尔积的,只保留两张表关联部分的数据,使得emp表与dept表中的id一一对应查找。

 SQL语句中,如何来去除无效的笛卡尔积呢? 我们可以给多表查询加上连接查询的条件即可。

select * from emp , dept where emp.dept_id = dept.id;

结果如下:

而由于 id 17 的员工,没有 dept_id 字段值,所以在多表查询时,根据连接查询的条件并没有查询
到。

3.分类

1.连接查询

  • 内连接:相当于查询AB交集部分数据
  • 外连接:
  • 左外连接:查询左表所有数据,以及两张表交集部分数据
  • 右外连接:查询右表所有数据,以及两张表交集部分数据
  • 自连接:当前表与自身的连接查询,自连接必须使用表别名

2.子查询

 以上就是本期的内容了,下期我会继续发布多表查询详细的文章。

分享一张壁纸:

  • 21
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 《郑阿奇.mysql实用教材》是一本关于数据库管理系统MySQL的实用教材。该教材以郑阿奇老师的经验和教学经历为基础,系统地介绍了MySQL的基本概念、特性和使用方法。 本书共分六章,首先是MySQL概述,介绍了数据库的基本知识以及MySQL的发展历程和特点。接着是MySQL的安装与配置,详细说明了如何在不同操作系统上安装和配置MySQL数据库,使读者能够轻松地完成环境的搭建。 第三章到第五章是本书的重点内容,分别介绍了MySQL的基本操作、高级应用和性能优化。基本操作包括数据库的创建与删除、表的创建与管理以及增删改查等操作,通过实例和案例的引导,读者能够快速掌握MySQL的基本使用方法。高级应用部分则介绍了事务、索引、视图和存储过程等高级技术,帮助读者在实际应用中更好地利用MySQL来解决问题。性能优化章节更是针对数据库的性能提出了一系列优化方案和技巧,通过对数据库结构、查询语句和服务器参数的调整,使读者能够提升系统性能,提高数据处理效率。 最后一章是MySQL的备份与恢复,简单介绍了MySQL的备份策略和常用的备份工具,以及如何在系统崩溃后恢复数据库。 该教材使用简洁明了的语言,结合大量实例和案例,使读者能够很好地理解和掌握MySQL的使用方法和技巧。同时,每章后都附有练习题和答案,方便读者巩固所学知识。 综上所述,《郑阿奇.mysql实用教材》是一本内容丰富、实用性强的MySQL教材,适合初学者和有一定基础的人士使用,是学习和应用MySQL的良好指导工具。 ### 回答2: 郑阿奇编写的《MySQL实用教材》是一本非常实用的数据库相关书籍。MySQL是一款非常流行的开源关系数据库管理系统,而这本实用教材就是为希望学习和应用MySQL的读者而设计的。 这本教材主要包含了MySQL数据库的基本概念和操作技巧。首先,它介绍了数据库的概念、关系模型以及SQL语言的基本知识。通过这些基础知识的学习,读者可以了解到数据库的结构和操作方式。 接下来,教材详细介绍了MySQL数据库的安装和配置。这是使用MySQL的第一步,只有正确地安装和配置MySQL,才能顺利地进行后续的操作。 在数据库的实际应用方面,教材涵盖了常见的数据操作和管理技术。例如,如何创建和管理数据库、数据表以及各种数据类型的使用。同时,教材还介绍了如何添加、更新和删除数据,以及如何查询和筛选数据等常用技巧。 此外,教材还提供了一些高级技术的介绍,如索引的创建和优化、事务处理、并发控制等。这些内容对于需要进行复杂数据操作和管理的读者来说特别有帮助。 总的来说,郑阿奇的《MySQL实用教材》适合各种程度的读者,无论是初学者还是有一定经验的人。它深入浅出地介绍了MySQL的基本概念和操作技巧,帮助读者学会使用这个强大的数据库管理系统。无论是从事开发、数据分析还是其他与数据库相关的职业,这本教材都是非常实用的参考书。 ### 回答3: 《郑阿奇.mysql实用教材》是一本非常实用的MySQL数据库教材。这本教材采用了简洁明了的语言和逻辑结构,非常适合MySQL初学者使用。 首先,这本教材从MySQL的基本概念开始介绍,包括数据库的定义、表和列的概念等。然后,逐步引入了SQL语言的使用,包括常见的增删改查操作,让读者能够迅速上手操作数据库。此外,教材也介绍了MySQL的常见数据类型、约束、索引等高级概念,帮助读者更深入地理解MySQL的运作原理。 教材还特别强调了MySQL数据库的性能优化与安全性,这是很多初学者容易忽略的方面。书中详细介绍了如何优化查询语句、设计高效的表结构以及进行备份与恢复操作。此外,教材也提供了一些实例和案例,帮助读者将理论知识应用到实际项目中。 除了内容的丰富性之外,这本教材的优势还在于它的语言简练和结构清晰。作者郑阿奇用通俗易懂的语言阐述复杂的数据库概念,并且通过大量的图表和例子进行说明,使学习过程变得轻松愉快。 总之,《郑阿奇.mysql实用教材》是一本非常实用的MySQL学习材料,适合初学者使用。它全面介绍了MySQL的基本概念、SQL语言的使用以及数据库性能优化与安全,内容丰富,结构清晰。无论是希望掌握MySQL的基本操作,还是想进一步提升数据库设计与优化能力,这本教材都会是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fitz&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值