SQL Server 2012 数据查询二 多表查询(连接查询、嵌套查询)

SQL语法格式

SELECT [all | DISTINCT] <目标列表达式> [别名] [,<目标列表达式> [别名]]...
FROM <表名或视图名> [别名] [,<表名或视图名> [别名]]... | (<SELECT语句>) [AS] <别名>
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名2> [AES|DESC]]

连接查询

1.交叉连接查询

简要说明:
    交叉连接是连接查询里最简单的连接方式,原理是对两个表进行连接查询操作时,生成两者的笛卡尔积。例如:一个m行的数据表与一个n行的数据表进行交叉连接,则会生成一个m*n的结果集。交叉连接查询由于会生成大量不符合业务的数据,因此基本没有实际应用。

语法格式:

	语法一:
	SELECT <目标列表达式> 
	FROM <表名或视图名> CROSS JOIN <表名或视图名>
	语法二:
	SELECT <目标列表达式> 
	FROM <表名或视图名> , <表名或视图名>

使用示例:对student表和class表进行交叉连接查询

	select StuNo 学号,StuName 姓名,ClassName 所在班级 
	from student cross join class
	或者
	select StuNo 学号,StuName 姓名,ClassName 所在班级 
	from student , class

2.内连接查询

简要说明:
    内连接是在交叉连接生成结果集的基础上,按照指定条件对结果集进行过滤。内连接查询的结果符合实际业务逻辑,在实际应用中用的最多。

语法格式:

	语法一:
	SELECT <目标列表达式> 
	FROM <表名或视图名> INNER JOIN <表名或视图名>
	ON <过滤条件表达式>
	语法二:
	SELECT <目标列表达式> 
	FROM <表名或视图名> , <表名或视图名>
	WHERE <过滤条件表达式>

使用示例:对student表和class表进行交叉查询

	select StuNo 学号,StuName 姓名,ClassName 所在班级 
	from student inner join class
	on student.ClassID=class.ClassID  --过滤出学生所在班级编号与class表班级编号一致的数据
	或者
	select StuNo 学号,StuName 姓名,ClassName 所在班级 
	from student , class
	where student.ClassID=class.ClassID  --过滤出学生所在班级编号与class表班级编号一致的数据

3.左外连接查询

简要说明:
    左外连接的左表为主表,右表为从表,使用左外连接进行查询时,如果左表有记录但是右表没有与之匹配的记录时。则将右表相应的列值设为null。
    例如:A表: a,null,c,d
      对应B表:1 ,2,null ,3
    使用左外连接后的结果集为(假设同一列数据相匹配):a1,cnull,d3
    因此可以看出,当左表没有记录而右表有记录时(如A中的第二列与B中的第二列),去掉该记录;当左表有记录而右表没有记录时,将右表对应列值设null(如A表第三列与B表第三列形成cnull)。

语法格式:

	SELECT <目标列表达式> 
	FROM <表名或视图名> LEFT OUTER JOIN <表名或视图名>  --OUTER关键字可省略
	ON <过滤条件表达式>

使用示例:对student表和class表进行左外连接查询

	select StuNo 学号,StuName 姓名,ClassName 所在班级 
	from student left outer join class
	on student.ClassID=class.ClassID

4.右外连接查询

简要说明:
    右外连接的右表为主表,左表为从表,使用右外连接进行查询时,如果右表有记录但是左表没有与之匹配的记录时。则将左表相应的列值设为null。
    例如:A表: a,null,c,d
      对应B表:1 ,2,null ,3
    使用右外连接后的结果集为(假设同一列数据相匹配):a1,null2,d3
    因此可以看出,当右表没有记录而左表有记录时(如B中的第三列与A中的第三列),去掉该记录;当右表有记录而左表没有记录时,将左表对应列值设null(如B表第二列与A表第二列形成null2)。

语法格式:

	SELECT <目标列表达式> 
	FROM <表名或视图名> RIGHT OUTER JOIN <表名或视图名>  --OUTER关键字可省略
	ON <过滤条件表达式>

使用示例:对student表和class表进行右外连接查询

	select StuNo 学号,StuName 姓名,ClassName 所在班级 
	from student right outer join class
	on student.ClassID=class.ClassID

5.全外连接查询

简要说明:
    全外连接左表右表的所有记录都需要保留。当一个表中的记录另一个表没有相应的记录与之匹配值,则将另一个表的相应列值设为NULL。
    例如:A表: a,null,c,d
      对应B表:1 ,2,null ,3
    使用全外连接后的结果集为:a1,null2,cnull,d3
    因此可以看出,当左表没有记录而右表有记录时,将左表对应列值设null(如B表第二列与A表第二列形成null2);当左表有记录而右表没有记录时,将右表对应列值设null(如A表第三列与B表第三列形成cnull)。

语法格式:

	SELECT <目标列表达式> 
	FROM <表名或视图名> FULL OUTER JOIN <表名或视图名>  --OUTER关键字可省略
	ON <过滤条件表达式>

使用示例:对student表和class表进行右外连接查询

	select StuNo 学号,StuName 姓名,ClassName 所在班级 
	from student full outer join class
	on student.ClassID=class.ClassID

嵌套查询

1.独立单值子查询

简单说明:独立单值子查询中,内查询与外查询没有依赖关系,返回的值只有一个
语法格式:

	SELECT <目标列表达式> 
	FROM <表名或视图名>
	WHERE <含有独立单值子查询的条件表达式>

使用示例:查询student表中所在班级为19软件3班的学生

	select *
	from student
	where ClassID=(
		select ClassID
		from class
		where ClassName='19软件3班'
	)

2.独立多值子查询

简单说明:独立多值子查询中,内查询与外查询没有依赖关系,返回的值有多个
语法格式:

	SELECT <目标列表达式> 
	FROM <表名或视图名>
	WHERE <含有独立多值子查询的条件表达式>

使用示例:查询student表中软件专业的学生

	select *
	from student
	where ClassID in(
		select ClassID
		from class
		where ClassName like '%软件%'
	)

3.相关子查询

简单说明:相关子查询中,内查询与外查询有依赖关系
语法格式:

	SELECT <目标列表达式> 
	FROM <表名或视图名>
	WHERE <含有相关子查询的条件表达式>

使用示例:查询所有班级的学生信息

	select *
	from student
	where exists(
		select * from class
		where class.ClassID=student.ClassID
	)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章