连接查询(交叉连接,内连接,外连接,自然连接)

创建一个学生表和一个课程表。先放出实验的表结构:

create table student(
id int,
name varchar(15),
gender varchar(15),
cid int
);
create table class(
cid int,
cname varchar(15)
);

插入数据:

insert into student values(1,"lilei","male",1),(2,"hanmeimei","male",2),(3,"jack","male",1),(4,"alice","female",4),(5,"lili","female",NULL); 
--这里特意创建了一个class中没有的4,以及一条cid为NULL值的记录。

insert into class values(1,"linux"),(2,"python"),(3,"java"),(5,"html5");
--这里特意创建了一个student中没有的5

查看数据:

1.交叉连接 cross join

不需要连接条件的连接。

交叉连接产生的结果就是笛卡儿积,左表的每一条记录都会与右表的所有记录连接并保留。

产生记录数 = A表记录数 × B表记录数

例如:

           select * from student cross join class;
或者:      select * from student,class;

产生20条记录。(截图不完整

总结:交叉连接没有实际数据价值,应尽量避免。

2.内连接 [inner] join

将两张表根据指定的条件连接起来,严格连接

内连接是将一张表中的每一条记录去另外一张表中根据条件匹配:匹配成功,保留连接数据;匹配失败,都不保留。

语法:左表 join 右表 on 连接条件

(不用on条件的时间,结果与交叉连接相同。)

例如:

SELECT * FROM student JOIN class ON student.cid = class.cid;

3.外连接 outer join

是一种不严格的连接方式

分为两种:左外连接(左连接)left join,右外连接(右连接)right join

外连接有主表和从表之分。左外连接左表为主表;右外连接右表为主表。  

外连接是将主表的记录去匹配从表的记录:匹配成功,记录保留;匹配失败,也保留,只是从表字段置空。

例如:

select * from student left join class on student.cid = class.cid;
select * from student right join class on student.cid = class.cid;

总结:外连接与内连接区别在于数据匹配失败的时候,外连接会保留一条记录(主表数据保留,从表数据置空)

4.自然连接 natural join

是一种自动寻找连接条件的连接查询。

  • 自然内连接:类似内连接,但不提供连接条件。
  • 自然外连接:类似外连接,但不提供连接条件。

例如:

select * from student natural join class;

select * from student natural left join class;

总结:自然连接根据相同的列名来匹配连接条件,并且会将两个表中列名相同的列合并为一个列。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章