1.1、JOIN 对比
1.2、查询参加了考试 的同学(学号,姓名,科目编号,分数)
思路:
- 分析需求,分析查询的字段来自哪些表,(连接查询)
- 确定使用哪种连接查询? 7种
- 确定交叉点(这两个表中哪个数据是相同的)
- 判断的条件:学生表的中 studentNo = 成绩表 studentNo
操作 | 描述 |
---|---|
Inner join | 如果表中至少有一个匹配,就返回行 |
left join | 会从左表中返回所有的值,即使右表中没有匹配 |
right join | 会从右表中返回所有的值,即使左表中没有匹配 |
1.2.1、Inner Join
SELECT s.studentNO,studentName,SubjectNo,StudentResult
FROM student AS s
INNER JOIN result AS r
ON s.studentNO = r.studentNO
1.2.2、Right Join
SELECT s.studentNO,studentName,SubjectNo,StudentResult
FROM student s
RIGHT JOIN result r
ON s.studentNO = r.studentNO
1.2.3、Left Join
SELECT s.studentNO,studentName,SubjectNo,StudentResult
FROM student s
LEFT JOIN result r
ON s.studentNO = r.studentNO
1.3、查询参加考试的同学(学号,学生姓名,科目名,分数)
如果存在多张表关联查询思路:
- 我要查询哪些数据 select ...
- 从那几个表中查 FROM 表 XXX Join 连接的表 on 交叉条件
- 假设存在一种多张表查询,慢慢来,先查询两张表然后再慢慢增加
SELECT s.studentNo,studentName,SubjectName,`StudentResult`
FROM student s
RIGHT JOIN result r
ON r.studentNo = s.studentNo
INNER JOIN `subject` sub
ON r.SubjectNo = sub.SubjectNo
效果:
1.4、自连接
自己的表和自己的表连接
核心:一张表拆为两张一样的表即可,设计出Demo
CREATE TABLE `category` (
`categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT \'主题id\',
`pid` INT(10) NOT NULL COMMENT \'父id\',
`categoryName` VARCHAR(50) NOT NULL COMMENT \'主题名字\',
PRIMARY KEY (`categoryid`)
) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
INSERT INTO `category` (`categoryid`, `pid`, `categoryName`)
VALUES(\'2\',\'1\',\'信息技术\'),
(\'3\',\'1\',\'软件开发\'),
(\'4\',\'3\',\'数据库\'),
(\'5\',\'1\',\'美术设计\'),
(\'6\',\'3\',\'web开发\'),
(\'7\',\'5\',\'ps技术\'),
(\'8\',\'2\',\'办公信息\');
效果:
分析:
父类
categoryid | categoryName |
---|---|
2 | 信息技术 |
3 | 软件开发 |
5 | 美术设计 |
子类
pid | categoryid | categoryName |
---|---|---|
3 | 4 | 数据库 |
2 | 8 | 办公信息 |
3 | 6 | web开发 |
5 | 7 | ps技术 |
操作:查询父类对应的子类关系
父类 | 子类 |
---|---|
信息技术 | 办公信息 |
软件开发 | 数据库 |
软件开发 | web开发 |
美术设计 | ps技术 |
查询父子信息: 把一张表看为两个一模一样的表:
SELECT a.`categoryName` AS \'父栏目\',b.`categoryName` AS \'子栏目\'
FROM `category` AS a,`category` AS b
WHERE a.`categoryid` = b.`pid`
效果:
1.5、联表查询的练习
1、查询学生所属的年级
SELECT studentNo,studentName,`GradeName`
FROM student s
INNER JOIN `grade` g
ON s.`GradeID` = g.`GradeID`
效果:
2、查询科目所属的年级 (科目名称,年级名称)
SELECT `SubjectName`,`GradeName`
FROM `subject` sub
INNER JOIN `grade` g
ON sub.`GradeID` = g.`GradeID`
效果:
3、查询了参加 数据库结构-1 考试的同学信息
-- 查询了参加 数据库结构-1 考试的同学信息: 学号,学生姓名,科目名,分数
SELECT s.`StudentNo`,`StudentName`,`SubjectName`,`StudentResult`
FROM student s
INNER JOIN `result` r
ON s.StudentNo = r.StudentNo
INNER JOIN `subject` sub
ON r.`SubjectNo` = sub.`SubjectNo`
WHERE subjectName = \'数据库结构-1\'
效果: