点击查看合集

索引

索引用于快速找出在某个列中有某个个特定值的行。如果不适用索引,mysql必须从第一条数据开始然后读完整个表直到找出相关行。表越大,花费的时间也就越长。
但是索引也不是越多越好,要尽量用条件列作为索引。这样可以最大限度地提高sql的执行效率。并且要尽量使用唯一列作为索引。例如,如果用性别作为索引的话,结果只有男/女,对查询的帮助不大,反而会增大磁盘空间的消耗。当用字符串作为索引时,一定要指定一个长度,否则如果字符串过长的话,将会浪费大量的磁盘空间。
InnoDB和 MyISAM默认船舰的都是BTREE索引。可以在单列或多列上建立索引。并且在Mysql 5.7之后可以使用虚拟列索引来实现函数索引的功能。并且也支持前缀索引。空间索引(用RTREE实现)。全文本索引
创建虚拟列的语法为:
alter table user add user_name varchar(20) generated always as (相关函数如DATE(时间))
Mysql8中加入了不可见索引,即将索引隐藏起来。这样做的目的是测试去掉索引后对实际应用的影响。语句
create index 索引名 on 表明(索引列) Invisible
可以通过下列语句改回可见
alter table 表名 index 索引名 visible

视图

视图是一种虚拟的表。视图并不在数据库中存在,而是每次使用时动态生成。视图使用起来更加简单,因为用户不需要关心后面的表结构。而且也更加安全,使用视图的用户只能查询部分结果集(被允许的)。而且视图还有数据独立的优势,即使表中的列名更改,列增加了也不会影响到用户的调用。只需要更改视图即可。
视图是否可以更新与定义的sql语句有关。如下情况视图不能进行更新操作
1.包含聚合函数(sum count max min )、distinct 、group by、having、union、union all
2.常量试图
3.select中包含子查询
4.join
5.from一个不可更新的视图、或没有更新权限的表
6、where 中的子查询引用了from后面的表
with【CASCADED | LOCAL】check option语句决定了对视图进行更新操作时,是否允许记录不在满足视图条件。
如果不写【】中的内容,默认是CASCADE (即 with check option = with CASCADED |check option)
CASCADED:必须满足本视图条件以及其他引用了该视图的条件
LOCAL:只需要满足本视图条件即可
创建视图的语句
Create view 视图名字 as 查询语句 with【CASCADED | LOCAL】check option
更改视图可以使用alter 或者create or replace
删除视图使用 drop

存储过程和函数

存储过程和函数的区别在于存储过程的参数可以是in out inout 而 函数的参数只能是in(不需要写),2默认为in out。并且函数有返回值而存储过程则没有。
存储过程和函数不能使用create or replace 来进行更改,只能通过alter function/procedure来进行修改
可以通过call 调用存储过程

变量的创建与赋值

可以通过declare name type 来创建变量
通过set name = ?的方式来赋值

定义条件和处理

定义条件:

declare 条件名字 condition for [sql-error-code | sqlState | SQLWARNING | NOT FOUND | SQLEXCEPTION ]

SQLWARNING:开头为01的SQLSTATE

NOT FOUND :开头为02的SQLSTATE

SQLEXCEPTION:01 02开头的SQLSTATE

定义处理过程:

declare [Continue | EXIT] Handler for [sql-error-code | sqlState | SQLWARNING | NOT FOUND | SQLEXCEPTION | 条件名字]

Continue:遇到错误时跳过该条语句继续执行

EXIT:遇到错误就退出

mysql 为性别建立索引 mysql性别适合加索引吗_sql

光标的使用

可以用光标对结果集进行循环处理。

mysql 为性别建立索引 mysql性别适合加索引吗_mysql 为性别建立索引_02


mysql 为性别建立索引 mysql性别适合加索引吗_sql_03

流程控制

1.IF语句
2.CASE语句
3.LOOP语句
4.LEAVE语句
5.ITERATE语句
6.REPEAT语句
7.WHILE语句

事件调度器

事件调度器,可以将数据库按照自定义的时间间隔执行某种操作。
例如
create event 事件调度器名字 on schedule every 10 minute do truncate 表名
每10分钟清空一次表

触发器

触发器是在插入 删除 更新操作的之前或者之后执行的操作。触发其的这种特性可以协助应用在数据库端确保数据的完整性。
语句
create trigger 触发器名字 [After | Before] [Insert | Delete | Update] on 表 for Each Row
Begin
执行的操作
END
After和Before分别代表在 插入/删除/更新 操作的前后执行该触发器。
当执行得语句时Insert Into… on duplicate key update …语句时。会先执行 before insert触发器->before update触发器 ->after update触发器