多表查询2

来源:互联网 发布:淘宝零点抢购怎么抢 编辑:程序博客网 时间:2024/06/05 05:06

多表查询—–笛卡尔积
当两个数据表进行关联查询时,用第一张数据表的每一条记录去匹配第二张数据表的每一条记录。
第一张表10条记录
第二张表20条记录
使用笛卡尔积 结果 10*20=200条记录
笛卡尔积没意义的。在实际开发中获得笛卡尔积中有意义的记录
——连接查询
内连接
外连接
内连接查询:将两张表相同意义字段连接起来
select *from A,B where A.A_ID=B.A_ID;
A表中的A_ID与B表中的A_ID相等匹配
这才能有意义。
返回的结果一定是两个表中都存在的信息,最有意义的信息。
如果第一张表中的记录在第二张表找不到匹配的信息,不显示。
第二张表的记录在第一张表无匹配的信息,也是不显示的。
第一张表10条数据
第二张表20条数据
内连接 结果<=10条

语法: select * from a inner join b on a.a_id=b.a_id;
简化 : select * from a,b where a.a_id=b.a_id;

外连接:左外连接,右外连接,全外连接
左外连接:用第一张表的每条记录去匹配第二张表的记录对应的记录。
结果是无论是否找到匹配的信息,都显示第一张表匹配的结果。
例如: 每个水果的价格?没有价格的水果也要显示。
select * from a left outer join b on a.a_id=b.a_id;

第一张表记录10条数据
第二张表记录20条数据
左外连接 —-10条

这里写图片描述

右外连接:从二张表的去找第一张表匹配记录,无论是否找到,第二张表的记录都显示。

select * from a right outer join b on a.a_id=b.a_id;

这里写图片描述

关联子查询 重点
将一个查询作为另一个查询的一部分

查询student表中年龄最大学员的信息
select * from student where age =(select max(age) from student);

将第一个查询的结果作为第二个查询的条件。

in/exists 当前查询记录在子查询结果中存在
查询所有成绩小于60分

查询studentcource表成绩小于60所有记录
select student_id from studentcource where score<60; —小于60分学生的学号2,8
再根据id去查询学生表,得知学生姓名
select * from student where id in(2,8);

select * from student where id in(select student_id from studentcource where score<60);

exists 实现上面 in语句效果
select name from student where exists (select student_id from studentcource where score<60 and student.id=studentcource.student_id);

any some all
some 和any 作用是相同的
any 部分数据 >any(1,2,3) >min
all 所有数据>all(1,2,3) 必须同时大于三个值。 等价于>max

自我比较
select student_id from studentcource where >=all(select score from studentcource);

阅读全文
0 0
原创粉丝点击