数据库多表查询(二)
成绩
from 学生表 left outer join 成绩表
on 学生表.学号=成绩表.学号
2。右外连接(RIGHT OUTER JOIN或RIGHT JOIN):
在结果表中包含第二个表中满足条件的所有记录。
如果是在连接条件上匹配的记录,则第一个表返回相应值,否则第一个表返回空值。
select 学生表.学号,学生表.姓名,成绩表.课程代号,成绩表.课程成绩
from 学生表 right outer join 成绩表
on 学生表.学号=成绩表.学号
3。全外连接(FULL OUTER JOIN或FULL JOIN):
在结果表中包含两个表中满足条件的所有记录。
如果是在连接条件上匹配的元组,则另一个表返回相应值,否则另一个表返回空值。
select 学生表.学号,学生表.姓名,成绩表.课程代号,成绩表.课程成绩
from 学生表 full outer join 成绩表
on 学生表.学号=成绩表.学号
例子:
SELECT a.*,b.* FROM student as a left JOIN sclass as b
ON a.sno=b.sno and a.sno=''9502101''
go
SELECT a.*,b.* FROM student as a right JOIN sclass as b
ON a.sno=b.sno and a.sno=''9502101''
go
SELECT a.*,b.* FROM student as a full JOIN sclass as b
ON a.sno=b.sno
go
----------------------------
四。交叉连接:
交叉连接不使用任何连接条件来限制结果集合,将各表的记录以“笛卡尔”积的方式组合起来,
是分别使用两个数据源中的行以所有可能的方式进行组合,
即数据集中的每一行都要与另一表每一行组成一个新的行.
例如:一表中有三条记录,另一表有4条记录,交叉连接后,结果集合将由12条记录组成.
交叉连接(CROSS JOIN)没有WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,
返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中
符合查询条件的数据行数。
例,
titles表中有6类
图书,而publishers表中有8家出版社,
则下列交叉连接检索到的记录数将等于6*8=48行。
select * from student,sclass
SELECT * FROM student a CROSS JOIN sclass ORDER BY a.sno
----------------------------
五。联合查询
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,
即执行联合查询。
UNION的语法格式为:
select_statement
UNION [ALL] selectstatement
[UNION [ALL] selectstatement][…n]
其中selectstatement为待联合的SELECT查询语句。
ALL选项表示将所有行合并到结果集合中。不指定该项时,
被联合查询结果集合中的重复行将只保留一行。
联合查询时,查询结果的列标题为第一个查询语句的列标题。
因此,要定义列标题必须在第一个查询语句中定义。要对联合查询结果排序时,
也必须使用第一查询语句中的列名、列标题或者列序号。
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,
并且每个查询选择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型
。
在自动转换时,对于数值类型,
系统将低精度的数据类型转换为高精度的数据类型。
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。
例如:
查询1 UNION (查询2 UNION 查询3)
select topicbody,posttime from bbs_topic
union all
select replybody,posttime from bbs_reply
----------------------------
六。复杂查询
---复合连接
select a.学号,a.姓名,b.课程代号,b.课程成绩,c.课程名称,d.教师代号
from 学生表 a,成绩表 b,课程表 c,教学表 d
where (a.学号=b.学号)
and (b.课程代号=c.课程代号)
and(c.课程代号=d.课程代号)
三个表以上的连接
SELECT dbo.kb.xq, dbo.kbk.kcmc, dbo.kbk.lbdh, dbo.kbk.jsmc, dbo.kb.jse, dbo.bj.bj,
dbo.kb.jc, 2 AS num, dbo.kb.zc,
CASE dbo.kb.ds WHEN ''单'' THEN ''1'' WHEN ''双'' THEN ''2'' WHEN '' '' THEN ''0'' END AS ds,
dbo.kb.zc1, dbo.kb.zc2
FROM dbo.kb INNER JOIN
dbo.bj ON dbo.kb.bh = dbo.bj.bh INNER JOIN
dbo.kbk ON dbo.kb.xq = dbo.kbk.xq AND dbo.kb.bh = dbo.kbk.bh AND
dbo.kb.kcdm = dbo.kbk.kcdm
WHERE (dbo.kb.jc = 1) OR
(dbo.kb.jc = 3) OR
(dbo.kb.jc = 5) OR
(dbo.kb.jc = 7) OR
(dbo.kb.jc = 9) OR
(dbo.kb.jc = 11)
----------------------------
总结:
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,
但可以对这三种列进行间接连接。
例如:
SELECT p1.pub_id p2.pub_id p1.pr_info
FROM pub_info AS p1 INNER JOIN pub_info AS p2
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)