七种联表查询图解
image.png

核心三种联表查询

操作 描述
Inner join 如果表中至少有一个匹配 就返回
Left join 会从左表中返回所有的值,即使右表中没有匹配
Right join 会从右表中返回所有的值,即使左表中没有匹配

两张表联表查询

  1. --Inner JOIN内连接
  2. SELECT s.`StudentNo`,`StudentName`,`SubjectNo`,`StudentResult`
  3. FROM `student` AS s
  4. INNER JOIN `result` AS r
  5. ON s.`StudentNo`=r.`StudentNo`;
  6. --right JOIn右连接
  7. SELECT s.`StudentNo`,`StudentName`,`SubjectNo`,`StudentResult`
  8. FROM `student` AS s
  9. RIGHT JOIN `result` AS r
  10. ON s.`StudentNo`=r.`StudentNo`;
  11. --left JOIN左连接
  12. SELECT s.`StudentNo`,`StudentName`,`SubjectNo`,`StudentResult`
  13. FROM `student` AS s
  14. LEFT JOIN `result` AS r
  15. ON s.`StudentNo`=r.`StudentNo`;

多张表联表查询

  1. --三表查询
  2. SELECT s.`StudentNo`,`StudentName`,`SubjectName`,`StudentResult`
  3. FROM `student` AS s
  4. RIGHT JOIN `result` AS r
  5. ON r.`StudentNo`=s.`StudentNo`
  6. INNER JOIN `subject` AS su
  7. ON su.`SubjectNo`=r.`SubjectNo`

思路
要查询的数据
从哪几个表中查 from表 XXX join 表 on交叉条件
假设存在一种多张表查询,慢慢来,先查询两张表再慢慢增加

FROM a LEFT JOIN b 以左边的表为基准
FROM a RIGHT JOIN b 右边的表为基准

自连接

表数据

  1. CREATE TABLE `categore`(
  2. `categoreid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT'主题id',
  3. `pid` INT(10) NOT NULL COMMENT'父id',
  4. `categoreName` VARCHAR(50) NOT NULL COMMENT'主题名字',
  5. PRIMARY KEY(`categoreid`)
  6. )ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
  7. INSERT INTO `categore`(`categoreid`,`pid`,`categoreName`)
  8. VALUES('2','1','信息技术'),
  9. ('3','1','软件开发'),
  10. ('4','3','数据库'),
  11. ('5','1','美术设计'),
  12. ('6','3','web开发'),
  13. ('7','5','ps技术'),
  14. ('8','2','办公信息');

自己的表和自己的表链接 核心:拆为两张表才为两张一样的表

父类**

categoreid categoreName
2 信息技术
3 软件开发
5 美术设计

子类

pid categoreid categoreName
3 4 数据库
3 6 web开发
5 7 ps技术
2 8 办公信息

操作:查询父类对应的子类信息

父类 子类
信息技术 办公信息
软件开发 数据库,web开发
美术设计 ps技术
  1. --查询父子信息 把一张表看作两个一样的表
  2. SELECT a.`categoreName` AS '父类',b.`categoreName` AS '子类'
  3. FROM `categore` AS a,`categore` AS b
  4. WHERE a.`categoreid`=b.`pid`;