① sql server中關系型資料庫的第一、第二、第三標准形式的各自要求是什麼
第一範式的目標是確保每列的原子性
如果每列都是不可再分的最小數據單元(也稱為最小的原子單元),則滿足第一範式(1NF)
如果一個關系滿足1NF,並且除了主鍵以外的其他列,都依賴與該主鍵,則滿足第二範式(2NF)
第二範式要求每個表只描述一件事情
如果一個關系滿足2NF,並且除了主鍵以外的其他列都不傳遞依賴於主鍵列,則滿足第三範式(3NF)
② SQL語句執行流程與順序原理解析
SQL語句執行流程與順序原理解析
Oracle語句執行流程
第一步:客戶端把語句發給伺服器端執行
當我們在客戶端執行SQL語句時,客戶端會把這條SQL語句發送給伺服器端,讓伺服器端的進程來處理這語句。也就是說,Oracle 客戶端是不會做任何的操作,他的主要任務就是把客戶端產生的一些SQL語句發送給伺服器端。伺服器進程從用戶進程把信息接收到後, 在PGA 中就要此進程分配所需內存,存儲相關的信息,如:在會話內存存儲相關的登錄信息等。
雖然在客戶端也有一個資料庫進程,但是,這個進程的作用跟伺服器上的進程作用是不相同的,伺服器上的資料庫進程才會對SQL 語句進行相關的處理。不過,有個問題需要說明,就是客戶端的進程跟伺服器的進程是一一對應的。也就是說,在客戶端連接上伺服器後,在客戶端與伺服器端都會形成一個進程,客戶端上的我們叫做客戶端進程,而伺服器上的我們叫做伺服器進程。
第二步:語句解析
當客戶端把SQL語句傳送到伺服器後,伺服器進程會對該語句進行解析。這個解析的工作是在伺服器端所進行的,解析動作又可分為很多小動作。
1)查詢高速緩存(library cache)
伺服器進程在接到客戶端傳送過來的SQL語句時,不會直接去資料庫查詢。伺服器進程把這個SQL語句的字元轉化為ASCII等效數字碼,接著這個ASCII碼被傳遞給一個HASH函數,並返回一個hash值,然後伺服器進程將到shared pool中的library cache(高速緩存)中去查找是否存在相同的hash值。如果存在,伺服器進程將使用這條語句已高速緩存在SHARED POOL的library cache中的已分析過的版本來執行,省去後續的解析工作,這便是軟解析。若調整緩存中不存在,則需要進行後面的步驟,這便是硬解析。硬解析通常是昂貴的操作,大約占整個SQL執行的70%左右的時間,硬解析會生成執行樹,執行計劃,等等。
所以,採用高速數據緩存的話,可以提高SQL 語句的查詢效率。其原因有兩方面:一方面是從內存中讀取數據要比從硬碟中的數據文件中讀取數據效率要高,另一方面也是因為避免語句解析而節省了時間。
不過這里要注意一點,這個數據緩存跟有些客戶端軟體的數據緩存是兩碼事。有些客戶端軟體為了提高查詢效率,會在應用軟體的客戶端設置數據緩存。由於這些數據緩存的存在,可以提高客戶端應用軟體的查詢效率。但是,若其他人在伺服器進行了相關的修改,由於應用軟體數據緩存的存在,導致修改的數據不能及時反映到客戶端上。從這也可以看出,應用軟體的數據緩存跟資料庫伺服器的高速數據緩存不是一碼事。
2)語句合法性檢查(data dict cache)
當在高速緩存中找不到對應的SQL語句時,則伺服器進程就會開始檢查這條語句的合法性。這里主要是對SQL語句的語法進行檢查,看看其是否合乎語法規則。如果伺服器進程認為這條SQL語句不符合語法規則的時候,就會把這個錯誤信息反饋給客戶端。在這個語法檢查的過程中,不會對SQL語句中所包含的表名、列名等等進行檢查,只是檢查語法。
3)語言含義檢查(data dict cache)
若SQL 語句符合語法上的定義的話,則伺服器進程接下去會對語句中涉及的表、索引、視圖等對象進行解析,並對照數據字典檢查這些對象的名稱以及相關結構,看看這些欄位、表、視圖等是否在資料庫中。如果表名與列名不準確的話,則資料庫會就會反饋錯誤信息給客戶端。
所以,有時候我們寫select語句的時候,若語法與表名或者列名同時寫錯的話,則系統是先提示說語法錯誤,等到語法完全正確後再提示說列名或表名錯誤。
4)獲得對象解析鎖(control structer)
當語法、語義都正確後,系統就會對我們需要查詢的對象加鎖。這主要是為了保障數據的一致性,防止我們在查詢的過程中,其他用戶對這個對象的結構發生改變。
5)數據訪問許可權的核對(data dict cache)
當語法、語義通過檢查之後,客戶端還不一定能夠取得數據,伺服器進程還會檢查連接用戶是否有這個數據訪問的許可權。若用戶不具有數據訪問許可權的話,則客戶端就不能夠取得這些數據。要注意的是資料庫伺服器進程先檢查語法與語義,然後才會檢查訪問許可權。
6)確定最佳執行計劃
當語法與語義都沒有問題許可權也匹配,伺服器進程還是不會直接對資料庫文件進行查詢。伺服器進程會根據一定的規則,對這條語句進行優化。在執行計劃開發之前會有一步查詢轉換,如:視圖合並、子查詢解嵌套、謂語前推及物化視圖重寫查詢等。為了確定採用哪個執行計劃,Oracle還需要收集統計信息確定表的訪問聯結方法等,最終確定可能的最低成本的執行計劃。
不過要注意,這個優化是有限的。一般在應用軟體開發的過程中,需要對資料庫的sql語句進行優化,這個優化的作用要大大地大於伺服器進程的自我優化。
當伺服器進程的優化器確定這條查詢語句的最佳執行計劃後, 就會將這條SQL語句與執行計劃保存到數據高速緩存(library cache)。如此,等以後還有這個查詢時,就會省略以上的語法、語義與許可權檢查的步驟,而直接執行SQL語句,提高SQL語句處理效率。
第三步:綁定變數賦值
如果SQL語句中使用了綁定變數,掃描綁定變數的聲明,給綁定變數賦值,將變數值帶入執行計劃。若在解析的第一個步驟,SQL在高速緩沖中存在,則直接跳到該步驟。
第四步:語句執行
語句解析只是對SQL語句的語法進行解析,以確保伺服器能夠知道這條語句到底表達的是什麼意思。等到語句解析完成之後,資料庫伺服器進程才會真正的執行這條SQL語句。
對於SELECT語句:
1)首先伺服器進程要判斷所需數據是否在db buffer存在,如果存在且可用,則直接獲取該數據而不是從資料庫文件中去查詢數據,同時根據LRU 演算法增加其訪問計數;
2)若數據不在緩沖區中,則伺服器進程將從資料庫文件中查詢相關數據,並把這些數據放入到數據緩沖區中(buffer cache)。
其中,若數據存在於db buffer,其可用性檢查方式為:查看db buffer塊的頭部是否有事務,如果有事務,則從回滾段中讀取數據;如果沒有事務,則比較select的scn和db buffer塊頭部的scn,如果前者小於後者,仍然要從回滾段中讀取數據;如果前者大於後者,說明這是一非臟緩存,可以直接讀取這個db buffer塊的中內容。
對於DML語句(insert、delete、update):
1)檢查所需的資料庫是否已經被讀取到緩沖區緩存中。如果已經存在緩沖區緩存,則直接執行步驟3;
2)若所需的資料庫並不在緩沖區緩存中,則伺服器將數據塊從數據文件讀取到緩沖區緩存中;
3)對想要修改的表取得的數據行鎖定(Row Exclusive Lock),之後對所需要修改的數據行取得獨占鎖;
4)將數據的Redo記錄復制到redo log buffer;
5)產生數據修改的undo數據;
6)修改db buffer;
7)dbwr將修改寫入數據文件;
其中,第2步,伺服器將數據從數據文件讀取到db buffer經經歷以下步驟:
1)首先伺服器進程將在表頭部請求TM鎖(保證此事務執行過程其他用戶不能修改表的結構),如果成功加TM鎖,再請求一些行級鎖(TX鎖),如果TM、TX鎖都成功加鎖,那麼才開始從數據文件讀數據。
2)在讀數據之前,要先為讀取的文件准備好buffer空間。伺服器進程需要掃描LRU list尋找free db buffer,掃描的過程中,伺服器進程會把發現的所有已經被修改過的db buffer注冊到dirty list中。如果free db buffer及非臟數據塊緩沖區不足時,會觸發dbwr將dirty buffer中指向的緩沖塊寫入數據文件,並且清洗掉這些緩沖區來騰出空間緩沖新讀入的數據。
3)找到了足夠的空閑buffer,伺服器進程將從數據文件中讀入這些行所在的每一個數據塊(db block)(DB BLOCK是ORACLE的最小操作單元,即使你想要的數據只是DB BLOCK中很多行中的一行或幾行,ORACLE也會把這個DB BLOCK中的所有行都讀入Oracle DB BUFFER中)放入db buffer的空閑的區域或者覆蓋已被擠出LRU list的非臟數據塊緩沖區,並且排列在LRU列表的頭部,也就是在數據塊放入db buffer之前也是要先申請db buffer中的鎖存器,成功加鎖後,才能讀數據到db buffer。
若數據塊已經存在於db buffer cache(有時也稱db buffer或db cache),即使在db buffer中找到一個沒有事務,而且SCN比自己小的非臟緩存數據塊,伺服器進程仍然要到表的頭部對這條記錄申請加鎖,加鎖成功才能進行後續動作,如果不成功,則要等待前面的進程解鎖後才能進行動作(這個時候阻塞是tx鎖阻塞)。
在記redo日誌時,其具體步驟如下:
1)數據被讀入到db buffer後,伺服器進程將該語句所影響的並被讀入db buffer中的這些行數據的rowid及要更新的原值和新值及scn等信息從PGA逐條的寫入redo log buffer中。在寫入redo log buffer之前也要事先請求redo log buffer的鎖存器,成功加鎖後才開始寫入。
2)當寫入達到redo log buffer大小的三分之一或寫入量達到1M或超過三秒後或發生檢查點時或者dbwr之前發生,都會觸發lgwr進程把redo log buffer的數據寫入磁碟上的redo file文件中(這個時候會產生log file sync等待事件)。
3)已經被寫入redo file的redo log buffer所持有的鎖存器會被釋放,並可被後來的寫入信息覆蓋,redo log buffer是循環使用的。Redo file也是循環使用的,當一個redo file寫滿後,lgwr進程會自動切換到下一redo file(這個時候可能出現log file switch(check point complete)等待事件)。如果是歸檔模式,歸檔進程還要將前一個寫滿的redo file文件的內容寫到歸檔日誌文件中(這個時候可能出現log file switch(archiving needed)。
在為事務建立undo信息時,其具體步驟如下:
1)在完成本事務所有相關的redo log buffer之後,伺服器進程開始改寫這個db buffer的塊頭部事務列表並寫入scn(一開始scn是寫在redo log buffer中的,並未寫在db buffer)。
2)然後包含這個塊的頭部事務列表及scn信息的數據副本放入回滾段中,將這時回滾段中的信息稱為數據塊的「前映像」,這個「前映像」用於以後的回滾、恢復和一致性讀。(回滾段可以存儲在專門的回滾表空間中,這個表空間由一個或多個物理文件組成,並專用於回滾表空間,回滾段也可在其它表空間中的數據文件中開辟)。
在修改信息寫入數據文件時,其具體步驟如下:
1)改寫db buffer塊的數據內容,並在塊的頭部寫入回滾段的地址。
2)將db buffer指針放入dirty list。如果一個行數據多次update而未commit,則在回滾段中將會有多個「前映像」,除了第一個「前映像」含有scn信息外,其他每個"前映像"的頭部都有scn信息和"前前映像"回滾段地址。一個update只對應一個scn,然後伺服器進程將在dirty list中建立一條指向此db buffer塊的指針(方便dbwr進程可以找到dirty list的db buffer數據塊並寫入數據文件中)。接著伺服器進程會從數據文件中繼續讀入第二個數據塊,重復前一數據塊的動作,數據塊的讀入、記日誌、建立回滾段、修改數據塊、放入dirty list。
3)當dirty queue的長度達到閥值(一般是25%),伺服器進程將通知dbwr把臟數據寫出,就是釋放db buffer上的鎖存器,騰出更多的free db buffer。前面一直都是在說明oracle一次讀一個數據塊,其實oracle可以一次讀入多個數據塊(db_file_multiblock_read_count來設置一次讀入塊的個數)
當執行commit時,具體步驟如下:
1)commit觸發lgwr進程,但不強制dbwr立即釋放所有相應db buffer塊的鎖。也就是說有可能雖然已經commit了,但在隨後的一段時間內dbwr還在寫這條sql語句所涉及的數據塊。表頭部的行鎖並不在commit之後立即釋放,而是要等dbwr進程完成之後才釋放,這就可能會出現一個用戶請求另一用戶已經commit的資源不成功的現象。
2)從Commit和dbwr進程結束之間的時間很短,如果恰巧在commit之後,dbwr未結束之前斷電,因為commit之後的數據已經屬於數據文件的內容,但這部分文件沒有完全寫入到數據文件中。所以需要前滾。由於commit已經觸發lgwr,這些所有未來得及寫入數據文件的更改會在實例重啟後,由smon進程根據重做日誌文件來前滾,完成之前commit未完成的工作(即把更改寫入數據文件)。
3)如果未commit就斷電了,因為數據已經在db buffer更改了,沒有commit,說明這部分數據不屬於數據文件。由於dbwr之前觸發lgwr也就是只要數據更改,(肯定要先有log)所有dbwr在數據文件上的修改都會被先一步記入重做日誌文件,實例重啟後,SMON進程再根據重做日誌文件來回滾。
其實smon的前滾回滾是根據檢查點來完成的,當一個全部檢查點發生的時候,首先讓LGWR進程將redologbuffer中的所有緩沖(包含未提交的重做信息)寫入重做日誌文件,然後讓dbwr進程將dbbuffer已提交的緩沖寫入數據文件(不強制寫未提交的)。然後更新控制文件和數據文件頭部的SCN,表明當前資料庫是一致的,在相鄰的兩個檢查點之間有很多事務,有提交和未提交的。
當執行rollback時,具體步驟如下:
伺服器進程會根據數據文件塊和db buffer中塊的頭部的事務列表和SCN以及回滾段地址找到回滾段中相應的修改前的副本,並且用這些原值來還原當前數據文件中已修改但未提交的改變。如果有多個」前映像「,伺服器進程會在一個「前映像」的頭部找到「前前映像」的回滾段地址,一直找到同一事務下的最早的一個「前映像」為止。一旦發出了commit,用戶就不能rollback,這使得commit後dbwr進程還沒有全部完成的後續動作得到了保障。
第五步:提取數據
當語句執行完成之後,查詢到的數據還是在伺服器進程中,還沒有被傳送到客戶端的用戶進程。所以,在伺服器端的進程中,有一個專門負責數據提取的一段代碼。他的作用就是把查詢到的數據結果返回給用戶端進程,從而完成整個查詢動作。
從這整個查詢處理過程中,我們在資料庫開發或者應用軟體開發過程中,需要注意以下幾點:
一是要了解資料庫緩存跟應用軟體緩存是兩碼事情。資料庫緩存只有在資料庫伺服器端才存在,在客戶端是不存在的。只有如此,才能夠保證資料庫緩存中的內容跟資料庫文件的內容一致。才能夠根據相關的規則,防止數據臟讀、錯讀的發生。而應用軟體所涉及的數據緩存,由於跟資料庫緩存不是一碼事情,所以,應用軟體的數據緩存雖然可以提高數據的查詢效率,但是,卻打破了數據一致性的要求,有時候會發生臟讀、錯讀等情況的發生。所以,有時候,在應用軟體上有專門一個功能,用來在必要的時候清除數據緩存。不過,這個數據緩存的清除,也只是清除本機上的數據緩存,或者說,只是清除這個應用程序的數據緩存,而不會清除資料庫的數據緩存。
二是絕大部分SQL語句都是按照這個處理過程處理的。我們DBA或者基於Oracle資料庫的開發人員了解這些語句的處理過程,對於我們進行涉及到SQL語句的開發與調試,是非常有幫助的。有時候,掌握這些處理原則,可以減少我們排錯的時間。特別要注意,資料庫是把數據查詢許可權的審查放在語法語義的後面進行檢查的。所以,有時會若光用資料庫的許可權控制原則,可能還不能滿足應用軟體許可權控制的需要。此時,就需要應用軟體的前台設置,實現許可權管理的要求。而且,有時應用資料庫的許可權管理,也有點顯得繁瑣,會增加伺服器處理的工作量。因此,對於記錄、欄位等的查詢許可權控制,大部分程序涉及人員喜歡在應用程序中實現,而不是在資料庫上實現。
Oracle SQL語句執行順序
(8)SELECT (9) DISTINCT (11) <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
1)FROM:對FROM子句中的表執行笛卡爾積(交叉聯接),生成虛擬表VT1。
2)ON:對VT1應用ON篩選器,只有那些使為真才被插入到TV2。
3)OUTER (JOIN):如果指定了OUTER JOIN(相對於CROSS JOIN或INNER JOIN),保留表中未找到匹配的行將作為外部行添加到VT2,生成TV3。如果FROM子句包含兩個以上的表,則對上一個聯接生成的結果表和下一個表重復執行步驟1到步驟3,直到處理完所有的表位置。
4)WHERE:對TV3應用WHERE篩選器,只有使為true的行才插入TV4。
5)GROUP BY:按GROUP BY子句中的列列表對TV4中的行進行分組,生成TV5。
6)CUTE|ROLLUP:把超組插入VT5,生成VT6。
7)HAVING:對VT6應用HAVING篩選器,只有使為true的組插入到VT7。
8)SELECT:處理SELECT列表,產生VT8。
9)DISTINCT:將重復的行從VT8中刪除,產品VT9。
10)ORDER BY:將VT9中的行按ORDER BY子句中的列列表順序,生成一個游標(VC10),生成表TV11,並返回給調用者。
以上每個步驟都會產生一個虛擬表,該虛擬表被用作下一個步驟的輸入。這些虛擬表對調用者(客戶端應用程序或者外部查詢)不可用。只有最後一步生成的表才會會給調用者。如果沒有在查詢中指定某一個子句,將跳過相應的步驟。
③ SQL資料庫(簡單)簡答題
Microsoft SQL Server 2000 簡答題及其答案
1.在安裝SQL Server 2000時,「僅客戶端工具」、「伺服器和客戶端工具」及「僅連接」等安裝定義有什麼差別?
答:僅客戶端工具:僅安裝客戶端工具。伺服器和客戶端工具:同時安裝伺服器和客戶端工具。僅連接:僅安裝客戶端連接。
2.一個資料庫中包含哪幾種文件?
答:主資料庫文件,輔助數據文件,事務日誌文件。
3.事務文件和數據文件分開存放有什麼好處?
答:因為利用事務日誌備份可以將資料庫恢復到特定的即時點(如輸入不想要的數據之前的那一點)或故障發生點。在媒體恢復策略中應考慮利用事務日誌備份。
4.什麼是批處理?使用批處理有何限制?
答:包含一個或多個T-SQL語句的組,從應用程序將一次性發送到SQL Server執行,SQL Server批處理語句作為整體編譯成一個可執行單元。
限制:如不能夠在同一個批處理中更改表,然後引用新列。如在一個批處理程序中,有兩條語句。第一條語句用來在一張表中插入一個欄位,如在User表中插入員工的出生年月;第二條語句則用來引用這個列,如根據身份證號碼來推算出這個員工的出身年月並把這個值賦值給這個第一條語句創建的出身年月欄位。
5.數據檢索時,COMPUTE和COMPUTE BY產生的結果有何不同?
答:Compute:第一個為明細行 第二個為聚合函數的合計 Compute by:第一個為明細行第二個為聚合函數的小計
6.什麼是索引?索引分為哪兩種?各有什麼特點?
答:1、資料庫中的索引與書籍中的目錄類似。在一本書中,利用目錄可以快速查找所需信息,無須閱讀整本書。在資料庫中,索引使資料庫程序無須對整個表進行掃描,就可以在其中找到所需數據。 2、聚集索引和非聚集索引。
3、聚集索引的特點:行的物理位置和行在索引中的位置是相同的,每個表只能有一個聚集索引,聚集索引的平均大小大約為表大小的5%左右。
非聚集索引特點:若未指定索引類型,則默認為非聚集索引,葉節點頁的次序和表的物理存儲次序不同,每個表最多可以有249個非聚集索引,在非聚集索引創建之前創建聚集索引。
7.創建索引有什麼優點和缺點?
答:優點:索引在資料庫中的作用類似於目錄在書籍中的作用,用來提高查找信息的速度。
使用索引查找數據,無需對整表進行掃描,可以快速找到所需數據。
缺點:索引需要佔用數據表以外的物理存儲空間。創建索引和維護索引要花費一定的時間。當對表進行更新操作時,索引需要被重建,這樣降低了數據的維護速度。
8.什麼是視圖?使用視圖的優點和缺點是什麼?
答:視圖是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖並不在資料庫中以存儲的數據值集形式存在。行和列數據來自由定義視圖的查詢所引用的表,並且在引用視圖時動態生成。
優點:1隱蔽資料庫的復雜性2控制用戶提取數據3簡化資料庫用戶管理 4簡化查詢
缺點:1性能:SQL Server必須把視圖的查詢轉化成對基本表的查詢,如果這個視圖是由,一個復雜的多表查詢所定義,那麼,即使是視圖的一個簡單查詢,SQL Server也,把它變成一個復雜的結合體,需要花費一定的時間。2修改限制:當用戶試圖修改視圖的某些行時,SQL Server必須把它轉化為對基本,表的某些行的修改。對於簡單視圖來說,這是很方便的,但是,對於比較復雜的,視圖,可能是不可修改的。
9. 修改視圖中的數據會受到哪些限制?
答:1、必須有許可權 2、單表視圖直接改
3、多表可在視圖中定義 instead of 觸發器.
4、對由多表連接成的視圖修改數據時,不能同時影響一個以上的基表,也不能刪除視圖中的數據
5、對視圖上的某些列不能修改,這些列是:計算列,內置函數列和行集合函數列
6、對具有NOT NULL 的列進行修改時可能會出錯。通過視圖修改或者插入數據時,必須保證未顯示的具有NOT NULL 屬性的列有值,可以是默認值,IDENTITY 等,否則不能像視圖中插入數據行。
7、如果某些列因為規則或者約束的限制不能接受從視圖插入的數據時,則插入數據可能會失敗
8、刪除基表並不刪除視圖,建議採用與表明顯不同的名字命名規則
10. 什麼是數據完整性?如果資料庫不實施數據完整性會產生什麼結果?
答:數據完整性是指數據的精確性和可靠性。它是應防止資料庫中存在不符合語義規定的數據和防止因錯誤信息的輸入輸出造成無效操作或錯誤信息而提出的。
11.數據完整性有哪幾類?如何實施?
答:1、數據完整性分為四類:實體完整性、域完整性、參照完整性、用戶定義的完整性。
2、資料庫採用多種方法來保證數據完整性,包括外鍵、束約、規則和觸發器。系統很好地處理了這四者的關系,並針對不同的具體情況用不同的方法進行,相互交叉使用,相補缺點。
12. 什麼是主鍵約束?什麼是惟一約束?兩者有什麼區別?
答:主鍵約束:有一列或列的組合,其值能唯一的標識表中的每一行。
唯一約束:不允許資料庫表在指定列上具有相同的值,但允許有空值。
區別:一個表可以定義多個唯一約束,只能定義一個主鍵約束;空值得列上可以定義唯一約束,不能定義主鍵約束。
13.什麼是外鍵,怎樣建立外鍵約束?
答:外鍵是用於建立和加強兩個表數據之間的鏈接的一列或多列。通過將保存表中主鍵值的一列或多列添加到另一個表中,可創建兩個表之間的鏈接。這個列就成為第二個表的外鍵。
14.什麼是存儲過程?使用存儲過程有什麼好處?
答:1、是存儲在伺服器上的 Transact-SQL 語句的命名集合,是封裝重復性任務的方法,支持用戶聲明變數、條件執行以及其他強有力的編程特性。
2、存儲過程封裝了商務邏輯,確保一致的數據訪問和修改。若規則或策略有變化,則只需要修改伺服器上的存儲過程,所有的客戶端就可以直接使用
屏蔽資料庫模式的詳細資料。用戶不需要訪問底層的資料庫和資料庫內的對象
提供了安全性機制。用戶可以被賦予執行存儲過程的許可權,而不必在存儲過程引用的所有對象上都有許可權
改善性能。預編譯的 Transact-SQL 語句,可以根據條件決定執行哪一部分
減少網路通信量。客戶端用一條語句調用存儲過程,就可以完成可能需要大量語句才能完成的任務,這樣減少了客戶端和伺服器之間的請求/回答包
15.什麼是觸發器?觸發器分有什麼作用?
答:觸發器是一類特殊的存儲過程,不能被直接調用,也不傳遞或接受參數
作用:1、維護不可能在表創建時刻通過聲明性約束進行的復雜的完整性約束限制。
2、通過記錄所進行的修改以及誰進行了修改來審計表中的信息。
3、當表被修改的時候,自動給其他需要執行操作的程序發信號。
④ SQL一道題目。選什麼為什麼
SQL SERVER 幫助文檔關於批處理的:
批處理是同時從應用程序發送到 SQL Server 並得以執行的一組單條或多條 Transact-SQL 語句。SQL Server 將批處理的語句編譯為單個可執行單元,稱為執行計劃。執行計劃中的語句每次執行一條。
每個 Transact-SQL 語句應以分號結束。此要求不是強制性的,但不推薦使用允許語句不以分號結束的功能,Microsoft SQL Server 的未來版本可能會刪除這種功能。
編譯錯誤(如語法錯誤)可使執行計劃無法編譯。因此,不會執行批處理中的任何語句。
諸如算術溢出或約束沖突之類的運行時錯誤具有下面的影響:
- 大多數運行時錯誤將停止執行批處理中當前語句和它之後的語句。
- 某些運行時錯誤(如違反約束)僅停止執行當前語句。而繼續執行批處理中其他所有語句。
在遇到運行時錯誤的語句之前執行的語句不受影響。唯一例外的情況是批處理位於事務中並且錯誤導致事務回滾。在這種情況下,所有在運行時錯誤之前執行的未提交數據修改都將回滾。
例如,假定批處理中有 10 條語句。如果第五條語句有一個語法錯誤,則不執行批處理中的任何語句。如果批處理經過編譯,並且第二條語句在運行時失敗,則第一條語句的結果不會受到影響,因為已執行了該語句。
SQL Server 提供了語句級重新編譯功能。也就是說,如果一條語句觸發了重新編譯,則只重新編譯該語句而不是整個批處理。此行為與 SQL Server 2000 不同。請考慮下面的示例,其中在同一批處理中包含一條 CREATE TABLE 語句和四條 INSERT 語句。
首先,對批處理進行編譯。對 CREATE TABLE 語句進行編譯,但由於表 dbo.t3 尚不存在,因此,未編譯 INSERT 語句。
然後,批處理開始執行。表已創建。編譯第一條 INSERT,然後立即執行。表現在具有一個行。然後,編譯第二條 INSERT 語句。編譯失敗,批處理終止。SELECT 語句返回一個行。
在 SQL Server 2000 中,批處理開始執行,同時創建了表。逐一編譯三條 INSERT 語句,但不執行。因為第二條 INSERT 語句導致一個編譯錯誤,因此,整個批處理都將終止。SELECT 語句未返回任何行。
批處理使用規則下面的規則適用於批處理的使用:
- CREATE DEFAULT、CREATE FUNCTION、CREATE PROCEDURE、CREATE RULE、CREATE SCHEMA、CREATE TRIGGER 和 CREATE VIEW 語句不能在批處理中與其他語句組合使用。批處理必須以 CREATE 語句開始。所有跟在該批處理後的其他語句將被解釋為第一個 CREATE 語句定義的一部分。
- 不能在同一個批處理中更改表,然後引用新列。
- 如果 EXECUTE 語句是批處理中的第一句,則不需要 EXECUTE 關鍵字。如果 EXECUTE 語句不是批處理中的第一條語句,則需要 EXECUTE 關鍵字。
⑤ 使用sql函數檢測字元串是否存在對應的字串問題,。
函數分類列表
載入宏和自動化函數
多維數據集函數
資料庫函數
日期和時間函數
工程函數
財務函數
信息函數
邏輯函數
查找和引用函數
數學和三角函數
統計函數
文本函數
-----------------------------------------------------
載入宏和自動化函數
CALL 調用動態鏈接庫或代碼源中的過程
EUROCONVERT 用於將數字轉換為歐元形式,將數字由歐元形式轉換為歐元成員國貨幣形式,或利用歐元作為中間貨幣將數字由某一歐元成員國貨幣轉化為另一歐元成員國貨幣形式(三角轉換關系)
GETPIVOTDATA 返回存儲在數據透視表中的數據
REGISTER.ID 返回已注冊過的指定動態鏈接庫 (DLL) 或代碼源的注冊號
SQL.REQUEST 連接到一個外部的數據源並從工作表中運行查詢,然後將查詢結果以數組的形式返回,無需進行宏編程
多維數據集函數
CUBEKPIMEMBER 返回重要性能指標 (KPI) 名稱、屬性和度量,並顯示單元格中的名稱和屬性。KPI 是一項用於監視單位業績的可量化的指標,如每月總利潤或每季度雇員調整。
CUBEMEMBER 返回多維數據集層次結構中的成員或元組。用於驗證多維數據集內是否存在成員或元組。
CUBEMEMBERPROPERTY 返回多維數據集內成員屬性的值。用於驗證多維數據集內是否存在某個成員名並返回此成員的指定屬性。
CUBERANKEDMEMBER 返回集合中的第 n 個或排在一定名次的成員。用於返回集合中的一個或多個元素,如業績排在前幾名的銷售人員或前 10 名學生。
CUBESET 通過向伺服器上的多維數據集發送集合表達式來定義一組經過計算的成員或元組(這會創建該集合),然後將該集合返回到 Microsoft Office Excel。
CUBESETCOUNT 返回集合中的項數。
CUBEVALUE 返回多維數據集內的匯總值。
資料庫函數
DAVERAGE 返回所選資料庫條目的平均值
DCOUNT 計算資料庫中包含數字的單元格的數量
DCOUNTA 計算資料庫中非空單元格的數量
DGET 從資料庫提取符合指定條件的單個記錄
DMAX 返回所選資料庫條目的最大值
DMIN 返回所選資料庫條目的最小值
DPRODUCT 將資料庫中符合條件的記錄的特定欄位中的值相乘
DSTDEV 基於所選資料庫條目的樣本估算標准偏差
DSTDEVP 基於所選資料庫條目的樣本總體計算標准偏差
DSUM 對資料庫中符合條件的記錄的欄位列中的數字求和
DVAR 基於所選資料庫條目的樣本估算方差
DVARP 基於所選資料庫條目的樣本總體計算方差
日期和時間函數
DATE 返回特定日期的序列號
DATEVALUE 將文本格式的日期轉換為序列號
DAY 將序列號轉換為月份日期
DAYS360 以一年 360 天為基準計算兩個日期間的天數
EDATE 返回用於表示開始日期之前或之後月數的日期的序列號
EOMONTH 返回指定月數之前或之後的月份的最後一天的序列號
HOUR 將序列號轉換為小時
MINUTE 將序列號轉換為分鍾
MONTH 將序列號轉換為月
NETWORKDAYS 返回兩個日期間的全部工作日數
NOW 返回當前日期和時間的序列號
SECOND 將序列號轉換為秒
TIME 返回特定時間的序列號
TIMEVALUE 將文本格式的時間轉換為序列號
TODAY 返回今天日期的序列號
WEEKDAY 將序列號轉換為星期日期
WEEKNUM 將序列號轉換為代表該星期為一年中第幾周的數字
WORKDAY 返回指定的若干個工作日之前或之後的日期的序列號
YEAR 將序列號轉換為年
YEARFRAC 返回代表 start_date 和 end_date 之間整天天數的年分數
工程函數
BESSELI 返回修正的貝賽耳函數 In(x)
BESSELJ 返回貝賽耳函數 Jn(x)
BESSELK 返回修正的貝賽耳函數 Kn(x)
BESSELY 返回貝賽耳函數 Yn(x)
BIN2DEC 將二進制數轉換為十進制數
BIN2HEX 將二進制數轉換為十六進制數
BIN2OCT 將二進制數轉換為八進制數
COMPLEX 將實系數和虛系數轉換為復數
CONVERT 將數字從一種度量系統轉換為另一種度量系統
DEC2BIN 將十進制數轉換為二進制數
DEC2HEX 將十進制數轉換為十六進制數
DEC2OCT 將十進制數轉換為八進制數
DELTA 檢驗兩個值是否相等
ERF 返回誤差函數
ERFC 返回互補錯誤函數
GESTEP 檢驗數字是否大於閾值
HEX2BIN 將十六進制數轉換為二進制數
HEX2DEC 將十六進制數轉換為十進制數
HEX2OCT 將十六進制數轉換為八進制數
IMABS 返回復數的絕對值(模數)
IMAGINARY 返回復數的虛系數
IMARGUMENT 返回參數 theta,即以弧度表示的角
IMCONJUGATE 返回復數的共軛復數
IMCOS 返回復數的餘弦
IMDIV 返回兩個復數的商
IMEXP 返回復數的指數
IMLN 返回復數的自然對數
IMLOG10 返回復數的以 10 為底的對數
IMLOG2 返回復數的以 2 為底的對數
IMPOWER 返回復數的整數冪
IMPRODUCT 返回從 2 到 29 的復數的乘積
IMREAL 返回復數的實系數
IMSIN 返回復數的正弦
IMSQRT 返回復數的平方根
IMSUB 返回兩個復數的差
IMSUM 返回多個復數的和
OCT2BIN 將八進制數轉換為二進制數
OCT2DEC 將八進制數轉換為十進制數
OCT2HEX 將八進制數轉換為十六進制數
財務函數
ACCRINT 返回定期支付利息的債券的應計利息
ACCRINTM 返回在到期日支付利息的債券的應計利息
AMORDEGRC 返回使用折舊系數的每個記帳期的折舊值
AMORLINC 返回每個記帳期的折舊值
COUPDAYBS 返回從付息期開始到成交日之間的天數
COUPDAYS 返回包含成交日的付息期天數
COUPDAYSNC 返回從成交日到下一付息日之間的天數
COUPNCD 返回成交日之後的下一個付息日
COUPNUM 返回成交日和到期日之間的應付利息次數
COUPPCD 返回成交日之前的上一付息日
CUMIPMT 返回兩個付款期之間累積支付的利息
CUMPRINC 返回兩個付款期之間為貸款累積支付的本金
DB 使用固定余額遞減法,返回一筆資產在給定期間內的折舊值
DDB 使用雙倍余額遞減法或其他指定方法,返回一筆資產在給定期間內的折舊值
DISC 返回債券的貼現率
DOLLARDE 將以分數表示的價格轉換為以小數表示的價格
DOLLARFR 將以小數表示的價格轉換為以分數表示的價格
DURATION 返回定期支付利息的債券的每年期限
EFFECT 返回年有效利率
FV 返回一筆投資的未來值
FVSCHEDULE 返回應用一系列復利率計算的初始本金的未來值
INTRATE 返回完全投資型債券的利率
IPMT 返回一筆投資在給定期間內支付的利息
IRR 返回一系列現金流的內部收益率
ISPMT 計算特定投資期內要支付的利息
MDURATION 返回假設面值為 ¥100 的有價證券的 Macauley 修正期限
MIRR 返回正和負現金流以不同利率進行計算的內部收益率
NOMINAL 返回年度的名義利率
NPER 返回投資的期數
NPV 返回基於一系列定期的現金流和貼現率計算的投資的凈現值
ODDFPRICE 返回每張票面為 ¥100 且第一期為奇數的債券的現價
ODDFYIELD 返回第一期為奇數的債券的收益
ODDLPRICE 返回每張票面為 ¥100 且最後一期為奇數的債券的現價
ODDLYIELD 返回最後一期為奇數的債券的收益
PMT 返回年金的定期支付金額
PPMT 返回一筆投資在給定期間內償還的本金
PRICE 返回每張票面為 ¥100 且定期支付利息的債券的現價
PRICEDISC 返回每張票面為 ¥100 的已貼現債券的現價
PRICEMAT 返回每張票面為 ¥100 且在到期日支付利息的債券的現價
PV 返回投資的現值
RATE 返回年金的各期利率
RECEIVED 返回完全投資型債券在到期日收回的金額
SLN 返回固定資產的每期線性折舊費
SYD 返回某項固定資產按年限總和折舊法計算的每期折舊金額
TBILLEQ 返回國庫券的等價債券收益
TBILLPRICE 返回面值 ¥100 的國庫券的價格
TBILLYIELD 返回國庫券的收益率
VDB 使用余額遞減法,返回一筆資產在給定期間或部分期間內的折舊值
XIRR 返回一組現金流的內部收益率,這些現金流不一定定期發生
XNPV 返回一組現金流的凈現值,這些現金流不一定定期發生
YIELD 返回定期支付利息的債券的收益
YIELDDISC 返回已貼現債券的年收益;例如,短期國庫券
YIELDMAT 返回在到期日支付利息的債券的年收益
信息函數
CELL 返回有關單元格格式、位置或內容的信息
ERROR.TYPE 返回對應於錯誤類型的數字
INFO 返回有關當前操作環境的信息
ISBLANK 如果值為空,則返回 TRUE
ISERR 如果值為除 #N/A 以外的任何錯誤值,則返回 TRUE
ISERROR 如果值為任何錯誤值,則返回 TRUE
ISEVEN 如果數字為偶數,則返回 TRUE
ISLOGICAL 如果值為邏輯值,則返回 TRUE
ISNA 如果值為錯誤值 #N/A,則返回 TRUE
ISNONTEXT 如果值不是文本,則返回 TRUE
ISNUMBER 如果值為數字,則返回 TRUE
ISODD 如果數字為奇數,則返回 TRUE
ISREF 如果值為引用值,則返回 TRUE
ISTEXT 如果值為文本,則返回 TRUE
N 返回轉換為數字的值
NA 返回錯誤值 #N/A
TYPE 返回表示值的數據類型的數字
邏輯函數
AND 如果其所有參數均為 TRUE,則返回 TRUE
FALSE 返回邏輯值 FALSE
IF 指定要執行的邏輯檢測
NOT 對其參數的邏輯求反
OR 如果任一參數為 TRUE,則返回 TRUE
TRUE 返回邏輯值 TRUE
查找和引用函數
ADDRESS 以文本形式將引用值返回到工作表的單個單元格
AREAS 返回引用中涉及的區域個數
CHOOSE 從值的列表中選擇值
COLUMN 返回引用的列號
COLUMNS 返回引用中包含的列數
GETPIVOTDATA 返回存儲在數據透視表中的數據
HLOOKUP 查找數組的首行,並返回指定單元格的值
HYPERLINK 創建快捷方式或跳轉,以打開存儲在網路伺服器、Intranet 或 Internet 上的文檔
INDEX 使用索引從引用或數組中選擇值
INDIRECT 返回由文本值指定的引用
LOOKUP 在向量或數組中查找值
MATCH 在引用或數組中查找值
OFFSET 從給定引用中返回引用偏移量
ROW 返回引用的行號
ROWS 返回引用中的行數
RTD 從支持 COM 自動化 (自動化:從其他應用程序或開發工具使用應用程序的對象的方法。以前稱為「OLE 自動化」,自動化是一種工業標准和組件對象模型 (COM) 功能。)的程序中檢索實時數據
TRANSPOSE 返回數組的轉置
VLOOKUP 在數組第一列中查找,然後在行之間移動以返回單元格的值
數學和三角函數
ABS 返回數字的絕對值
ACOS 返回數字的反餘弦值
ACOSH 返回數字的反雙曲餘弦值
ASIN 返回數字的反正弦值
ASINH 返回數字的反雙曲正弦值
ATAN 返回數字的反正切值
ATAN2 返回 X 和 Y 坐標的反正切值
ATANH 返回數字的反雙曲正切值
CEILING 將數字舍入為最接近的整數或最接近的指定基數的倍數
COMBIN 返回給定數目對象的組合數
COS 返回數字的餘弦值
COSH 返回數字的雙曲餘弦值
DEGREES 將弧度轉換為度
EVEN 將數字向上舍入到最接近的偶數
EXP 返回 e 的 n 次方
FACT 返回數字的階乘
FACTDOUBLE 返回數字的雙倍階乘
FLOOR 向絕對值減小的方向舍入數字
GCD 返回最大公約數
INT 將數字向下舍入到最接近的整數
LCM 返回最小公倍數
LN 返回數字的自然對數
LOG 返回數字的以指定底為底的對數
LOG10 返回數字的以 10 為底的對數
MDETERM 返回數組的矩陣行列式的值
MINVERSE 返回數組的逆矩陣
MMULT 返回兩個數組的矩陣乘積
MOD 返回除法的余數
MROUND 返回一個舍入到所需倍數的數字
MULTINOMIAL 返回一組數字的多項式
ODD 將數字向上舍入為最接近的奇數
PI 返回 pi 的值
POWER 返回數的乘冪
PRODUCT 將其參數相乘
QUOTIENT 返回除法的整數部分
RADIANS 將度轉換為弧度
RAND 返回 0 和 1 之間的一個隨機數
RANDBETWEEN 返回位於兩個指定數之間的一個隨機數
ROMAN 將阿拉伯數字轉換為文本式羅馬數
ROUND 將數字按指定位數舍入
ROUNDDOWN 向絕對值減小的方向舍入數字
ROUNDUP 向絕對值增大的方向舍入數字
SERIESSUM 返回基於公式的冪級數的和
SIGN 返回數字的符號
SIN 返回給定角度的正弦值
SINH 返回數字的雙曲正弦值
SQRT 返回正平方根
SQRTPI 返回某數與 pi 的乘積的平方根
小計 返回列表或資料庫中的分類匯總
SUM 求參數的和
SUMIF 按給定條件對若干單元格求和
SUMIFS 在區域中添加滿足多個條件的單元格
SUMPRODUCT 返回對應的數組元素的乘積和
SUMSQ 返回參數的平方和
SUMX2MY2 返回兩數組中對應值平方差之和
SUMX2PY2 返回兩數組中對應值的平方和之和
SUMXMY2 返回兩個數組中對應值差的平方和
TAN 返回數字的正切值
TANH 返回數字的雙曲正切值
TRUNC 將數字截尾取整
統計函數
AVEDEV 返回數據點與它們的平均值的絕對偏差平均值
AVERAGE 返回其參數的平均值
AVERAGEA 返回其參數的平均值,包括數字、文本和邏輯值
AVERAGEIF 返回區域中滿足給定條件的所有單元格的平均值(算術平均值)
AVERAGEIFS 返回滿足多個條件的所有單元格的平均值(算術平均值)。
BETADIST 返回 Beta 累積分布函數
BETAINV 返回指定 Beta 分布的累積分布函數的反函數
BINOMDIST 返回一元二項式分布的概率值
CHIDIST 返回 χ2 分布的單尾概率
CHIINV 返回 γ2 分布的單尾概率的反函數
CHITEST 返回獨立性檢驗值
CONFIDENCE 返回總體平均值的置信區間
CORREL 返回兩個數據集之間的相關系數
COUNT 計算參數列表中數字的個數
COUNTA 計算參數列表中值的個數
COUNTBLANK 計算區域內空白單元格的數量
COUNTIF 計算區域內非空單元格的數量
COVAR 返回協方差,成對偏差乘積的平均值
CRITBINOM 返回使累積二項式分布小於或等於臨界值的最小值
DEVSQ 返回偏差的平方和
EXPONDIST 返回指數分布
FDIST 返回 F 概率分布
FINV 返回 F 概率分布的反函數值
FISHER 返回 Fisher 變換值
FISHERINV 返回 Fisher 變換的反函數值
FORECAST 返回沿線性趨勢的值
FREQUENCY 以垂直數組的形式返回頻率分布
FTEST 返回 F 檢驗的結果
GAMMADIST 返回 γ 分布
GAMMAINV 返回 γ 累積分布函數的反函數
GAMMALN 返回 γ 函數的自然對數,Γ(x)
GEOMEAN 返回幾何平均值
GROWTH 返回沿指數趨勢的值
HARMEAN 返回調和平均值
HYPGEOMDIST 返回超幾何分布
INTERCEPT 返回線性回歸線的截距
KURT 返回數據集的峰值
LARGE 返回數據集中第 k 個最大值
LINEST 返回線性趨勢的參數
LOGEST 返回指數趨勢的參數
LOGINV 返回對數分布函數的反函數
LOGNORMDIST 返回對數累積分布函數
MAX 返回參數列表中的最大值
MAXA 返回參數列表中的最大值,包括數字、文本和邏輯值
MEDIAN 返回給定數值集合的中值
MIN 返回參數列表中的最小值
MINA 返回參數列表中的最小值,包括數字、文本和邏輯值
MODE 返回在數據集內出現次數最多的值
NEGBINOMDIST 返回負二項式分布
NORMDIST 返回正態累積分布
NORMINV 返回標准正態累積分布的反函數
NORMSDIST 返回標准正態累積分布
NORMSINV 返回標准正態累積分布函數的反函數
PEARSON 返回 Pearson 乘積矩相關系數
PERCENTILE 返回區域中數值的第 K 個百分點的值
PERCENTRANK 返回數據集中值的百分比排位
PERMUT 返回給定數目對象的排列數
POISSON 返回泊松分布
PROB 返回區域中的數值落在指定區間內的概率
QUARTILE 返回一列數字的數字排位
RANK 返回一列數字的數字排位
RSQ 返回 Pearson 乘積矩相關系數的平方
SKEW 返回分布的不對稱度
SLOPE 返回線性回歸線的斜率
SMALL 返回數據集中的第 K 個最小值
STANDARDIZE 返回正態化數值
STDEV 基於樣本估算標准偏差
STDEVA 基於樣本(包括數字、文本和邏輯值)估算標准偏差
STDEVP 基於整個樣本總體計算標准偏差
STDEVPA 基於總體(包括數字、文本和邏輯值)計算標准偏差
STEYX 返回通過線性回歸法預測每個 x 的 y 值時所產生的標准誤差
TDIST 返回學生的 t 分布
TINV 返回學生的 t 分布的反函數
TREND 返回沿線性趨勢的值
TRIMMEAN 返回數據集的內部平均值
TTEST 返回與學生的 t 檢驗相關的概率
VAR 基於樣本估算方差
VARA 基於樣本(包括數字、文本和邏輯值)估算方差
VARP 計算基於樣本總體的方差
VARPA 計算基於總體(包括數字、文本和邏輯值)的標准偏差
WEIBULL 返回 Weibull 分布
ZTEST 返回 z 檢驗的單尾概率值
文本函數
ASC 將字元串中的全形(雙位元組)英文字母或片假名更改為半形(單位元組)字元
BAHTTEXT 使用 ß(泰銖)貨幣格式將數字轉換為文本
CHAR 返回由代碼數字指定的字元
CLEAN 刪除文本中所有非列印字元
CODE 返迴文本字元串中第一個字元的數字代碼
CONCATENATE 將幾個文本項合並為一個文本項
DOLLAR 使用 $(美元)貨幣格式將數字轉換為文本
EXACT 檢查兩個文本值是否相同
FIND、FINDB 在一個文本值中查找另一個文本值(區分大小寫)
FIXED 將數字格式設置為具有固定小數位數的文本
JIS 將字元串中的半形(單位元組)英文字母或片假名更改為全形(雙位元組)字元
LEFT、LEFTB 返迴文本值中最左邊的字元
LEN、LENB 返迴文本字元串中的字元個數
LOWER 將文本轉換為小寫
MID、MIDB 從文本字元串中的指定位置起返回特定個數的字元
PHONETIC 提取文本字元串中的拼音(漢字注音)字元
PROPER 將文本值的每個字的首字母大寫
REPLACE、REPLACEB 替換文本中的字元
REPT 按給定次數重復文本
RIGHT、RIGHTB 返迴文本值中最右邊的字元
SEARCH、SEARCHB 在一個文本值中查找另一個文本值(不區分大小寫)
SUBSTITUTE 在文本字元串中用新文本替換舊文本
T 將參數轉換為文本
TEXT 設置數字格式並將其轉換為文本
TRIM 刪除文本中的空格
UPPER 將文本轉換為大寫形式
VALUE 將文本參數轉換為數字
⑥ 北大青鳥南京校區的課程介紹
北大青鳥IT教育的培訓課程是面向社會的系統化、職業化、專業化的培訓課程,為有志於進入這個新興行業尋求發展的人們提供了一座跨越夢想的橋梁。
ACCP6.0課程介紹
入學條件 面向大眾、以培養軟體開發人員(程序員、軟體工程師)為目標的課程。 報讀人員要求:
1) 年齡要求:18 周歲(含)以上;
2) 學歷要求:高中(含)以上學歷;
3) 專業技術要求:有一定的邏輯能力,對學習計算機有興趣。 課程簡介
ACCP6.0是北大青鳥APTECH推出的最新軟體工程師職業教育課程,由中印兩國軟體技術專家聯合研發完成。作為一款面向大眾的求職系列教育產品,ACCP6.0的課程開發採用了全球同步機制,推陳出新,引領未來IT技術發展潮流,繼續保持了北大青鳥APTECHACCP課程體系的國際同步水平以及在國內IT職業教育領域的領導地位。
ACCP6.0的課程相對於ACCP5.0增加了DB2關系型資料庫系統,DB2具有很好的網路支持能力,每個子系統可以連接十幾萬個分布式用戶,可同時激活上千個活動線程,對大型分布式應用系統尤為適用。
逆向設計確保就業:專業分析5362條招聘信息,深入訪談386家用人企業,定製2份行業人才需求標准簡歷,針對286項關鍵技能點逐一突破,斥資2000萬,組織186名中美印專家投入研發高強訓練編程能力,1年半完,成52000行代碼編寫,相當於1名程序員2年代碼編寫量項目驅動案例貫穿,提供CRM、ERP中型項目實戰訓,演練26項全真項目案例,貫穿8大行業打造COT六脈神劍,訓練目標清晰、訓練手段多樣,滲透學習過程,考核方法明確。
課程背景
ACCP(阿博泰克認證的計算機專家)課程始於2002年,由150多名知名技術開發人員,在對中國IT企業,培訓中心經過一系列調研的基礎上,研發完成。已經歷時11年,畢業學員已超過40萬人。
具體課程以及設置
第一學期:
1、先學習進入軟體編程世界,才能夠具備計算機Java語言學習的基礎;
2、第一學期Java課程結束後,.NET課程的基本語言語法都與Java課程類似,將對比進行學習;
3、HTML語言是獨立的課程,不牽涉到程序編寫,學習Java課程之後,為了緩解學習壓力,調整學習節奏,先學習這門課程;
4、SQL Server課程和.NET課程共同結合起來完成第一學期的階段項目。
第二學期:
1、第二學期剛開始就學習SQL Server課程,是在第一學期學會SQL基本操作、基本查詢的基礎上學習高級知識;
2、第二學期兩門.NET課程有嚴格的先後次序關系,並且是在第一學期的基礎上進行提高;
3、JavaScript課程是在學習完成.NET課程之後進行,同時要求首先學會第一學期的HTML課程,否則無法建立頁面,更談不上動態效果;
4、Java的兩門課程也存在嚴格的先後次序關系,只有熟練理解、掌握了面向對象的思想,才能夠進入到MVC開發模式的學習,否則將會存在很大的理解上的困難;
5、.NET課程中的三層結構模式,與Java的MVC模式,存在諸多相似之處;
6、學習完Java課程,將結合資料庫課程、HTML、JavaScript課程,綜合來完成第二學期的階段項目。
第二學年:
1、第一門Java課程,核心技術JSP/Servlet/JavaBean,就是MVC模式的經典實現,需要第二學期JSP課程作為基礎;
2、只有在掌握了JSP/Servlet/JavaBean的應用以後,才能夠體會到框架的必要性,第二門Java課程中的Struts/Hibernate/Spring中,JSP/Servlet/JavaBean是最基本的應用,並在此基礎上做框架的集成,因此這兩門課程也存在嚴格的先後關系;
3、Ajax技術在Java課程中先講解基礎、原理,並要求手寫Ajax代碼,繼而在.NET課程中使用方便的控制項來實現,因此Java和.NET課程安排的次序不能變更;
4、.NET第一門課程是基於三層結構的企業級B/S系統開發,因此三層結構是這門課程的基礎;
5、只有掌握了B/S中的開發技術,並且實現了網上書店的應用系統開發,才能夠在該系統上進行優化和提高、擴展更方便的功能,因此,第二門.NET課程也必須在第一門.NET課程之後進行;
6、畢業設計項目分別在Java課程結束、.NET課程結束後都會執行,整個第二學年的學習過程,將有三個月時間的實戰訓練(其中集中編碼的課時為免費學時)。
JAVA方向:
計算機軟體基礎、資料庫原理、SQLserver、C++程序設計、java核心編程、linux、websphere 開發工具、DB2資料庫高級管理、DB2資料庫應用開發、ERWin資料庫建模、UML、ratioanlrose建模、OM軟體開發生命周期、J2EEOM企業級開發、基於MVC的struts框架技術、軟體測試工具與方法、項目管理基礎等。
網路應用方向:
電子技術基礎、數字電路與邏輯設計、面向對象程序設計、操作系統原理、計算機網路、微機原理及介面應用、現代通信技術、實用網路技術、資料庫原理及應用、WEB應用開發技術、計算機網路安全與維護、網路管理技術、TCP/IP及應用、網路存儲技術、組網工程、區域網應用技術、網路編程技術等。
ACCP軟體工程師就業方向:
初級程序員、初級代碼編程、軟體外包開發、網站設計和開發工程師、ERP/CRM/OA/B2C開發應用工程師、系統分析設計員、文檔工程師
BENET4.0課程介紹
入學條件 面向大眾、以培養企業高級網路技術人員為目標的課程。 報讀人員要求:
1) 年齡要求:18 周歲(含)以上。
2) 學歷要求:具備高中或同等學歷。
3) 專業技術要求:零起點,具備基本的計算機操作、實際動手操作能力。 4)其他要求:熱愛計算機、對網路感興趣均可。
課程簡介
北大青鳥IT教育的BENET(網路工程師)培訓課程是面向社會的系統化、職業化的培訓課程。在2012年2月,北大青鳥IT教育BENET(網路工程師)培訓課程已經從3.0版本升級為4.0版本。在3.0的基礎上,4.0添加了3G技術,藍牙技術,還有雲計算技術。同時,學期由3.0的兩個學期延長為3個學期。
BENET4.0課程,共計700(320+230+150)學時,採取講課與實驗相結合的教學方式,且重在實際操作。分為三個模塊:分別是第一學期、第二學期和第二學年。從內容上講每一模塊都是前一模塊的提高與延伸。
BENET4.0課程研發過程定位課程的內容需求建立招聘的崗位資料庫(分析、對比了1800個招聘崗位需求)與專業咨詢公司——賽迪顧問合作(80家典型企業用人需求,分析了120個專業技術人士的工作技能)全國各地17家中心(11個城市)跟蹤調查236個已就業學員研發人員參與企業面試明確產品的教學要求(中心教員調研了全國各地27家中心,共80名教員樣本)。
BENET4.0課程的培訓目標崗位:
第一學期的培訓目標:網路管理員,系統管理員;第二學期的培訓目標:系統工程師,網路工程師,售後工程師;第二學年的培訓目標:信息安全工程師,系統架構工程師
BTEST課程介紹
入學條件 面向大眾、以軟體檢查測試人員為目標的課程; 報讀人員要求:1) 年齡要求:21周歲(含)以上;2)學歷要求:大專(含)以上學歷; 課程簡介
國內第一套系統全面的軟體測試工程師職業教育課程
一、課程體系說明
BTEST是北大青鳥Aptech公司經過走訪國內大量軟體企業測試崗位和人力資源部門、綜合國內主要人才招聘媒體的最新招聘數據、分析研究國內外職業教育課程體系後,結合北大青鳥 Aptech 公司多年的 IT 職業教育經驗,由國家勞動和社會保障部、北大軟體學院、北大軟體工程中心,國家重點實驗室、北大青鳥集團、印度 Aptech 公司的多位職業教育專家、軟體開發專家、項目經理和測試經理共同完成的。
1、能夠掌握單機、網路環境下多種體系結構軟體的測試; 2、能夠在 Linux/Windows 平台上,建立多種體系結構(包括資料庫)的軟體運行和測試環境;3、能夠掌握軟體開發技術並能夠編寫簡單應用程序、測試腳本;4、能夠掌握測試流程、缺陷管理流程,並能對測試流程實施監督和處理;5、能夠編寫測試計劃、設計測試用例、執行測試並填寫缺陷報告;6、能夠獨立或協助開發人員進行單元測試和白盒測試;7、能夠使用自動化測試工具來進行各種測試
二、課程設置說明
1、搭建 Windows 測試環境
主要講解搭建Windows測試環境所要具備的軟、硬體及網路知識。包括計算機中各種硬體和介面。軟體的分類、分發和授權等方式;操作系統的初步知識;注冊表、病毒、安全等知識; TCP/IP 協議和 DNS 、活動目錄等知識。
2、使用C 語言開發簡單應用
設置本課程的目的主要是使學員掌握軟體開發的技術,掌握編程的方法、思想,了解軟體開發過程當中常犯的錯誤,為後面的測試課程以及編寫測試腳本打下語言基礎。
3、測試計劃與軟體缺陷
本課程主要介紹軟體測試的基本概念和基礎知識、如何編寫測試計劃、識別軟體缺陷、編寫缺陷報告等。
4、高效設計測試用例
本課程主要通過引入的大量案例講解如何編寫測試用例。講解設計測試用例的技術包括等價類劃分、邊界值分析、因果圖方法、狀態圖方法、測試大綱等的方法以及正交排列表、測試矩陣等。測試特性包括:功能、性能、兼容性、易用性等。
5、白盒測試
本課程主要講解白盒測試技術。主要內容包括邏輯驅動覆蓋和基本路徑覆蓋兩個方面,在邏輯驅動覆蓋中主要介紹了語句覆蓋、判定覆蓋、條件覆蓋、判定 / 條件覆蓋、條件組合覆蓋、路徑覆蓋和循環語句覆蓋;在基本路徑覆蓋中介紹了繪制控制流圖及程序復雜性相關概念,最後重點介紹了單元測試技術。
6、Linux 與網路應用環境
本課程主要講解搭建Linux測試環境所應具備的知識。通過學習 Linux 的安裝和配置、Linux常用命令、 Linux 下軟體安裝、卸載和使用、常見Linux的服務(Apache、Mysql、Squid 、Iptables等)、Linux軟體開發環境等,讓學員能夠使用Linux實現一個提供常見服務的網路環境。
7、WEB 技術與資料庫
本課程通過對資料庫、HTML、XML、HTTP、J2EE、.NET等基礎知識的講解,讓學員掌握這些技術,以便於建立分布式軟體的測試環境。資料庫是以 SQL Server 作為重點講解,同時也介紹了Oracle和MySQL資料庫。
8、高效使用自動測試工具
本課程主要介紹了國際測試工具佔有率最高的 MI 的三大測試工具:功能測試工具 QuickTest Professional 、性能測試工具LoadRunner、測試管理工具TestDirector。學員掌握這些流行的測試工具,從而進一步提高測試的效率。
9、軟體測試實訓
本課程是最後一門課程,該課程主要是通過運用前面所學習的課程,指導學員完成一個項目的測試過程,從而鞏固所學知識。
10、 職業導向訓練 (COT)
職業導向訓練,簡稱COT課程,即Career Oriented Training,是對學員進行職業引導,包括就業指導和職前引導。通過就業指導以及就業專員、就業明星與學員的座談會等日常輔助訓練明確就業方向,進一步了解就業形式。
課程介紹
JBNS2.0網站工程師(英文名稱:Jade Bird Certified North Star Web Development Engineer, 中文簡稱:JB北極星網站工程師),是北大青鳥IT教育公司在對國內IT行業發展現狀及企業人才需求狀況充分調研的基礎上,針對電大體系定向開發的網站開發工程師教育產品。JBNS網站工程師教育產品僅提供電大體系,不再向電大體系外第三方提供。中央電大開放教育專為本套課程的合作設置網站開發專業,學生參加該專業的學習後,如果達到中央電大畢業要求,不僅可以獲得中央電大相關專業學歷證書,還可以通過職業資格認證考試獲得北大青鳥IT教育頒發的JBNS職業資格證書。
JBNS網站工程師培訓--勝任職位:
1、軟體公司的軟體工程師:參與商用網站或政府網站的開發、維護、技術支持;參與企業內部信息系統的開發、維護、技術支持
2、網站運營企業的網站開發與維護工程師:網站系統的開發、維護、技術支持
3、信息化企業的IT服務崗:企業內部信息系統和服務的搭建、維護;企業自己的網站的開發、維護;企業內部信息系統的安全防護
學士後課程介紹
課程定位
「學士後」是北大青鳥學士後課程專門針對大學生人群設計,解決「大學生就業難」問題的教育產品。眼下,「大學生就業難」已經成為亟待解決的社會問題,其根本原因在於:大學生雖然文化素質基礎不錯,不缺知識,但缺乏企業需要的技能和經驗。
北大青鳥作為中國IT職業教育領導品牌,憑借對業界的深刻理解,認為「技能」和「經驗」並非只能在工作中獲得,恰恰相反,工作中獲得的「技能」和「經驗」不僅並不全面,而且積累速度慢,獲得成本並不低。
學士後入學條件 面向大眾、以軟體開發人員為目標的課程; 報讀人員要求:
1) 年齡要求:21 周歲(含)以上。
2) 學歷要求:大專(含)以上學歷。
3) 專業技術要求:必須具備一定的英語基礎,對計算機感興趣。 課程介紹
學士後開設的課程主要有網路營銷師,JAVA、和.NET軟體工程師,Android軟體工程師。
「2段式」課程結構:整個學習過程被劃分為兩個階段。第一個階段為「技能准備階段」,3個月左右;第二個階段為「就業沖刺階段」,2個月左右。第一個階段通過精心設計的知識、技能點訓練重點提升學員的專業技術能力,使每個學員的技術技能達到可動手實戰項目的水平。第二個階段將通過實戰項目重點增加學員的項目經驗和工作經驗,向就業發起沖刺,實現就業對接。
「混合式」學習模式:在第一階段,「學士後」中獨創了「混合式」學習模式,課程內容被設計為「線上」和「線下」2部分,學員們將體驗到「網上學習課程、線下驗證效果」的混合式方法帶來的便利和優勢。
⑦ 求助SQL考試題。。明天早上就考了 今晚要交
1.select 書名,出版社 from 圖書 where 20=<價格=<50 order by 價格 desc
2.select distinct a.書號 as 圖書種類 ,a.操作員帳號 from 借出 a,操作員 b where a.操作員帳號=(select b.操作員帳號 from 操作員 where 操作員姓名='李凡')
3.select 書名,出版社 from 圖書 where 書名 like '%資料庫%' or 書名 like '%SQL%'
4.delete from 課程 where 課程編號 in ( '20016','20018','20019')
5.insert into 教師 (教師編號,姓名,所在部門,職稱) values (60016,王力,,講師)
6.select a.生產廠家,count(b.商品編號) as 商品種類 from 商品 b,(select distinct 生產廠家 from 商品) as a where a.生產廠家=b.生產廠家 group by a.生產廠家
⑧ sql資料庫 建立三個表 student(學號 姓名 性別) sc(學號 課程號 成績)course(課程號 課程名 分數 )
select 姓名,savg from (select 學號,avg(成績)as savg from sc where 成績<60 group by 學號 having count(學號)>=2) t1,student where t1.學號=student.學號
1. Group By 語句簡介:
Group By語句從英文的字面意義上理解就是「根據(by)一定的規則進行分組(Group)」。它的作用是通過一定的規則將一個數據集劃分成若干個小的區域,然後針對若干個小區域進行數據處理。 2. Group By 的使用: 上面已經給出了對Group By語句的理解。基於這個理解和SQL Server 2000的聯機幫助,下面對Group By語句的各種典型使用進行依次列舉說明。 2.1 Group By [Expressions]: 這個恐怕是Group By語句最常見的用法了,Group By + [分組欄位](可以有多個)。在執行了這個操作以後,數據集將根據分組欄位的值將一個數據集劃分成各個不同的小組。比如有如下數據集,其中水果名稱(FruitName)和出產國家(ProctPlace)為聯合主鍵: FruitName ProctPlace Price
Apple China $1.1
Apple Japan $2.1
Apple USA $2.5
Orange China $0.8
Banana China $3.1
Peach USA $3.0
如果我們想知道每個國家有多少種水果,那麼我們可以通過如下SQL語句來完成: SELECT COUNT(*) AS 水果種類, ProctPlace AS 出產國 FROM T_TEST_FRUITINFO GROUP BY ProctPlace 這個SQL語句就是使用了Group By + 分組欄位的方式,那麼這句SQL語句就可以解釋成「我按照出產國家(ProctPlace)將數據集進行分組,然後分別按照各個組來統計各自的記錄數量。」很好理解對吧。這里值得注意的是結果集中有兩個返回欄位,一個是ProctPlace(出產國), 一個是水果種類。如果我們這里水果種類不是用Count(*),而是類似如下寫法的話: SELECT FruitName, ProctPlace FROM T_TEST_FRUITINFO GROUP BY ProctPlace 那麼SQL在執行此語句的時候會報如下的類似錯誤: 選擇列表中的列 'T_TEST_FRUITINFO.FruitName' 無效,因為該列沒有包含在聚合函數或 GROUP BY 子句中。 這就是我們需要注意的一點,如果在返回集欄位中,這些欄位要麼就要包含在Group By語句的後面,作為分組的依據;要麼就要被包含在聚合函數中。我們可以將Group By操作想像成如下的一個過程,首先系統根據SELECT 語句得到一個結果集,如最開始的那個水果、出產國家、單價的一個詳細表。然後根據分組欄位,將具有相同分組欄位的記錄歸並成了一條記錄。這個時候剩下的那些不存在於Group By語句後面作為分組依據的欄位就有可能出現多個值,但是目前一種分組情況只有一條記錄,一個數據格是無法放入多個數值的,所以這里就需要通過一定的處理將這些多值的列轉化成單值,然後將其放在對應的數據格中,那麼完成這個步驟的就是聚合函數。這就是為什麼這些函數叫聚合函數(aggregate functions)了。 2.2 Group By All [expressions] : Group By All + 分組欄位, 這個和前面提到的Group By [Expressions]的形式多了一個關鍵字ALL。這個關鍵字只有在使用了where語句的,且where條件篩選掉了一些組的情況才可以看出效果。在SQL Server 2000的聯機幫助中,對於Group By All是這樣進行描述的: 如果使用 ALL 關鍵字,那麼查詢結果將包括由 GROUP BY 子句產生的所有組,即使某些組沒有符合搜索條件的行。沒有 ALL 關鍵字,包含 GROUP BY 子句的 SELECT 語句將不顯示沒有符合條件的行的組。 其中有這么一句話「如果使用ALL關鍵字,那麼查詢結果將包含由Group By子句產生的所有組...沒有ALL關鍵字,那麼不顯示不符合條件的行組。」這句話聽起來好像挺耳熟的,對了,好像和LEFT JOIN 和 RIGHT JOIN 有點像。其實這里是類比LEFT JOIN來進行理解的。還是基於如下這樣一個數據集: FruitName ProctPlace Price
Apple China $1.1
Apple Japan $2.1
Apple USA $2.5
Orange China $0.8
Banana China $3.1
Peach USA $3.0
首先我們不使用帶ALL關鍵字的Group By語句: SELECT COUNT(*) AS 水果種類, ProctPlace AS 出產國 FROM T_TEST_FRUITINFO WHERE (ProctPlace <> 'Japan') GROUP BY ProctPlace 那麼在最後結果中由於Japan不符合where語句,所以分組結果中將不會出現Japan。 現在我們加入ALL關鍵字: SELECT COUNT(*) AS 水果種類, ProctPlace AS 出產國 FROM T_TEST_FRUITINFO WHERE (ProctPlace <> 'Japan') GROUP BY ALL ProctPlace 重新運行後,我們可以看到Japan的分組,但是對應的「水果種類」不會進行真正的統計,聚合函數會根據返回值的類型用默認值0或者NULL來代替聚合函數的返回值。 2.3 GROUP BY [Expressions] WITH CUBE | ROLLUP: 首先需要說明的是Group By All 語句是不能和CUBE 和 ROLLUP 關鍵字一起使用的。 首先先說說CUBE關鍵字,以下是SQL Server 2000聯機幫助中的說明: 指定在結果集內不僅包含由 GROUP BY 提供的正常行,還包含匯總行。在結果集內返回每個可能的組和子組組合的 GROUP BY 匯總行。GROUP BY 匯總行在結果中顯示為 NULL,但可用來表示所有值。使用 GROUPING 函數確定結果集內的空值是否是 GROUP BY 匯總值。 結果集內的匯總行數取決於 GROUP BY 子句內包含的列數。GROUP BY 子句中的每個操作數(列)綁定在分組 NULL 下,並且分組適用於所有其它操作數(列)。由於 CUBE 返回每個可能的組和子組組合,因此不論指定分組列時所使用的是什麼順序,行數都相同。 我們通常的Group By語句是按照其後所跟的所有欄位進行分組,而如果加入了CUBE關鍵字以後,那麼系統將根據所有欄位進行分組的基礎上,還會通過對所有這些分組欄位所有可能存在的組合形成的分組條件進行分組計算。由於上面舉的例子過於簡單,這里就再適合了,現在我們的數據集將換一個場景,一個表中包含人員的基本信息:員工所在的部門編號(C_EMPLINFO_DEPTID)、員工性別(C_EMPLINFO_SEX)、員工姓名(C_EMPLINFO_NAME)等。那麼我現在想知道每個部門各個性別的人數,那麼我們可以通過如下語句得到: SELECT C_EMPLINFO_DEPTID, C_EMPLINFO_SEX, COUNT(*) AS C_EMPLINFO_TOTALSTAFFNUM FROM T_PERSONNEL_EMPLINFO GROUP BY C_EMPLINFO_DEPTID, C_EMPLINFO_SEX 但是如果我現在希望知道: 1. 所有部門有多少人(這里相當於就不進行分組了,因為這里已經對員工的部門和性別沒有做任何限制了,但是這的確也是一種分組條件的組合方式); 2. 每種性別有多人(這里實際上是僅僅根據性別(C_EMPLINFO_SEX)進行分組); 3. 每個部門有多少人(這里僅僅是根據部門(C_EMPLINFO_DEPTID)進行分組);那麼我們就可以使用ROLLUP語句了。 SELECT C_EMPLINFO_DEPTID, C_EMPLINFO_SEX, COUNT(*) AS C_EMPLINFO_TOTALSTAFFNUM FROM T_PERSONNEL_EMPLINFO GROUP BY C_EMPLINFO_DEPTID, C_EMPLINFO_SEX WITH CUBE 那麼這里你可以看到結果集中多出了很多行,而且結果集中的某一個欄位或者多個欄位、甚至全部的欄位都為NULL,請仔細看一下你就會發現實際上這些記錄就是完成了上面我所列舉的所有統計數據的展現。使用過SQL Server 2005或者RDLC的朋友們一定對於矩陣的小計和分組功能有印象吧,是不是都可以通過這個得到答案。我想RDLC中對於分組和小計的計算就是通過Group By的CUBE和ROLLUP關鍵字來實現的。(個人意見,未證實) CUBE關鍵字還有一個極為相似的兄弟ROLLUP, 同樣我們先從這英文入手,ROLL UP是「向上卷」的意思,如果說CUBE的組合是絕對自由的,那麼ROLLUP的組合就需要有點約束了。我們先來看看SQL Server 2000的聯機中對ROLLUP關鍵字的定義: 指定在結果集內不僅包含由 GROUP BY 提供的正常行,還包含匯總行。按層次結構順序,從組內的最低級別到最高級別匯總組。組的層次結構取決於指定分組列時所使用的順序。更改分組列的順序會影響在結果集內生成的行數。 那麼這個順序是什麼呢?對了就是Group By 後面欄位的順序,排在靠近Group By的分組欄位的級別高,然後是依次遞減。如:Group By Column1, Column2, Column3。那麼分組級別從高到低的順序是:Column1 > Column2 > Column3。還是看我們前面的例子,SQL語句中我們僅僅將CUBE關鍵字替換成ROLLUP關鍵字,如: SELECT C_EMPLINFO_DEPTID, C_EMPLINFO_SEX, COUNT(*) AS C_EMPLINFO_TOTALSTAFFNUM FROM T_PERSONNEL_EMPLINFO GROUP BY C_EMPLINFO_DEPTID, C_EMPLINFO_SEX WITH ROLLUP 和CUBE相比,返回的數據行數減少了不少。:),仔細看一下,除了正常的Group By語句後,數據中還包含了: 1. 部門員工數;(向上卷了一次,這次先去掉了員工性別的分組限制) 2. 所有部門員工數;(向上又卷了依次,這次去掉了員工所在部門的分組限制)。 在現實的應用中,對於報表的一些統計功能是很有幫助的。 這里還有一個問題需要補充說明一下,如果我們使用ROLLUP或者CUBE關鍵字,那麼將產生一些小計的行,這些行中被剔除在分組因素之外的欄位將會被設置為NULL,那麼還存在一種情況,比如在作為分組依據的列表中存在可空的行,那麼NULL也會被作為一個分組表示出來,所以這里我們就不能僅僅通過NULL來判斷是不是小計記錄了。下面的例子展示了這里說得到的情況。還是我們前面提到的水果例子,現在我們在每種商品後面增加一個「折扣列」(Discount),用於顯示對應商品的折扣,這個數值是可空的,也就是可以通過NULL來表示沒有對應的折扣信息。數據集如下所示: FruitName ProctPlace Price Discount
Apple China $1.1 0.8
Apple Japan $2.1 0.9
Apple USA $2.5 1.0
Orange China $0.8 NULL
Banana China $3.1 NULL
Peach USA $3.0 NULL
現在我們要統計「各種折扣對應有多少種商品,並總計商品的總數。」,那麼我們可以通過如下的SQL語句來完成: SELECT COUNT(*) AS ProctCount, Discount FROM T_TEST_FRUITINFO GROUP BY Discount WITH ROLLUP 好了,運行一下,你會發現數據都正常出來了,按照如上的數據集,結果如下所示: ProctCount Discount
3 NULL
1 0.8
1 0.9
1 1.0
6 NULL
好了,各種折扣的商品數量都出來了,但是在顯示「沒有折扣商品」和「商品小計」的時候判斷上確存在問題,因為存在兩條Discount為Null的記錄。是哪一條呢?通過分析數據我們知道第一條數據(3, Null)應該對應沒有折扣商品的數量,而(6,Null)應該對應所有商品的數量。需要判斷這兩個具有不同意義的Null就需要引入一個聚合函數Grouping。現在我們把語句修改一下,在返回值中使用Grouping函數增加一列返回值,SQL語句如下: SELECT COUNT(*) AS ProctCount, Discount, GROUPING(Discount) AS Expr1 FROM T_TEST_FRUITINFO GROUP BY Discount WITH ROLLUP 這個時候,我們再看看運行的結果: ProctCount Discount Expr1
3 NULL 0
1 0.8 0
1 0.9 0
1 1.0 0
6 NULL 1
對於根據指定欄位Grouping中包含的欄位進行小計的記錄,這里會標記為1,我們就可以通過這個標記值將小計記錄從判斷那些由於ROLLUP或者CUBE關鍵字產生的行。Grouping(column_name)可以帶一個參數,Grouping就會去判斷對應的欄位值的NULL是否是由ROLLUP或者CUBE產生的特殊NULL值,如果是那麼就在由Grouping聚合函數產生的新列中將值設置為1。注意Grouping只會檢查Column_name對應的NULL來決定是否將值設置為1,而不是完全由此列是否是由ROLLUP或者CUBE關鍵字自動添加來決定的。 2.2 Group By 和 Having, Where ,Order by語句的執行順序: 最後要說明一下的Group By, Having, Where, Order by幾個語句的執行順序。一個SQL語句往往會產生多個臨時視圖,那麼這些關鍵字的執行順序就非常重要了,因為你必須了解這個關鍵字是在對應視圖形成前的欄位進行操作還是對形成的臨時視圖進行操作,這個問題在使用了別名的視圖尤其重要。以上列舉的關鍵字是按照如下順序進行執行的:Where, Group By, Having, Order by。首先where將最原始記錄中不滿足條件的記錄刪除(所以應該在where語句中盡量的將不符合條件的記錄篩選掉,這樣可以減少分組的次數),然後通過Group By關鍵字後面指定的分組條件將篩選得到的視圖進行分組,接著系統根據Having關鍵字後面指定的篩選條件,將分組視圖後不滿足條件的記錄篩選掉,然後按照Order By語句對視圖進行排序,這樣最終的結果就產生了。在這四個關鍵字中,只有在Order By語句中才可以使用最終視圖的列名,如: SELECT FruitName, ProctPlace, Price, ID AS IDE, Discount FROM T_TEST_FRUITINFO WHERE (ProctPlace = N'china') ORDER BY IDE 這里只有在ORDER BY語句中才可以使用IDE,其他條件語句中如果需要引用列名則只能使用ID,而不能使用IDE。
⑨ 求如何在SQL語句里實現兩次或多次求合
幹嘛要查2次,一次就可以了
select 科目,sum(第一單元成績) 第一單元成績,sum(第二單元成績) 第二單元成績
from 成績表
group by 科目
⑩ 定義SQL用戶函數取單元格內值
substring參數使用不正確,很明顯,錯誤也在提示你這個原因!
substring一共要三個參數,第一個為要截的字元,第二個為字元串截取的起始位置,最後一個為要截取的長度!
很明顯你要截取的字元串是@content,
起始位置為@spaceindex1+len(@text1),
長度為@spaceindex2-@spaceindex1-len(@text1)
這幾個值你寫的都是正確的,但我們必須要考慮一些意外情況!
varchar與nvarchar兩者之間的區別!還有就是查找不到的情況!比如你輸入的錯了一個字元,那麼就會導致@spaceindex1與@spaceindex2都為0第一個式子還好說,而第二個,也就是說長度會變為負值,而substring就會報錯!
所以我們不妨先測試一下@spaceindex2的值,若為0時,則直接讓其等於len(@content),這樣如果查不到由直接返回整個字串,當然如果是@spaceindex1不為0時,還可以照樣截取.
另一種情況也是你程序中常出現的錯誤!
set
@spaceindex2=charindex(@text2,@content)如果反過來了,也是得到的負值的.好在charindex支持第三個參數!
set
@spaceindex2=charindex(@text2,@content,@spaceindex1+1)
這樣做的目的是保證@spaceindex2大於@spaceindex1,否則照出現錯誤!為了杜絕重復引起的錯誤,最好是
set
@spaceindex2=charindex(@text2,@content,@spaceindex1+1+len(@text1))
這樣保證了@spaceindex2-len(@text1)也大於@spaceindex1
最後的那個varchar與nvarchar兩者的區別,建議你如果處理有中文最好用nvarchar,因為這兩個在統計長度是不至於出錯的!
我想你最終的程序,應該是好修改的吧?