JOIN:通过引用两个或者两个以上的表,从而获取数据。
***实际应用过程中应尽量使用小表join大表,join查询时应注意的点:
-- 只支持等值连接
SELECT a.* FROM a JOIN b ON (a.id = b.id)
SELECT a.* FROM a JOIN b
ON (a.id = b.id AND a.department = b.department)
-- 可以 join 多个表
SELECT a.val, b.val, c.val FROM a JOIN b
ON (a.key = b.key1) JOIN c ON (c.key = b.key2)
JOIN有以下几种用法:
1.(INNER)JOIN:表中至少有一个行匹配,才会返回相应的行,否则不返回:
如下,返回所有同学的语文成绩,如果没有语文成绩则不返回该同学姓名:
select stu_name,grade from
student
join
(select stu_id,grade from course
join
grade
on grade.stu_id=course.stu_id
where couname='语文') as a
on student.stu_id=a.stu_id;
2.LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行:
如下:返回所有同学的语文成绩,如果没有语文成绩则只返回该同学姓名
select stu_name,grade from
student
left join
(select stu_id,grade from course
join
grade
where couname='语文' and grade.stu_id=course.stu_id) as a
on student.stu_id=a.stu_id;
3.RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行:
如下:返回所有同学的语文成绩,如果没有语文成绩则只返回该同学姓名
select stu_name,grade from
(select stu_id,grade from course
join
grade
where couname='语文' and grade.stu_id=course.stu_id) as a
left join
student
on student.stu_id=a.stu_id;
4.FULL JOIN: 只要其中一个表中存在匹配,就返回行:
****join的示例用法,查找在A表却不在B表的数据:
-- 统计没有选择数学课的学生姓名
select tsuname from
(select couid from course where couname="数学") t1
join
grade
on
t1.couid=grade.couid
right join
student
on grade.stuid=student.stuid
where student.stuid is null