700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > MySQL--多表连接(内连接 外连接 交叉连接--笛卡尔积)

MySQL--多表连接(内连接 外连接 交叉连接--笛卡尔积)

时间:2019-06-25 06:56:42

相关推荐

MySQL--多表连接(内连接 外连接 交叉连接--笛卡尔积)

@toc

更多关于数据库知识请加关注哟~~。若需联系博主请私信或者加博主联系方式:

QQ:3327908431

微信:ZDSL1542334210

前言:MySQL一系列操作猛如虎,代码易懂清晰,结构也简单,今天我们来谈一谈MySQL强大的多表连接,将表连接后,不但方便查询、处理,而且更加便于做数据分析,为我们省去了诸多麻烦,废话不多说,直接进入今天的讲解画面。**

1、多表连接种类与语法

1.1、纵向拼接

Union 拼接也称为纵向拼接,根据每个表共有的列的值匹配两个表中的行,要进行连接的两张表必须有相同的列名才可以,若两表字段不全相同或者顺序不同,那么就用查询来代替。语法为:

select * from t1 union select * from t2; # 两表列名和列顺序完全相同select 列名称 from t1 union select 列名称 from t2;

1.2、外联接

该种连接方式是最常用也是比较难理解的一种连接方式。外联接可以是左向外联接、右向外联接或完整外部联接。在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:

1)left join或left outer join左向外联接的结果集包括left outer子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值,但是需要指定主键id,该两个表格的主键名字要一样,语法为:

select * from t1 left join t2 on t1.id=t2.id;

2)right join或 right outer join右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

select * from t1 right join t2 on t1.id=t2.id;

1.3、内联接

inner join只显示两表中有关联的数据,就是当两个表没有相同主键时,不会显示结果。如下面的例子,当scores 里面的s_id不全的时候,那么内连接就不会显示scores 没有的s_id相应的行。

select * from stu inner join scores on stu.s_id = scores.s_id;

1.4、交叉联接(笛卡尔积)

交叉联接中 join=full join 都是返回左表中的所有行,左表中的每一行与右表中的所有行组合,不需要指定主键。交叉联接也称作笛卡尔积。from 子句中的表或视图可通过内联接或完整外部联接按任意顺序指定;但是,用左或右向外联接指定表或视图时,表或视图的顺序很重要。

select * from t1 join t2; # 法一select * from t1 full join t2;# 法二

2、表格创建

创建学生信息表stu

create table stu(s_id varchar(5),s_name varchar(5),s_sex varchar(1),s_age int(3),s_day date);insert into stu values("001","李华","男",23,'1996-8-16'),("002","王二","男",24,'1997-3-16'),("003","赵敏","女",23,'1990-5-26'),("004","张莹莹","女",22,'1995-2-16'),("005","朱亚军","男",25,'1999-8-16'),("006","马云","男",28,'1993-12-16');

创建学生得分表scores

create table scores (s_id varchar(5),c_id varchar(3),score float);insert into scores values ("001","01",135),("005","01",120),("003","01",110),("002","01",90),("005","02",140),("001","02",125.5),("004","02",100),("006","02",90),("002","03",102),("005","03",100.6),("001","03",100),("003","03",95.6),("004","03",83),("003","02",80),("006","03",79.5);

创建课程表coure

create table coure(c_id varchar(2),t_id char(1),c_name varchar(10));insert into coure values ("01","3","数据库原理"),("02","2","统计学基础"),("03","1","Python基础");

创建教师信息表teacher

create table teacher(t_id char(1),t_name varchar(5));insert into teacher values("1","邓博"),("2","崔博"),("3","汪院长");

创建t1表

create table t1(s_id varchar(5),s_name varchar(5),s_sex varchar(1),s_age int(3),s_day date);insert into stu values("007","走走走","男",105,'1996-8-16');

3、题目部分

题目一:将stu表和scores表左连接

select * from stu left join scores on stu.s_id=scores.s_id;# 答案:001李华男231996-8-1600101135005朱亚军男251999-8-1600501120003赵敏女231990-5-2600301110002王二男241997-3-16000005朱亚军男251999-8-1600502140001李华男231996-8-1600102125.5004张莹莹女221995-2-1600402100006马云男281993-12-160060290002王二男241997-3-160020310朱亚军男251999-8-1600503100.6001李华男231996-8-1600103100003赵敏女231990-5-260030395.6004张莹莹女221995-2-160040383003赵敏女231990-5-260030280006马云男281993-12-160060379.5

题目二:将stu表和scores表和coure表做连接

分析:多表连接无非就是多了几张表,其具体语法为:

select * from t1 left join t2 on ti.id=t2.id left join t3 on t2.id=t3.id left join t4 on t3.id=t4.id ... ;

这里要保证信息不丢失,且这里列名不同,采用左连接,根据数据的特点可知,有:

select * from stu left join scores on stu.s_id=scores.s_id left join coure on scores.c_id=coure.c_id;# 答案:001李华男231996-8-1600101135013数据库原理005朱亚军男251999-8-1600501120013数据库原理003赵敏女231990-5-2600301110013数据库原理002王二男241997-3-16000013数据库原理005朱亚军男251999-8-1600502140022统计学基础001李华男231996-8-1600102125.5022统计学基础004张莹莹女221995-2-1600402100022统计学基础006马云男281993-12-160060290022统计学基础003赵敏女231990-5-260030280022统计学基础002王二男241997-3-1600203102031Python基础005朱亚军男251999-8-1600503100.6031Python基础001李华男231996-8-1600103100031Python基础003赵敏女231990-5-260030395.6031Python基础004张莹莹女221995-2-160040383031Python基础006马云男281993-12-160060379.5031Python基础007走走走男1051996-8-16

题目三:将stu、scores、coure以及teacher表做连接

select * from stu left join scores on stu.s_id=scores.s_id left join coure on scores.c_id=coure.c_id left join teacher on coure.t_id=teacher.t_id;

题目四:将stu表和t1表纵向连接;

select * from stu union select * from t1;# 答案001李华男231996-8-16002王二男241997-3-16003赵敏女231990-5-26004张莹莹女221995-2-16005朱亚军男251999-8-16006马云男281993-12-16007走走走男1051996-8-16

题目五:将teacher表和coure表纵向连接;

分析:由于两表只有教师id这一列相同,但是这样会出现重复结果,于是利用union all不去重复,所以要实现纵向连接就只有如此

select t_id from teacher union all select t_id from coure;# 答案123321

4、文末彩蛋–轻松一刻

大家都知道嘛,男人到了17、18岁呢难免有点那啥,你比方说我好朋友小熊就出现过这事儿,以前高中时候嘛,我们班长就谈了一女朋友,而且他两还合租了,然后过几个周我们一起吃饭,由于好几周没见又瘦了,结果小熊调侃到:“你小子早晚得死在女人身上!”然后班长撇下嘴说到:“你早晚得死自己右手里!”,然后小熊默默低下头,看了看自己的右手,老茧确实比以前厚了许多…就是这么个情况嘛。

今天到这里就结束了哟//每篇文章都有文末彩蛋–轻松一刻哟~加关注学习更多MySQL知识!谢谢观看,我是Jetuser-data

链接: [/L1542334210]

CSND:L1542334210

祝大家工作顺利!阖家欢乐!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。