SQL_Server_2008完全学习之第七章操作查询

1、基本连接

用户在进行基本连接操作时,可以遵循以下基本原则:

1)SELECT子句列表中,每个目标列前都要加上基表名称。

2)FROM子句应包括所有使用的基表。

3)WHERE子句应定义一个同等连接。

SELECT a.UserId,a.UserName,a.Sex,b.CompanyName
FROM T_Member a,T_Company b
where a.UserId = b.UserId

2、内连接

内连接语法

SELECT select_list

FROM table1 INNER JOIN table2 [ON join_conditions]

[WHERE search_conditions]

[ORDER BY order_expression]

SELECT a.UserId,a.UserName,a.Sex,b.CompanyName
FROM T_Member a INNER join T_Company b
ON a.UserId = b.UserId AND AreaId=106
ORDER BY a.UserId desc

3、左外连接

外连接

1)内连接消除与另一个表的任何行不匹配的行,而外连接会返回FROM子句中提到的至少一个表或视图中的所有行,只要这些行符合任何搜索条件

2)因为,在外连接中参与连接的表有主从之分,以主表的每行数据去匹配从表中的数据行,如果符合连接条件,则直接返回到查询结果中;如果主表中的行在从表中没有找到匹配的行,主表的行仍然保留,并返回到查询结果中,相应的从表中的行中被填上空值后也返回到查询结果中。


SELECT a.UserId,a.UserName,a.Sex,b.CompanyName
FROM T_Member a LEFT join T_Company b
ON a.UserId = b.UserId
WHERE a.AreaId=106 
ORDER BY a.UserId desc

4、右外连接

SELECT a.UserId,a.UserName,a.Sex,b.CompanyName
FROM T_Member a RIGHT join T_Company b
ON a.UserId = b.UserId
ORDER BY a.UserId desc


5、全连接

SELECT a.UserId,a.UserName,a.Sex,b.CompanyName
FROM T_Member a FULL join T_Company b
ON a.UserId = b.UserId
ORDER BY a.UserId desc

6、交叉连接

1)交叉连接不带WHERE子句,它返回被连接的两个表所有数据行的笛卡欠积,返回到结果集中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据的行数。

2)语法格式

SELECT select_list

FROM table1 CROSS JOIN table2

[WHERE search_conditions]

[ORDER BY order_expression]

select b.UserName,a.CompanyName
from t_company a CROSS join t_member b
where b.userName = 'Admin'

7、自连接

SELECT a.UserId,b.UserName,b.UserName as tmpUserName
FROM T_Member a,T_Member b
WHERE a.UserID = b.UserID

这段不是太明白在什么场合下有用,求解!

8、联合查询

1)语法格式

SELECT select_list

FROM table_source

[WHERE search_conditions]

{UNION [ALL]
SELECT select_list FROM table_source [WHERE search_conditions]}

[ORDER BY order_expression]

2)注意:

使用UNION查询时,连接到两个结果集必须在某些目标列表中有相同数目的表达式,且数据内容尽量保持一致。


3)示例:

--查询用户财务记录,并联合查询平均值与合计值
SELECT a.UserName,b.Amount,b.Balance
FROM [User] a,ProfitLoss b
WHERE a.UserId = b.UserId AND b.TypeId=0 AND UpdateTime>='2013-08-21' AND UpdateTime<='2013-08-21 23:59:59'
UNION
--查询平均
SELECT '平均',AVG(b.Amount),0
FROM [User] a,ProfitLoss b
WHERE a.UserId = b.UserId AND b.TypeId=0 AND UpdateTime>='2013-08-21' AND UpdateTime<='2013-08-21 23:59:59'
UNION
--查询合计
SELECT '合计',SUM(b.Amount),0
FROM [User] a,ProfitLoss b
WHERE a.UserId = b.UserId AND b.TypeId=0 AND UpdateTime>='2013-08-21' AND UpdateTime<='2013-08-21 23:59:59'
--对结果集进行排序
ORDER BY b.Amount DESC

9、使用子查询

--查询用户财务记录,使用子查询找到高于平均消费的记录
SELECT a.UserName,b.Amount,b.Balance
FROM [User] a,ProfitLoss b
WHERE a.UserId = b.UserId AND b.TypeId=1 AND UpdateTime>='2013-07-21' AND UpdateTime<='2013-08-21 23:59:59' AND 
b.Amount>=
(
SELECT AVG(b.Amount)
FROM [User] a,ProfitLoss b
WHERE a.UserId = b.UserId AND b.TypeId=1 AND UpdateTime>='2013-07-21' AND UpdateTime<='2013-08-21 23:59:59'
)

10、嵌套子查询(略)

11、EXISTS关键字查询

--以用户登录查询语句为例
declare @userName nvarchar(20)
declare @passWord nvarchar(32)
set @userName='agent'
set @passWord='30B8CA8354B5AC6542797BFF9623B346'
if exists(select * from [User] where UserName=@userName and Password=@passWord)
    print '1'
else
    print '0'

12、差查询EXCEPT(略:查询去除基结果集与次结果集的相交记录后的结果集)

13、交查询INTERSECT(略:求结果集的交集)

14、XML查询

Create Table TestXML
(
    ItemId int not null,
    [Content] xml
)

insert into TestXML VALUES(1,'<学生信息><姓名>张三</姓名><年龄>28</年龄><性别>男</性别><班级>云计算一班</班级></学生信息>')

SELECT * FROM TestXML

declare @xmlData xml
set @xmlData = (SELECT [Content] from TestXML where ItemId = 1)
SELECT @xmlData.query('学生信息/姓名'as 姓名,@xmlData.query('学生信息/性别'as 性别,@xmlData.query('学生信息/班级'as 班级

15、FOR XML子句

FOR XML子句

通过FOR XML子句并指定模式可以将从数据库系统的表中检索出来的数据自动表示成XML格式。SQL Server 2005 在之前版本的基础增加了FOR XML子句的功能,添加了多种显示模式,如RAW模式、AUTO模式、EXPLICIT模式和PATH模式等。

SELECT a.UserID,a.UserName,b.CompanyName
FROM T_Member a,T_Company b
where a.UserID = b.UserId
FOR XML RAW | AUTO | EXPLICIT | PATH

RAW:

<row UserID="1" UserName="Admin" CompanyName="**" />
<row UserID="2" UserName="Manager" CompanyName="**" />

AUTO:

<UserID="1" UserName="Admin">
  <CompanyName="**" />
</a>
<UserID="2" UserName="Manager">
  <CompanyName="**" />
</a>

PATH:

<row>
  <UserID>1</UserID>
  <UserName>Admin</UserName>
  <CompanyName>**</CompanyName>
</row>
<row>
  <UserID>2</UserID>
  <UserName>Manager</UserName>
  <CompanyName>**</CompanyName>
</row>

原文地址:https://www.cnblogs.com/cxmsky/p/3270410.html