以下笔记内容来自《PHP与MySQL动态网站开发(第4版)》
- 对于几乎所有的数据库应用程序都是如此:
- 文本(即字符串)
- 数字
- 日期和时间
- 存储为
CHAR
的任何内容将总是被存储为具有列长度的字符串(使用空格填充它;在从数据库中检索存储的值时将删除这些空格)。 - 如果你在使用非整形时需要绝对精度,
DECIMAL
要比FLOAT
和DOUBLE
合适。 - 当发生
INSERT
或UPDATE
时,会自动把TIMESTAMP
字段类型设置成当前日期和时间,即使没有为那个特定的字段指定任何值。如果一张表具有多个TIMESTAMP
列,那么在执行INSERT
或UPDATE
时,只会更新其中的第一个列。 DESCRIBE tablename
语句与SHOW COLUMNS FROM tablename
语句等价。- 当在SQL语句中使用任何函数时,不要用引号括住它。
- 你偶尔会在SQL命令中看到使用反绰号(`)。这个字符与波浪符(~)是同一个键,它与单引号不同。反引号用来安全地引用可能与已存在的MySQL关键词重复的表名或列名。
INSERT
中一个有意思的变化是REPLACE
。REPLACE
语句的作用是,如果使用的表的主键或唯一索引的值已经存在,那么REPLACE
会更新存在的行;如果不存重复则会同INSERT
一样插入新行。- MySQL支持关键字
TRUE
与FALSE
,不区分大小写。在内部,TRUE
等于1而FALSE
等于0。因此,TRUE+TRUE=2
。 - 带有
LIKE
条件语句的查询一般比较慢,因为它们不能利用索引,所以仅当绝对需要时才应该使用这种格式。 - 为了在
LIKE
或NOT LIKE
查询中使用原意的下划线或百分号,需要对它们进行转义(在字符前放置一个反斜杠),使得不会把它们与通配符相混淆。 FULLTEXT
查找通常比LIKE
查询要好一些。- 如果有一个gender列,定义为
ENUM('M','F')
,子句ORDER BY gender
返回的结果是M记录在前。 - 应该从来都不需要在主键列上执行一个
UPDATE
,因为这个值应该从不发生变化。更改主键的值可能造成严重的后果。 - 即使
SELECT
查询只返回一行,也要格外小心,将LIMIT 1
子句添加到DELETE查询中。 - 如果创建的主键没有任何其他意义和目的,就称其为
代理主键
。 - MySQL只允许每个表有一个主键,虽然你可以让主键基于多列(这表示这些列的组合必须唯一且永远不变)。
- 理想情况下,主键应该是整数,使MySQL性能更佳。
- 第一范式(1NF):
- 每一列必须仅包含一个值(有时候这被描述为
原子性
或不可分割性
); - 所有表都不能具有相关数据的重复列。
- 每一列必须仅包含一个值(有时候这被描述为
- 如果内联结中引用的列值为NULL,则永远不会有返回值,因为没有值会匹配NULL,包括NULL。
- 左联结要考虑的最重要的内容是首先指定哪个表。
- SQL可以执行
自联结
:让表自己联结自己。 - 你可以通过
database.table.column
语法跨库执行联结,条件是所有数据库都在同一服务器上(不能跨网络),并且使用联结的用户需要有权限访问所有涉及的表。 NULL
是一个特殊的值,有趣的是GROUP BY
将会NULL
值分到同一组,因为他们有相同的空值。- 另一个相关的子句是
HAVING
,它类似竽一个组的WHERE条件。 - 不能将
SUM()
和AVG()
直接应用于日期或日间值。你需要将日期和时间值转换为秒,执行SUM()
和AVG()
函数,并且然后将这个值换回日期和时间。 IFNULL()
函数有时可以用来代替COALESCE()
。它的语法是:
IFNULL(value,reutnr_if_null)
如果第一个参数是一个指定列,包含NULL值,那么将返回第二个参数。如果参数不包含NULL值,则返回该参数的值。FULLTEXT
搜索需要FULLTEXT
索引,这种类型的索引,只能在MyISAM
表中创建。如果50%以上的记录与关键字匹配,则不会返回记录。OPTIMIZE TABLE tablename
在通过ALTER
命令改变表或对表进行了大量的删除操作后,在记录之间会留下虚拟的间断,而运行这个命令可以 优化数据库。
其次,你可以偶尔使用ANALYZE命令:
ANALYZE TABLE tablename
执行此命令更新表中的索引,从而改善它们在查询中的使用情况。每当存储表中的数据发生批量更改的时候(例如,通过UPDATE
或INSERT
命令)可以执行这个命令。数据库优化
数据库的性能主要依赖于它的结构和索引。创建数据库时尽量:- 选择最佳的存储引擎;
- 尽量为每列使用最小的数据类型;
- 尽可能定义不可为空(
NOT NULL
)的列; - 为主键使用整数;
- 明智而谨慎地定义索引,选择正确的类型应用到恰当的一列或多列;
- 如果可能的话限制索引为固定数目的字符;
- 避免创建太多的索引;
- 确保作为联结基础的列是相同的类型,如果是字符串的话,使用相同的字符集和校对规则。