数据库多表查询
多表查询也叫连接查询,此处为基于两个表的连接查询
如果一个查询需要对多个表进行操作就称为连接查询,连接查询的结果集或结果称为表之间的连接。
连接查询实际上是通过 各个 表之间共同列 的关联性 来查询数据的,它是关系数据库查询最主要的特征。
select 表1.字段名,表2.字段名,...
from 表1,表2
where 连接条件
连接查询分类:
1.自连接查询,对同一个表进行连接操作
2.内连接查询,<又分为:自然连接,等值连接,不等值连接三种>
3.外连接查询,<又分为:左外连接,右外连接,全外连接三种>(左连接和左外连接一样,右连接和右外连接一样,在mysql中不支持全连接,在oracle中左连接才有“(+)” 的形式 eg:select * a.name(+) = b.name )
4.交叉连接查询,也称为 无条件查询。
5.联合查询
一 自连接查询
一个表 自己 与 自己建立 连接 称为自连接或自身连接。
进行自连接就如同两个分开的表 一样,可以把一个表的某一行与同一表中的另一行连接起来。
例:
查询选学“101”课程的成绩高于“9505201”号学生成绩的所有学生记录 并按成绩高低 排列
select x.* from sclass x,sclass y
where x.cno='101' and x.degree>y.degree and y.sno='9505201' and y.cno='101'
order by x.degree desc
二 内连接(Inner join)
内连接是最常用的一种连接方式,它只返回两个数据集合之间 匹配关系的 那些行。
将位于两个相互交叉的数据集合中重叠部分以内的那些数据行连接起来.
内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作,
并列出这些表中与连接条件相匹配的数据行。
根据所使用的比较方式不同,内连接查询操作列出与连接条件匹配的数据行,
它使用比较运算符比较被连接列的列值。
语法:
select 字段名列表 from 表名 [inner] join 表名 on 连接条件 [where 条件表达式]
例:
select 学生表.学号,学生表.姓名,学生表.班级代号,成绩表.课程代号,成绩表.课程成绩
from 学生表 INNER JOIN 成绩表
on 学生表.学号=成绩表.学号
where 学生表.班级代号=''200201''
select x.sno,x.sname,y.cno,y.degree from student x
INNER join sclass y on x.sno=y.sno where x.sclass=''95文秘1''
内连接分三种:
1、等值连接:
所谓等值连接,是指表之间通过“等于”关系连接起来,产生一个临时表,
然后对该临时表进行处理后生成最终结果。其查询结果中列出被连接表中的所有列,
包括其中的重复列。
(1)查询所有学生的sno,cname,degree列:
SELECT x.sno,y.cname,x.degree
FROM score x,course y
WHERE x.cno=y.cno
(2)查询“95033”班所选课程的平均分:
SELECT y.cno,avg(y.degree) as "平均分"
FROM student x,score y
WHERE x.class=''95033'' and x.sno=y.sno group by y.cno
(3)查询所有学生的student,score表信息:
select x.*,y.* from student x,score y where x.sno=y.sno
用等值连接列出authors和publishers表中位于同一城市的作者和出版社:
SELECT * FROM authors AS a INNER JOIN publishers AS p ON a.city=p.city
2、不等值连接:
是指表之间的连接关系不是“等于”,而是其它关系。
这些运算符包括>、>=、<=、<、!>、!<和<>。
(1)查询所有学生的sno,cno,rank列:
select sno,cno,rank
from score,grade
where degree between low and upp order by rank
(2)
select x.sno,x.sname,y.cno,y.degree
from student x,score y
where x.sno!=y.sno
3、自然连接:
在等值连接中消除重复列就是自然连接。
(1)
select x.sno,x.sname,y.cno,y.degree
from student x,score
where x.sno=y.sno
用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):
SELECT a.* p.pub_id p.pub_name p.country
FROM authors AS a INNER JOIN publishers AS p ON a.city=p.city
----------------------------
三。外连接(OUTER JOIN):
与内连接不同的是,外连接不只列出与连接条件相匹配的行,
而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)
中所有符合搜索条件的数据行。
外连接是对内连接的扩充,除了将两个数据集合中重叠部分以内的那些数据行连接起来之外,
还可以根据要求返回左侧或右侧数据集合中非匹配的数据或全部的数据.
即 左外连接(LEFT OUTER JOIN);
右外连接(RIGHT OUTER JOIN);
全部连接(FULL OUTER JOIN).
外连接返回的结果集中的一些数据看起来和内连接返回的数据完全一样,
但有一些数据也与内连接返回的数据不同,这些数据行的某些部分是来自于表中的数据,
另一部分是NULL值,产生这些NULL值的原因是因为另一表中不包含与指定表相匹配的数据项
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和
连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,
而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。
注: 外连接强以使不满足条件的记录也出现在结果集中。
外连接语法:
Select 字段名列表 from 表名 Left|Right|Full [Outer] join 表名 ON 连接条件
外连接分为:
1。左外连接(LEFT OUTER JOIN或LEFT JOIN):
在结果表中包含第一个表中满足条件的所有记录。
如果是在连接条件上匹配的记录,则第二个表返回相应值,否则第二个表返回空值。
select 学生表.学号,学生表.姓名,成绩表.课程代号,成绩表.课程