「MySQL必知必会」,上大学时,每个计算机专业的学生必备的数据库神书。当时觉得枯燥乏味,毕业5年后,重新阅读了此书,发现此书真的是一本通俗易懂、涉及知识面广但浅尝辄止的数据库入门书。
以下为此次阅读后一些新的认识的总结。

1.DISTINCT-查询去重所有的字段的结果集,如下SQL会查询users表中name和age排重后的结果集

select discitct name,age from users;

2.LIKE和REGEXP的异同

LIKE和REGEXP的不同在于,LIKE匹配整个串而REGEXP匹配子串。利用定位符,通过用^开始每个表达式,用$结束每个表达式,可以使REGEXP的作用与LIKE一样。

3.BINARY区分大小写(MySQL3.23.4后)

MySQL默认查询结果不区分大小写,如一下SQL语句,会把表中name为「apple」、「APPLE」、「Apple」、「aPPle」等结果都查出来。

select * from fruit where name = 'apple'

如果只想查出「apple」,需要在字段前增加「BINARY」关键字,那么MySQL将进行区分大小写的查询,只会查出「apple」

4.GROUP BY的使用

(1) GROUP BY 子句中列出的每个列都必须是检索列或有效的表达式 (但不能是聚集函数)。
(2) 如果在 SELECT 中使用表达式, 则必须在GROUP BY子句中指定相同的表达式,不能使用别名。
(3) 除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出。

5.分组后的筛选-HAVING

这里有另一种理解方法,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。

5.组合查询:UNION和UNION ALL

组合查询意味着必须要有两条及以上的select语句,且两个语句中的字段必须一样,顺序可不一样。

UNION:去处重复的行
UNION ALL:不去重重复的行

6.truncate table比delete from table效率更高

TRUNCATE实际是删除原来的表并重新创建一个表,而不是逐行删除表中的数据

7.视图

(1)创建

create view audit_users as select * from users where age >= 18

Notice 如果视图定义中有以下操作,则不能进行视图的更新:

  • 分组(使用GROUP BY和HAVING);
  • 联结;
  • 子查询;
  • 并;
  • 聚集函数(Min()、Count()、Sum()等);
  • DISTINCT;
  • 导出(计算)列。

8.存储过程

(1)添加

如下假设添加一个计算会员id为5的用户,下订单订单实际支付价格的存储过程,传入一个订单金额的参数,传出实际支付金额的参数

-- 如果存在就删除calculate_amount存储过程
DROP PROCEDURE IF EXISTS calculate_amount; 
-- 创建存储过程calculate_amount
CREATE PROCEDURE calculate_amount (
    IN order_amount DECIMAL (10,2),
    OUT receivable_amount DECIMAL (10,2)) BEGIN 
-- 取出会员的折扣
SELECT discount FROM users WHERE id = 5 INTO @discount;-- 0.85
-- 计算折后价格
SELECT (order_amount*@discount) INTO receivable_amount;
END; 
-- 调用calculate_amount存储过程
CALL calculate_amount (100,@receivable_amount); 
-- @receivable_amount调用变量不会输出,要select一下
SELECT @receivable_amount;

9.触发器

创建

create trigger 触发器名 before 操作名(insert,update,delete) on 表 for each row
  • insert

(1)可引用NEW虚拟表
(2)before前也可被更新
(3)auto_increment插入前为0,后为自增数

  • delete

(1)可引用OLD虚拟表
(2)OLD虚拟表数据为只读

  • update

(1)可引用OLD和NEW的虚拟表
(2)NEW虚拟表在update之前也可改变
(3)OLD虚拟表不可改变

10.事务保留点

创建
SAVEPOINT sp1

回滚
rollback to sp1