一定有你不知道的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;
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章