Mysql读书笔记

309 阅读5分钟

《MYSLQ必知必会》(第二版) Ben Forta 笔记

  • order by排序 如果是多个列 是先对前面的列排序 如果前面列有一样的 再对后面列排序
  • 在多个列上降序排序 如果想在多个列上进行降序排序,必须对每个列指定DESC关键字。
  • WHERE子句的位置 在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误(关于ORDER BY的使用,请参阅第5章)。
  • SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符。
  • and优先级最高
  • IN操作符一般比OR操作符清单执行更快、
  • %表示任何字符出现任意次数
  • 但下划线只匹配单个字符而不是多个字符
  • 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
  • 把通配符置于搜索模式的开始处,搜索起来是最慢的。
  • 正则 把like 换成Regexp
  • | 为正则表达式的OR操作符。它表示匹配其中之一
  • []是另一种形式的OR语句。
  • .匹配任意字符
  • ^匹配串的开始
  • LIKE匹配整个串而REGEXP匹配子串。
  • 多数DBMS使用+或||来实现拼接,MySQL则使用Concat()函数来实现。
  • Concat()需要一个或多个指定的串,各个串之间用逗号分隔。
  • MySQL除了支持RTrim()(正如刚才所见,它去掉串右边的空格),还支持LTrim()(去掉串左边的空格)以及Trim()(去掉串左右两边的空格)。
  • soundex函数匹配发音类似
  • 如果你想要的仅是日期,则使用Date()是一个良好的习惯,
  • 只用于单个列 AVG()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出。为了获得多个列的平均值,必须使用多个AVG()函数。
  • 如果指定列名,则指定列的值为空的行被COUNT()函数忽略,但如果COUNT()函数中用的是星号(*),则不忽略。
  • 如果指定列名,则DISTINCT只能用于COUNT()。DISTINCT不能用于COUNT(*),因此不允许使用COUNT(DISTINCT),否则会产生错误。类似地,DISTINCT必须使用列名,不能用于计算或表达式。
  • GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。
  • 如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。
  • WHERE过滤指定的是行而不是分组
  • WHERE没有分组的概念。
  • WHERE过滤行,而HAVING过滤分组。
  • 意思就是使用了 group by 再where过滤是没用的 但是可以使用 having来过滤分组
  • where放在group by后面是没用的 所以要放前面 把having放在group by 的后面
  • GROUP BY子句时,应该也给出ORDER BY子句。这是保证数据正确排序的唯一方法。千万不要仅依赖GROUP BY排序数据。
  • 子查询(如这里所示),应该保证SELECT语句具有与WHERE子句中相同数目的列。通常,子查询将返回单个列并且与单个列匹配,但如果需要也可以使用多个列。
  • MySQL不支持full join
  • union的好处是不需要外键
  • set autocommit=0;就可以回滚插入操作(关闭MySQL的自动提交
  • 没有commit 就还能rollback
  • begin 或start transaction 手动开启回滚
  • MyISAM和InnoDB是两种最常使用的引擎。前者不支持明确的事务处理管理,而后者支持。
  • 提交(commit)指将未存储的SQL语句结果写入数据库表;
  • 事务(transaction)指一组SQL语句;
  • 显然,ROLLBACK只能在一个事务处理内使用(在执行一条START TRANSACTION命令之后
  • 保留点越多越好 可以在MySQL代码中设置任意多的保留点,越多越好。为什么呢?因为保留点越多,你就越能按自己的意愿灵活地进行回退。
  • DELETE不需要列名或通配符
  • 如果想从表中删除所有行,不要使用DELETE。可使用TRUNCATE TABLE语句,它完成相同的工作,但速度更快(TRUNCATE实际是删除原来的表并重新创建一个表,而不是逐行删除表中的数据)。
  • 除非确实打算更新和删除每一行,否则绝对不要使用不带WHERE子句的UPDATE或DELETE语句。
  • 在对UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不正确。
  • NULL值是没有值,它不是空串。
  • 空串是一个有效的值,它不是无值
  • NULL值用关键字NULL而不是空串指定。
  • 主键和NULL值 第1章介绍过,主键为其值唯一标识表中每个行的列。主键中只能使用不允许NULL值的列。允许NULL值的列不能作为唯一标识
  • 每个表只允许一个AUTO_INCREMENT列,而且它必须被索引(如,通过使它成为主键)
  • 使用默认值而不是NULL值 许多数据库开发人员使用默认值而不是NULL列,特别是对用于计算或数据分组的列更是如此。