「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