--查找学生数据库中每个学生的情况和选修的课程情况 use xscj select * from xs inner join xs_kc on xs.学号=xs_kc.学号 go --从数据库xscj中查询学生的姓名、课程名和成绩 use xscj select 姓名,课程名,成绩 from xs join xs_kc on xs.学号=xs_kc.学号 join kc on kc.课程号=xs_kc.课程号 go --内连接— …inner join… on… --查找选修了‘计算机基础’课程且成绩在80分以上的学生的学号、姓名、课程名及成绩 use xscj select 学号,姓名,课程名,成绩 from xs join xs_kc on xs.学号=xs_kc.学号 join kc on kc.课程号=xs_kc.课程号 where 课程名=‘计算机’ and 成绩>=80 go--查找不同课程但成绩相同的学生的学号、课程号和成绩 use xscj select a.学号,a.课程号,b.课程号,b.成绩 from xs_kc a join xs_kc b on a.成绩=b.成绩 and a.学号=b.学号 and a.课程号!=b.课程号 go
--Test Data CREATE TABLE #First ( userID smallint, userName nvarchar(50), userAddress nvarchar(200) ) INSERT INTO #First SELECT 1, 'Kim', 'China' UNION ALL SELECT 2, 'Tom', 'America' UNION ALL SELECT 3, 'Lily', 'Japan'CREATE TABLE #Second ( userID smallint, userName nvarchar(50), userAddress nvarchar(200) ) INSERT INTO #Second SELECT 2, 'Kim', 'China' UNION ALL SELECT 5, 'Tom', 'America' UNION ALL SELECT 6, 'Lily', 'Japan'--FULL JOIN /* FULL JOIN就是把两个表完全连起来,不管对应的连接值是否存在 */ SELECT * FROM #First a FULL JOIN #Second b ON a.userID = b.userID--CROSS JOIN /* CROSS JOIN按笛卡尔积连接,也就是两表组合的任何形式 */ SELECT * FROM #First a CROSS JOIN #Second bDROP TABLE #First DROP TABLE #Second
Full Join 相当于只把两个表的字段相加到了一起,而行数等于行数较多的表,不会增加行数(我的理解) Cross Join 是笛卡尔积,比如一个表有2行,而另外的表有3行,那么Cross Join后就是6行 使用Cross Join的时候不需要设置ON条件,而Full Join的时候需要
use xscj
select *
from xs inner join xs_kc
on xs.学号=xs_kc.学号
go
--从数据库xscj中查询学生的姓名、课程名和成绩
use xscj
select 姓名,课程名,成绩
from xs join xs_kc
on xs.学号=xs_kc.学号
join kc
on kc.课程号=xs_kc.课程号
go
--内连接— …inner join… on…
--查找选修了‘计算机基础’课程且成绩在80分以上的学生的学号、姓名、课程名及成绩
use xscj
select 学号,姓名,课程名,成绩
from xs join xs_kc
on xs.学号=xs_kc.学号
join kc
on kc.课程号=xs_kc.课程号
where 课程名=‘计算机’ and 成绩>=80
go--查找不同课程但成绩相同的学生的学号、课程号和成绩
use xscj
select a.学号,a.课程号,b.课程号,b.成绩
from xs_kc a join xs_kc b
on a.成绩=b.成绩 and a.学号=b.学号
and a.课程号!=b.课程号
go
--Test Data
CREATE TABLE #First
(
userID smallint,
userName nvarchar(50),
userAddress nvarchar(200)
)
INSERT INTO #First
SELECT 1, 'Kim', 'China' UNION ALL
SELECT 2, 'Tom', 'America' UNION ALL
SELECT 3, 'Lily', 'Japan'CREATE TABLE #Second
(
userID smallint,
userName nvarchar(50),
userAddress nvarchar(200)
)
INSERT INTO #Second
SELECT 2, 'Kim', 'China' UNION ALL
SELECT 5, 'Tom', 'America' UNION ALL
SELECT 6, 'Lily', 'Japan'--FULL JOIN
/*
FULL JOIN就是把两个表完全连起来,不管对应的连接值是否存在
*/
SELECT * FROM #First a
FULL JOIN #Second b
ON a.userID = b.userID--CROSS JOIN
/*
CROSS JOIN按笛卡尔积连接,也就是两表组合的任何形式
*/
SELECT * FROM #First a
CROSS JOIN #Second bDROP TABLE #First
DROP TABLE #Second
Cross Join 是笛卡尔积,比如一个表有2行,而另外的表有3行,那么Cross Join后就是6行
使用Cross Join的时候不需要设置ON条件,而Full Join的时候需要
不等于使用"<>"符,是T-SQL的规定,没办法...
而cross就是不依赖等值关系而将2个表连起来,有很多数据是没有实际意义的。