引言
假设有这样四个表student、teacher、score和course它们的定义如下:
create table student(
学号 int primary key,
姓名 varchar(20)
);
create table teacher(
工号 int primary key,
姓名 varchar(20)
);
create table course(
课号 int primary key,
课名 varchar(20),
教师 int references teacher(工号)
);
create table score(
学号 int references student(学号),
课号 int references course(课号),
成绩 int
);
若要完成以下任务:
- 任务1:连接course和score(按课号相同的策略连接) [course和score符合条件的只有314行,交叉连接有1000行]
- 任务2:连接teacher和course(按工号和教师相同的策略) [teacher和course符合条件的只有10行,交叉连接有200行]
1.等值连接(join on)
任务1
select *
from score join course
on score.课号=course.课号;
任务2
SELECT *
FROM teacher JOIN course
ON teacher.`工号`=course.`教师`;
2.自然连接(natural join)
SELECT *
FROM score natural JOIN course;
SELECT *
FROM teacher NATURAL JOIN course;
[注意]natural join不能加on
SELECT *
FROM teacher NATURAL JOIN course
ON teacher.`工号`=course.`教师`;
3.内连接(inner join on)
SELECT *
FROM score INNER JOIN course
ON score.`课号`=course.`课号`;
SELECT *
FROM teacher INNER JOIN course
ON teacher.`工号`=course.`教师`;
[总结]
- 内连接和等值连接效果一样,只是叫法不一样
- 在运算的两个联系中,如果两个联系有公共属性(同名属性),则自然连接会去除其中一个联系的共有属性,只留下另一个的共有属性,等值连接和内连接则会保留两者的共有属性
- 在运算的两个联系中,如果两个联系没有公共属性(同名属性),则自然连接的笛卡儿积的结果一样。