创建一个学生表和一个课程表。先放出实验的表结构:
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
查看数据:
不需要连接条件的连接。
交叉连接产生的结果就是笛卡儿积,左表的每一条记录都会与右表的所有记录连接并保留。
产生记录数 = A表记录数 × B表记录数
例如:
select * from student cross join class;
或者: select * from student,class;
产生20条记录。(截图不完整
总结:交叉连接没有实际数据价值,应尽量避免。
将两张表根据指定的条件连接起来,严格连接。
内连接是将一张表中的每一条记录去另外一张表中根据条件匹配:匹配成功,保留连接数据;匹配失败,都不保留。
语法:左表 join 右表 on 连接条件
(不用on条件的时间,结果与交叉连接相同。)
例如:
SELECT * FROM student JOIN class ON student.cid = class.cid;
是一种不严格的连接方式。
分为两种:左外连接(左连接)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;
总结:外连接与内连接区别在于数据匹配失败的时候,外连接会保留一条记录(主表数据保留,从表数据置空)。
是一种自动寻找连接条件的连接查询。
例如:
select * from student natural join class;
select * from student natural left join class;
总结:自然连接根据相同的列名来匹配连接条件,并且会将两个表中列名相同的列合并为一个列。