多表连接的方式有四种:
- 内连接
- 外连接**
- 全连接
- 子查询
SQL92语法
1992年的语法。
-- 查询学号,姓名,年龄,分数,通过多表连接查询,student和scores通过id和s_id连接
SELECT
stu.id 学号,
stu.name 姓名,
stu.age 年龄,
sc.score 分数
FROM
student stu,
scores sc
WHERE
stu.id = sc.s_id;
-- 查询学号,姓名,年龄,分数,科目名称,通过多表查询,student和scores,course
SELECT
stu.`id` 学号,
stu.`name` 姓名,
stu.`age` 年龄,
sc.`score` 分数,
c.`name` 科目
FROM
student stu,
scores sc,
course c
WHERE
stu.id = sc.s_id
AND
c.id = sc.c_id;
-- 查询学号,姓名,年龄,分数,科目名称,老师名称,通过多表查询,student和scores,course,teacher
SELECT
stu.`id` 学号,
stu.`name` 姓名,
stu.`age` 年龄,
sc.`score` 分数,
c.`name` 科目,
t.`name` 老师
FROM
student stu,
scores sc,
course c,
teacher t
WHERE
stu.id = sc.s_id
AND
c.id = sc.c_id
AND
c.t_id = t.id;
-- 查询老师的信息以及对应教的课程
SELECT
t.id 教师号,
t.NAME 教师姓名,
c.NAME 科目名
FROM
teacher t,
course c
WHERE
t.id = c.t_id;
SQL92语法,多表查询,如果有数据为null,会过滤掉。
-- 查询学号,姓名,年龄,分数,科目名称,通过多表查询,student和scores,course
-- 在查询的基础上,进一步筛选,筛选小红和张小军的成绩
SELECT
stu.`id` 学号,
stu.`name` 姓名,
stu.`age` 年龄,
sc.`score` 分数,
c.`name` 科目
FROM
student stu,
scores sc,
course c
WHERE
stu.id = sc.s_id
AND
c.id = sc.c_id
AND
stu.`name` in ('小红','张小军');
-- 查询学号,姓名,年龄,分数,科目名称,通过多表查询,student和scores,course
-- 在查询的基础上,进一步筛选,筛选小红和张小军的成绩
-- 在小红和张小军成绩的基础上进一步再筛选,筛选他们的java成绩
SELECT
stu.`id` 学号,
stu.`name` 姓名,
stu.`age` 年龄,
sc.`score` 分数,
c.`name` 科目
FROM
student stu,
scores sc,
course c
WHERE
stu.id = sc.s_id
AND
c.id = sc.c_id
AND
stu.`name` in ('小红','张小军')
AND
c.`name` = 'java';
-- 查询学号,姓名,年龄,分数,科目名称,通过多表查询,student和scores,course
-- 找出最低分和最高分,按照科目分组,每一科
SELECT
sc.c_id,
max( score ),
min( score ),
c.`name`
FROM
scores sc,
course c
WHERE
sc.c_id = c.id
GROUP BY
sc.c_id;
SQL99语法
1999年的语法。
内连接
在我们刚才的sql当中,使用逗号分隔两张表进行查询,mysql进行优化默认就等效于内连接。
使用【join】关键字,使用【on】来确定连接条件。【where】只做筛选条件。
SELECT
t.*,
c.* ,
sc.*
FROM
teacher t
INNER JOIN course c ON c.t_id = t.id
INNER JOIN scores sc ON sc.c_id = c.id;
外连接(常用)
内连接和外连接的区别:
- 对于【内连接】的两个表,如果【驱动表】在【被驱动表】找不到与之匹配的记录,则最终的记录不会出现在结果集中。
- 对于【外连接】中的两个表,即使【驱动表】中的记录在【被驱动表】中找不到与之匹配的记录,也要将该记录加入到最后的结果集中。针对不同的【驱动表】的位置,有分为【左外连接】和【右外连接】。
- 对于左连接,左边的表为主,左边的表的记录会完整的出现在结果集里。
- 对于右连接,右边的表为主,左边的表的记录会完整的出现在结果集里。
外连接的关键字【outter join】,也可以省略outter,连接条件同样使用【on】关键字。
左连接
SELECT
t.*,
c.*
FROM
teacher t
LEFT JOIN course c ON t.id = c.t_id;
右连接
SELECT
t.*,
c.*
FROM
course c
RIGHT JOIN teacher t ON t.id = c.t_id;
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/280952.html