MySQL多表查询

118 阅读2分钟

本篇用到的表结构

课程表
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);

image.png

image.png

内连接(INNER JOIN)

最后返回的数据行数是在inner join前后两张表中同时存在的数据行数。

SELECT 字段名 FROM1 INNER JOIN2 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;

image.png

外连接

外连接可以分为左外连接和右外连接

左连接(LEFT OUTER JOIN)
SELECT 字段名 FROM1 LEFT OUTER JOIN2 ON子句
- 上述语法中,“表1”为基表,“表2”为参考表。左连接查询时,可以查询出“表1”中的所有记录和“表2”中匹配连接条件的记录。
  如果“表1”的某行在“表2”中没有匹配行,那么在返回结果中,“表2”的字段值均为空值(NULL)。

现将表插入数据
insert into student1(id,name,sex,height,course_id) values (9,'Davis','男',199,7);

image.png eg:
select s.name,c.course_name from student1 s left outer join course c on s.course_id = c.cid;

image.png

右连接(RIGHT OUTER JOIN)
SELECT 字段名 FROM1 RIGHT OUTER JOIN2 ON子句
- 与左连接相反,右连接以“表2”为基表,“表1”为参考表。右连接查询时,可以查询出“表2”中的所有记录和“表1”中匹配连接条件的记录。
如果“表2”的某行在“表1”中没有匹配行,那么在返回结果中,“表1”的字段值均为空值(NULL)。

交叉连接(CROSS JOIN)

笛卡尔积
举个例子:有 AB 两个集合,它们的值如下:   
A = {1,2}   
B = {3,4,5}    
集合 A×BB×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×BB×A 的结果就叫做两个集合的笛卡尔积。

交叉连接一定意义上就是笛卡尔积。

SELECT 字段名 FROM1 CROSS JOIN2 WHERE子句
eg:
    select * from student1 cross join course where student1.course_id = course.cid;

image.png