MySQL数据库(七)

目录

 一、联合查询

1.1内连接

1.2外连接

1.3自连接

1.4子查询

1.5合并查询


 一、联合查询

实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积:

下面进行多表查询的练习,对应的在表的设计与数据插入

1.1内连接

语法:

select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件

案例:

--查询“许仙”同学的 成绩
select student.name, score.score from student,score
where student.name = '许仙' and score.student_id = student.id;

或者

select student.name, score.score from student join score
on student.name = '许仙' and student.id = score.student_id;

 --查询所有同学的总成绩,及同学的个人信息

select student.sn, student.name, student.email, sum(score.score)
from student, score
where student.id = score.student_id
group by score.student_id;

查询所有同学的成绩,及同学的个人信息:
select student.id, student.sn, student.name, score.score,course.name
from student,score,course
where student.id = score.student_id and score.course_id = course.id;

这里我们发现,两个name没有辨识度,可以采取起别名的方式,这里不再赘述

关于内连接还有许多的应用场景,这里就需要具体问题具体分析了,本文只展示了一些常用的场景 

1.2外连接

外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接右侧的表完全显示我们就说是右外连接。
语法:

-- 左外连接,表1完全显示
select 字段名 from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显示
select 字段 from 表名1 right join 表名2 on 连接条件;

案例:

查询所有同学的成绩,及同学的个人信息,如果该同学没有成绩,也需要显示
select * from student left join score on student.id = score.student_id;

此处发现即使“老外学中文”同学没有成绩,使用left join能够将左表完全显示 

  select * from student right join score on student.id = score.student_id;

使用右外连接查询时就只能完全显示右表的数据,数据为空的就查询不到了

1.3自连接

自连接是指在同一张表连接自身进行查询(这里多应用于无法分列的情况)

案例:显示所有“计算机原理”成绩比“Java”成绩高的成绩信息

对于案例,成绩表是一个总表,没有对应的列,所以这里采用的就是自连接

首先查询出计算机原理和Java的id

select id, name from course where name = 'Java' or name = '计算机原理';

再查询计算机原理比Java高的成绩信息

select student.*, s1.score as Java, s2.score as '计算机原理'
from student, score as s1, score as s2  ​​
--这里一定要对表起别名,因为自连接只有个一个表,不然就会识别不了!
where student.id = s1.student_id

and s1.student_id = s2.student_id

and s1.score < s2.score
and s1.course_id = 1

and s2.course_id = 3;

在以后的过程中,对于复杂的sql语句要尽量简化,能够拆分的sql尽量拆分,上述就是将一个复杂的sql拆分成两个,这样会提高查询的效率。

1.4子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询(不建议使用,了解就行)
案例:查询与“不想毕业” 同学的同班同学

select * from student where classes_id=(select classes_id from student where
name='不想毕业');

1.5合并查询

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用UNION和UNION ALL时,前后查询的结果集中,字段需要一致。

  • union该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。

查询id小于3,或者名字为“英文”的课程

select * from course where id < 3
union
select * from course where name = '英文';

 

也可以使用or来代替

select * from course where id < 3 or name = '英文';

  •  union all 该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行

查询id小于3,或者名字为“Java”的课程
select * from course where id<3
union all
select * from course where name='英文';

猜你喜欢

转载自blog.csdn.net/x2656271356/article/details/131840247