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
)