MySQL 学习笔记 基础篇

mysqld 客户/服务器程序
libmysqld 嵌入式服务器库:不需要网络
使用IS NULL 或IS NOT NULL来对NULL 进行查找。<=>
IF(rowname IS NULL, 0, 1) 条件选择语句
ORDER BY RAND() LIMIT num 随机取出num条记录
SELECT CONCAT(row_name1, ‘ ‘, row_name2) AS name 合并列字符串为name=row_name1 row_name2
日期:1970-01-01
按日期排序/查找某个日期或范围/提取年月日(WHERE MONTH(birth) = 3)/计算距离/加减时间间隔 YEAR(), MONTH(), DAYOFMONTH(), CURDATE()
LIKE/NOT LIKE :
匹配一个字符,%匹配任何一个字符序列
变量:SELECT @var := value
SELECT @today := CURDATE();
去重复:SELECT DISTINCT row_name FROM table_name
COUNT()统计被选中的数据行的总数,COUNT(row_name)只统计全体非NULL值的个数。
COUNT(
) FROM table_name GROUP BY row_name
SELECT row_name, COUNT(*) AS count FROM table_name GROUP BY state HAVING count > 1 ORDER BY count DESC;
函数MIN(), MAX(), SUM(), AVG()能够得出某个数据列你的最小值/最大值/总和和平均值。
WITH ROLLUP 超级聚合


MySQL存储引擎


InnoDB数据表的内容都集中保存在一个共享存储空间里。

MySQL存储引擎的索引特性
ALTER TABLE tbl_name ADD INDEX/UNIQUE/PRIMARY KEY/FULLTEXT/SPATIAL index_name (index_columns); // index_name 是可选的,若省略,MySql将自动挑选一个。
CREATE INDEX index_name ON tbl_name (index_columns); // 同上,且不支持PRIMERY KEY


INNER JOIN(CROSS JOIN/JOIN):内连接,笛卡尔积
LEFT/RIGHT JOIN :外连接,找不到匹配的用NULL代替(这个特征可以让你知道右/左数据表里缺少了那些数据行。如:哪些库存商品一件也没卖出去?)
EXISTS/NOT EXISTS 测试某个子查询是否返回了数据行 0/1
IN/NOT IN 测试一个给定的比较值有没有出现在一个特定的集合里
ALL/ANY/SOME : <= ALL(SELECT…) 测试比较值是否与子查询所返回的部分或一部分匹配


UNION : 同一条 UNION 语句里的各有关数据列会是相同的数据类型,如果不一样,MySql会进行必要的类型转换。UNION将剔除重复的数据行(UNION ALL)。


视图:CREATE VIEW view_name AS SELECT…


事物:ACID原则:Atomic/Consistent/Isolated/Durable
START TRANSACTION;

SAVEPOINT point_name;

ROLLBACK TO SAVEPOINT point_name;

COMMIT/ROLLBACK;


SET autocommit = 0; // 禁用自动提交模式

COMMIT/ROLLBACK;
用来创建/改变或删除数据库其中的对象的DLL语句以及与锁定有关的语句都不能成为事物的一部分。


外键:InnoDB存储引擎通过这些规则来保证在外键关系里不会有不匹配的东西,这杯称为引用完整性。


FULLTEXT 索引:CHAR/VARCHAR/TEXT

自然语言模式:忽略至少在一半数据行里出现过的单词(50%规则),忽略the/after/other等”休止单词“,结果按相关程度排序
布尔模式:无50%规则,结果不按相关度排序,可以在没被包括在FULLTEXT索引里的数据列上进行
查询扩展模式:搜索分两阶段进行:第一阶段是自然语言搜索,第二阶段使用原来的搜索字符串加上在第一次搜索中找到的相关度最高的匹配数据再进行一次搜索


BINAARY(20)容纳20个字节,CHAR(20)容纳20个字符

BLOB和TEXT数据列的删除和修改操作很容易在数据表里产生大量碎片,如果使用了一个MyISAM数据表来保存BLOB或TEXT值,应该定期运行OPTIMIZE TABLE命令以减少碎片和改善系统性能。


对于数值数据或TIME数据列,超出合法范围的值将被截短到最近的取值范围边界

对于字符串数据列,太长的字符串将被截短到数据列的最大长度


LAST_INSERT_ID()返回AUTO_INCREMENT最近生成的序号值。
MyISAM/InnoDB : CREATE/ALTER TABLE AUTO_INCREMENT = n
MyISAM存储索引支持使用符合(多数据列)索引在同一数据表里创建镀铬相互独立的序列:微数据表创建一个由多个数据列组成的PRIMARY KEY或UNIQUE索引,并把一个AUTO_INCREMENT数据列包括在这个索引里作为它的最后一个数据列。
MyISAM:长度固定的数据行会比长度可变的数据行有更好的性能表现。
InnoDB在内存里维护计数器以生成后续的序号值,如果从顶端删除了一些值以后重启服务器,这些序号值将被重复使用。
TRUNCATE TABLE 重置计数序列
重新编排:先删除该数据列,然后再重新添加它


MySQL使用索引的方式有:

  • 在查询中把与WHERE字句所给出的条件相匹配的数据行尽快找出来;
  • 在关联操作中把与其他数据表里的数据行相匹配的数据行尽快找出来;
  • 对于使用MIN()或MAX()的查询,索引能迅速找到最小值和最大值;
  • 可以通过索引来避免微一个查询整体读取数据行。
    缺点:
  • 降低了在带索引的数据列里插入/删除/修改数值的速度(需要同时修改索引);
  • 索引要占据磁盘空间,这会使你较快地到达数据表的尺寸极限。