-- 实验表结构
create table student(
id int,
name varchar(15),
gender varchar(15),
cid int
);
create table class(
cid int,
cname varchar(15)
);
drop table student,class;
-- 实验表数据:
insert into student values(1,"lilei","male",1),(2,"hanmeimei","male",2),(3,"jack","male",1),(4,"alice","female",4); --这里特意创建了一个class中没有的4
insert into class values(1,"linux"),(2,"python"),(3,"java"),(5,"html5");--这里特意创建了一个student中没有的5
select * from student;
select * from class;
内连接:
从左表中取出每一条记录,去右表中与所有的记录进行匹配,保留匹配成功的记录,并将两份记录拼接 。
语法:select 字段列表 from 左表 [inner] join 右表 on 左表.字段 = 右表.字段;
不使用on条件的时候,结果与交叉连接相同
-- 内连接
-- select * from student inner join class; --结果与交叉连接相同
select * from student join class on student.cid = class.cid;
select * from student inner join class on student.cid = class.cid;
左外连接:select 字段列表 from 左表 left join 右表 on 左表.字段 = 右表.字段;
右外连接:select 字段列表 from 左表 right join 右表 on 左表.字段 = 右表.字段;
select * from student left join class on student.cid = class.cid;
select * from student right join class on student.cid = class.cid;
自然连接:
自动匹配连接条件,系统以字段名字作为匹配模式(同名字段就作为条件,多个同名字段就都作为条件)
自然内连接:类似内连接,但不提供连接条件 。
自然外连接:类似外连接,但不提供连接条件 。
语法:
自然内连接:select 字段列表 from 表名 natural join 表名;
自然外连接:select 字段列表 from 表名 natural left
ight join 表名;
select * from student natural join class;
select * from student natural left join class;
交叉连接:
将每一条记录与另外一个表的每一条记录连接
语法:
select 字段列表 from 表名 cross join 表名;
select 字段列表 from 表名 ,表名;
select * from student cross join class;
select * from student,class;
补充:
在多个表中,为了区分每个表,以及简便使用,可以使用表别名 。
select * from student inner join class on student.cid = class.cid;-- 原本结果
select id,name,gender,c.cid,cname from student as s inner join class as c on s.cid = c.cid;-- 使用表别名