【网学网提醒】:网学会员,鉴于大家对SQL语法教育训练十分关注,会员在此为大家搜集整理了“SQL语法教育训练”一文,供大家参考学习!
SQL语法教育训练目标:能够清楚说明SQL与SUNLIKE系统的连接、简单语法使用、
SQL效能调整期间:二个星期(下午半天讲师培训,上午自行练习)
SQL环境的一些查询指令1.Sp_help
/列出目前的Database所有的Table2.Sp_columnsauthors
/列出authors这个Table所有栏位的资讯3.Sp_Server_Info
/SQLServer的设定讯息4.Sp_Who
/查出SQLServer有谁在上面正在做什么事5.Sp_HelpSort
/查出SQLServer的SortOrder6.Sp_HelpServer
/查SQLServerName
单一Table的Select
1.
Select*fromAccn
/列出Accn这个Table所有的资料
2.SelectAcc_No,Name,Acc_No_Up,DC,Eng_NamefromAccn/列出Accn这个Table内的Acc_No,
Name,Acc_No_Up,DC,Eng_Name五个栏位的所有资料
3.SelectAcc_No,Name+’’+Eng_NameFrmeAccn/列出Accn这个Table内的Acc_No及Name,Eng_Name两个栏位字串相加后的资料
4.SelectAcc_No,Name+’’+Eng_Nameas“FullName”FromAccn/同上,并替Name+’’+Eng_Name两个栏位字串相加后的栏位加上表头名称“FullName”
5.Select*FromAccnWhereAcc_No=’1111’/由Accn这个Table,找出Acc_No这个栏位为’1111’的资料。
6.Select*FromAccnorderbyAcc_No/由Accn这个Table,找出Acc_No这个栏位排序由小到大
7.SelectAcc_No,count(*)FromAccnGroupbyAcc_No/由Accn这个Table,找出Acc_No栏位个别计算笔数
8.Select*FromAccnWhereNamelike’应%’/由Accn这个Table,找出Name栏位开头为“应”的资料
9.Select*FromAccnWhereNamelike‘%款’/由Accn这个Table,找出Name栏位结尾为“款”的资料
10.Select*FromAccnWhereNamelike‘%版%’/由Accn这个Table,找出Name栏位资料中有“收”的资料
11.SelectDistinctMak_NofromVhed/由Vhed个Table,找出Mak_No栏位,但相同的资料只列出一笔
12.Selectmak_No,Mak_Dat,Voh_IdfromDB_0003..VhedwhereVoh_Id=’4’/若不在Dn_0003的DataBase内,亦可透过指定的方式抓取Db_0003..Vhed的Table,正确的语法databaseName.Owner.TableName’Owner若是自己可省略不打。
13.Where可以为+,>,<,>=,<=,<>,in(),notin()
14.SelectMak_No,Mak_Dat,Voh_IdFromVhedWhereVoh_Idin(‘3’,’4’)/由Vhed这个Table,找出Mak_No,Mak_Dat,Voh_Id栏位,Voh_Id这个栏位为‘3’或‘4’的资料
15.Select*FromSalm/列出Salm这个Table所有的资料
16.
SelectPs_No‘订单号码’,Sum(Qty)‘合计’FromTf_pss
WherePs_Noin(‘SA91010001’,’SA97030001’)GroupbyPs_No/由Tp_Pss这个Table,Ps_No找出Qty栏位全计,Ps_No依且这个栏位为‘SA91010001’,’SA97030001’的资料
17.SelectPs_No“订单号码”Sum(Qty)“合计”FromTF_PSS,WherePs_Noin(‘SA91
010001’,’SA97030001’)GroupbyPs_NoHavingSum(Qty)>1/由TF_PSS这个Table,Ps_No找出Qty栏位合计,PS_No依且这个栏位为‘SA91010001’,’SA97030001’的资料,且合计需大于1才列出
多个Table的select1.Select*FromMf_pss/列出Mf_Pss这个Table所有的资料
2.Select*FromTF_PSS/列出TF_PSS这个Table所有的资料
3.
Select*FromMF_PSS,TF_PSS
/列出MP_PSS及TF_PSS这两个Table所有的资料,请注意这个资料不是我们所想要的,因为列出来的是指两个Table的笔数相乘之后的结果,没能任何关系性,所以请看下面列子
4.Select*FromMF_PSS,TF_PSSWhereMF_Pss.Ps_No=TF_Pss.
Ps_No/列出MF_PSS及TF_PSS这两个table所有的资料,但两个Table的PS_No相同的资料合并成一笔列出
5.
Select*FromMf_PssA,TF_PssBWhereA.PS_Id=b.PS_Id
/同上例,可将MF_PSS取别名A,TF_Pss取别名B,如此若要使用很多栏位时,只要在栏位前面的tablename改用别名表示即可,省略打字的时间,亦不容易打错6.SelectA.Ps_id,A.Ps_No,A.PS_Dd,B.Ps_IdfromTF_PssB,MF_PssAwhereB.PS_id=A.PS_idandB.Qty>100
/列出MF_Pss及TF_Pss这两个Table的某些栏位,两个Table的Ps_Id相同的资料合并成一笔列出,且TF_Pss的Qty栏位需大于100才列出。
7.SelectA.Ps_id,A.PS_NO,A.PS_DDfromMF_PssA,TF_PSSBWhereB.PS_id=A.PS_idandB.Qty>100./列出MF_PSS这个Table的某些栏位,但参考到TF_PSS这个Table的Qty栏位需大于100才列出
8.SelectPS_id,Ps_No,PS_DDFromDB_0003..MF_PSSWhere
(PS_Id)in(SelectPS_idFromTF_PSSWhereQty=100)/同上,但请注意第6,7,8三个作法是否类似,但结果不同,在第6,7题会比第8题多出一笔,因为有一个MF_PSS有两笔的TF_Pss,造成第6,7题所列出的资料可能不是我们所要的,若要避免这个情形,就要使用第8题的作法,总结来说:要列出某一Table的资料,却必须参考其它Table的条件,则使用in的语法是最正确的
1.Select*FromMF_PssWhereSubstring(Ps_No,3,4)=‘9703’/MF_PSS这个Table,PS_No这个栏位从第三个byte开始四个byte为’9703’的记录列出来,Substring是一个字串函数
2.
Select
*
From
MF_Pss
Where
PS_No
Between
‘PC97030001’and‘97090003’/由MF_PSS这个Table,PS_NO这个栏位为介于‘PC97030001’and‘97090003’的资料,包含
‘PC97030001’及‘97090003’
3.SelectPS_No,PS_DD,Qty“订单数量”,Qty*1.1“实际出货
数量”FromTF_PSS/由TF_PSS这个Table,列出PS_No,,PS_DD,Qty三个栏位及Qty这个栏位的值乘上1.1之后一起列出
4.Select*IntoMPSSfromMF_Pss/将MF_PSS这个Table所有资料写入MPSS的Table内,注意MPSS为新的Table
5.Select*
IntoTPSSfromTF_Pss/将TF_PSS这个Table所有资料写入TPSS的Table内,注意TPSS为新的Table
6.Select*fromTPSS
7.DeleteTPSSWherePS_No=‘PC97030001’/将TPSS这个Table内PS_No为‘PC97030001’的记录删除8.Select*FromMPSSWherePS_NONotin(SelectPS_NoFromTPSS)/将MPSS这个Table内PS_No在TPSS找不到的记录列出来不,意思可以找出有表头没有表身或是有表身没有表头的资料
9.InsertintoTPSS(Ps_Id,Ps_No,Ps_Dd,Qty,Itm,Wh)Values(‘SA’,’SA00310099’.’2000/3/10’,5,‘1’,‘0000’)/Insertinto指令可新增记录到Table内,例如新增资料到TPSS这个Table内,资料值就在Values后面的资料,若Insert全部栏位则TPSS后面的栏位可以省略
10.UpdateTPSSSetQty=6WherePS_No=’PC97030001’/update指令可将栏位值改变,例如将TPSS这个Table内PS_No为‘PC97030001’的记录数量都改为6
11.BEGINTRANSACTIONSelect*FromTPSSWherePS_No=‘PC97030001’UpdateTPSSSetQty=10WherePS_No=‘PC97030001’Select*FromTPSSWherePS_No=‘PC97030001’RollbackSelect*FromTPSSWherePS_No=‘PC97030001’/Rollback指令可将Update的资料回复成原来的值
12.BEGIN
TRANSACTION
Select*FromTPSSWherePS_No=‘PC97030001’UpdateTPSSSetQty=20WherePS_No=‘PC97030001’Select*FromTPSSWherePS_No=‘PC97030001’CommitSELECT*FromTPSSWherePS_No=‘PC97030001’BEGINTRANSACTIONRollbackSelect*FromTPSSWherePS_No=‘PC97030001’/Commit指令可将Update的资料真正写入资料库内
13.TruncateTableTPSS/Truncate指令可将Table的所有资料全部删除,Table架构但仍在,意即将Table清空
14.DropTableTPSS/Drop指令可将Table删除
SQL的效能调整一、清除LOG文件:1.LOG文件的日渐增大会占用海量存储器,降低SQL工作交通,
因此要随时清除。2.对于刚开始使用SQL时,进入SQLSERVERENTERPRICEMANAGER(管理器),在指定数据库的PROPERTIES(道具)的OPTIONS(选项)中对AUTOSHRINK及TRUNCATELOGONCHECKPOINT两项选项打勾设置即可。3.如果没进行以上设置,则在SQLSERVERQUERYANALYZER(分析器)执行如下词句,之后再进行上条所述的设置:CREATETABLENEWTABLE(AINT)GOINSERTINTONEWTABLEVALUES(10)INSERTINTONEWTABLEVALUES(20)INSERTINTONEWTABLEVALUES(30)GODECLARE@COUNT=1SET@COUNT=1WHILE@COUNT<100BEGINUPDATENWETABLESETA=A+1BACKUPLOG数据库名WITHTRUNCATE)ONLYDBCCSHRINKDATABASE(数据库名)SET@COUNT=@COUNT+1
END4.如果硬盘有分区(比如C盘和D盘),SQL安装在C盘。为节省空间,当LOG文件增大到一定程度,希望转增到D盘,可以进入SQLSERVERENTERPRICEMANAGER(管理器),在指定数据库的PROPERTIES(道具)的TRANSACTIONLOG中新增一个LOG在D盘即
可。
二、如何做REINDEX1.在SQLSERVERQUERYANALYZER(分析器)执行如下语句:DBCCDBREINDEX(table)2.在指定数据库的ALLTASKS(任务)中建立MAINTENANCE
PLAN(维护计划),按指定期间自动执行JOB即可。3.在sunlike系统中备份出资料,再新建一帐套,恢复回来,系
统就会自动重新索引。
三、更改CODEPAGE1.执行SP_HELPSORT查看当前的SQL的CODEPAGE。2.3.4.停掉SQLSERVER。COPY数据库(SATA\*.MDF*.IDF)到指定路径。执行REBUILDM.EXE(BINN\).
四、恢复数据库(SUSPECTSTATUS)sp_detach_db‘db_tt’,‘true’execsp_attach_db@dbname=N’db_tt’,@filename1=N’c:\mssql7\data\dat_tt.mdf,@filename1=N’c:\mssql7\data\log_tt.ldf,
五、修补数据库记录(DBCCCHECKDB)1.DBCCCHECKDB(‘数据库名’REPAIR_FAST)快速修补,2.DBCCCHECKDB(‘数据库名’REPAIR_REBUILD)可重,新索引3.DBCCCHECKDB(‘数据库名’,
REPAIR_ALLOW_DATA_LOSS)允许丢失记录