SQL Server 2008编程入门经典笔记(第七章:更复杂的查询)

来源:互联网 发布:数码大师2016软件下载 编辑:程序博客网 时间:2024/06/01 09:04

7.1 构建嵌套子查询
SELECT <SELECT list>
FROM <SomeTable>
WHERE <SomeColumn>=(
 SELECT <single column>
 FROM <SomeTable>
 WHERE <condition that results in only one row returned>)
或者:
SELECT <SELECT list>
FROM <SomeTable>
WHERE <SomeColumn> IN (
 SELECT <single column>
 FROM <SomeTable>
 [WHERE <condition>])

a)使用返回多个值的子查询的嵌套查询

--以内连的方式查询
select st.StudentNo,StudentName,StudentAddr,MathScores,TeacherName
from students st
inner join scores sc
on st.StudentNo=sc.StudentNo
--以嵌套的方式查询
select StudentNo,StudentName,StudentAddr
from students
where StudentNo in
(select StudentNo from scores);

b)使用嵌套的SELECT发现孤立的记录

--以内连的方式查询
select st.StudentNo,StudentName,StudentAddr,MathScores,TeacherName
from students st
left join scores sc
on st.StudentNo=sc.StudentNo
where sc.StudentNo is NULL;
--以嵌套的方式查询
select StudentNo,StudentName,StudentAddr
from students
where StudentNo not in
(select StudentNo from scores);

7.2.1 关联子查询
关联子查询和嵌套子查询的不同在于信息传递是双向的,而不是单向的。在嵌套子查询中,内部查询只处理了一次(后面的SELECT语句),然后将信息传递到外部查询,而外部查询也只执行一次--提供和您自己可能输入的完全相同的值或列表。
在关联子查询中,内部查询用外部查询提供的信息运行,反之亦然。
1.外部查询获得一个记录,然后将该记录传递到内部查询。
2.内部查询根据传递的值执行。
3.然后内部查询将结果值传回外部查询,而外部查询利用这些值完成处理过程。

7.2.2 在WHERE子句中的关联子查询
SELECT soh1.CustomerID,soh1.SalesOrderID,soh1.OrderDate
FROM Sales.SalesOrderHeader soh1
WHERE soh1.OrderDate=(SELECT Min(soh2.OrderDate)
      FROM Sales.SalesOrderHeader soh2
      WHERE soh2.CustomerID=soh1.CustomerID)
ORDER BY CustomerID;

a)在SELECT列表中的关联子查询
SELECT sc.AccountNumber,
 (SELECT Min(OrderDate)
  FROM Sales.SalesOrderHeader soh
  WHERE soh.CustomerID=sc.CustomerID)
 AS OrderDate
FROM Sales.Customer sc;

7.3 派生表
SELECT <select list>
FROM (<query that returns a regular resultset>) AS <alias name>
JOIN <some other base or derived table>

7.4 EXISTS运算符
使用EXISTS时,并不真正返回数据,而是根据是否存在数据满足查询中EXISTS语句所建立的条件标准,返回简单的TRUE或者FALSE结果。
SELECT st.StudentNo,StudentName,StudentAddr
FROM students st
WHERE exists
(SELECT StudentNo
 FROM scores sc
 WHERE st.StudentNo=sc.StudentNo);

使用内部连接会得到相同的结果
SELECT st.StudentNo,StudentName,StudentAddr
FROM students st
INNER JOIN scores sc
ON st.StudentNo=sc.StudentNo

a)以其他方式使用EXISTS
EXISTS通常的用法 是在运行CREATE语句之前检验表是否存在。有时可能希望删除一个已存在的表,如果表已经存在的话,可能使用ALTER语句或者其它语句修改已存在的表。

7.5 混合数据类型:CAST和CONVERT
CAST和CONVERT都可以执行数据类型转换。大多数情况,两者执行同样的功能,不同的是CONVERT还提供一些日期格式转换,而CAST没有这个功能。

CAST(expression AS data_type)
CONVERT(data_type,expression[,style])
例子:
CAST(SalesOrderID AS varchar)
CONVERT(varchar(12) OrderDate,111)--111给出日本标准,带4位数字的年份。5是意大利标准,带两位数字的年份。

 

原创粉丝点击