连接查询
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
多表查询目的在于解决单表查询无法实现的复杂的信息搜集,涉及到的数据必须位于同一数据库的不同表,而表与表之间我们事先在创建数据库及表时,会明确表之间的公共字段,从而确保结果输出的是有意义的数据(难点)。
一、连接查询(难点:明确两表的连接条件、公共字段)
1、交叉连接(笛卡尔积运算)
2、内连接(条件连接重点)连接谓词:join
3、外连接where子句
4、自连接
二、子查询(重点)
以上两种查询方式不同,主要区别1、连接查询可以在最终结果中显示多张表的信息2、在于逻辑顺序不一样
本节内容:
解决查询问题思路:
1、明确查询的数据库以及涉及的多张数据表
2、明确最终输出的字段(只能来源于1中的表)
3、明确查询的条件(不只有表中查询的条件还有两个表连接
的条件)
4、书写语句
5、得到查询结果
交叉连接:
(1,2,3,)(4,5)14,15,24,25,34,35
连接原理:第一张表的每一行分别与第二张表的每一行进行连接,得到的结果集行数是两张表的行数之积,列数是两张表的列数之和。
有两张表t1和t2
例1:将t1和t2进行笛卡尔积连接
分析:t1的每一行分别和t2的每一行连接,得到一张新的表,
行数9,列数4
T1.xh=t2.xh符合这个条件的记录有意义,列名称可以只显示公共字段的一个
select*
from t1crossjoin t2
where T1.xh=t2.xh
格式一:
Select *|部分列
From 表名1,表名2 …,表名n
格式二:
Select *|部分列(若涉及公共字段要通过表名前缀来区分)From 表名1 cross join表名2 …cross join表名n
将course和class交叉连接
select*
from course,class
select*
from course crossjoin class
查看所有学生可能的选课情况
交叉连接的结果大多数都是无意义的,只有部分有意义。而结果是否有意义取决于公共字段值是否相同,若不相同则可以通过内连接的方式将它们(无意义的行记录)筛选掉,而列相同的也不需要重复出现,也可以去掉
交叉连接等值连接(相等连接)去掉连接后公共字段
不相同的记录去掉重复列内连接on 表1.字段名=表2.字段名
自然连接
内连接:在交叉连接的基础上只保留满足连接条件的记录
格式一:p110
Select 字段名列表
From 表名1,表名2 …表名n
Where 表名1.字段名=表名2.字段名and …
格式二:p113
Select字段名列表
From 表名1 [inner]join表名2on表名1.字段名=表名2.字段名…inner join 表名3 on 连接条件…
将t1和t2进行内连接
--格式解决.2
select a.学号,姓名,课程名
from A innerjoin B on A.学号=b.学号
xk例题:
1、查询学生的基本信息以及他的选课信息分析:1明确涉及的表:student,stucou
2明确输出的列:student.*,stucou.*
3连接条件:student.stuno=stucou.stuno
Select student.*,couno,WillOrder, State,RandomNum
From student join stucou on student.stuno=stucou.stuno
Select student.*,couno,WillOrder, State,RandomNum
From student,stucou
Where student.stuno=stucou.stuno
2、查询00电子商务班级学生的选课情况
select*
from class join student on
class.classno=student.classno
join stucou on student.stuno=stucou.stuno
where classname='00电子商务'
找出朱川所在的班的班级名称
Select classname
From student,class
Where student.classno=class.classno and stuname='朱川'
3、查找朱川基本信息以及所在班级名称
Select student.*,classname
From student join class on student.classno=class.classno
Where stuname='朱川'
4、查找朱川基本信息以及所在系部名称
Select student.*,departname
From student,class,department
Where student.classno=class.classno and class.departno=department.depart no and stuname='朱川'
Select student.*,departname
from student join class on student.classno=class.classno
join department on class.departno=department.departno
where stuname='朱川'
5、查找朱川基本信息以及所在系部名称、班级名称、选课课程编号
Select student.*,departname,classname,couno
From student,class,department,stucou
Where student.classno=class.classno and class.departno=department.depart no and
Student.stuno=stucou.stuno and stuname='朱川'