應儘量避免在 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的基礎。
造成數據不一致的原因主要有:
數據冗餘
如果數據庫中存在冗餘數據,比如兩張表中都存儲了用戶的地址,在用戶的地址發生改變時,如果只更新了一張表中的數據,那麼這兩張表中就有了不一致的數據。
併發控制不當
比如某個訂票系統中,兩個用戶在同一時間訂同一張票,如果併發控制不當,可能會導致一張票被兩個用戶預訂的情況。當然這也與元數據的設計有關。
故障和錯誤
如果軟硬件發生故障造成數據丟失等情況,也可能引起數據不一致的情況。因此我們需要提供數據庫維護和數據恢復的一些措施。