MySQL表的增删改查3

文章目录

  • 1.联合查询
    • 1.1笛卡尔积
    • 1.2 内连接
    • 1.3外连接
      • 1.3.1 左外连接
      • 1.3.2 右外连接
    • 1.4自连接
    • 1.5 子查询
      • 1.5.1单行子查询
      • 1.5.2多行子查询
      • 1.5.3 exists关键字
  • 2.合并查询
    • 2.1 union
    • 2.2 union all

1.联合查询

1.1笛卡尔积

实际开发中往往数据来自于不同的表,所以需要多表查询,多表查询是对多张表的数据取笛卡尔积。那么笛卡尔积是什么呢?
MySQL表的增删改查3_第1张图片
笛卡尔积:
先遍历第一张表,依次取出表中的第一条记录,再拿出这条记录和第二张表再进行排列组合。
注意: 关联查询可以对关联表取别名。

1.2 内连接

语法:

select 字段 from1 别名1[inner] join2 别名2 on 连接条件 and 其他条件
select 字段 from2 别名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;

MySQL表的增删改查3_第2张图片
(2)查询所有同学的总成绩,及学生的个人信息

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;

MySQL表的增删改查3_第3张图片
(3)查询所有同学的成绩,及同学的个人信息

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;

MySQL表的增删改查3_第4张图片

1.3外连接

外连接分为左外连接和右外连接,如果联合查询,左侧的表完全显示的我们称为左外连接;右侧完全显示我们就称为右外连接。
假设有两张表,此时学生表中的王五,在分数表中没有成绩,分数表中4,在学生表中没有学生存在。
MySQL表的增删改查3_第5张图片

1.3.1 左外连接

-- 左外连接,表1完全显示
select 字段名 from1 left join on2 on 连接条件;

--示例
select student.name, student.id,score.score from student left join on student.id=score.student_id;

MySQL表的增删改查3_第6张图片

1.3.2 右外连接

-- 右外连接,表2完全显示
select 字段名 from1 right join on2 on 连接条件;

--示例
select student.name, student.id,score.score from student right join on student.id=score.student_id;

MySQL表的增删改查3_第7张图片

1.4自连接

自连接是指在同一张表连接自身进行查询。
显示所有的“计算机原理”成绩比“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;

MySQL表的增删改查3_第8张图片

1.5 子查询

子查询是指嵌入到其他sql语句中的select语句,也叫做嵌套查询。

1.5.1单行子查询

单行子查询:返回一行记录的子查询。
查询于“buxiaobiye"的同班同学:

select name from student where
classes_id=
(select classes_id from student
where name='buxiangbiye');

MySQL表的增删改查3_第9张图片

1.5.2多行子查询

多行子查询:返回多行记录的子查询
查询"english"或“chinese"课程的成绩信息。

select * from score
where score.course_id in
(select id from course
where name='chinese' or name='english');

MySQL表的增删改查3_第10张图片

1.5.3 exists关键字

select * from score
where exists
 (select score.course_id from course
 where(name='chinese' or name='english')
 and course.id=score.course_id);

MySQL表的增删改查3_第11张图片
exists:一边进行外层查询,一边进行里查询.
在from子句中使用子查询:子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当作一个临时表可以使用。

2.合并查询

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

2.1 union

该操作符用于取得两个结果的并集。当使用该操作符时,会自动去掉结果集中的重复行。
查询id<3,或者名字为"english"的课程:

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

MySQL表的增删改查3_第12张图片

2.2 union all

该操作符用于取得两个结果集的并集,当使用该操作符时,不会去掉结果中的重复行。
示例:查询id小于3,或者名字为"java"的课程

select * from course where id<3
union all
select * from course where name='java';

可以看到结果中Java出现了两次,没有去掉重复行。
MySQL表的增删改查3_第13张图片

你可能感兴趣的:(数据库,mysql,数据库,sql)