㈠ sql語句執行過程詳解
SQL語句執行過程詳解
一條sql,plsql的執行到底是怎樣執行的呢?
一、SQL語句執行原理:
第一步:客戶端把語句發給伺服器端執行當我們在客戶端執行 select 語句時,客戶端會把這條 SQL 語句發送給伺服器端,讓伺服器端的
進程來處理這語句。也就是說,Oracle 客戶端是不會做任何的操作,他的主要任務就是把客戶端產生
的一些 SQL 語句發送給伺服器端。雖然在客戶端也有一個資料庫進程,但是,這個進程的作用跟伺服器
上的進程作用事不相同的。伺服器上的資料庫進程才會對SQL 語句進行相關的處理。不過,有個問題需
要說明,就是客戶端的進程跟伺服器的進程是一一對應的。也就是說,在客戶端連接上伺服器後,在客戶
端與伺服器端都會形成一個進程,客戶端上的我們叫做客戶端進程;而伺服器上的我們叫做伺服器進程。
第二步:語句解析
當客戶端把 SQL 語句傳送到伺服器後,伺服器進程會對該語句進行解析。同理,這個解析的工作,
也是在伺服器端所進行的。雖然這只是一個解析的動作,但是,其會做很多「小動作」。
1. 查詢高速緩存(library cache)。伺服器進程在接到客戶端傳送過來的 SQL 語句時,不
會直接去資料庫查詢。而是會先在資料庫的高速緩存中去查找,是否存在相同語句的執行計劃。如果在
數據高速緩存中,則伺服器進程就會直接執行這個 SQL 語句,省去後續的工作。所以,採用高速數據緩
存的話,可以提高 SQL 語句的查詢效率。一方面是從內存中讀取數據要比從硬碟中的數據文件中讀取
數據效率要高,另一方面,也是因為這個語句解析的原因。
不過這里要注意一點,這個數據緩存跟有些客戶端軟體的數據緩存是兩碼事。有些客戶端軟體為了
提高查詢效率,會在應用軟體的客戶端設置數據緩存。由於這些數據緩存的存在,可以提高客戶端應用軟
件的查詢效率。但是,若其他人在伺服器進行了相關的修改,由於應用軟體數據緩存的存在,導致修改的
數據不能及時反映到客戶端上。從這也可以看出,應用軟體的數據緩存跟資料庫伺服器的高速數據緩存
不是一碼事。
2. 語句合法性檢查(data dict cache)。當在高速緩存中找不到對應的 SQL 語句時,則服
務器進程就會開始檢查這條語句的合法性。這里主要是對 SQL 語句的語法進行檢查,看看其是否合乎
語法規則。如果伺服器進程認為這條 SQL 語句不符合語法規則的時候,就會把這個錯誤信息,反饋給客
戶端。在這個語法檢查的過程中,不會對 SQL 語句中所包含的表名、列名等等進行 SQL 他只是語法
上的檢查。
3. 語言含義檢查(data dict cache)。若 SQL 語句符合語法上的定義的話,則伺服器進程
接下去會對語句中的欄位、表等內容進行檢查。看看這些欄位、表是否在資料庫中。如果表名與列名不
准確的話,則資料庫會就會反饋錯誤信息給客戶端。所以,有時候我們寫 select 語句的時候,若語法
與表名或者列名同時寫錯的話,則系統是先提示說語法錯誤,等到語法完全正確後,再提示說列名或表名
錯誤。
4. 獲得對象解析鎖(control structer)。當語法、語義都正確後,系統就會對我們需要查詢
的對象加鎖。這主要是為了保障數據的一致性,防止我們在查詢的過程中,其他用戶對這個對象的結構發
生改變。
5. 數據訪問許可權的核對(data dict cache)。當語法、語義通過檢查之後,客戶端還不一定
能夠取得數據。伺服器進程還會檢查,你所連接的用戶是否有這個數據訪問的許可權。若你連接上伺服器
的用戶不具有數據訪問許可權的話,則客戶端就不能夠取得這些數據。有時候我們查詢數據的時候,辛辛苦
苦地把 SQL 語句寫好、編譯通過,但是,最後系統返回個 「沒有許可權訪問數據」的錯誤信息,讓我們氣
半死。這在前端應用軟體開發調試的過程中,可能會碰到。所以,要注意這個問題,資料庫伺服器進程先
檢查語法與語義,然後才會檢查訪問許可權。
6. 確定最佳執行計劃 ?。當語句與語法都沒有問題,許可權也匹配的話,伺服器進程還是不會直接對
資料庫文件進行查詢。伺服器進程會根據一定的規則,對這條語句進行優化。不過要注意,這個優化是有
限的。一般在應用軟體開發的過程中,需要對資料庫的 sql 語言進行優化,這個優化的作用要大大地大
於伺服器進程的自我優化。所以,一般在應用軟體開發的時候,資料庫的優化是少不了的。當伺服器進程
的優化器確定這條查詢語句的最佳執行計劃後,就會將這條 SQL 語句與執行計劃保存到數據高速緩存
(library cache)。如此的話,等以後還有這個查詢時,就會省略以上的語法、語義與許可權檢查的步驟,
而直接執行 SQL 語句,提高 SQL 語句處理效率。
第三步:語句執行
語句解析只是對 SQL 語句的語法進行解析,以確保伺服器能夠知道這條語句到底表達的是什麼意
思。等到語句解析完成之後,資料庫伺服器進程才會真正的執行這條 SQL 語句。這個語句執行也分兩
種情況。
一是若被選擇行所在的數據塊已經被讀取到數據緩沖區的話,則伺服器進程會直接把這個數據傳遞
給客戶端,而不是從資料庫文件中去查詢數據。
若數據不在緩沖區中,則伺服器進程將從資料庫文件中查詢相關數據,並把這些數據放入到數據緩沖
區中(buffer cache)。
第四步:提取數據
當語句執行完成之後,查詢到的數據還是在伺服器進程中,還沒有被傳送到客戶端的用戶進程。所以,
在伺服器端的進程中,有一個專門負責數據提取的一段代碼。他的作用就是把查詢到的數據結果返回給
用戶端進程,從而完成整個查詢動作。從這整個查詢處理過程中,我們在資料庫開發或者應用軟體開發過
程中,需要注意以下幾點:
一是要了解資料庫緩存跟應用軟體緩存是兩碼事情。資料庫緩存只有在資料庫伺服器端才存在,在
客戶端是不存在的。只有如此,才能夠保證資料庫緩存中的內容跟資料庫文件的內容一致。才能夠根據
相關的規則,防止數據臟讀、錯讀的發生。而應用軟體所涉及的數據緩存,由於跟資料庫緩存不是一碼事
情,所以,應用軟體的數據緩存雖然可以提高數據的查詢效率,但是,卻打破了數據一致性的要求,有時候
會發生臟讀、錯讀等情況的發生。所以,有時候,在應用軟體上有專門一個功能,用來在必要的時候清除
數據緩存。不過,這個數據緩存的清除,也只是清除本機上的數據緩存,或者說,只是清除這個應用程序
的數據緩存,而不會清除資料庫的數據緩存。
二是絕大部分 SQL 語句都是按照這個處理過程處理的。我們 DBA 或者基於 Oracle 資料庫的
開發人員了解這些語句的處理過程,對於我們進行涉及到 SQL 語句的開發與調試,是非常有幫助的。有
時候,掌握這些處理原則,可以減少我們排錯的時間。特別要注意,資料庫是把數據查詢許可權的審查放在
語法語義的後面進行檢查的。所以,有時會若光用資料庫的許可權控制原則,可能還不能滿足應用軟體許可權
控制的需要。此時,就需要應用軟體的前台設置,實現許可權管理的要求。而且,有時應用資料庫的許可權管
理,也有點顯得繁瑣,會增加伺服器處理的工作量。因此,對於記錄、欄位等的查詢許可權控制,大部分程
序涉及人員喜歡在應用程序中實現,而不是在資料庫上實現。
DBCC DROPCLEANBUFFERS
從緩沖池中刪除所有清除緩沖區。
DBCC FREEPROCCACHE
從過程緩存中刪除所有元素。
DBCC FREESYSTEMCACHE
從所有緩存中釋放所有未使用的緩存條目
SQL語句中的函數、關鍵字、排序等執行順序:
1. FROM 子句返回初始結果集。
2. WHERE 子句排除不滿足搜索條件的行。
3. GROUP BY 子句將選定的行收集到 GROUP BY 子句中各個唯一值的組中。
4. 選擇列表中指定的聚合函數可以計算各組的匯總值。
5. 此外,HAVING 子句排除不滿足搜索條件的行。
6. 計算所有的表達式;
7. 使用 order by 對結果集進行排序。
8. 查找你要搜索的欄位。
二、SQL語句執行完整過程:
1.用戶進程提交一個 sql 語句:
update temp set a=a*2,給伺服器進程。
2.伺服器進程從用戶進程把信息接收到後,在 PGA 中就要此進程分配所需內存,存儲相關的信息,如在會
話內存存儲相關的登錄信息等。
3.伺服器進程把這個 sql 語句的字元轉化為 ASCII 等效數字碼,接著這個 ASCII 碼被傳遞給一個
HASH 函數,並返回一個 hash 值,然後伺服器進程將到shared pool 中的 library cache 中去查找是否存在相
同的 hash 值,如果存在,伺服器進程將使用這條語句已高速緩存在 SHARED POOL 的library cache 中的已
分析過的版本來執行。
4.如果不存在,伺服器進程將在 CGA 中,配合 UGA 內容對 sql,進行語法分析,首先檢查語法的正確性,接
著對語句中涉及的表,索引,視圖等對象進行解析,並對照數據字典檢查這些對象的名稱以及相關結構,並根據
ORACLE 選用的優化模式以及數據字典中是否存在相應對象的統計數據和是否使用了存儲大綱來生成一個
執行計劃或從存儲大綱中選用一個執行計劃,然後再用數據字典核對此用戶對相應對象的執行許可權,最後生成
一個編譯代碼。
5.ORACLE 將這條 sql 語句的本身實際文本、HASH 值、編譯代碼、與此語名相關聯的任何統計數據
和該語句的執行計劃緩存在 SHARED POOL 的 library cache中。伺服器進程通過 SHARED POOL 鎖存
器(shared pool latch)來申請可以向哪些共享 PL/SQL 區中緩存這此內容,也就是說被SHARED POOL 鎖存
器鎖定的 PL/SQL 區中的塊不可被覆蓋,因為這些塊可能被其它進程所使用。
6.在 SQL 分析階段將用到 LIBRARY
CACHE,從數據字典中核對表、視圖等結構的時候,需要將數據
字典從磁碟讀入 LIBRARY
CACHE,因此,在讀入之前也要使用LIBRARY
CACHE 鎖存器(library cache
pin,library cache lock)來申請用於緩存數據字典。 到現在為止,這個 sql 語句已經被編譯成可執行的代碼了,
但還不知道要操作哪些數據,所以伺服器進程還要為這個 sql 准備預處理數據。
7.首先伺服器進程要判斷所需數據是否在 db buffer 存在,如果存在且可用,則直接獲取該數據,同時根據
LRU 演算法增加其訪問計數;如果 buffer 不存在所需數據,則要從數據文件上讀取首先伺服器進程將在表頭部
請求 TM 鎖(保證此事務執行過程其他用戶不能修改表的結構),如果成功加 TM 鎖,再請求一些行級鎖(TX
鎖),如果 TM、TX 鎖都成功加鎖,那麼才開始從數據文件讀數據,在讀數據之前,要先為讀取的文件准備好
buffer 空間。伺服器進程需要掃面 LRU list 尋找 free db buffer,掃描的過程中,伺服器進程會把發現的所有
已經被修改過的 db buffer 注冊到 dirty list 中, 這些 dirty buffer 會通過 dbwr 的觸發條件,隨後會被寫出到
數據文件,找到了足夠的空閑 buffer,就可以把請求的數據行所在的數據塊放入到 db buffer 的空閑區域或者
覆蓋已經被擠出 LRU list 的非臟數據塊緩沖區,並排列在 LRU list 的頭部,也就是在數據塊放入 DB
BUFFER 之前也是要先申請 db buffer 中的鎖存器,成功加鎖後,才能讀數據到 db buffer。
8.記日誌 現在數據已經被讀入到 db buffer 了,現在伺服器進程將該語句所影響的並被讀
入 db buffer 中的這些行數據的 rowid 及要更新的原值和新值及 scn 等信息從 PGA 逐條的寫入 redo log
buffer 中。在寫入 redo log buffer 之前也要事先請求 redo log buffer 的鎖存器,成功加鎖後才開始寫入,當
寫入達到 redo log buffer 大小的三分之一或寫入量達到 1M 或超過三秒後或發生檢查點時或者 dbwr 之前
發生,都會觸發 lgwr 進程把 redo log buffer 的數據寫入磁碟上的 redo file 文件中(這個時候會產生log file
sync 等待事件)
已經被寫入 redofile 的 redo log buffer 所持有的鎖存器會被釋放,並可被後來的寫入信息覆蓋,
redo log buffer是循環使用的。Redo file 也是循環使用的,當一個 redo file 寫滿後,lgwr 進程會自動切換到
下一 redo file(這個時候可能出現 log fileswitch(checkpoint complete)等待事件)。如果是歸檔模式,歸檔進
程還要將前一個寫滿的 redo file 文件的內容寫到歸檔日誌文件中(這個時候可能出現 log file
switch(archiving needed)。
9.為事務建立回滾段 在完成本事務所有相關的 redo log buffer 之後,伺服器進程開始改寫這個 db buffer
的塊頭部事務列表並寫入 scn,然後 包含這個塊的頭部事務列表及 scn 信息的數據副本放入回滾段中,將
這時回滾段中的信息稱為數據塊的「前映像「,這個」前映像「用於以後的回滾、恢復和一致性讀。(回滾段可以
存儲在專門的回滾表空間中,這個表空間由一個或多個物理文件組成,並專用於回滾表空間,回滾段也可在其它
表空間中的數據文件中開辟。
10.本事務修改數據塊 准備工作都已經做好了,現在可以改寫 db buffer 塊的數據內容了,並在塊的頭部寫
入回滾段的地址。
11.放入 dirty list 如果一個行數據多次 update 而未 commit,則在回滾段中將會有多個「前映像「,除了第
一個」前映像「含有 scn 信息外,其他每個「前映像「的頭部都有 scn 信息和「前前映像」回滾段地址。一個
update 只對應一個 scn,然後伺服器進程將在 dirty list 中建立一
條指向此 db buffer 塊的指針(方便 dbwr 進程可以找到 dirty list 的 db buffer 數據塊並寫入數據文件中)。
接著伺服器進程會從數據文件中繼續讀入第二個數據塊,重復前一數據塊的動作,數據塊的讀入、記日誌、建
立回滾段、修改數據塊、放入 dirty list。當 dirty queue 的長度達到閥值(一般是 25%),伺服器進程將通知
dbwr 把臟數據寫出,就是釋放 db buffer 上的鎖存器,騰出更多的 free db buffer。前面一直都是在說明
oracle 一次讀一個數據塊,其實 oracle 可以一次讀入多個數據塊(db_file_multiblock_read_count 來設置一
次讀入塊的個數)
說明:
在預處理的數據已經緩存在 db buffer 或剛剛被從數據文件讀入到 db buffer 中,就要根據 sql 語句
的類型來決定接下來如何操作。
1>如果是 select 語句,則要查看 db buffer 塊的頭部是否有事務,如果有事務,則從回滾段中讀取數據;如
果沒有事務,則比較 select 的 scn 和 db buffer 塊頭部的 scn,如果前者小於後者,仍然要從回滾段中讀取數據;
如果前者大於後者,說明這是一非臟緩存,可以直接讀取這個 db buffer 塊的中內容。
2>如果是 DML 操作,則即使在 db buffer 中找到一個沒有事務,而且 SCN 比自己小的非臟
緩存數據塊,伺服器進程仍然要到表的頭部對這條記錄申請加鎖,加鎖成功才能進行後續動作,如果不成功,則要
等待前面的進程解鎖後才能進行動作(這個時候阻塞是 tx 鎖阻塞)。
用戶 commit 或 rollback 到現在為止,數據已經在 db buffer 或數據文件中修改完
成,但是否要永久寫到數文件中,要由用戶來決定 commit(保存更改到數據文件) rollback 撤銷數據的更改)。
1.用戶執行 commit 命令
只有當 sql 語句所影響的所有行所在的最後一個塊被讀入 db buffer 並且重做信息被寫入 redo log
buffer(僅指日誌緩沖區,而不包括日誌文件)之後,用戶才可以發去 commit 命令,commit 觸發 lgwr 進程,但不
強制立即 dbwr來釋放所有相應 db buffer 塊的鎖(也就是no-force-at-commit,即提交不強制寫),也就是說有
可能雖然已經 commit 了,但在隨後的一段時間內 dbwr 還在寫這條 sql 語句所涉及的數據塊。表頭部的行鎖
並不在 commit 之後立即釋放,而是要等 dbwr 進程完成之後才釋放,這就可能會出現一個用戶請求另一用戶
已經 commit 的資源不成功的現象。
A .從 Commit 和 dbwr 進程結束之間的時間很短,如果恰巧在 commit 之後,dbwr 未結束之前斷電,因為
commit 之後的數據已經屬於數據文件的內容,但這部分文件沒有完全寫入到數據文件中。所以需要前滾。由
於 commit 已經觸發 lgwr,這些所有未來得及寫入數據文件的更改會在實例重啟後,由 smon 進程根據重做日
志文件來前滾,完成之前 commit 未完成的工作(即把更改寫入數據文件)。
B.如果未 commit 就斷電了,因為數據已經在 db buffer 更改了,沒有 commit,說明這部分數據不屬於數
據文件,由於 dbwr 之前觸發 lgwr 也就是只要數據更改,(肯定要先有 log) 所有 DBWR,在數據文件上的修改
都會被先一步記入重做日誌文件,實例重啟後,SMON 進程再根據重做日誌文件來回滾。
其實 smon 的前滾回滾是根據檢查點來完成的,當一個全部檢查點發生的時候,首先讓 LGWR 進程將
redo log buffer 中的所有緩沖(包含未提交的重做信息)寫入重做日誌文件,然後讓 dbwr 進程將 db buffer 已
提交的緩沖寫入數據文件(不強制寫未提交的)。然後更新控制文件和數據文件頭部的 SCN,表明當前資料庫
是一致的,在相鄰的兩個檢查點之間有很多事務,有提交和未提交的。
像前面的前滾回滾比較完整的說法是如下的說明:
A.發生檢查點之前斷電,並且當時有一個未提交的改變正在進行,實例重啟之後,SMON 進程將從上一個
檢查點開始核對這個檢查點之後記錄在重做日誌文件中已提交的和未提交改變,因為
dbwr 之前會觸發 lgwr,所以 dbwr 對數據文件的修改一定會被先記錄在重做日誌文件中。因此,斷電前被
DBWN 寫進數據文件的改變將通過重做日誌文件中的記錄進行還原,叫做回滾,
B. 如果斷電時有一個已提交,但 dbwr 動作還沒有完全完成的改變存在,因為已經提交,提交會觸發 lgwr
進程,所以不管 dbwr 動作是否已完成,該語句將要影響的行及其產生的結果一定已經記錄在重做日誌文件中
了,則實例重啟後,SMON 進程根據重做日誌文件進行前滾.
實例失敗後用於恢復的時間由兩個檢查點之間的間隔大小來決定,可以通個四個參數設置檢查點執行的頻
率:
Log_checkpoint_interval:
決定兩個檢查點之間寫入重做日誌文件的系統物理塊(redo blocks)
的大小,默認值是 0,無限制。
log_checkpoint_timeout:
兩 個 檢 查 點 之 間 的 時 間 長 度(秒)默 認 值 1800s。
fast_start_io_target:
決定了用於恢復時需要處理的塊的多少,默認值是 0,無限制。
fast_start_mttr_target:
直接決定了用於恢復的時間的長短,默認值是 0,無限制(SMON 進程執行的前滾
和回滾與用戶的回滾是不同的,SMON 是根據重做日誌文件進行前滾或回滾,而用戶的回滾一定是根據回滾段
的內容進行回滾的。
在這里要說一下回滾段存儲的數據,假如是 delete 操作,則回滾段將會記錄整個行的數據,假如是 update,
則回滾段只記錄被修改了的欄位的變化前的數據(前映像),也就是沒有被修改的欄位是不會被記錄的,假如是
insert,則回滾段只記錄插入記錄的 rowid。 這樣假如事務提交,那回滾段中簡單標記該事務已經提交;假如是
回退,則如果操作是 delete,回退的時候把回滾段中數據重新寫回數據塊,操作如果是 update,則把變化前數據
修改回去,操作如果是 insert,則根據記錄的 rowid 把該記錄刪除。
2.如果用戶 rollback。
則伺服器進程會根據數據文件塊和 DB BUFFER 中塊的頭部的事務列表和 SCN 以及回滾段地址找到
回滾段中相應的修改前的副本,並且用這些原值來還原當前數據文件中已修改但未提交的改變。如果有多個
「前映像」,伺服器進程會在一個「前映像」的頭部找到「前前映像」的回滾段地址,一直找到同一事務下的最早的
一個「前映像」為止。一旦發出了 COMMIT,用戶就不能rollback,這使得 COMMIT 後 DBWR 進程還沒有
全部完成的後續動作得到了保障。到現在為例一個事務已經結束了。
說明:
TM 鎖:
符合 lock 機制的,用於保護對象的定義不被修改。 TX 鎖:
這個鎖代表一個事務,是行
級鎖,用數據塊頭、數據記錄頭的一些欄位表示,也是符合 lock 機制,有 resource structure、lock
structure、enqueue 演算法。
㈡ SQL語言有什麼作用它與C語言有什麼異同點。
SQL既結構化查詢語言,是一種關系型資料庫.作用和ORACLE,DB2,MYSQL類似.
作用:存儲數據,查詢數據.處理數據.
C語言是一種過程性語言,是從事系統軟體和游戲軟體開發的語言,現在主要是用VC++,它也可以從事手機系統開發,像塞班系統就是VC開發的.
SQL是一種非過程化語言,你只用下命令,不用說明怎麼做,軟體幫你解決.而C語言是過程化語言,你不僅要下命令,還要說明怎麼做,難度遠遠大於SQL.
㈢ Sql語言是一個什麼語言
結構化查詢語言是高級的非過程化編程語言,允許用戶在高層數據結構上工作。它不要求用戶指定對數據的存放方法,也不需要用戶了解具體的數據存放方式,所以具有完全不同底層結構的不同資料庫系統,可以使用相同的結構化查詢語言作為數據輸入與管理的介面。結構化查詢語言語句可以嵌套,這使它具有極大的靈活性和強大的功能。
(3)漫談一條sql語句的一生擴展閱讀:
sql語言的特點
1、綜合統一
SQL語言集數據定義語言DDL、數據操縱語言DML、數據控制語言DCL的功能於一體,語言風格統一,可以獨立完成資料庫生命周期中的全部活動,包括定義關系模式、錄入數據以建立資料庫、查詢、更新、維護、資料庫重構、資料庫安全性控制等一系列操作要求,這就為資料庫應用系統開發提供了良好的環境,例如用戶在資料庫投入運行後,還可根據需要隨時地逐步地修改模式,並不影響資料庫的運行,從而使系統具有良好的可擴充性。
2、高度非過程化
非關系數據模型的數據操縱語言是面向過程的語言,用其完成某項請求,必須指定存取路徑。而用SQL語言進行數據操作,用戶只需提出「做什麼」,而不必指明「怎麼做」,因此用戶無需了解存取路徑,存取路徑的選擇以及SQL語句的操作過程由系統自動完成。這不但大大減輕了用戶負擔,而且有利於提高數據獨立性。
3、面向集合的操作方式
SQL語言採用集合操作方式,不僅查找結果可以是元組的集合,而且一次插入、刪除、更新操作的對象也可以是元組的集合。
非關系數據模型採用的是面向記錄的操作方式,任何一個操作其對象都是一條記錄。例如查詢所有平均成績在80分以上的學生姓名,用戶必須說明完成該請求的具體處理過程,即如何用循環結構按照某條路徑一條一條地把滿足條件的學生記錄讀出來。
4、以同一種語法結構提供兩種使用方式
SQL語言既是自含式語言,又是嵌入式語言。
作為自含式語言,它能夠獨立地用於聯機交互的使用方式,用戶可以在終端鍵盤上直接鍵入SQL命令對資料庫進行操作。作為嵌入式語言,SQL語句能夠嵌入到高級語言(例如C、PB)程序中,供程序員設計程序時使用。而在兩種不同的使用方式下,SQL語言的語法結構基本上是一致的。這種以統一的語法結構提供兩種不同的使用方式的作法,為用戶提供了極大的靈活性與方便性。
㈣ SQL語句是什麼意思
以下摘自網路 SQL基本語句 來自:SQL編程技巧
掌握SQL四條最基本的數據操作語句:Insert,Select,Update和Delete。
練掌握SQL是資料庫用戶的寶貴財 富。在本文中,我們將引導你掌握四條最基本的數據操作語句—SQL的核心功能—來依次介紹比較操作符、選擇斷言以及三值邏輯。當你完成這些學習後,顯然你已經開始算是精通SQL了。
在我們開始之前,先使用CREATE TABLE語句來創建一個表(如圖1所示)。DDL語句對資料庫對象如表、列和視進行定義。它們並不對表中的行進行處理,這是因為DDL語句並不處理資料庫中實際的數據。這些工作由另一類SQL語句—數據操作語言(DML)語句進行處理。
SQL中有四種基本的DML操作:INSERT,SELECT,UPDATE和DELETE。由於這是大多數SQL用戶經常用到的,我們有必要在此對它們進行一一說明。在圖1中我們給出了一個名為EMPLOYEES的表。其中的每一行對應一個特定的雇員記錄。請熟悉這張表,我們在後面的例子中將要用到它。
INSERT語句
用戶可以用INSERT語句將一行記錄插入到指定的一個表中。例如,要將雇員John Smith的記錄插入到本例的表中,可以使用如下語句:
INSERT INTO EMPLOYEES VALUES
('Smith','John','1980-06-10',
'Los Angles',16,45000);
通過這樣的INSERT語句,系統將試著將這些值填入到相應的列中。這些列按照我們創建表時定義的順序排列。在本例中,第一個值「Smith」將填到第一個列LAST_NAME中;第二個值「John」將填到第二列FIRST_NAME中……以此類推。
我們說過系統會「試著」將值填入,除了執行規則之外它還要進行類型檢查。如果類型不符(如將一個字元串填入到類型為數字的列中),系統將拒絕這一次操作並返回一個錯誤信息。
如果SQL拒絕了你所填入的一列值,語句中其他各列的值也不會填入。這是因為SQL提供對事務的支持。一次事務將資料庫從一種一致性轉移到另一種一致性。如果事務的某一部分失敗,則整個事務都會失敗,系統將會被恢復(或稱之為回退)到此事務之前的狀態。
回到原來的INSERT的例子,請注意所有的整形十進制數都不需要用單引號引起來,而字元串和日期類型的值都要用單引號來區別。為了增加可讀性而在數字間插入逗號將會引起錯誤。記住,在SQL中逗號是元素的分隔符。
同樣要注意輸入文字值時要使用單引號。雙引號用來封裝限界標識符。
對於日期類型,我們必須使用SQL標准日期格式(yyyy-mm-dd),但是在系統中可以進行定義,以接受其他的格式。當然,2000年臨近,請你最好還是使用四位來表示年份。
既然你已經理解了INSERT語句是怎樣工作的了,讓我們轉到EMPLOYEES表中的其他部分:
INSERT INTO EMPLOYEES VALUES
('Bunyan','Paul','1970-07-04',
'Boston',12,70000);
INSERT INTO EMPLOYEES VALUES
('John','Adams','1992-01-21',
'Boston',20,100000);
INSERT INTO EMPLOYEES VALUES
('Smith','Pocahontas','1976-04-06',
'Los Angles',12,100000);
INSERT INTO EMPLOYEES VALUES
('Smith','Bessie','1940-05-02',
'Boston',5,200000);
INSERT INTO EMPLOYEES VALUES
('Jones','Davy','1970-10-10',
'Boston',8,45000);
INSERT INTO EMPLOYEES VALUES
('Jones','Indiana','1992-02-01',
'Chicago',NULL,NULL);
在最後一項中,我們不知道Jones先生的工薪級別和年薪,所以我們輸入NULL(不要引號)。NULL是SQL中的一種特殊情況,我們以後將進行詳細的討論。現在我們只需認為NULL表示一種未知的值。
有時,像我們剛才所討論的情況,我們可能希望對某一些而不是全部的列進行賦值。除了對要省略的列輸入NULL外,還可以採用另外一種INSERT語句,如下:
INSERT INTO EMPLOYEES(
FIRST_NAME, LAST_NAME,
HIRE_DATE, BRANCH_OFFICE)
VALUE(
'Indiana','Jones',
'1992-02-01','Indianapolis');
這樣,我們先在表名之後列出一系列列名。未列出的列中將自動填入預設值,如果沒有設置預設值則填入NULL。請注意我們改變了列的順序,而值的順序要對應新的列的順序。如果該語句中省略了FIRST_NAME和LAST_NAME項(這兩項規定不能為空),SQL操作將失敗。
讓我們來看一看上述INSERT語句的語法圖:
INSERT INTO table
[(column { ,column})]
VALUES
(columnvalue [{,columnvalue}]);
和前一篇文章中一樣,我們用方括弧來表示可選項,大括弧表示可以重復任意次數的項(不能在實際的SQL語句中使用這些特殊字元)。VALUE子句和可選的列名列表中必須使用圓括弧。
SELECT語句
SELECT語句可以從一個或多個表中選取特定的行和列。因為查詢和檢索數據是資料庫管理中最重要的功能,所以SELECT語句在SQL中是工作量最大的部分。實際上,僅僅是訪問資料庫來分析數據並生成報表的人可以對其他SQL語句一竅不通。
SELECT語句的結果通常是生成另外一個表。在執行過程中系統根據用戶的標准從資料庫中選出匹配的行和列,並將結果放到臨時的表中。在直接SQL(direct SQL)中,它將結果顯示在終端的顯示屏上,或者將結果送到列印機或文件中。也可以結合其他SQL語句來將結果放到一個已知名稱的表中。
SELECT語句功能強大。雖然表面上看來它只用來完成本文第一部分中提到的關系代數運算「選擇」(或稱「限制」),但實際上它也可以完成其他兩種關系運算—「投影」和「連接」,SELECT語句還可以完成聚合計算並對數據進行排序。
SELECT語句最簡單的語法如下:
SELECT columns FROM tables;
當我們以這種形式執行一條SELECT語句時,系統返回由所選擇的列以及用戶選擇的表中所有指定的行組成的一個結果表。這就是實現關系投影運算的一個形式。
讓我們看一下使用圖1中EMPLOYEES表的一些例子(這個表是我們以後所有SELECT語句實例都要使用的。而我們在圖2和圖3中給出了查詢的實際結果。我們將在其他的例子中使用這些結果)。
假設你想查看雇員工作部門的列表。那下面就是你所需要編寫的SQL查詢:
SELECT BRANCH_OFFICE FROM EMPLOYEES;
以上SELECT語句的執行將產生如圖2中表2所示的結果。
由於我們在SELECT語句中只指定了一個列,所以我們的結果表中也只有一個列。注意結果表中具有重復的行,這是因為有多個雇員在同一部門工作(記住SQL從所選的所有行中將值返回)。要消除結果中的重復行,只要在SELECT語句中加上DISTINCT子句:
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES;
這次查詢的結果如表3所示。
現在已經消除了重復的行,但結果並不是按照順序排列的。如果你希望以字母表順序將結果列出又該怎麼做呢?只要使用ORDER BY子句就可以按照升序或降序來排列結果:
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES
ORDER BY BRANCH_OFFICE ASC;
這一查詢的結果如表4所示。請注意在ORDER BY之後是如何放置列名BRANCH _OFFICE的,這就是我們想要對其進行排序的列。為什麼即使是結果表中只有一個列時我們也必須指出列名呢?這是因為我們還能夠按照表中其他列進行排序,即使它們並不顯示出來。列名BRANCH_ OFFICE之後的關鍵字ASC表示按照升序排列。如果你希望以降序排列,那麼可以用關鍵字DESC。
同樣我們應該指出ORDER BY子句只將臨時表中的結果進行排序;並不影響原來的表。
假設我們希望得到按部門排序並從工資最高的雇員到工資最低的雇員排列的列表。除了工資括弧中的內容,我們還希望看到按照聘用時間從最近聘用的雇員開始列出的列表。以下是你將要用到的語句:
SELECT BRANCH_OFFICE,FIRST_NAME,
LAST_NAME,SALARY,HIRE_DATE
FROM EMPLOYEES
ORDER BY SALARY DESC,
HIRE_DATE DESC;
這里我們進行了多列的選擇和排序。排序的優先順序由語句中的列名順序所決定。SQL將先對列出的第一個列進行排序。如果在第一個列中出現了重復的行時,這些行將被按照第二列進行排序,如果在第二列中又出現了重復的行時,這些行又將被按照第三列進行排序……如此類推。這次查詢的結果如表5所示。
將一個很長的表中的所有列名寫出來是一件相當麻煩的事,所以SQL允許在選擇表中所有的列時使用*號:
SELECT * FROM EMPLOYEES;
這次查詢返回整個EMPLOYEES表,如表1所示。
下面我們對開始時給出的SELECT語句的語法進行一下更新(豎直線表示一個可選項,允許在其中選擇一項。):
SELECT [DISTINCT]
(column [{, columns}])| *
FROM table [ {, table}]
[ORDER BY column [ASC] | DESC
[ {, column [ASC] | DESC }]];
定義選擇標准
在我們目前所介紹的SELECT語句中,我們對結果表中的列作出了選擇但返回的是表中所有的行。讓我們看一下如何對SELECT語句進行限制使得它只返回希望得到的行:
SELECT columns FROM tables [WHERE predicates];
WHERE子句對條件進行了設置,只有滿足條件的行才被包括到結果表中。這些條件由斷言(predicate)進行指定(斷言指出了關於某件事情的一種可能的事實)。如果該斷言對於某個給定的行成立,該行將被包括到結果表中,否則該行被忽略。在SQL語句中斷言通常通過比較來表示。例如,假如你需要查詢所有姓為Jones的職員,則可以使用以下SELECT語句:
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones';
LAST_NAME = 'Jones'部分就是斷言。在執行該語句時,SQL將每一行的LAST_NAME列與「Jones」進行比較。如果某一職員的姓為「Jones」,即斷言成立,該職員的信息將被包括到結果表中(見表6)。
使用最多的六種比較
我們上例中的斷言包括一種基於「等值」的比較(LAST_NAME = 'Jones'),但是SQL斷言還可以包含其他幾種類型的比較。其中最常用的為:
等於 =
不等於 <>
小於 <
大於 >
小於或等於 <=
大於或等於 >=
下面給出了不是基於等值比較的一個例子:
SELECT * FROM EMPLOYEES
WHERE SALARY > 50000;
這一查詢將返回年薪高於$50,000.00的職員(參見表7)。
邏輯連接符
有時我們需要定義一條不止一種斷言的SELECT語句。舉例來說,如果你僅僅想查看Davy Jones的信息的話,表6中的結果將是不正確的。為了進一步定義一個WHERE子句,用戶可以使用邏輯連接符AND,OR和NOT。為了只得到職員Davy Jones的記錄,用戶可以輸入如下語句:
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones' AND FIRST_NAME = 'Davy';
在本例中,我們通過邏輯連接符AND將兩個斷言連接起來。只有兩個斷言都滿足時整個表達式才會滿足。如果用戶需要定義一個SELECT語句來使得當其中任何一項成立就滿足條件時,可以使用OR連接符:
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones' OR LAST_NAME = 'Smith';
有時定義一個斷言的最好方法是通過相反的描述來說明。如果你想要查看除了Boston辦事處的職員以外的其他所有職員的信息時,你可以進行如下的查詢:
SELECT * FROM EMPLOYEES
WHERE NOT(BRANCH_OFFICE = 'Boston');
關鍵字NOT後面跟著用圓括弧括起來的比較表達式。其結果是對結果取否定。如果某一職員所在部門的辦事處在Boston,括弧內的表達式返回true,但是NOT操作符將該值取反,所以該行將不被選中。
斷言可以與其他的斷言嵌套使用。為了保證它們以正確的順序進行求值,可以用括弧將它們括起來:
SELECT * FROM EMPLOYEES
WHERE (LAST_NAME = 'Jones'
AND FIRST_NAME = 'Indiana')
OR (LAST_NAME = 'Smith'
AND FIRST_NAME = 'Bessie');
SQL沿用數學上標準的表達式求值的約定—圓括弧內的表達式將最先進行求值,其他表達式將從左到右進行求值。
以上對邏輯連接符進行了說明,在對下面的內容進行說明之前,我們再一次對SELECT語句的語法進行更新:
SELECT [DISTINCT]
(column [{, column } ] )| *
FROM table [ { , table} ]
[ORDER BY column [ASC] | [DESC
[{ , column [ASC] | [DESC } ] ]
WHERE predicate [ { logical-connector predicate } ];
NULL和三值邏輯
在SQL中NULL是一個復雜的話題,關於NULL的詳細描述更適合於在SQL的高級教程而不是現在的入門教程中進行介紹。但由於NULL需要進行特殊處理,並且你也很可能會遇到它,所以我們還是簡略地進行一下說明。
首先,在斷言中進行NULL判斷時需要特殊的語法。例如,如果用戶需要顯示所有年薪未知的職員的全部信息,用戶可以使用如下SELECT語句:
SELECT * FROM EMPLOYEES
WHERE SALARY IS NULL;
相反,如果用戶需要所有已知年薪數據的職員的信息,你可以使用以下語句:
SELECT * FROM EMPLOYEES
WHERE SALARY IS NOT NULL;
請注意我們在列名之後使用了關鍵字IS NULL或IS NOT NULL,而不是標準的比較形式:COLUMN = NULL、COLUMN <> NULL或是邏輯操作符NOT(NULL)。
這種形式相當簡單。但當你不明確地測試NULL(而它們確實存在)時,事情會變得很混亂。
例如,回過頭來看我們圖1中的EM-PLOYEES表,可以看到Indiana Jones的工薪等級或年薪值都是未知的。這兩個列都包含NULL。可以想像運行如下的查詢:
SELECT * FROM EMPLOYEES
WHERE GRADE <= SALARY;
此時,Indiana Jones應該出現在結果表中。因為NULL都是相等的,所以可以想像它們是能夠通過GRADE小於等於SALARY的檢查的。這其實是一個毫無疑義的查詢,但是並沒有關系。SQL允許進行這樣的比較,只要兩個列都是數字類型的。然而,Indiana Jones並沒有出現在查詢的結果中,為什麼?
正如我們早先提到過的,NULL表示未知的值(而不是象某些人所想像的那樣表示一個為NULL的值)。對於SQL來說意味著這個值是未知的,而只要這個值為未知,就不能將其與其他值比較(即使其他值也是NULL)。所以SQL允許除了在true 和false之外還有第三種類型的真值,稱之為「非確定」(unknown)值。
如果比較的兩邊都是NULL,整個斷言就被認為是非確定的。將一個非確定斷言取反或使用AND或OR與其他斷言進行合並之後,其結果仍是非確定的。由於結果表中只包括斷言值為「真」的行,所以NULL不可能滿足該檢查。從而需要使用特殊的操作符IS NULL和IS NOT NULL。
UPDATE語句
UPDATE語句允許用戶在已知的表中對現有的行進行修改。
例如,我們剛剛發現Indiana Jones的等級為16,工資為$40,000.00,我們可以通過下面的SQL語句對資料庫進行更新(並清除那些煩人的NULL)。
UPDATE EMPLOYEES
SET GRADE = 16, SALARY = 40000
WHERE FIRST_NAME = 'Indiana'
AND LAST_NAME = 'Jones';
上面的例子說明了一個單行更新,但是UPDATE語句可以對多行進行操作。滿足WHERE條件的所有行都將被更新。如果,你想讓Boston辦事處中的所有職員搬到New York,你可以使用如下語句:
UPDATE EMPLOYEES
SET BRANCH_OFFICE = 'New York'
WHERE BRANCH_OFFICE = 'Boston';
如果忽略WHERE子句,表中所有行中的部門值都將被更新為'New York'。
UPDATE語句的語法流圖如下面所示:
UPDATE table
SET column = value [{, column = value}]
[ WHERE predicate [ { logical-connector predicate}]];
DELETE語句
DELETE語句用來刪除已知表中的行。如同UPDATE語句中一樣,所有滿足WHERE子句中條件的行都將被刪除。由於SQL中沒有UNDO語句或是「你確認刪除嗎?」之類的警告,在執行這條語句時千萬要小心。如果決定取消Los Angeles辦事處並解僱辦事處的所有職員,這一卑鄙的工作可以由以下這條語句來實現:
DELETE FROM EMPLOYEES
WHERE BRANCH_OFFICE = 'Los Angeles';
如同UPDATE語句中一樣,省略WHERE子句將使得操作施加到表中所有的行。
DELETE語句的語法流圖如下面所示:
DELETE FROM table
[WHERE predicate [ { logical-connector predicate} ] ];
現在我們完成了數據操作語言(DML)的主要語句的介紹。我們並沒有對SQL能完成的所有功能進行說明。SQL還提供了許多的功能,如求平均值、求和以及其他對表中數據的計算,此外SQL還能完成從多個表中進行查詢(多表查詢,或稱之為連接)的工作。這種語言還允許你使用GRANT和REVOKE命令控制使用者的數據訪問許可權。
㈤ sql 語句 獲取最大值
sql 語句 獲取一列中的最大值使用MAX() 函數
一、MAX 函數功能:返回一列中的最大值。NULL 值不包括在計算中。
二、SQL MAX() 語法:
SELECT MAX(column_name) FROM table_name
注釋:MIN 和 MAX 也可用於文本列,以獲得按字母順序排列的最高或最低值。
三、檢索aid欄位的最大值語句:
selectmax(aid)as'最大值'fromaaa;
結果如圖:
(5)漫談一條sql語句的一生擴展閱讀:
SQL語言,是結構化查詢語言(StructuredQueryLanguage)的簡稱。SQL語言是一種資料庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關系資料庫系統;同時也是資料庫腳本文件的擴展名。
SQL語言,是結構化查詢語言(Structured Query Language)的簡稱。SQL語言是一種資料庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關系資料庫系統;同時也是資料庫腳本文件的擴展名。
寫從什麼事得到什麼啟示的作文
這是我原來寫的:下五子棋的啟示人們在生活中,會遇到許多難忘的事,也會從這些難忘的事中獲得啟示,我就給大家講一講我從下五子棋中所獲得的啟示吧! 記得有一天晚上,我和爸爸正下著五子棋,當時爸爸的白棋把我的黑棋堵死了,這時我便靈機一動,去棋盤上另一個地方下了一顆棋子。
在我不經意中把棋子東拼西湊後,竟然不可思議地和老地方的棋子連了起來。
原來還正得意一定贏的爸爸結果輸了。
多虧了我的靈活機動,才扭轉了這局面。
真是「山重水復疑無路,柳暗花明又一村」。
爸爸拉著我的手,親切地說:「幺兒,你贏了爸爸呢!」 晚上睡覺時,我仔細回憶了整個下棋的過程,有了幾條心得:一、學習時,如果遇到了困難,也要堅持不懈。
二、不懂的地方要反復去想、讀、看,把題目裡面所蘊藏的韻味讀透了,自然就能夠懂了。
三、平時要多看書,書中的好詞、佳句要記下來,可以引用於自己的作文中。
早上一起床,我就把晚上所想到的心得體會告訴了爸爸。
爸爸高興地說:「孩子,你說得很對!寫作文也是這樣的,先要有一個主題思想,再東拼一點兒好詞,西借一點兒佳句。
再往作文中『添油加醋』,等把作文寫通順了,再用自己的語言把它『變』美觀,就是一篇好的文章了。
」爸爸接著說:「寫作文就好比一棵樹,它的主幹(中心句)『長』好了,然後再把葉子、枝幹(好詞、佳名)添進去,這棵樹(作文)是不是就會很好了呢?」我點了點頭。
這個早上,雖然它永遠地過去了,但是爸爸的話卻永遠深深地印在我的腦海里,怎麼也抹不去。
...
關於發生在身邊的事得到啟示的作文
展開全部 大自然的啟示仙人掌,螞蟻,這些自然的事物隨處可見,因此它們並不稀奇,但你可別小看它們. 你是否看過一群小小的螞蟻,在牆壁爬動著 它們時時抬著像沙子一般小的食物,成群結隊的走動.那細小的身材,生命十分柔弱,只要被人一壓,它的一生,可能就這樣結束.螞蟻雖然渺小,但非常團結.一隻螞蟻找到食物,由於食物的體積太大,自己無法搬運,它便立刻回巢,通知夥伴,大家一起團結起來,就能成功了.我們也是一樣,如果不能團結,像一盤散沙一樣,一點力量都沒有;如果能合作,在做人處世上就能屹立不搖. 仙人掌生活在沙漠地區,那裡酷熱無比,還有許多惡毒的猛獸,處境十分危險.但是仙人掌生活在那裡許久,卻不見它絕種,這是因為它為了適應險惡的環境,長出了尖銳的刺,使動物們無可奈何.這似乎告訴我們,必須克服困難,外在艱苦的環境,要靠自己堅強的毅力去解決.俗語說:「天下無難事,只怕有心人.」就是這個道理. 大自然中,給我們的啟示實在太多了,只要用心體會,都能讓我們對生命有更深一層的體認,像仙人掌,螞蟻,不都是很好的例子嗎 大自然對人類的啟示 大自然是美麗的大自然,我們因該保護大自然,不能丟垃圾、吐啖、砍樹.接著,我給大家講個故事. 從前有一個村,他不愛保護大自然就砍樹,拿樹做成椅子和桌子,不久,哪個村裡人覺的房子舊了該換新的。
人們都去砍木做房,房子做好了,那裡村字的人都高興的叫了起來,有的驕傲到比誰的房子美就這樣子人們天天都砍樹。
不久洪水來了,洪水把村莊全毀了,越漂亮的房子都給兇猛的洪水沖走了因為沒有數的阻擋下著些房子都被沖走了,這里都變成廢區,這個故事給大家不要亂采地。
大自然這么好為什麼還要有人破壞呢?讓我說吧!因為有人沒地方丟,沒辦法就丟到地下,有的人以為丟垃圾就這么一丟多沒家教,還有在我們的班裡有人把蘋果不吃在上面畫畫多可惡,還有的吃香口絞吃了吐在地下讓值日生添麻煩,在這么好的環境下學習聽,那一群一群的螞蟻幫的小骨頭是教我們團結,那蜜蜂去采蜜是教我們勤勞,你看大自然多麼美好,去破壞它捨得嗎? 《生活的啟示》生活中的每一件事,都讓我有所收獲,因為我得到了生活的啟示。
我喜歡下圍棋,叔叔是爸爸的朋友,也住在我家的隔壁,他經常來教我下棋,我的棋藝越來越好,興趣也越來越濃厚了。
後來慢慢地,叔叔把我介紹給我們這里經常下棋的老爺爺們一起下棋,久而久之,老爺爺們下不過我,我的心裡很高興,也非常得意,總想讓更多的人知道我會下象棋。
然而我卻為自己的不知天高地厚付出了代價,那就是過於注重別人的評價,而且輸不起棋。
有一天,叔叔讓我和一個比我小幾歲的我不認識的夥伴下棋,我看看了他,足足比我矮一個頭。
我輕蔑地笑了笑,漫不經心和他比試起來。
漸漸,我驚訝了。
看著他那自信的笑臉。
我開始自暴自棄,果然不出我所料,他贏了。
回到家,我生氣的大叫一聲,引來了媽媽,媽媽問我出什麼事了?我把事情的經過從頭到尾的告訴媽媽。
媽媽頓時語重心長的對我說:「強中自有強中手,你現在知道了吧。
人外有人,天外有天。
俗話說:『一分勤勞,一分回報。
』因為你不肯努力,而別人的付出比你多,自然回報也很多,他也就贏得了你。
」 夜深了,靜悄悄的夜晚讓我的心無法平靜下來。
這個夜晚,給我留下了太多的回憶和永久的啟示。
無論在學習生活還是競技方面,都應該保持謙虛,而且要努力做到勝不驕敗不餒。
那天中午,家裡只有我和爺爺倆人,奶奶去菜市場買菜了,爸爸和媽媽都去上班了,現在家裡就好象一個大南瓜裡面沒有了南瓜籽一樣,空盪盪的。
我和爺爺因為感覺悶得慌,就准備一起收拾屋子。
我發現了廚房冰箱里雞蛋快沒有了,就跑下樓去超市買雞蛋。
超市裡的東西雖然是應有盡有,但是價格太昂貴了。
我拿過袋子,小心翼翼地裝雞蛋,心裡祈禱著:千萬不能有任何的差錯呀。
可是事與願違,正當我在拿最後一個雞蛋時,可能是由於心裡如釋重負,一放鬆,手一滑,手中的雞蛋就如一塊巨大的石頭一般重重地砸在了另外一個雞蛋上面,破天慌的,一塊大石頭無緣無故地砸在你的頭上面,你還不得委屈死了?雞蛋委屈,可是我也一樣委屈,自認倒霉,我得賠錢呀。
於是,我就跑過去,去問售貨員阿姨一個雞蛋大概幾元錢,她說:"一個雞蛋大概五角錢吧。
"我鬆了一口氣,幸好我付了雞蛋原來的錢還多剩下五角錢,真是不幸中的萬幸呀,如果一個雞蛋是一元錢的話,那我就是雙悲臨門哪。
我告訴了給我結帳的那位阿姨,她也沒有責怪我,只是讓我賠了五角錢。
回到家,爺爺問我怎麼這么晚才回來,我告訴了爺爺那件事情,他說:"你呀真是太老實了,換成別人哪,沒准還會賊人喊賊呢。
"我在想:如果我當時沒有賠那五角錢,可能現在我還在耿耿於懷,沒准還會慚愧呢。
現在我又想到:何必呢,五角錢就能夠換來一個"清白身"和一個"自由身"不是挺值的嘛,何必那麼吝嗇呢。
老老實實地踏踏實實地過日子不是更舒坦的嗎?最起碼我是這么認為的。
這件事使我明白了許多道理,令我難忘。
2和往常不同的是,今天放學一回到家沒看電視而是...
因為一件事得到啟發的作文
從一件事得到的啟示 失敗乃成功之母是啊,做每件事都要經歷過失敗,才能成功.在我的記憶深處,有一件學騎車的事情,讓我從這件事得到了一個啟示.在我四歲時,就在騎自行車,那時候的自行車是有四個輪子的,騎上去不會摔跤.十歲那年 有一天,爸爸突然地對我說:''孩子,你不能總是騎四輪車,應該練練單車吧!''我想了想說:''好吧!''正好該我過生日了,所以我的生日禮物爸爸給我買了一台鳳凰的折疊自行車。
剛開始學的時候,別提多難了!一跨上車,車子就像喝醉了酒,搖搖晃晃的,有時候車頭怎麼也扭不過來,讓我連人帶車的重重地摔在地上,摔得我四腳朝天,搞得別人哈哈大笑. 有時候我連車都騎不上來,有時候爸爸推我走但是爸爸一鬆手我就摔倒了,但我看見院里的其他小朋友和我一樣老摔跤卻一點也不服輸,繼續努力地練習.於是我也和他們一樣繼續努力地練習。
過了幾天後又經過幾次摔跤後,我漸漸地發現,車子像被我馴服的一匹駿馬,終於能讓我瀟灑自如地駕駛了.那一天晚上,我正在回味著白天學自行車的事,並從中我悟出了一個啟示:做什麼事,不可能一下子就會成功,一定要經歷過失敗,然後再通過不懈的努力,最終才會取得成功,正所謂失敗是成功之母.要從失敗中吸取教訓,總結經驗,成功之母才會再進一步.
受到啟示的作文
一件事給我的啟示 在生活中,每天會發生許多事情。
有的像過眼雲煙,很快就忘得一干二凈。
而有些事情,卻會深深的印在腦海里,揮之不去。
一個暑假的早晨,我捧著一本書坐在陽台上。
抬頭仰望低沉昏暗的天空,好像是要下大雨了。
再看樓下不遠處的一棵大樹下,螞蟻正在忙碌著搬家呢,它們排的可真整齊!母雞咯咯地叫喚著,似乎在召喚她的孩子們回家。
鄰居家的小狗似乎也躁動不安起來,低聲地嗚嗚叫著,像被低壓壓得喘不過氣來。
遠處的池塘里冒著一串串泡兒,荷花也垂著頭。
路上的行人匆匆忙忙的,還是沒躲過這場突如其來的大雨。
我急忙站起來去關窗子,在不經意間,牆角一隻蜘蛛闖進了我的視線——它正在結網。
我仔細盯著它「工作」,甚至忘了關窗子的事。
只見蜘蛛來回穿梭,很快就結好了大半張網。
可就在這時,一陣暴風吹來,細細的蛛網無力地飄搖了兩下,忽地斷裂了。
我不禁伸出手去,真想幫它挽救那辛苦結好的捕食工具,可是在無能為力。
蜘蛛似乎也聽了一下,它大概被這突如其來的災難嚇了一跳,恐怕心裡還在抱怨這不合時宜的一陣風吧。
看它細小的爪勉強掛在殘存的蛛網上,似乎在盤算著下一步該怎麼辦。
不知道它是不是也動搖過或猶豫過,過了半晌,出乎我的意料,它竟又踏踏實實地重新結起網來了。
好不容易結到一半時,暴風好像和它作對一樣,又將它的心血揮之而去。
這下它彷彿沒有驚訝也沒有猶豫了,甚至不肯休息片刻,繼續結著。
就這么努力著,終於結出大半張網了,我想,這次大概足夠牢固了,應該可以成功了。
我剛剛微笑著暗自為它高興時,老天竟像要故意考驗它一樣,又把網吹破了。
我一下子像泄了氣的皮球,彷彿比蜘蛛還灰心,想,唉,可憐的蜘蛛,這下一定要放棄了,這該死的風怎麼能如此故意和它作對呢?但讓我吃驚的是它竟然像什麼都沒發生過一樣,一如既往地織啊織啊……這次,它終於織成了一張結實的網,我也長出了一口氣。
忽然間,我覺得自己應該向蜘蛛學習,做事要持之以恆,堅持到底,就算困難再大也要勇於面對,不要灰心喪氣,不要輕言放棄。
我要像蜘蛛一樣,對目標有著堅定的信念,只有這樣,成功才會最終屬於自己。
我相信我也能結一張比那蜘蛛更大,更堅固,更結實的網,網住一個成功的明天!參考資料:呵呵,希望對你有所幫助!...
什麼什麼受到的啟示作文100字
星期天的早晨,天氣晴朗,陽光明媚,碧空萬里無雲,我正在逍遙自在地玩耍。
這時候,媽媽走過來對我說:「這里有一把生綉的菜刀,請你把它磨利。
」我心直口快地答應了。
俗語說:「看事容易做事難。
」我覺得這話一點也不假,剛磨了一會兒刀,雙手就累得筋疲力盡,氣得我哭笑不得。
我本來想要放棄磨刀,得過且過,頂多被媽媽罵一頓。
可是望著生銹的刀口,它好像在沾沾自喜地嘲笑我:「真弱智,做事半途而廢。
」 這時,我的腦海里又清清楚楚地浮現了老師在課堂上講的磨杵成針地故事。
說得是李白小時候經常貪玩逃學,一次,李白逃學途中看見河邊有一個老太太在磨鐵杵。
好奇心使他身不由己地上前去,李白問老太太:「您為什麼沒事找事,磨起鐵杵來了,這不是白費力氣嗎?」老太太語重心長地說:「孩子,我不是沒事找事,我正用這根鐵杵磨一根綉花針。
」李白聽了,不由得哈哈大笑,還對老太太說:「這是不可能的,鐵杵那麼粗大,綉花針那麼細小,要磨到何年何月呢?」老太太一本正經地說:「只要有耐心,堅持不懈,天大的事情也能做到。
所謂冰凍三尺,非一日之寒。
」李白聽了,覺得很慚愧,因為他以前做什麼事都沒有耐心。
些後,他每天都奮發圖強,春去秋來,終於成為了唐代著名的詩人。
從小狗得到什麼啟示的作文
狗是人類最忠誠的朋友,它能幫助我們看家,很安全,但是,狗也有不同種類的狗,也有不同特點的狗,就讓我來給你說一說我姥姥家的狗吧!暑假裡,我去我姥姥家玩,姥姥家養了一隻小狗,他在天熱的時候總是不停的伸舌頭,這點讓我有些迷惑不解。
於是我就查理查資料。
原來,狗是很不耐熱的動物.因為狗不會出汗,也不會因為熱而停止活動;狗的身體不能自我調節溫度,狗也不會自己照顧自己及時補水;狗的汗腺全在舌頭上,所以看到狗吐出舌頭喘氣說明狗很熱,需要喝水降溫或靜下來停止活動;短鼻子的狗比長鼻子狗更怕熱,更不容易散熱。
因此,我想到了可以發明一種汽車。
因為現在的汽車在停車時總是被太陽曬,曬後再進去會非常非常熱。
所以,我們可以採用夠用舌頭散熱的原理,發明一個汽車散熱器,這樣,就再也不用為汽車內太熱而煩惱了。
但要是車內的東西丟了怎麼辦呢?沒有關系,我們可以根據狗的嗅覺靈敏的特徵,發明一個細胞存儲器,每個放入車內的東西都會被細胞存儲器所存儲,其實,它就如同汽車的「大腦」,當你丟東西時,給他下達指令,他就會接收到,這時,細胞存儲器成千上萬的嗅覺細胞便會發揮作用啦!他會靠著靈敏的嗅覺帶你去找到丟失的物品。
那麼如果在路上汽油沒了,又沒有加油站怎麼辦呢?不要擔心,我們會根據狗腿骨骼結構,弄一個隱藏的「機器腿」當沒有汽油時,汽車輪子便會自己收縮起來,不耗油的「機器腿」便會出來,可以很快的帶你到目的地了。
現在的科學越來越發達,在現代化的科技社會中,相信人們會創造出更多的奇跡啊!另一篇小狗是我們常見的動物,它能幫主人管好家,不讓小偷近來偷東西,它可是家庭里最忠實的「保安」了。
我想,這個「保安」它會累嗎?我希望它該快活的時候就應該像人一樣快活自在;但是,該認真的時候,就應該認真。
所以,我想發明一種機器狗,機器狗跟哈巴狗沒什麼兩樣,但是,它的功能跟哈巴狗可大有區別啊!請聽聽我的詳細介紹吧!機器狗的頭上有一個微型小按鈕,只要輕輕按一下那個按鈕,機器狗就會二十四個小時為您服務。
當您覺的郁悶時,機器狗還會陪您聊天、玩游戲呢!機器狗會說人話,你叫它說什麼,它就說什麼;它還會為你解答難題,它可以算是一位「小老師」了。
在遇見陌生人時,它不會亂叫,它只會對你聞一聞。
它的背上有兩盞燈:一盞紅燈,一盞綠燈。
如果你不是小偷,那盞綠燈就會亮;如果你是小偷,它的那盞紅燈就會亮。
你們應該會問:如果小偷是「飛毛腿」怎麼辦呢?別急,機器狗會出色地完成這項任務的。
你看,機器狗的四隻腳都出現了四個「風火輪」,「風火輪」飛起來啊,那可是比風還快啊,三下五除二的就可以把小偷順利抓起來。
你們看,這就是我想發明的機器狗,它還有好多好多的神奇功能呢,等我長大了,發明出了機器狗,你們肯定會大吃一驚的!
我從什麼得到了啟發作文600字
我從生活中的啟發 生活,宛如情節曲折的故事,永遠是精彩的。
可以說我是生活的一位受益者,因為我得到了生活的啟示,改變完善了我自己。
記得有一天放學,我像平常一樣背著書包獨自回家。
當我走出城鐵站走到小區門口的時候,看到一群人圍在小區門口,我走過去一看,原來,一位老爺爺騎著電動三輪車不小心把一個大約一年級的小孩撞著了,看小孩站在那裡的樣子也不像受傷了,但卻在哭。
可能因為小孩年齡小,沒經歷過這樣的事,嚇哭的吧! 這個小孩的家長正在沖那位爺爺嚷嚷: 看你,怎麼把我家孩子撞了?! 老爺爺連忙賠禮道: 對不起,對不起。
小孩的家長不依不饒的說: 你這么大歲數了,走路不長眼呀! 老爺爺又說: 對不起,怨我,都怨我。
小孩的家長又接著說: 怨你?你把我孩子撞了,不怨你怨誰?還怨我呀?! 說著,還推了一下老爺爺,差點把老爺爺推倒在地。
看到這里,我就匆匆進了小區的大門。
在路上,我想: 既然那個小孩沒受傷,只是身上有些灰塵,人家也道歉了還不如這件事就這樣算了。
何必弄得誰都不高興呢?那個小孩的家長心胸怎麼那麼狹小呢? 通過這件事,我明白了:一個人的一生中可能會遇到很多不愉快的事,也難免會犯錯誤,當我們遇到不愉快或犯了錯誤的時候,我們要心胸寬闊些,以樂觀的態度去對待自己對待他人、寬容他人。
只有這樣,我們的社會才會變得更美好、更和諧。
我從生活中的啟發 在生活中,有許多事給了我啟示,讓我終身難忘的是這一件事。
有一天,我和媽媽去買菜。
半路上,我突然感到口渴,舌頭熱得發紅,我哀求著對媽媽說: 媽媽,我好渴,你給我買瓶水,行不行? 媽媽給了我五塊錢,叫我自己去買。
我跑到商店,是一為老奶奶在櫃台,我挑了一瓶三元的可樂,然後把錢給老奶奶,老奶奶本應該找回我兩塊錢,卻找給我三塊錢,竟多找了一塊錢。
我歡天喜地,心裡想:這個老太婆,真是老花眼了,多找了我一塊錢都不知道。
我接過錢,飛快跑回媽媽身邊,悄悄對媽媽說: 媽媽,我今天真是撞上好運氣了,一個老太婆找錢時多找了我一塊,哈哈 哈哈 媽媽聽了,氣怒地批評我:你知道嗎?你這種行為是 *** 的,多找了一塊就應該還給人家,你這是占別人便宜,沒有道得修養,沒有素質! 我聽了,趕快跑回原處,把錢還給了老婆婆,老婆婆摸摸我的頭說: 你真是個好孩子 我的臉卻紅彤彤的。
我回到媽媽身邊,媽媽語重心長地對我說: 浩宇,誠實,是做人之根本,不誠實就等於失去了一切! 我羞愧地點點頭。
我一直把這句話當做自己的座右銘,這句話在我的生活中也起了很大的做用。
有一次考試,卷子發下來,我考了一百分,但在講題的時候,我發現自己一個題沒答對,老師卻打了鉤,我向老師報告了這件事,老師給我扣了兩分,並且表揚了我誠懇的態度。
回去媽媽也表揚了我,說我做到了 誠實 。
媽媽的話讓我知道了做人的道理,我會把它牢記在我心中,永久不會忘記。
關於在生活得到的啟示的作文怎麼寫?
「寶劍鋒從磨礪出,梅花香自苦寒來」,每當我經過樓下,看到牆角那一株盛開的梅花時,便不由自主想到了這句詩,心裡充滿著深深的敬意。
曾經的我喜歡放棄,總是為自己尋找各種冠冕堂皇的借口,對於自己的惰性視而不見。
那天800米測驗,我以身體不適為借口,企圖矇混過關,卻被老師逮個正著,不得已站在了起跑線上。
途中我氣喘吁吁,呼進的空氣像是一把冰刀,鈍鈍地割在我的心上,生疼。
看著前方漸遠的大部隊,我再一次放棄,倒在地上再也不肯起來。
老師忍無可忍找來了家長。
爸爸沉默著,沒有表情地點點頭,帶我回家。
經過那一株梅,爸爸突然開口:「你知道么,什麼事情都沒有借口。
成功,向來只是你想不想的問題。
」我停下腳步,怔怔地盯著爸爸剛才站立的地方,沉思著。
空氣像是被冰凍成了固體,連呼吸都是那麼困難。
冷風拂過,我吐出一口白霧,脖子往衣服里縮了縮。
又一陣風吹過,竟帶來了些許冷香,縈繞在鼻尖,說不出的好聞。
我驀然回首,卻見那株梅凌寒而立。
雨,打不倒她倔強的身影;風,帶不走她清雅的芬芳。
我突然感到有些可惜,要是她生長在春天,那該是真正的「百花齊放競芳華」了。
但轉念一想,不,正是因為她生長在萬物盡凋的冬季,才歷來為人稱道。
陶淵明愛菊,揮筆寫下「採菊東籬下,悠然見南山」的千古絕句;周敦頤喜蓮,是欣賞「出淤泥而不染,濯清漣而不妖」的高潔;而陸游好梅,就應該愛的是「雪虐風饕愈凜然,花中氣節最高堅」的堅強與不屈!梅花告訴了我堅強。
在逆境中,她不屈服,不因為天氣寒冷而選擇放棄。
我站在梅下,漸漸有所領悟。
第二天,我請求老師幫我重新測一次成績。
還是與先前一樣的氣喘吁吁,但是一種新的力量流淌在我的血脈中,它促使我前進再前進,在我想放棄的時候給我以勇氣與信心。
㈥ sql常用語句,幫我歸納出來,謝謝
SQL語句先前寫的時候,很容易把一些特殊的用法忘記,我特此整理了一下SQL語句操作。
一、基礎
1、說明:創建資料庫
CREATE DATABASE database-name
2、說明:刪除資料庫
drop database dbname
3、說明:備份sql server
--- 創建 備份數據的 device
USE master
EXEC sp_admpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 開始 備份
BACKUP DATABASE pubs TO testBack
4、說明:創建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根據已有的表創建新表:
A:create table tab_new like tab_old (使用舊表創建新表)
B:create table tab_new as select col1,col2... from tab_old definition only
5、說明:刪除新表
drop table tabname
6、說明:增加一個列
Alter table tabname add column col type
註:列增加後將不能刪除。DB2中列加上後數據類型也不能改變,唯一能改變的是增加varchar類型的長度。
7、說明:添加主鍵: Alter table tabname add primary key(col)
說明:刪除主鍵: Alter table tabname drop primary key(col)
8、說明:創建索引:create [unique] index idxname on tabname(col....)
刪除索引:drop index idxname
註:索引是不可更改的,想更改必須刪除重新建。
9、說明:創建視圖:create view viewname as select statement
刪除視圖:drop view viewname
10、說明:幾個簡單的基本的sql語句
選擇:select * from table1 where 范圍
插入:insert into table1(field1,field2) values(value1,value2)
刪除:delete from table1 where 范圍
更新:update table1 set field1=value1 where 范圍
查找:select * from table1 where field1 like '%value1%' ---like的語法很精妙,查資料!
排序:select * from table1 order by field1,field2 [desc]
總數:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、說明:幾個高級查詢運算詞
A: UNION 運算符
UNION 運算符通過組合其他兩個結果表(例如 TABLE1 和 TABLE2)並消去表中任何重復行而派生出一個結果表。當 ALL 隨 UNION 一起使用時(即 UNION ALL),不消除重復行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。
B: EXCEPT 運算符
EXCEPT 運算符通過包括所有在 TABLE1 中但不在 TABLE2 中的行並消除所有重復行而派生出一個結果表。當 ALL 隨 EXCEPT 一起使用時 (EXCEPT ALL),不消除重復行。
C: INTERSECT 運算符
INTERSECT 運算符通過只包括 TABLE1 和 TABLE2 中都有的行並消除所有重復行而派生出一個結果表。當 ALL 隨 INTERSECT 一起使用時 (INTERSECT ALL),不消除重復行。
註:使用運算詞的幾個查詢結果行必須是一致的。
12、說明:使用外連接
A、left outer join:
左外連接(左連接):結果集幾包括連接表的匹配行,也包括左連接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join:
右外連接(右連接):結果集既包括連接表的匹配連接行,也包括右連接表的所有行。
C:full outer join:
全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。
二、提升
1、說明:復製表(只復制結構,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1<>1
法二:select top 0 * into b from a
2、說明:拷貝表(拷貝數據,源表名:a 目標表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;
3、說明:跨資料庫之間表的拷貝(具體數據使用絕對路徑) (Access可用)
insert into b(a, b, c) select d,e,f from b in '具體資料庫' where 條件
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..
4、說明:子查詢(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
5、說明:顯示文章、提交人和最後回復時間
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
6、說明:外連接查詢(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
7、說明:在線視圖查詢(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;
8、說明:between的用法,between限制查詢數據范圍時包括了邊界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 數值1 and 數值2
9、說明:in 的使用方法
select * from table1 where a [not] in ('值1','值2','值4','值6')
10、說明:兩張關聯表,刪除主表中已經在副表中沒有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
11、說明:四表聯查問題:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
12、說明:日程安排提前五分鍾提醒
SQL: select * from 日程安排 where datediff('minute',f開始時間,getdate())>5
13、說明:一條sql 語句搞定資料庫分頁
select top 10 b.* from (select top 20 主鍵欄位,排序欄位 from 表名 order by 排序欄位 desc) a,表名 b where b.主鍵欄位 = a.主鍵欄位 order by a.排序欄位
14、說明:前10條記錄
select top 10 * form table1 where 范圍
15、說明:選擇在每一組b值相同的數據中對應的a最大的記錄的所有信息(類似這樣的用法可以用於論壇每月排行榜,每月熱銷產品分析,按科目成績排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
16、說明:包括所有在 TableA 中但不在 TableB和TableC 中的行並消除所有重復行而派生出一個結果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)
17、說明:隨機取出10條數據
select top 10 * from tablename order by newid()
18、說明:隨機選擇記錄
select newid()
19、說明:刪除重復記錄
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
20、說明:列出資料庫里所有的表名
select name from sysobjects where type='U'
21、說明:列出表裡的所有的
select name from syscolumns where id=object_id('TableName')
22、說明:列示type、vender、pcs欄位,以type欄位排列,case可以方便地實現多重選擇,類似select 中的case。
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
顯示結果:
type vender pcs
電腦 A 1
電腦 A 1
光碟 B 2
光碟 A 2
手機 B 3
手機 C 3
23、說明:初始化表table1
TRUNCATE TABLE table1
24、說明:選擇從10到15的記錄
select top 5 * from (select top 15 * from table order by id asc) table_別名 order by id desc
三、技巧
1、1=1,1=2的使用,在SQL語句組合時用的較多
"where 1=1" 是表示選擇全部 "where 1=2"全部不選,
如:
if @strWhere !=''
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
end
else
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
end
我們可以直接寫成
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere
2、收縮資料庫
--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--收縮數據和日誌
DBCC SHRINKDB
DBCC SHRINKFILE
3、壓縮資料庫
dbcc shrinkdatabase(dbname)
4、轉移資料庫給新用戶以已存在用戶許可權
exec sp_change_users_login 'update_one','newname','oldname'
go
5、檢查備份集
RESTORE VERIFYONLY from disk='E:\dvbbs.bak'
6、修復資料庫
ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] SET MULTI_USER
GO
7、日誌清除
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT
USE tablename -- 要操作的資料庫名
SELECT @LogicalFileName = 'tablename_log', -- 日誌文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
@NewSize = 1 -- 你想設定的日誌文件的大小(M)
-- Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size
FROM sysfiles
WHERE name = @LogicalFileName
SELECT 'Original Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
(DummyColumn char (8000) not null)
DECLARE @Counter INT,
@StartTime DATETIME,
@TruncLog VARCHAR(255)
SELECT @StartTime = GETDATE(),
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)
AND (@OriginalSize * 8 /1024) > @NewSize
BEGIN -- Outer loop.
SELECT @Counter = 0
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
BEGIN -- update
INSERT DummyTrans VALUES ('Fill Log')
DELETE DummyTrans
SELECT @Counter = @Counter + 1
END
EXEC (@TruncLog)
END
SELECT 'Final Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF
8、說明:更改某個表
exec sp_changeobjectowner 'tablename','dbo'
9、存儲更改全部表
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
AS
DECLARE @Name as NVARCHAR(128)
DECLARE @Owner as NVARCHAR(128)
DECLARE @OwnerName as NVARCHAR(128)
DECLARE curObject CURSOR FOR
select 'Name' = name,
'Owner' = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
order by name
OPEN curObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN
if @Owner=@OldOwner
begin
set @OwnerName = @OldOwner + '.' + rtrim(@Name)
exec sp_changeobjectowner @OwnerName, @NewOwner
end
-- select @name,@NewOwner,@OldOwner
FETCH NEXT FROM curObject INTO @Name, @Owner
END
close curObject
deallocate curObject
GO
10、SQL SERVER中直接循環寫入數據
declare @i int
set @i=1
while @i<30
begin
insert into test (userid) values(@i)
set @i=@i+1
end
小記存儲過程中經常用到的本周,本月,本年函數
Dateadd(wk,datediff(wk,0,getdate()),-1)
Dateadd(wk,datediff(wk,0,getdate()),6)
Dateadd(mm,datediff(mm,0,getdate()),0)
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0))
Dateadd(yy,datediff(yy,0,getdate()),0)
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))
上面的SQL代碼只是一個時間段
Dateadd(wk,datediff(wk,0,getdate()),-1)
Dateadd(wk,datediff(wk,0,getdate()),6)
就是表示本周時間段.
下面的SQL的條件部分,就是查詢時間段在本周范圍內的:
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6)
而在存儲過程中
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1)
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6)
㈦ sql 基礎知識 語句解釋 select fieldname from tablename where pkfield = pkvalue
select fieldname from tablename where pkfield = pkvalue
sql語句可以直接翻譯:
選擇 fieldname 從tablename 哪裡的 pkfield = pkvalue
上面的翻譯整理下就是:
從tablename中選擇那些pkfield欄位的值為pkvlaue的行中的欄位fieldname的值。
例如,表t_test有如下結構和數據,其中pkfield為主鍵:
pkfield fieldname elsefield
1 f1 e1
2 f2 e2
3 f3 e3
4 f4 e4
sql: select fieldname from t_test where pkfield = 2
含義:從t_test中選擇那些pkfield欄位的值為2的行中的欄位fieldname的值。
那麼返回結果就是:
fieldname
f2
如果sql為:sql: select fieldname from t_test where pkfield > 2,則返回結果為:
fieldname
f3
f4
從你給的這條sql語句來看,這不是具體的表,而是一個概括性的sql文。因為主鍵的英文是primary key,從pkfield這個來看,應該是主鍵域(主鍵欄位),而pkvalue則為主鍵值。這條sql需要將其中的關鍵字部分(如tablename、fieldname、pkvalue等)替換後才能應用於其他表。由於主鍵欄位的取值唯一性,這樣的sql語句是最多隻能得到一條數據。
欄位名和列名其實沒有區別,甚至可以說是同一種東西,就像表格的表頭。比如說如下表結構:
表名:西遊記
id 姓名 性別
1 孫悟空 男
2 豬八戒 男
3 唐三藏 女
在上面的表結構中,id、姓名、性別這三個都是欄位名,也可以說是列名。自然這是縱向看的,縱向看錶,會看到相似的東西,比如id,如果定義的表id為int型,則id列的值都必須是int型數據。那麼橫向來看,1 孫悟空 男,這組數據成為行,行之間也是有關系的,一行通常對應一個對象,行也稱作元組。每個元組的每一個元素,都是該元素所在列的一個取值而已。欄位名通常確定後不會變,而值不同,它是資料庫表的作用所在,一定會伴隨數據值的增刪改等操作,所以欄位或者說是列,在表中的數目是有限的,是固定的,數據值或者是行,是不確定的,是隨時可以增刪改的。
至於fieldname和pkvalue,只是一種假設性的代名詞,比如上面的表結構有如下sql:
select 姓名 from 西遊記 where id = 2
就是將你所提供的sql:
select fieldname from tablename where pkfield = pkvalue
中的某些關鍵字替換後的結果,其中:
fieldname(欄位域)被姓名代替,即這條sql文選擇的是姓名這一列的值;
tablename(表名)被西遊記代替,即數據來源是表西遊記;
pkfield(主鍵域)被id代替,即選擇條件是id;
pkvalue(主鍵值)被2代替,即選擇條件的值為2的數據;
另外,pkfield可以不是主鍵,可以是任何列名,條件和條件的值之間也不必是=,可以是<>(不等於),<小於,>大於等等運算符。