一定有你不知道的MySQL易錯點-基礎篇-必知必會

MySQL易錯點總結-基礎篇-必知必會

  1. 數據庫和數據庫管理系統的概念

    答:數據庫是保存有組織的數據的容器,DBMS是我們通過其對數據庫進行操作的軟件。

  2. 什麼是模式

    答:模式是關於數據庫和表的佈局及特性的信息。

  3. SQL語句不區分大小寫,但表名,列名有可能區分(mysql版本,5版本以後不區分)。同時,MySQL在執行匹配時默認不區分大小寫,所以在select fuses中,fuses與Fuses同樣匹配。

  4. 不能部分使用DISTINCT DISTINCT關鍵字應用於所有列而 不僅是前置它的列。如果給出SELECT DISTINCT vend_id, prod_price,除非指定的兩個列都不同,否則所有行都將被 檢索出來。

  5. 檢索出來的第一行爲行0而不是行1。

  6. 關係數據庫設計理論認爲,如果不明確規定排序順序,則不應該假定檢索出的數據的順序有意義。

  7. ORDER BY用非 檢索的列排序數據是完全合法的。 如果不指定DESC,則該命令默認按照升序排列。

  8. 對文本數據進行排序時,A與a是否相同取決於數據庫如何設置,在dictionary排序中,A與a被視爲相同。

  9. NULL ,無值(no value),它與字段包含0、空字符串或僅僅包含空格不同。

  10. SQL(像多數語言一樣)在處理OR操作符前,優先處理AND操作符。可以使用圓括號消除歧義。

  11. IN操作符一般比OR操作符清單執行更快。

  12. 根據MySQL的配置方式,搜索可以是區分大小 寫的。如果區分大小寫,like 'jet%‘與JetPack 1000將不匹配。注意’%'不能匹配NULL。

  13. 在確實需要使用通配符時,除非絕對有必要,否則不要把它們用 在搜索模式的開始處。把通配符置於搜索模式的開始處,搜索起 來是最慢的。

  14. LIKE匹配整個列。如果被匹配的文本在列值 中出現,LIKE將不會找到它,相應的行也不被返回(除非使用 通配符)。而REGEXP在列值內進行匹配,如果被匹配的文本在 列值中出現,REGEXP將會找到它,相應的行將被返回。這是一 個非常重要的差別。 即REGEXP是包含即可。

  15. MySQL中的正則表達式匹配(自版本 3.23.4後)不區分大小寫(即,大寫和小寫都匹配)。爲區分大小寫,可使用BINARY關鍵字,如WHERE prod_name REGEXP BINARY ‘JetPack .000’。

  16. 除非把字符|括在一個集合中,否則它將應用於整個串。

  17. ^有兩種用法。在集合中(用[和]定義),用它來否定該集合,否則,用來指串的開始處。例如 [^0-9]和正則中使用。

  18. 可以在不使用數據庫表的情況下用 SELECT來測試正則表達式。REGEXP檢查總是返回0(沒有匹配) 或1(匹配)。可以用帶文字串的REGEXP來測試表達式,並試驗它們。下個語句返回0。select ‘hello’ regexp ‘[0-9]’;。

  19. 如何測試計算 ,SELECT提供了測試和試驗函數與計算的一個 很好的辦法。雖然SELECT通常用來從表中檢索數據,但可以 省略FROM子句以便簡單地訪問和處理表達式。例如,SELECT 3*2;將返回6,SELECT Trim(‘abc’);將返回abc,而SELECT Now()利用Now()函數返回當前日期和時間。

  20. 多數DBMS使用+或||來實現拼接, MySQL則使用Concat()函數來實現。當把SQL語句轉換成 MySQL語句時一定要把這個區別銘記在心。

  21. 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')
    
  22. 不管是插入或更新表值還是用WHERE子句進行過濾,日期必須爲 格式yyyy-mm-dd。因此,2005年9月1日,給出爲2005-09-01。雖然其他的 日期格式可能也行,但這是首選的日期格式,因爲它排除了多義性。

  23. 如果要的是日期,請使用Date() 如果你想要的僅是日期, 則使用Date()是一個良好的習慣,即使你知道相應的列只包含日期也是如此。

    select cust_id,order_num
    from orders
    where Date(order_date) ='2005-09-01'
    
  24. 聚集函數AVG()忽略列值爲NULL的行。 COUNT()函數有兩種使用方式。
    使用COUNT(*)對錶中行的數目進行計數,不管表列中包含的是空值(NULL)還是非空值。使用COUNT(column)對特定列中具有值的行進行計數,忽略 NULL值。MAX()函數忽略列值爲NULL的行。 對於文本數據MAX()返回最後一行。

  25. 如果指定列名,則DISTINCT只能用於COUNT()。DISTINCT 不能用於COUNT(*),因此不允許使用COUNT(DISTINCT), 否則會產生錯誤。類似地,DISTINCT必須使用列名,不能用於計算或表達式。

    select AVG(DISTINCT pro_price) AS avg_price
    from products
    where vend_id = 100
    
  26. GROUP BY子句中列出的每個列都必須是檢索列或有效的表達式 (但不能是聚集函數)。如果在SELECT中使用表達式,則必須在 GROUP BY子句中指定相同的表達式。不能使用別名。 除聚集計算語句外,SELECT語句中的每個列都必須在GROUP BY子 句中給出。

  27. WHERE在數據分組前進行過濾,HAVING在數據分組後進行過濾。這是一個重要的區別,WHERE排除的行不包括在分組中。這可能會改變計算值,從而影響HAVING子句中基於這些值過濾掉的分組。 HAVING中聚集函數必須指出,不要使用別名。

  28. SQL執行順序

    子句 說明 是否必須使用
    select 要返回的列或表達式
    from 從中檢索數據的表 僅在從表選擇數據時使用
    where 行級過濾
    group by 分組說明 僅在按組聚集計算時使用
    having 組級過濾
    order by 輸出排序順序
    limit 要檢索的行數
  29. 任何時候只要列名可能有多義 性,就必須使用相關子查詢(表名和列名由一個句點分隔)而非直接使用列名。

  30. 由沒有聯結條件的表關係返回 的結果爲笛卡兒積。檢索出的行的數目將是第一個表中的行數乘 以第二個表中的行數。

  31. 在使用INNER JOIN時,聯結條件用特定的ON子句而不是WHERE 子句給出。傳遞給ON的實際條件與傳遞給WHERE的相同。 SQL規範首選INNER JOIN而不是簡單的JOIN。

  32. 自聯結通常作爲外部語句用來替代 從相同表中檢索數據時使用的子查詢語句。雖然最終的結果是 相同的,但有時候處理聯結遠比處理子查詢快得多。(需要指定不同的表別名)。

  33. UNION中的每個查詢必須包含相同的列、表達式或聚集函數(不過各個列不需要以相同的次序列出)。且列數據類型必須兼容:類型不必完全相同,但必須是DBMS可以 隱含地轉換的類型(例如,不同的數值類型或不同的日期類型)。

  34. 不要在導入數據時使用FULLTEXT 。FULLTEXT在創建表使用或者導入完成後對錶進行修改。

  35. 文本中詞靠前的行的等級值比詞靠後的 行的等級值高。 而且全文搜索比LIKE快。例如下面返回的rabbit如果出現在第二個詞比出現在第20個詞的排序高,先返回。

    select note_text
    from productnotes
    where Match(note_text) Against('rabbit')
    
  36. 一般不要使用沒有明確給出列的列表的 INSERT語句。插入數據最好指定列名。

  37. 如果數據檢索是最重要的(通常是這樣),則你可以通過在 INSERT和INTO之間添加關鍵字LOW_PRIORITY,指示MySQL 降低INSERT語句的優先級。且同樣適用於UPDATE和DELETE操作。

    insert low_priority into
    
  38. 如果用UPDATE語句更新多行,並且在更新這些 行中的一行或多行時出一個現錯誤,則整個UPDATE操作被取消 (錯誤發生前更新的所有行被恢復到它們原來的值)。即使是發 錯誤,也繼續進行更新,可使IGNORE關鍵字.

    UPDATE IGNORE customers
    SET [email protected]
    where customers.id = 10001
    
  39. 如果想從表中刪除所有行,不要使用DELETE。 可使用TRUNCATE TABLE語句,它完成相同的工作,但速度更快。

  40. 如果你僅想在一個表不存在時創建它,應該在表名後給出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;
    
  41. 主鍵中只能使用不允許NULL值的列。允許NULL值的 列不能作爲唯一標識。

  42. 每個表只允許一個AUTO_INCREMENT列,而且它必須被索引(如,通 過使它成爲主鍵)。SELECT last_insert_id()函數可以獲得最後一個auto_increment的值

  43. 不同引擎有不同的特性。

    • InnoDB是一個可靠的事務處理引擎,它不支持全文 本搜索;
    • MEMORY在功能等同於MyISAM,但由於數據存儲在內存(不是磁盤) 中,速度很快(特別適合於臨時表);
    • MyISAM是一個性能極高的引擎,它支持全文本搜索, 但不支持事務處理

    注意:不用引擎的表不能夠互相引用。

  44. ALTER TBALE一般用於定義外鍵,因爲表一旦固定最好不要更替。ALTER語句DROP掉一列後不可撤銷。

    alter table orderitems
    add constraint fk_order_orders
    foreign key (order_num) references orders (order_num);
    
  45. 爲什麼要使用視圖?(因爲視圖不包含數據,所以每次使用視圖時,都必須處理查詢執行時所需的任一個檢索。所以有時候性能會下降。)(如果你對視圖增加或刪除行,實際上是對其基表增加或刪除行。)

    • 重用SQL語句。
    • 簡化複雜的SQL操作。在編寫查詢後,可以方便地重用它而不必 知道它的基本查詢細節。
    • 使用表的組成部分而不是整個表。
    • 保護數據。可以給用戶授予表的特定部分的訪問權限而不是整個 表的訪問權限。
    create view orderview as
    select order_num
    from orderitems;
    
    • 使用表的組成部分而不是整個表。
    • 保護數據。可以給用戶授予表的特定部分的訪問權限而不是整個 表的訪問權限。
    create view orderview as
    select order_num
    from orderitems;
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章