欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据库(笔记)——子查询与外连接

程序员文章站 2024-03-08 23:15:10
...

子查询与外连接

下面三个表会用到
Student
数据库(笔记)——子查询与外连接
Course
数据库(笔记)——子查询与外连接
Choise
数据库(笔记)——子查询与外连接

子查询

常见的形式如下

//查询与张彬相同性别的学生姓名和性别
Select s_name,s_sex
From Student
Where s_sex = (Select s_sex
				From Student
				Where s_name = '张彬')
//外部为父查询,括号内的是子查询
//在这一句首-先-执行子查询,寻找到张彬的性别,--然后--执行父查询
//当然这个也可以使用自身连接来实现

上一个的子查询只有一个返回结果的,子查询也可以返回多个结果,而此时不能单纯的使用比较符,需要加上In、Any、All等,如下

//查询选择了01001课程的学生姓名
Select s_name
From Student
Where s_no = Any (Select s_no 
				From Choise
				Where course_no = '01001')
//同样先执行子查询,这次子查询的结果有多个,为
//('991101','991102','9991103','991104','991201')
// =Any可以换成In,但=Any不能去掉Any,因为这是一个元素与一个集合的比较

All的使用如下

//查询考试成绩中,比01001分数都大的课程号和成绩
Select course_no,score
From Choise
Where course != '01001'And score > All(Select score
									From Choise
									Where course_no = '01001')
score > All,表示大于只查询中所有成绩,也就是大于最大成绩,因此也可以用Max结果代替

Exists用法如下

//查询选择课程01002的学生姓名
Select s_name
From Student
Where Exists (Select *
			 From Choise
			 Where s_no = Student.s_no And course_no = '01002')
//可以发现子查询有几点不同
//1.Select后面是*号,因为Exists后面跟的子查询不需要返回具体查询结果,只需要范围子查询是否成功,返回真或假就行
//2.s_no = Student.s_no,这一句是Exists的核心
//Exists的执行过程是,在子查询中判断从父查询中的带来属性是否满足子查询的查询条件,若满足,则该属性对于元组满足父查询条件,执行一次父查询,然后再进行子查询,以此类推,知道查询结束

子查询与连接查询比较起来,子查询的逻辑更符合我们的思考逻辑,但是当查询复杂的时候,子查询语句就会显得很杂乱,而连接查询就会简化很多问题,因为连接查询相当于构建了一个新的、满足查询的表,这样的表操作起来更加方便

正常来说,子查询和连接查询是可以相互转换的,只是复杂程度不同

外连接

  1. 左外连接:Left Outer Join,用于显示符合条件的数据,以及左边表中不符合条件的数据行,此时左边不符合数据行的右边数据行会用NULL显示
  2. 右外连接:Right Outer Join,用于显示符合条件的数据,以及左边表中不符合条件的数据行,此时右边不符合数据行的右边数据行会用NULL显示

这里的左右表就是位置上的左右,如
S Left Outer Join C与S Right Outer Join C
两个情况下的S都是左边的表

区别如下

//右外连接查询
Select s_name,course_name,score
From Student Right Outer Join Choice
On Student.s_no = Choice.s_no Right Outer Join Course
On Choice.course_no = Course.course_no
//Student相对于Choise是左表,StudentStudent.s_no = Choice.s_no不成立时,来自左表Student的s_name就会为NULL
//Choice相对于Course为左表,当Choice.course_no = Course.course_no不成立时,来自左表Choise中的score就会为NULL
//下面的情况以此类推

//左外连接查询
Select s_name,course_name,score
From Student Left Outer Join Choice
On Student.s_no = Choice.s_no Left Outer Join Course
On Choice.course_no = Course.course_no
//全外连接查询
Select s_name,course_name,score
From Student Full Outer Join Choice
On Student.s_no = Choice.s_no Full Outer Join Course
On Choice.course_no = Course.course_no
//全外连接就是左右都有
//能够发现,全外连接就是左外连接与右外连接的结合


数据库(笔记)——子查询与外连接

数据库(笔记)——子查询与外连接
数据库(笔记)——子查询与外连接

总结

子查询对于简单的多表查询来说,用着还是很方便的,语法也不是很难
但需要注意子查询中,当子查询的结果是多个时,不能只是用比较符,这样会出错
外连接的几个方法是为了显示不一样的查询结果,在通常情况下,我们的查询结果都是满足查询条件的,而不满足的是没有输出的
而外连接能够对不满足查询条件的结果进行显示,这在有的情况下是需要的
此外,对于外连接语法中的Outer,我个人认为要不要无所谓··

相关标签: 数据库学习笔记