SQL Server 2012 - 多表链接查询

-- 交叉链接产生笛卡尔值 (X*Y)
SELECT  * 
FROM    Student
        cross Join dbo.ClassInfo  
--另一种写法
SELECT  * 
FROM    Student , ClassInfo  

-- 内链接 (Inner 能够省略)
SELECT  *
FROM    Student
        JOIN dbo.ClassInfo ON dbo.Student.Class = dbo.ClassInfo.ID;

-- Inner Join 
SELECT  *
FROM    Student
        INNER  JOIN dbo.ClassInfo ON dbo.Student.Class = dbo.ClassInfo.ID;

	  -- on 条件,一般是 主外键,可是不限于主外键
	  -- on 条件,容许有多个,并且多是针对某个表的
SELECT  *
FROM    Student
        INNER  JOIN dbo.ClassInfo ON dbo.Student.Class = dbo.ClassInfo.ID
		AND dbo.Student.Class IN (1,2)  -- 针对Student表增长查询条件

-- 不等于 (笛卡尔值减去 相等的值)
SELECT  *
FROM    Student
        INNER  JOIN dbo.ClassInfo ON dbo.Student.Class <> dbo.ClassInfo.ID;

--自链接  从Class表中查询到Class所在的系
SELECT T1.* ,T2.ClassName FROM dbo.ClassInfo AS T1
		INNER JOIN dbo.ClassInfo AS T2 ON T1.PID=T2.ID

-- Left Join
SELECT  *
FROM    Student
        Left  JOIN dbo.ClassInfo ON dbo.Student.Class = dbo.ClassInfo.ID;

-- Right Join
SELECT  *
FROM    Student
        RIGHT   JOIN dbo.ClassInfo ON dbo.Student.Class = dbo.ClassInfo.ID;
-- 全外链接
SELECT  *
FROM    Student
        FULL OUTER  JOIN dbo.ClassInfo ON dbo.Student.Class = dbo.ClassInfo.ID;

-- 外链接和内链接的区别是:
-- 内链接,on条件不符合的话,会过滤掉数据
-- 外链接,以保留表为主,on条件成立显示数据,不然显示NULL

--Union 纵向链接
SELECT  StuID,StuName,StuEnName,StuAge,StuBirthday
FROM    Student WHERE StuID<=2
UNION
SELECT StuID,StuName,StuEnName,StuAge,StuBirthday
FROM dbo.Student WHERE StuID>2

--Union 去重复
SELECT  StuSex
FROM    Student WHERE StuID<=2
UNION
SELECT StuSex
FROM dbo.Student WHERE StuID>2

--Union 显示所有
SELECT  StuSex
FROM    Student WHERE StuID<=2
UNION ALL
SELECT StuSex
FROM dbo.Student WHERE StuID>2

--Except 差集,排除
SELECT  StuID,StuName,StuEnName,StuAge,StuBirthday
FROM    Student 
Except
SELECT StuID,StuName,StuEnName,StuAge,StuBirthday
FROM dbo.Student WHERE StuID<=2

--Intersect 交集
SELECT  StuID,StuName,StuEnName,StuAge,StuBirthday
FROM    Student  WHERE StuID>=2
Except
SELECT StuID,StuName,StuEnName,StuAge,StuBirthday
FROM dbo.Student WHERE StuID<=3

  Union纵向查询的几个说明:sql

--Union 
--1,列的数目必须相同,对于没有的列,能够给默认的值,如NULL
SELECT StuID,StuName,StuSex,Class,Height FROM dbo.Student WHERE StuID<2
UNION 
SELECT  StuID,StuName,StuSex,Class,180 AS Height  FROM dbo.Student WHERE StuID=2
UNION 
SELECT  StuID,StuName,StuSex,Class,NULL  FROM dbo.Student WHERE StuID>2

--2,查询结果呈现的列名称是以第一列为准,以下面学生身高StuHeight
SELECT StuID,StuName,StuSex,Class,Height AS StuHeight FROM dbo.Student WHERE StuID<2
UNION 
SELECT  StuID,StuName,StuSex,Class,180 AS Height  FROM dbo.Student WHERE StuID=2
UNION 
SELECT  StuID,StuName,StuSex,Class,NULL AS hei FROM dbo.Student WHERE StuID>2

--3, 纵向对应的列的数据类型之间能够相互转换,以下 StuID和Height之间能够转换,能够纵向链接
SELECT StuID,StuName,StuSex,Class,Height AS StuHeight FROM dbo.Student WHERE StuID<2
UNION 
SELECT  Height,StuName,StuSex,Class,NULL AS hei FROM dbo.Student WHERE StuID>2

--4,对Union的查询结果进行排序,Order 写在最后
SELECT StuID,StuName,StuSex,Class,Height AS StuHeight FROM dbo.Student WHERE StuID<2
UNION 
SELECT  StuID,StuName,StuSex,Class,180 AS Height  FROM dbo.Student WHERE StuID=2
UNION 
SELECT  StuID,StuName,StuSex,Class,NULL AS hei FROM dbo.Student WHERE StuID>2
ORDER BY Class
相关文章
相关标签/搜索