连表查询
JOIN ON
操作 | 描述 |
---|---|
inner join | 只返回匹配的值 |
right join | 会从右表中返回所有的值, 即使左表中没有匹配 |
left join | 会从左表中返回所有的值, 即使右表中没有匹配 |
-- ========== 连表查询 join ============
-- 查询参加了考试的同学 学号, 姓名, 分数
SELECT * FROM student
SELECT * FROM result
/*
查询两个表, 这两个表的交叉点
*/
-- join 连接的表 on 判断条件 -- 连接查询
-- where -- 等值查询
-- inner join
SELECT result.gradeid,`grade`,`name` FROM student INNER JOIN result
WHERE result.gradeid = student.gradeid
-- right join
SELECT s.`gradeid`,`grade`,`name` FROM student AS s RIGHT JOIN result AS r
ON s.gradeid = r.gradeid
-- left join
SELECT s.`gradeid`,`grade`,`name` FROM student s LEFT JOIN result r
ON s.gradeid = r.gradeid
-- 查询没有分数的同学
SELECT s.`gradeid`,`grade`,`name` FROM student s LEFT JOIN result r
ON s.gradeid = r.gradeid
WHERE `grade` IS NULL
/*
查询参加了考试的同学的: 学号, 姓名, 科目, 分数
确定交叉点
*/
SELECT r.`gradeid`,`name`,`subject` AS 科目,`grade`
FROM `student` s RIGHT JOIN `result` r
ON s.gradeid = r.gradeid
INNER JOIN `subject` sub
ON r.gradeid = sub.gradeid
自连接
- 自己的表和自己的表连接, 核心:一张表拆为两张一样的表
父类
categoryid | categoryName |
---|---|
2 | 信息技术 |
3 | 软件开发 |
5 | 美术设计 |
子类
pid | categoryid | categoryName |
---|---|---|
3 | 4 | 数据库 |
3 | 6 | web开发 |
2 | 8 | 办公信息 |
5 | 7 | ps技术 |
-- 查询父子信息, 把一张表看做两个一模一样的表
SELECT a.`categoryName` AS '父栏目', b.`categoryName` AS '子栏目'
FROM `category` AS a, `category` AS b
WHERE a.`categoryid` = b.`pid`