联表查询
思路
- 分析需求,分析查询的字段来自拿些表, 连接查询
- 确定使用哪种连接查询
- 确定交叉点 (这两个表中哪个是数据相同的)
- 判断条件: 学生表中的 studentNo = 成绩表 studentNO
join on 连接查询
where 等值查询
-- inner join
SELECT s.sid,gender,sname,num
FROM student AS s
INNER JOIN score AS sc
ON s.sid=sc.sid
-- left join
SELECT s.sid,gender,sname,num
FROM student AS s
LEFT JOIN score AS sc
ON s.sid=sc.sid
-- right join
SELECT s.sid,gender,sname,num
FROM student AS s
RIGHT JOIN score AS sc
ON s.sid=sc.sid
操作 | 描述 |
---|---|
inner join | 如果表中至少有一个匹配,就返回行 |
left join | 会从左表中返回所有的值,即使右表中没有匹配 |
reight join | 会从右表中返回所有的值,即使左表中没有匹配 |
-- 三表查询
SELECT s.sid,gender,sname,num,c.`caption`,s.`class_id`
FROM student AS s
INNER JOIN score AS sc
ON s.sid=sc.sid
INNER JOIN class AS c
ON s.class_id=c.`caption`
总结:
- 要查询哪些数据 select…
- 从哪几个表中查 form 表 xxx join 连接的表 on 交叉条件
- 假设 存在一种多张表查询,慢慢来 ,先查询两张表然后在慢慢增加
自连接
自己的表和自己的表连接,核心:一张表拆为两张一样的表即可
父类
categoryid | categoryName |
---|---|
2 | 信息技术 |
3 | 软件开发 |
5 | 美术设计 |
子类
pid | categoryid | categoryName |
---|---|---|
3 | 4 | 数据库 |
2 | 8 | 办公信息 |
3 | 6 | web开发 |
5 | 7 | 美术设计 |
操作:查询父类对应的子类关系
父类 | 子类 |
---|---|
信息技术 | 办公信息 |
软件开发 | 数据库 |
软件开发 | web开发 |
美术设计 | ps技术 |
案例:
CREATE TABLE `category`
( `categoryid` INT(3) NOT NULL COMMENT 'id',
`pid` INT(3) NOT NULL COMMENT '父id 没有父则为1',
`categoryname` VARCHAR(10) NOT NULL COMMENT '种类名字',
PRIMARY KEY (`categoryid`)
) ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci;
INSERT INTO `school`.`category` (`categoryid`, `pid`, `categoryname`) VALUES ('2', '1', '信息技术');
INSERT INTO `school`.`CATEGOrY` (`categoryid`, `pid`, `categoryname`) VALUES ('3', '1', '软件开发');
INSERT INTO `school`.`category` (`categoryid`, `PId`, `categoryname`) VALUES ('5', '1', '美术设计');
INSERT INTO `School`.`category` (`categoryid`, `pid`, `categorynamE`) VALUES ('4', '3', '数据库');
INSERT INTO `school`.`category` (`CATEgoryid`, `pid`, `categoryname`) VALUES ('8', '2', '办公信息');
INSERT INTO `school`.`category` (`categoryid`, `pid`, `CAtegoryname`) VALUES ('6', '3', 'web开发');
INSERT INTO `SCHool`.`category` (`categoryid`, `pid`, `categoryname`) VALUES ('7', '5', 'ps技术');
SELECT * FROM `category`
-- 查询父子信息 :把一张表看成两个一摸一样的表
SELECT a.`categoryname` AS '父栏目', b.`categoryname` AS '子栏目'
FROM `category` AS a ,`category` AS b
WHERE a.`categoryid`=b.`pid`