您的位置:首页 > 数据库

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

2013-09-22 14:38 387 查看
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是意大利标准,带两位数字的年份。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息