MySQL select join on 连表查询和自连接查询

时间:2021-05-13 00:59:37

连表查询

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`