SQL语句写法.docx
《SQL语句写法.docx》由会员分享,可在线阅读,更多相关《SQL语句写法.docx(7页珍藏版)》请在冰点文库上搜索。
SQL语句写法
SQLSERVER2005语句写法
主要内容
1、LEFTJOIN、RIGHTJOIN与INNERJOIN用区别与用法
2、WITHAS用法
3、不使用NOTIN语句
4、不使用XX字段=(表查询)语法
5、聚集索引与非聚集索引使用介绍
6、索引创建以及优化
7、联合表更新、删除写法以及批量INSERT
8、WITH(NOLOCK)
1、LEFTJOIN与INNERJOIN用区别与用法
leftjoin(左连接)返回包括左表中的所有记录和右表中连接字段相等的记录
rightjoin(右连接)返回包括右表中的所有记录和左表中连接字段相等的记录
innerjoin(等值连接)只返回两个表中连接字段相等的行
表值如:
左连接结果:
SELECT*FROMPC_Usera
LEFTJOINPC_ScorebONa.UserID=b.UserID
右连接结果:
SELECT*FROMPC_Usera
RIGHTJOINPC_ScorebONa.UserID=b.UserID
等值连接结果:
SELECT*FROMPC_Usera
INNERJOINPC_ScorebONa.UserID=b.UserID
左右连接附加条件写法:
SELECT*FROMPC_Usera
LEFTJOINPC_ScorebONa.UserID=b.UserIDANDb.CourseID='a'
如果写成:
SELECT*FROMPC_Usera
LEFTJOINPC_ScorebONa.UserID=b.UserID
WHEREb.CourseID='a'
等同于:
SELECT*FROMPC_Usera
INNERJOINPC_ScorebONa.UserID=b.UserID
WHEREb.CourseID='a'
多次使用同一张表
SELECT*FROMPC_Usera
INNERJOINPC_ScorebONa.UserID=b.UserIDAndb.CourseID='a'
LeftJOINPC_ScorecONa.UserID=c.UserIDAndc.CourseID='b'
2、WITHAS用法
WITHtmpas(SELECT*FROMPC_ScoreWHERECourseID='a')
SELECT*FROMPC_Usera
INNERJOINtmpbONa.UserID=b.UserID
WITHtmpas(select*fromPC_ScorewhereScore=100)
SELECT*FROmPC_Usera
LEFTJOINtmpbona.UserID=b.UserID
3、不使用NOTIN语句
写法:
SELECT*FROMPC_User
WhereUserIDNOTIN(SelectUserIDFromPC_ScoreWherescore=100)
改为:
SELECTa.*FROmPC_Usera
LEFTJOINPC_Scorebona.UserID=b.UserIDANDscore=100
Whereb.UserIDIsNULL
4、不使用XX字段=(表查询)语法
SELECTUserID,UserNameFROMPC_User
WHEREUserID=(SELECTUserIDFromPC_ScoreWherescore=100)
出错:
子查询返回的值不止一个。
当子查询跟随在=、!
=、<、<=、>、>=之后,或子查询用作表达式时,这种情况是不允许的。
改为:
SELECTdistincta.UserID,a.UserNameFROMPC_Usera
INNERJOInPC_Scorebona.UserID=b.UserID
WHEREb.score=100
或者
SELECTa.UserID,a.UserNameFROMPC_Usera
INNERJOInPC_Scorebona.UserID=b.UserID
WHEREb.score=100
GROUPBYa.UserID,a.UserName
5、聚集索引与非聚集索引使用情况说明
⏹最大不同在于物理存储结构不同。
⏹聚集索引是根据索引字段进行数据的物理排序。
⏹非聚集索引类似书本索引,索引与数据存放在不同的物理区域。
如,当前字段数据值为10,15,30
A、使用聚集索引,添加数据20时,数据库将进行物理IO 移动,将(30移动后面)然后添加数据。
物理结果为:
10,15,20,30
B、利用非聚集索引,添加数据20时,数据库不进行物理 移动,直接将数据添加到文件末尾,然后建立索引指针。
物理结果为:
10,15,30,20
什么时候用聚集索引和非聚集索引呢?
情况如下:
如果字段为自增字段,记流水字段,而且大部分情况下是顺序添加的话,可以用聚集索引
如果字段值存储如用户名这样的结果,如果采用聚集索引,每次添加用户都需要进行移动IO,影响性能,这时候就采用非聚集索引。
6、索引创建以及优化
索引就是在数据库查询的时候提供快捷查找的指针。
索引的建立的时候要根据SQL语法来创建,最关键的时索引字段的顺序。
建立索引语法:
CREATEINDEX索引名称ON表(字段1,字段2)INCLUDE(字段)
删除索引语法:
DROPINDEX索引名称ON表
如
CREATEINDEXidx_PC_Score_score1onPC_Score(score)include(UserID)
优化索引:
SELECT*FROMAccMain.dbo.Jx_InfowhereOpenID<200
SELECTMemberID,FullNameFROMAccMain.dbo.Jx_InfowhereOpenID<200
CreateIndexidx_Jx_Info_OpenIDONAccMain.dbo.Jx_info(OpenID)
CreateIndexidx_Jx_Info_OpenIDONAccMain.dbo.Jx_info(OpenID)include(MemberID,FullName)
DropIndexidx_Jx_Info_OpenIDONAccMain.dbo.Jx_info
7、联合表更新、删除写法
SELECT*
--UpdatebSetscore=100
--Deleteb
FROMPC_Usera
INNERJOINPC_ScorebONa.UserID=b.UserID
whereb.CourseID='a'
批量INSERTINTO:
INSERTINTOPC_Score(UserID,CourseID,Score)
SelectUserID,'d',60FromPC_User
批量替换更新:
UpdatePC_ScoreSetCourseID=Replace(CourseID,'a','e')WHEREScore=100
8、WITH(NOLOCK)
情况:
每次SQL查询(如Select)会产生共享锁,在此期间影响到的表为只读,不允许进行修改操作。
优点:
如果在查询的时候添加上with(nolock)将不会产生共享锁,可以提高查询速度的同时不影响修改操作。
缺点:
会产生脏读,数据完整性要求比较严格的场景就不合适了,如财务结算,支付等环节。
用法如下:
SELECT*FROM表WITH(NOLOCk)