数据准备
学生表
studentNo | name | sex | gradeId |
---|---|---|---|
1 | 张三 | 男 | 2 |
2 | 李四 | 男 | 1 |
3 | 王五 | 男 | 2 |
4 | 麻子 | 男 | 2 |
5 | 小红 | 女 | 1 |
6 | 阿丽 | 女 | 1 |
7 | 陈六 | 男 | 1 |
成绩表
studentNo | objectNo | examDate | gradeId | studentTesult |
---|---|---|---|---|
1 | 张三 | 1 | 2022-10-8 12:04:41 | 60 |
2 | 李四 | 1 | 2022-10-8 12:04:41 | 70 |
3 | 张三 | 2 | 2022-10-7 12:04:41 | 80 |
4 | 王五 | 1 | 2022-10-8 12:04:41 | 73 |
5 | 陈六 | 1 | 2022-10-8 12:04:41 | 81 |
6 | 阿丽 | 1 | 2022-10-8 12:04:41 | 72 |
7 | 麻子 | 1 | 2022-10-8 12:04:41 | 70 |
8 | 小红 | 1 | 2022-10-8 12:04:41 | 73 |
9 | 阿丽 | 2 | 2022-10-7 12:04:41 | 70 |
10 | 麻子 | 2 | 2022-10-7 12:04:41 | 73 |
科目表
objectNo | objectName |
---|---|
1 | java |
2 | php |
3 | c |
4 | golang |
子查询
in
例1
select * from student where studentno in(
select studentno from result
);
- 从成绩表中查出所有学生id
- 再用第一步查寻出的学生id作为查询条件,从学生表中查询
作用:查询出参加考试的学生信息
例2
select * from student where studentno not in(
select studentno from result
);
- 从成绩表中查出所有学生id
- 再用第一步查寻出的学生id作为查询条件,从学生表中查询
作用:查询出没参加考试的学生信息
子查询返回的结果是供父查询使用,父查询需要什么字段,子查询就返回什么字段
连接
例1
select * from student inner join resulet
on student.studentNo=result.studentNo
- 将学生表和成绩表进行连接
- 找出学生表中的学生id=成绩表中的学生id的数据
例2
select * from student inner join resulet
on student.studentNo<>result.studentNo
- 将学生表和成绩表进行连接
- 找出学生表中的学生id!=成绩表中的学生id的数据
问: 结果会和子查询的例2一样吗?
答: 不会,两个表进行连接时,会将字段进行组合,再筛选满足条件的数据。
如果a表有3条数据,b表有10条数据,组合后的表,会有30条数据(笛卡尔积)。
注:1. 连接不会自动去除重复选项,可以使用distinct去重,select distinct …
子查询可以自动去重。
2. 如果结果集中需要显示两个表的列,建议使用表连接
3. 如果结果集中只显示一个表的列,建议使用子查询。
exists z
1.建、删表之前 进行判断
drop table if exsts temp;
2.exists子查询
select …from tablename where exists (子查询);
- 子查询有返回结果,exists子查询结果为true
- 子查询无返回结果,exists子查询结果为false,外层查询不执行