实际开发中往往数据来自于不同的表,所以需要多表查询,多表查询是对多张表的数据取笛卡尔积。那么笛卡尔积是什么呢?
笛卡尔积:
先遍历第一张表,依次取出表中的第一条记录,再拿出这条记录和第二张表再进行排列组合。
注意: 关联查询可以对关联表取别名。
语法:
select 字段 from 表1 别名1[inner] join 表2 别名2 on 连接条件 and 其他条件
select 字段 from 表2 别名2 where 连接条件 and 其他条件;
(1)查询"xuxian"同学的成绩
select student.name,score.score,score.course_id
from student,score where student.name='xuxian'
and student.id=score.student_id;
select student.name,score.score,score.course_id
from student join score on student.name='xuxian'
and student.id=score.student_id;
select student.name,student.id,score.student_id,sum(score.score)
from student,score
where student.id=score.student_id group by student.id;
select student.name,student.id,score.student_id,sum(score.score)
from student join score
on student.id=score.student_id group by student.id;
select student.id,student.name,course.name, score.score
from student,course, score
where student.id=score.student_id
and course.id=score.course_id;
外连接分为左外连接和右外连接,如果联合查询,左侧的表完全显示的我们称为左外连接;右侧完全显示我们就称为右外连接。
假设有两张表,此时学生表中的王五,在分数表中没有成绩,分数表中4,在学生表中没有学生存在。
-- 左外连接,表1完全显示
select 字段名 from 表1 left join on 表2 on 连接条件;
--示例
select student.name, student.id,score.score from student left join on student.id=score.student_id;
-- 右外连接,表2完全显示
select 字段名 from 表1 right join on 表2 on 连接条件;
--示例
select student.name, student.id,score.score from student right join on student.id=score.student_id;
自连接是指在同一张表连接自身进行查询。
显示所有的“计算机原理”成绩比“Java成绩高的成绩信息”
select * from score s1,score s2
where s1.student_id=s2.student_id
and s1.course_id=1
and s2.course_id=3
and s1.score<s2.score;
子查询是指嵌入到其他sql语句中的select语句,也叫做嵌套查询。
单行子查询:返回一行记录的子查询。
查询于“buxiaobiye"的同班同学:
select name from student where
classes_id=
(select classes_id from student
where name='buxiangbiye');
多行子查询:返回多行记录的子查询
查询"english"或“chinese"课程的成绩信息。
select * from score
where score.course_id in
(select id from course
where name='chinese' or name='english');
select * from score
where exists
(select score.course_id from course
where(name='chinese' or name='english')
and course.id=score.course_id);
exists:一边进行外层查询,一边进行里查询.
在from子句中使用子查询:子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当作一个临时表可以使用。
在实际开发中,为了合并多个select执行的结果,可以把使用集合操作符union,union all.使用union和union all时,前后查询的结果集中,字段需要一致。
该操作符用于取得两个结果的并集。当使用该操作符时,会自动去掉结果集中的重复行。
查询id<3,或者名字为"english"的课程:
select * from course where id<3
union
select * from course where name='english';
该操作符用于取得两个结果集的并集,当使用该操作符时,不会去掉结果中的重复行。
示例:查询id小于3,或者名字为"java"的课程
select * from course where id<3
union all
select * from course where name='java';