「MySQL必知必会」,上大学时,每个计算机专业的学生必备的数据库神书。当时觉得枯燥乏味,毕业5年后,重新阅读了此书,发现此书真的是一本通俗易懂、涉及知识面广但浅尝辄止的数据库入门书。
以下为此次阅读后一些新的认识的总结。
select discitct name,age from users;
LIKE和REGEXP的不同在于,LIKE匹配整个串而REGEXP匹配子串。利用定位符,通过用^开始每个表达式,用$结束每个表达式,可以使REGEXP的作用与LIKE一样。
MySQL默认查询结果不区分大小写,如一下SQL语句,会把表中name为「apple」、「APPLE」、「Apple」、「aPPle」等结果都查出来。
select * from fruit where name = 'apple'
如果只想查出「apple」,需要在字段前增加「BINARY」关键字,那么MySQL将进行区分大小写的查询,只会查出「apple」
(1) GROUP BY 子句中列出的每个列都必须是检索列或有效的表达式 (但不能是聚集函数)。
(2) 如果在 SELECT 中使用表达式, 则必须在GROUP BY子句中指定相同的表达式,不能使用别名。
(3) 除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出。
这里有另一种理解方法,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。
组合查询意味着必须要有两条及以上的select语句,且两个语句中的字段必须一样,顺序可不一样。
UNION:去处重复的行
UNION ALL:不去重重复的行
TRUNCATE实际是删除原来的表并重新创建一个表,而不是逐行删除表中的数据
(1)创建
create view audit_users as select * from users where age >= 18
Notice 如果视图定义中有以下操作,则不能进行视图的更新:
(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;
创建
create trigger 触发器名 before 操作名(insert,update,delete) on 表 for each row
(1)可引用NEW虚拟表
(2)before前也可被更新
(3)auto_increment插入前为0,后为自增数
(1)可引用OLD虚拟表
(2)OLD虚拟表数据为只读
(1)可引用OLD和NEW的虚拟表
(2)NEW虚拟表在update之前也可改变
(3)OLD虚拟表不可改变
创建
SAVEPOINT sp1
回滚
rollback to sp1