MySQL易錯點總結-基礎篇-必知必會
-
數據庫和數據庫管理系統的概念
答:數據庫是保存有組織的數據的容器,DBMS是我們通過其對數據庫進行操作的軟件。
-
什麼是模式
答:模式是關於數據庫和表的佈局及特性的信息。
-
SQL語句不區分大小寫,但表名,列名有可能區分(mysql版本,5版本以後不區分)。同時,MySQL在執行匹配時默認不區分大小寫,所以在select fuses中,fuses與Fuses同樣匹配。
-
不能部分使用DISTINCT DISTINCT關鍵字應用於所有列而 不僅是前置它的列。如果給出SELECT DISTINCT vend_id, prod_price,除非指定的兩個列都不同,否則所有行都將被 檢索出來。
-
檢索出來的第一行爲行0而不是行1。
-
關係數據庫設計理論認爲,如果不明確規定排序順序,則不應該假定檢索出的數據的順序有意義。
-
ORDER BY用非 檢索的列排序數據是完全合法的。 如果不指定DESC,則該命令默認按照升序排列。
-
對文本數據進行排序時,A與a是否相同取決於數據庫如何設置,在dictionary排序中,A與a被視爲相同。
-
NULL ,無值(no value),它與字段包含0、空字符串或僅僅包含空格不同。
-
SQL(像多數語言一樣)在處理OR操作符前,優先處理AND操作符。可以使用圓括號消除歧義。
-
IN操作符一般比OR操作符清單執行更快。
-
根據MySQL的配置方式,搜索可以是區分大小 寫的。如果區分大小寫,like 'jet%‘與JetPack 1000將不匹配。注意’%'不能匹配NULL。
-
在確實需要使用通配符時,除非絕對有必要,否則不要把它們用 在搜索模式的開始處。把通配符置於搜索模式的開始處,搜索起 來是最慢的。
-
LIKE匹配整個列。如果被匹配的文本在列值 中出現,LIKE將不會找到它,相應的行也不被返回(除非使用 通配符)。而REGEXP在列值內進行匹配,如果被匹配的文本在 列值中出現,REGEXP將會找到它,相應的行將被返回。這是一 個非常重要的差別。 即REGEXP是包含即可。
-
MySQL中的正則表達式匹配(自版本 3.23.4後)不區分大小寫(即,大寫和小寫都匹配)。爲區分大小寫,可使用BINARY關鍵字,如WHERE prod_name REGEXP BINARY ‘JetPack .000’。
-
除非把字符|括在一個集合中,否則它將應用於整個串。
-
^有兩種用法。在集合中(用[和]定義),用它來否定該集合,否則,用來指串的開始處。例如 [^0-9]和正則中使用。
-
可以在不使用數據庫表的情況下用 SELECT來測試正則表達式。REGEXP檢查總是返回0(沒有匹配) 或1(匹配)。可以用帶文字串的REGEXP來測試表達式,並試驗它們。下個語句返回0。select ‘hello’ regexp ‘[0-9]’;。
-
如何測試計算 ,SELECT提供了測試和試驗函數與計算的一個 很好的辦法。雖然SELECT通常用來從表中檢索數據,但可以 省略FROM子句以便簡單地訪問和處理表達式。例如,SELECT 3*2;將返回6,SELECT Trim(‘abc’);將返回abc,而SELECT Now()利用Now()函數返回當前日期和時間。
-
多數DBMS使用+或||來實現拼接, MySQL則使用Concat()函數來實現。當把SQL語句轉換成 MySQL語句時一定要把這個區別銘記在心。
-
WHERE子句使用Soundex()函數來轉換cust_ contact列值和搜索串爲它們的SOUNDEX值。因爲Y.Lee和 Y.Lie發音相似,所以它們的SOUNDEX值匹配,因此WHERE子句正確地過濾出了所需的數據。
select cust_name ,cust_contact from customers where soundex(cust_name) = soundex('Y Lie')
-
不管是插入或更新表值還是用WHERE子句進行過濾,日期必須爲 格式yyyy-mm-dd。因此,2005年9月1日,給出爲2005-09-01。雖然其他的 日期格式可能也行,但這是首選的日期格式,因爲它排除了多義性。
-
如果要的是日期,請使用Date() 如果你想要的僅是日期, 則使用Date()是一個良好的習慣,即使你知道相應的列只包含日期也是如此。
select cust_id,order_num from orders where Date(order_date) ='2005-09-01'
-
聚集函數AVG()忽略列值爲NULL的行。 COUNT()函數有兩種使用方式。
使用COUNT(*)對錶中行的數目進行計數,不管表列中包含的是空值(NULL)還是非空值。使用COUNT(column)對特定列中具有值的行進行計數,忽略 NULL值。MAX()函數忽略列值爲NULL的行。 對於文本數據MAX()返回最後一行。 -
如果指定列名,則DISTINCT只能用於COUNT()。DISTINCT 不能用於COUNT(*),因此不允許使用COUNT(DISTINCT), 否則會產生錯誤。類似地,DISTINCT必須使用列名,不能用於計算或表達式。
select AVG(DISTINCT pro_price) AS avg_price from products where vend_id = 100
-
GROUP BY子句中列出的每個列都必須是檢索列或有效的表達式 (但不能是聚集函數)。如果在SELECT中使用表達式,則必須在 GROUP BY子句中指定相同的表達式。不能使用別名。 除聚集計算語句外,SELECT語句中的每個列都必須在GROUP BY子 句中給出。
-
WHERE在數據分組前進行過濾,HAVING在數據分組後進行過濾。這是一個重要的區別,WHERE排除的行不包括在分組中。這可能會改變計算值,從而影響HAVING子句中基於這些值過濾掉的分組。 HAVING中聚集函數必須指出,不要使用別名。
-
SQL執行順序
子句 說明 是否必須使用 select 要返回的列或表達式 是 from 從中檢索數據的表 僅在從表選擇數據時使用 where 行級過濾 否 group by 分組說明 僅在按組聚集計算時使用 having 組級過濾 否 order by 輸出排序順序 否 limit 要檢索的行數 否 -
任何時候只要列名可能有多義 性,就必須使用相關子查詢(表名和列名由一個句點分隔)而非直接使用列名。
-
由沒有聯結條件的表關係返回 的結果爲笛卡兒積。檢索出的行的數目將是第一個表中的行數乘 以第二個表中的行數。
-
在使用INNER JOIN時,聯結條件用特定的ON子句而不是WHERE 子句給出。傳遞給ON的實際條件與傳遞給WHERE的相同。 SQL規範首選INNER JOIN而不是簡單的JOIN。
-
自聯結通常作爲外部語句用來替代 從相同表中檢索數據時使用的子查詢語句。雖然最終的結果是 相同的,但有時候處理聯結遠比處理子查詢快得多。(需要指定不同的表別名)。
-
UNION中的每個查詢必須包含相同的列、表達式或聚集函數(不過各個列不需要以相同的次序列出)。且列數據類型必須兼容:類型不必完全相同,但必須是DBMS可以 隱含地轉換的類型(例如,不同的數值類型或不同的日期類型)。
-
不要在導入數據時使用FULLTEXT 。FULLTEXT在創建表使用或者導入完成後對錶進行修改。
-
文本中詞靠前的行的等級值比詞靠後的 行的等級值高。 而且全文搜索比LIKE快。例如下面返回的rabbit如果出現在第二個詞比出現在第20個詞的排序高,先返回。
select note_text from productnotes where Match(note_text) Against('rabbit')
-
一般不要使用沒有明確給出列的列表的 INSERT語句。插入數據最好指定列名。
-
如果數據檢索是最重要的(通常是這樣),則你可以通過在 INSERT和INTO之間添加關鍵字LOW_PRIORITY,指示MySQL 降低INSERT語句的優先級。且同樣適用於UPDATE和DELETE操作。
insert low_priority into
-
如果用UPDATE語句更新多行,並且在更新這些 行中的一行或多行時出一個現錯誤,則整個UPDATE操作被取消 (錯誤發生前更新的所有行被恢復到它們原來的值)。即使是發 錯誤,也繼續進行更新,可使IGNORE關鍵字.
UPDATE IGNORE customers SET [email protected] where customers.id = 10001
-
如果想從表中刪除所有行,不要使用DELETE。 可使用TRUNCATE TABLE語句,它完成相同的工作,但速度更快。
-
如果你僅想在一個表不存在時創建它,應該在表名後給出IF NOT EXISTS
create table vendors if not exists( vend_id int not null auto_increment, vend_name char null, quantity int not null default 1 primary key(vend_id) )engine=InnoDB;
-
主鍵中只能使用不允許NULL值的列。允許NULL值的 列不能作爲唯一標識。
-
每個表只允許一個AUTO_INCREMENT列,而且它必須被索引(如,通 過使它成爲主鍵)。SELECT last_insert_id()函數可以獲得最後一個auto_increment的值
-
不同引擎有不同的特性。
- InnoDB是一個可靠的事務處理引擎,它不支持全文 本搜索;
- MEMORY在功能等同於MyISAM,但由於數據存儲在內存(不是磁盤) 中,速度很快(特別適合於臨時表);
- MyISAM是一個性能極高的引擎,它支持全文本搜索, 但不支持事務處理
注意:不用引擎的表不能夠互相引用。
-
ALTER TBALE一般用於定義外鍵,因爲表一旦固定最好不要更替。ALTER語句DROP掉一列後不可撤銷。
alter table orderitems add constraint fk_order_orders foreign key (order_num) references orders (order_num);
-
爲什麼要使用視圖?(因爲視圖不包含數據,所以每次使用視圖時,都必須處理查詢執行時所需的任一個檢索。所以有時候性能會下降。)(如果你對視圖增加或刪除行,實際上是對其基表增加或刪除行。)
- 重用SQL語句。
- 簡化複雜的SQL操作。在編寫查詢後,可以方便地重用它而不必 知道它的基本查詢細節。
- 使用表的組成部分而不是整個表。
- 保護數據。可以給用戶授予表的特定部分的訪問權限而不是整個 表的訪問權限。
create view orderview as select order_num from orderitems;
- 使用表的組成部分而不是整個表。
- 保護數據。可以給用戶授予表的特定部分的訪問權限而不是整個 表的訪問權限。
create view orderview as select order_num from orderitems;