SQLServer2012数据查询⼆多表查询(连接查询、嵌套查询)
⽂章⽬录
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 <;含有相关⼦查询的条件表达式>
sql left join 多表连接使⽤⽰例:查询所有班级的学⽣信息
select *
from student
where exists(
select * from class
where class.ClassID=student.ClassID
)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。