1、基本连接
用户在进行基本连接操作时,可以遵循以下基本原则:
1)SELECT子句列表中,每个目标列前都要加上基表名称。
2)FROM子句应包括所有使用的基表。
3)WHERE子句应定义一个同等连接。
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]
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)因为,在外连接中参与连接的表有主从之分,以主表的每行数据去匹配从表中的数据行,如果符合连接条件,则直接返回到查询结果中;如果主表中的行在从表中没有找到匹配的行,主表的行仍然保留,并返回到查询结果中,相应的从表中的行中被填上空值后也返回到查询结果中。
FROM T_Member a LEFT join T_Company b
ON a.UserId = b.UserId
WHERE a.AreaId=106
ORDER BY a.UserId desc
4、右外连接
FROM T_Member a RIGHT join T_Company b
ON a.UserId = b.UserId
ORDER BY a.UserId desc
5、全连接
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]
from t_company a CROSS join t_member b
where b.userName = 'Admin'
7、自连接
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查询
(
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模式等。
FROM T_Member a,T_Company b
where a.UserID = b.UserId
FOR XML RAW | AUTO | EXPLICIT | PATH
RAW:
<row UserID="2" UserName="Manager" CompanyName="**" />
<b CompanyName="**" />
</a>
<a UserID="2" UserName="Manager">
<b CompanyName="**" />
</a>
PATH:
<UserID>1</UserID>
<UserName>Admin</UserName>
<CompanyName>**</CompanyName>
</row>
<row>
<UserID>2</UserID>
<UserName>Manager</UserName>
<CompanyName>**</CompanyName>
</row>