數據庫練習筆記

應儘量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:     select id from t where num=10 or num=20  

可以這樣查詢:  

    select id from t where num=10  

    union all  

    select id from t where num=20

union和union all的區別是,union會自動壓縮多個結果集合中的重複結果,而union all則將所有的結果全部顯示出來,不管是不是重複。


DECLARE @count

SELECT @count=1

解釋如下:

DECLARE 用於聲明變量,

SELECT 用於變量賦值。


在mysql中,與語句SELECT * FROM book b WHERE b.book_num NOT BETWEEN 200 AND 300;

SELECT * FROM book b WHERE b.book_num < 200 OR b.book_num > 300;


A INNER JOIN B:返回A和B中符合on條件式的記錄

A LEFT JOIN B:返回A中的所有記錄和B中符合on條件式的記錄

A RIGHT JOIN B:返回B中的所有記錄和A中符合on條件式的記錄


約束主要有一下幾種:

NOT NULL : 用於控制字段的內容一定不能爲空(NULL)。 

UNIQUE : 控制字段內容不能重複,一個表允許有多個 Unique 約束。

PRIMARY KEY: 也是用於控制字段內容不能重複,但它在一個表只允許出現一個。

FOREIGN KEY: FOREIGN KEY 約束用於預防破壞表之間連接的動作,FOREIGN KEY 約束也能防止非法數據插入外鍵列,因爲它必須是它指向的那個表中的值之一。

CHECK: 用於控制字段的值範圍。

DEFAULT: 用於設置新記錄的默認值。


有關ibatis 中的#與$的區別

1.#是把傳入的數據當作字符串,如#user_id_list#傳入的是1,2,則sql語句生成是這樣,in ('1,2') ,

2.$傳入的數據直接生成在sql裏,如$user_id_list$傳入的是1,2,則sql語句生成是這樣,in(1,2). 

3.#方式能夠很大程度防止sql注入. 

4.$方式無法方式sql注入. 

5.$方式一般用於傳入數據庫對象.例如傳入表名. 

6.一般能用#的就別用$.

舉例:

#str# 出來的效果是  'str' 

$str$ 出來的效果是  str 


在Ibatis中我們使用SqlMap進行Sql查詢時需要引用參數,在參數引用中遇到的符號#和$之間的區分爲,#可以進行與編譯,進行類型匹配,而$不進行數據類型匹配。

例如: select * from table where id = #id# ,其中如果字段id爲字符型,那麼#id#表示的就是’id’類型,如果id爲整型,那麼#id#就是id類型。 select * from table where id = $id$ ,如果字段id爲整型,Sql語句就不會出錯,但是如果字段id爲字符型,那麼Sql語句應該寫成 select * from table where id = ‘$id$‘


在archivelog mode只要其歸檔日誌文件不丟失,就可以有效地防止數據丟失。


邏輯查詢處理階段簡介

FROM:對FROM子句中的前兩個表執行笛卡爾積(Cartesian product)(交叉聯接),生成虛擬表VT1

ON:對VT1應用ON篩選器。只有那些使<join_condition>爲真的行才被插入VT2。

OUTER(JOIN):如 果指定了OUTER JOIN(相對於CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部聯接把左表標記爲保留表,右外部聯接把右表標記爲保留表,完全外部聯接把兩個表都標記爲保留表)中未找到匹配的行將作爲外部行添加到 VT2,生成VT3.如果FROM子句包含兩個以上的表,則對上一個聯接生成的結果表和下一個表重複執行步驟1到步驟3,直到處理完所有的表爲止。

WHERE:對VT3應用WHERE篩選器。只有使<where_condition>爲true的行才被插入VT4.

GROUP BY:按GROUP BY子句中的列列表對VT4中的行分組,生成VT5.

CUBE|ROLLUP:把超組(Suppergroups)插入VT5,生成VT6.

HAVING:對VT6應用HAVING篩選器。只有使<having_condition>爲true的組纔會被插入VT7.

SELECT:處理SELECT列表,產生VT8.

DISTINCT:將重複的行從VT8中移除,產生VT9.

ORDER BY:將VT9中的行按ORDER BY 子句中的列列表排序,生成遊標(VC10).

TOP:從VC10的開始處選擇指定數量或比例的行,生成表VT11,並返回調用者。

注:步驟10,按ORDER BY子句中的列列表排序上步返回的行,返回遊標VC10.這一步是第一步也是唯一一步可以使用SELECT列表中的列別名的步驟。這一步不同於其它步驟的 是,它不返回有效的表,而是返回一個遊標。SQL是基於集合理論的。集合不會預先對它的行排序,它只是成員的邏輯集合,成員的順序無關緊要。對錶進行排序 的查詢可以返回一個對象,包含按特定物理順序組織的行。ANSI把這種對象稱爲遊標。理解這一步是正確理解SQL的基礎。


造成數據不一致的原因主要有:

數據冗餘

如果數據庫中存在冗餘數據,比如兩張表中都存儲了用戶的地址,在用戶的地址發生改變時,如果只更新了一張表中的數據,那麼這兩張表中就有了不一致的數據。

併發控制不當

比如某個訂票系統中,兩個用戶在同一時間訂同一張票,如果併發控制不當,可能會導致一張票被兩個用戶預訂的情況。當然這也與元數據的設計有關。

故障和錯誤

如果軟硬件發生故障造成數據丟失等情況,也可能引起數據不一致的情況。因此我們需要提供數據庫維護和數據恢復的一些措施。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章