连接查询.docx
- 文档编号:4937505
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:19
- 大小:2.23MB
连接查询.docx
《连接查询.docx》由会员分享,可在线阅读,更多相关《连接查询.docx(19页珍藏版)》请在冰豆网上搜索。
连接查询
多表查询目的在于解决单表查询无法实现的复杂的信息搜集,涉及到的数据必须位于同一数据库的不同表,而表与表之间我们事先在创建数据库及表时,会明确表之间的公共字段,从而确保结果输出的是有意义的数据(难点)。
一、连接查询(难点:
明确两表的连接条件、公共字段)
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
Xh
Xm
01
A
02
B
03
C
Xh
Cj
01
89
02
86
04
98
例1:
将t1和t2进行笛卡尔积连接
分析:
t1的每一行分别和t2的每一行连接,得到一张新的表,行数9,列数4
Xh
Xm
Xh
Cj
01
a
01
89
01
a
02
86
01
a
04
98
02
B
01
89
02
B
02
86
02
B
04
98
03
c
01
89
03
c
02
86
03
c
04
98
T1.xh=t2.xh符合这个条件的记录有意义,列名称可以只显示公共字段的一个
select*
fromt1crossjoint2
whereT1.xh=t2.xh
格式一:
Select*|部分列
From表名1,表名2…,表名n
格式二:
Select*|部分列(若涉及公共字段要通过表名前缀来区分)
From表名1crossjoin表名2…crossjoin表名n
将course和class交叉连接
select*
fromcourse,class
select*
fromcoursecrossjoinclass
查看所有学生可能的选课情况
交叉连接的结果大多数都是无意义的,只有部分有意义。
而结果是否有意义取决于公共字段值是否相同,若不相同则可以通过内连接的方式将它们(无意义的行记录)筛选掉,而列相同的也不需要重复出现,也可以去掉
交叉连接等值连接(相等连接)
去掉连接后公共字段
不相同的记录去掉重复列内连接
on表1.字段名=表2.字段名
自然连接
内连接:
在交叉连接的基础上只保留满足连接条件的记录
格式一:
p110
Select字段名列表
From表名1,表名2…表名n
Where表名1.字段名=表名2.字段名and…
格式二:
p113
Select字段名列表
From表名1[inner]join表名2on表名1.字段名=表名2.字段名…innerjoin表名3on连接条件…
将t1和t2进行内连接
--格式解决.2
selecta.学号,姓名,课程名
fromAinnerjoinBonA.学号=b.学号
xk例题:
1、查询学生的基本信息以及他的选课信息
分析:
1明确涉及的表:
student,stucou
2明确输出的列:
student.*,stucou.*
3连接条件:
student.stuno=stucou.stuno
Selectstudent.*,couno,WillOrder,State,RandomNum
Fromstudentjoinstucouonstudent.stuno=stucou.stuno
Selectstudent.*,couno,WillOrder,State,RandomNum
Fromstudent,stucou
Wherestudent.stuno=stucou.stuno
2、查询00电子商务班级学生的选课情况
select*
fromclassjoinstudenton
class.classno=student.classno
joinstucouonstudent.stuno=stucou.stuno
whereclassname='00电子商务'
找出朱川所在的班的班级名称
Selectclassname
Fromstudent,class
Wherestudent.classno=class.classnoandstuname='朱川'
3、查找朱川基本信息以及所在班级名称
Selectstudent.*,classname
Fromstudentjoinclassonstudent.classno=class.classno
Wherestuname='朱川'
4、查找朱川基本信息以及所在系部名称
Selectstudent.*,departname
Fromstudent,class,department
Wherestudent.classno=class.classnoandclass.departno=department.departnoandstuname='朱川'
Selectstudent.*,departname
fromstudentjoinclassonstudent.classno=class.classno
joindepartmentonclass.departno=department.departno
wherestuname='朱川'
5、查找朱川基本信息以及所在系部名称、班级名称、选课课程编号
Selectstudent.*,departname,classname,couno
Fromstudent,class,department,stucou
Wherestudent.classno=class.classnoandclass.departno=department.departnoand
Student.stuno=stucou.stunoandstuname='朱川'
Selectstudent.*,departname,classname,couno
fromstudentjoinclassonstudent.classno=class.classno
joindepartmentonclass.departno=department.departno
joinstucouonStudent.stuno=stucou.stuno
wherestuname='朱川'
6、找出选修了001课程的学生的学号和姓名
7、找出选修了001课程的学生的所在的系部名称
8、找出选修了Linux操作系统课程的学生的基本信息
9、找出选修了工程技术类课程的学生的系部名称
10、找出选修了工程技术类、人文类课程的学生的系部信息
11、查找限选人数小于等于10的课程的开课系部名称
找出被学生选修的课程的编号和名称
外连接:
在内连接的基础上,不仅显示出满足连接条件的记录,同时也可以显示指定表的不满足条件的记录。
左外连接、右外连接、全外连接
左外连接:
明确左表与右表,然后连接结果不仅显示满足两表连接条件的记录,还显示左表中不满足条件的记录,对应的右表的记录补NULL
格式:
From表1leftjoin表2on连接条件
例1:
将t1和t2进行左外连接
首先明确两表内连接的结果
然后补充左表中不满足条件的记录,对应的右表的记录补NULL
例2:
将t2和t1进行左外连接
右外连接:
明确左表与右表,然后连接结果不仅显示满足两表连接条件的记录,还显示右表中不满足条件的记录,对应的左表的记录补NULL(其实就是谁是右表,右表的信息全部输出,左表对应补充空值)
格式:
From表1rightjoin表2on连接条件
例3:
将t1和t2进行右外连接
例4:
将t2和t1进行右外连接
全外连接:
在表的内连接基础上,连接结果不仅显示满足两表连接条件的记录,还显示左、右表中不满足条件的记录,对应的左、右表的记录补NULL
格式:
From表1fulljoin表2on连接条件
例5:
将t1和t2进行全外连接
查看学生的基本信息以及他的选课信息,要求显示所有学生的学号、姓名以及他所选的课程编号,未选课学生也显示出来
Selectstudent.stuno,stuname,couno
FromstudentleftjoinstucouonStudent.Stuno=stucou.stuno
自连接:
是内连接的特例,也就是实现连接的两张表实际上是同一张表,也就是表与自身进行内连接。
(必须为表指定表别名)
(在内连接的基础上要加上一个条件防止记录自己和自己连接)
格式一:
From表ainnerjoin表b
Ona.字段名=b.字段名
格式二:
From表a,表b
Wherea.字段名=b.字段名
找出和邹群同一班级的学生的信息,显示学号、姓名
分析:
1)数据库:
xk
2)表:
student
3)条件:
和邹群同一班级,说明classno值相同
Studenta,studentb
a.classno=b.classnoanda.stuno<>b.stunoandstuname=’邹群’
selecta.stuno,a.stuname
fromstudenta,studentb
wherea.classno=b.classnoanda.stuno<>b.stunoandb.stuname='邹群'
找出比WJL001类商品进货单价所有/任意要高的商品的信息
分析:
要找出比这类商品所有的进货单价要高,就是要在商品信息表中找出在进货信息表中进货单价高于WJL001类所有商品(a要实现比较要找出在商品信息表WJL001类的商品编号)进货单价(c
>all(bWJL001类的))的商品的信息
select*
from商品信息表
whereexists
(select*
from进货信息表
where进货单价>all
(select进货单价
from进货信息表
where商品编号in
(select商品编号
from商品信息表
where商品类型编号='WJL001'))and商品信息表.商品编号=进货信息表.商品编号)
select*
from商品信息表
where商品编号in
(select商品编号
from进货信息表
where进货单价>all
(select进货单价
from进货信息表
where商品编号in
(select商品编号
from商品信息表
where商品类型编号='WJL001'))and商品信息表.商品编号=进货信息表.商品编号)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 连接 查询