本篇用到的表结构
课程表
create table course(
-> cid int primary key,
-> course_name varchar(20));
insert into course(cid,course_name)
-> values
-> (1,'MySQL'),(2,'Python'),(3,'JAVA'),(4,'C++');
学生表
create table student1(
-> id int primary key auto_increment,
-> name varchar(22) not null,
-> sex char(2),
-> height int not null,
-> course_id int);
insert into student1(id,name,sex,height,course_id)
-> values
-> (1,'Joe','男',175,1),(2,'Sam','女',158,2),(3,'Lily','女',169,3),(4,'James','男',189,2),
-> (5,'Curry','男',185,3),(6,'Joker','男',180,2),(7,'Thomas','女',180,4),(8,'Danner','男',180,1);
内连接(INNER JOIN)
最后返回的数据行数是在inner join前后两张表中同时存在的数据行数。
SELECT 字段名 FROM 表1 INNER JOIN 表2 ON子句
- ON子句:用来设置内连接的连接条件。
1. select s.name,c.course_name from student1 s inner join course c
-> on s.course_id = c.cid;
2. select student1.name,course.course_name from student1 inner join course
-> on student1.course_id = course.cid;
外连接
外连接可以分为左外连接和右外连接
左连接(LEFT OUTER JOIN)
SELECT 字段名 FROM 表1 LEFT OUTER JOIN 表2 ON子句
- 上述语法中,“表1”为基表,“表2”为参考表。左连接查询时,可以查询出“表1”中的所有记录和“表2”中匹配连接条件的记录。
如果“表1”的某行在“表2”中没有匹配行,那么在返回结果中,“表2”的字段值均为空值(NULL)。
现将表插入数据
insert into student1(id,name,sex,height,course_id) values (9,'Davis','男',199,7);
eg:
select s.name,c.course_name from student1 s left outer join course c on s.course_id = c.cid;
右连接(RIGHT OUTER JOIN)
SELECT 字段名 FROM 表1 RIGHT OUTER JOIN 表2 ON子句
- 与左连接相反,右连接以“表2”为基表,“表1”为参考表。右连接查询时,可以查询出“表2”中的所有记录和“表1”中匹配连接条件的记录。
如果“表2”的某行在“表1”中没有匹配行,那么在返回结果中,“表1”的字段值均为空值(NULL)。
交叉连接(CROSS JOIN)
笛卡尔积
举个例子:有 A 和 B 两个集合,它们的值如下:
A = {1,2}
B = {3,4,5}
集合 A×B 和 B×A 的结果集分别表示为:
A×B={(1,3), (1,4), (1,5), (2,3), (2,4), (2,5) };
B×A={(3,1), (3,2), (4,1), (4,2), (5,1), (5,2) };
以上 A×B 和 B×A 的结果就叫做两个集合的笛卡尔积。
交叉连接一定意义上就是笛卡尔积。
SELECT 字段名 FROM 表1 CROSS JOIN 表2 WHERE子句
eg:
select * from student1 cross join course where student1.course_id = course.cid;