本文最后更新于2 分钟前,文中所描述的信息可能已发生改变。
NULL值的处理
- 使用函数
COALESCE(arg1,arg2,agr3,...)
。其接收多个参数,返回其中不为 null 的值,全为 null则返回 null。 - 使用
IFNULL(arg1,arg2)
函数,如果 arg1 为null 则返回 arg2 否则返回 arg1 - 比较 null 值使用
IS NULL
和IS NOT NULL
或<=>
,其他比较符合比较 null 值都返回 null。
MySQL事务
事务必须满足:原子性、一致性、隔离性、持久性。MySQL中默认事务是自动提交的,使用SET AUTOCOMMIT=0;
可以禁止当前会话事务自动提交,设置为1即开启自动提交;BEGIN;
或START TRANSACTION;
可以显式的开启一个事务;SAVEPOINT savepoint_name;
用于设置一个事务保存点;ROLLBACK TO SAVEPOINT savepoint_name;
回滚到指定的保存点,类似快照一样。
ALTER语句
ALTER TABLE mytable ADD PRIMARY KEY (id);
添加主键约束。ALTER TABLE mytabel MODIFY id INT(4) AUTO_INCREMENT;
添加自增约束。ALTER TABLE mytable ADD COLUMN id INT(4) PRIMARY KEY AUTO_INCREMENT;
添加一个不存在的列且设置主键与自增约束。ALTER TABLE mytable DROP PRIMARY KEY;
删除不含自增约束的主键约束。ALTER TABLE mytable MODIFY id,DROP PRIMARY KEY;
同时删除主键约束与自增约束。
可以使用DESC mytable;
来查看表结构看是否修改成功。
索引
用于加快查找速度。
CREATE INDEX index_name ON mytable (id);
给表mytable的id字段创建一个索引。CREATE UNIQUE INDEX
可以创建唯一索引。DROP INDEX index_name ON mytable;
或ALTER TABLE mytable DROP INDEX index_name;
删除表 mytable 中索引名为 index_name 的索引。SHOW INDEX FROM mytable;
查看索引信息。
存储过程(MySql)
sql
DELIMITER $$
CREATE PROCEDURE name --存储过程名
(IN in_param INT,OUT out_param INT,INOUT inout_param INT) -- 参数列表
BEGIN
SELECT in_param;
SET out_param=6;
DECLARE temp INT; -- 定义存储过程中的变量,局部的在内部,使用关键字DECLARE
SET temp = 8;
SELECT temp;
END &&
DELIMITER ;
CALL name(12,@p); -- 调用存储过程,定义了一个用户变量p,全局的在外面定义,@定义用户变量
SHOW CREATE PROCEDURE name; -- 显示存储过程的定义,默认是当前数据库的
SHOW PROCEDURE STATUS; -- 显示系统中全部的存储过程
DROP PROCEDURE dbname.name; -- 删除dbname这个数据库中的存储过程name
复制表
sql
-- 法一 复制表的结构
CREATE TABLE new_tb SELECT * FROM old_tb WHERE 1=2;
CREATE TABLE new_tb LIKE old_tb;
SHOW CREATE TABLE tb_name; -- 显示创建表的完整语句,复制结果手动执行建表语句
-- 法二 复制表结构及其数据
CREATE TABLE new_tb SELECT * FROM old_tb;
DDL、DML、DQL、DCL
- DDL(数据定义语言)
- DML(数据操纵语言)
- DQL(数据查询语言)
- DCL(数据控制语言):比较少用,比如授权GRANT与取消授权REVOKE
TRUNCATE与DELETE
TRUNCATE和DROP一样属于DDL、用于删除表的数据而不改变表的结构。
- truncate会重置水位线,高水位线会影响全表扫描,因为MySQL全表扫描时会扫描水位线以下的数据。而使用delete删除数据时水位线并不会下降,导致删除了数据查询效率反而没有提升。
- truncate不会触发一些触发器。
- 使用truncate删除的数据不能回滚,也可以说不需要支持回滚,删除效率高。
SQL优化
- 使用慢查询来定位慢SQL
- 使用 Explain 分析来查看SQL语句的执行过程,使用 EXPLAIN 关键字可以模拟优化器执行 SQL 查询语句,从而知道 MySQL 是如何处理你的 SQL 语句的;通过查询出来的 type 字段可以知道 MySQL 是通过何种方式找到所需行的从而可以分析查询的性能。通过 key_len 字段可以知道索引被使用的情况,索引被使用的越多该值越大查询性能越好