连接查询和子查询举例

  • 笛卡尔积

当两个数据表进行关联查询时,用第一张数据表的每条记录去匹配第二张数据表的每条记录
select* from A,B;

第一张表10条数据
第二张表20条数据
返回结果是200条数据
笛卡尔积单独使用的时候是没有意义的,在实际开发中需要获得有意义的结果即需要进行连接查询。

  • 连接查询

此处使用的是内连接,将两张表具有相同意义的字段连接起来进行相等匹配。

写法两种:

select * from a inner join b on a.id=b.id
select * from a,b where a.id=b.id
第一张表10条数据
第二张表20条数据
返回结果小于200条数据。

外连接分为三种,左外连接,右外连接,全外连接
左外连接;用第一张表的每条记录去匹配第二张表的对应记录,无论是否找到匹配信息,都会显示出第一张表出现的记录的信息,无法找到的信息以null显示。
select *from a left outer join b on a.id=b.id
第一张表10条数据
第二张表20条数据
返回结果为10条数据
右外连接,用第二张表的每条记录去匹配第一张表的对应记录,无论是否找到第二张表出现的记录都会显示
select * from a right outer join b on a.id=b.id
第一张表10条数据
第二张表20条数据
返回结果20条数据
全外连接,左外连接和右外连接的结果和排除掉重复数据
select * from a full outer join b on a.id=b.id;
注意在mysql中不支持全外连接,需要使用union关键字实现全连接效果
select *from a left outer join b on a.id=b.id
union
select * from a right outer join b on a.id=b.id;

返回结果条数不一定。

  • 关联子查询

将一个查询结果作为第二个查询的条件
查询一个学生表中年龄最大的学员的信息
select * from student where age=(select max(age) from student);
等价于
select max(age) from student;返回最大年龄25
select * from student where age=25
关键字
in/exists当前查询的记录在子查询结果中存在
查询所有成绩小于60的学生
select * from student where id in(select student_id from studentcourse where score<60);
exists实现上面in语句效果
select * fron student where exists(select student_id from studentcourse where score<60 and student_id=studentcourse.student_id);
在实际开发中exists效率要比in高,因为内部使用了关联查询,而in是先将一张表中的查询结果做为另一次查询的条件

any,some,all的用法
some和any的作用相同,
如>any(1,2,3)大于任意一个即可
all作用是全部
>all(1,2,3)大于全部,即大于max最大值
自我比较
select student_id from studentcourse where score >=all(select score from studentcourse);将一张表中的某列数据进行提取作为房地产vklo比较依据,通过该表中每条记录与该列数据的对应比较的得到查询结果,这样的查询方式称为自我比较。
查询编号2课程比编号1课程成绩高的所有学号
select score from studentcourse where course_id=2 and score>any(select score from studentcourse where course_id=1);

  • union

并集关键字将查询结果进行合并
合并时列名必须一致
合并会排除重复数据
union all不会排除重复数据

猜你喜欢

转载自blog.csdn.net/Piqzem/article/details/87935087