连接的概念
何时要使用到多表操作
(1)嵌套查询可能用到。
如查出选了d01课程的学生数据:学号,姓名,性别。 这些数据来自于学生表,但要根据成绩表中查哪些选了D01课程的学生的学号,涉及了两个表操作。
Select 学号,姓名,性别 from 学生表 where 学号 in(select 学号 from 成绩表 where 课程号=’d01’)
SQL嵌套IN查询不能超过3层。
(2)数据查询结果(不是条件)来自于多个表。
如,查出选了D01课程的学生数据:学号,姓名,性别,课程号,成绩值。
第一种情况数据来源单一表学生表,虽然使用了成绩表,但结果没有成绩表的数据,成绩表的数据仅仅作为主查询的条件。可以使用连接也可以使用嵌套,把子查询的结果作为主查询的条件。此时,并非同时操作两个表,先操作的成绩表,把子查询结果列出为作常量集合(成绩表已经关闭),再打开学生表提取数据。虽然使用到了两个表,但是一前一后打开使用的.故,查询结果只能来自于学生表,不能出现成绩表的数据。
第二种情况数据来源于成绩表和学生表同时提供,这两个是并列操作,必须使用连接.
连接的概念
在逻辑上把两个及以上的物理表或视图,在列向上合并(不是记录合并,是列属性集合合并),在逻辑上把两个表的查询结果当成一个视图。
连接时,一般需要两表关键字有对应关系,如上两个表都有学号列,否则可能结果是笛卡尔积。(如所有学生把所有课堂一个不漏地选一次)
如何修改?实现连接查询
Select 学生表.学号,姓名,性别,课程号,成绩
from 学生表,成绩表 where 学生表.学号=成绩表.学号
两表按学号关键字对应匹配生成新记录。把学生表每个人按学号值去成绩表匹配相同学号,应对生成一个学生一门课数据。如果该生选了五门课,要匹配成功五次学号,结果中就该生的五条记录.
各种链接操作
内连接
a inner join b
要求两表能对应的记录才出现的结果中,不对应的记录被忽略掉。如学生表中x同学没有选课,则他在成绩表中无记录,内连接查询时,结果无x同学数据。
上例其实是内连接的另一种早期的写法
Select 学生表.学号,姓名,性别,课程号,成绩
from 学生表,成绩表 where 学生表.学号=成绩表.学号
标准化内连接:
Select 学生表.学号,姓名,性别,课程号,成绩
from 学生表 inner join 成绩表
on 学生表.学号=成绩表.学号
以前子句也可以使用
select a.学号,a.姓名,b.课程号,成绩
from 学生表 a inner join 成绩表 b on a.学号=b.学号
where 课程号 in (101,102,103) order