MYSQL 学习(一)--启蒙篇《MYSQL必知必会》
MYSQL必知必会
一. DDL 数据定义语言
Data Definition Language 是指CREATE,ALTER和DROP语句。
DDL允许添加/修改/删除包含数据的逻辑结构,或允许用户访问/维护数据(数据库,表,键,视图......)的逻辑结构。DDL是关于“元数据”的。
Delimiter 详解
Delimiter 指定命令行结束符。告诉MYSQL命令已经结束,可以执行了。 MYSQL默认的delimiter是分号”;”,但是,有的情况下,希望输入完整后,再一次执行。这种情况下,首先修改结束符为自己指定的符号。比如// 或者 $$.在最后输入完成后,输入指定的命令行结束符。开始执行整个语句。
(1) 表操作
1.创建表
创建表至少包含两部分信息。表名称和列的细节信息。
- 建表语言例子
CREATE TABLE table_name
(
Column1 int not null,
....
PRIMARY_KEY(Column1)
)engine = InnoDB|MyISAM;
- 建表语言描述
建表语句,CREATE TABLE + 表名称 然后用小括号包含字段列表(需要定义主键primary_key)。最后是引擎类型。MySQL通常有InnoDB(事务处理的好) 和 MyISAM(支持全文检索)两种
- 引擎类型
MySQL具有多种引擎。SQL是在引擎中执行的。
InnoDB :可靠的事务处理引擎,不支持全文检索。
MyISAM:不支持事务,支持全文检索
MEMORY:功能和MyISAM类似。数据是在内存中保存,而不是磁盘。速度快,特别适合临时表。
2.修改表
Alter table table_name add column_n data_type;
3.删除表
Drop table table-name;
4.重命名表
Rename table table-name to table-name2;
(2) 视图
视图是虚拟的表,只包含使用时动态检索数据的查询。
1.使用视图的原因
- 复用SQL语句
简化基于视图的SQL。
- 保护数据
因为视图只能查询部分字段。使用视图可以授予指定部分访问权限,而不是整个的访问权限。
- 更改数据的格式和表示
可以把数据格式进行转换之后,提供给用户。(对检索出来的数据重新格式化)
2.视图相关的语句
- 创建视图
Create view view_name AS ---;
- 删除视图
Drop view view_name;
- 更新视图
Create or replace view_name ;
视图的数据是可以更新的。意味着可以对视图进行insert、update和delete操作的。但是视图如果包含以下情况,将不可以更新。
- 分组(group by 和 having)
- 关联(任何join)
- 子查询
- 并(union 和 union All)
- 聚集函数(count()、sum()、avg()、max()、min())
- 去重distinct
- 导出(计算)列
- 查看创建视图语句
Show create view view_name;
(3) 存储过程
1) 使用存储过程的原因
- 执行速度快
存储过程只在创建的时候编译一次。以后每次执行都不用编译。而SQL语句每次执行,都需要编译一次。所以,存储过程能提高执行效率。
编译:SQL通常在db接收到执行一般有以下几个操作。
(1)语法、语义解析。
(2)优化SQL语句,制定执行计划。
(3)执行并返回结构。
其中,语法语义解析、优化SQL语句、制定执行计划是编译的部分。
- 减少网络传输
复杂逻辑需要多条SQL语句,客户机和数据库服务器之间的操作多时,产生大量的网络传输。而封装在一个存储过程中,减少网络负载。
- 更灵活
使用条件判断和游标,使用数据库内置函数,有更强的灵活性和复杂性。
2) 存储过程的操作语句
- 创建存储过程
Create procedure 存储过程名称([参数列表]) begin SQL语句 end;
- 参数列表格式
[类型限定 变量名 数据类型]
类型限定:
(1)IN
限定这个参数是传值给存储过程的。【in修饰的值,在存储过程内部不会被修改】
(2)OUT
限定这个值是从存储过程传出的一个值。
(3)INOUT
既可以作为参数传递给存储过程,也可以在存储过程中被修改,传值出来。
- 存储过程的调用
- 调用存储过程
Call 储存过程名(参数);
- 对于In类型的参数,参数可以是数值,也可以是变量。对于out/inout必须是变量。
- MYSQL变量必须以@开始。比如call 存储过程名(“xxx”,@变量名)
- 存储过程的删除
Drop procedure if exists 存储过程名称;
- 存储过程的亮点使用
- 游标
存储过程中可以使用游标,可以对检索出来的数据集合进行遍历操作。
- 条件分支
可以根据条件分支,建立SQL执行分子,使存储过程更加智能。
IF XXX THEN SQL语句 END IF
(4) 游标
游标是MYSQL数据库上的数据库查询出来的数据结果集。且只能用于存储过程。
1) 使用游标的步骤
- 定义游标
这个过程实际上没有检索数据,只是定义要使用的SELECT语句。
- 打开游标
这个过程用前面定义的SELECT语句把数据实际检索出来。
- 使用游标
对于填有数据的游标,根据需要取出(检索)各行。
- 关闭游标
结束游标使用时,必须关闭游标。
2) 创建游标
- 定义游标
DELCARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
- 打开游标
OPEN ordernumbers;
- 关闭游标
CLOSE ordernumbers;
3) 使用游标
1.FETCH:获取每一条数据
FETCH指定检索什么数据(所需的列),检索出来的数据存储在什么地方。它还向前移动游标中的内部行指针,使下一条FETCH语句检索下一行(不重复读取同一行)。
2.FETCH:循环检索数据
DELIMITER //CREATE PROCEDURE processorders()BEGIN
-- Declare local variables
DECLARE done BOOLEAN DEFAULT 0;
DECLARE o INT;
-- Delcare the cursor
DELCARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
-- Declare continue handler
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
-- Open the cursor
OPEN ordernumbers;
-- Loop through all rows
REPEAT
-- Get order number
FETCH ordernumbers INTO o;
-- End of loop
UNTIL done END REPEAT;
-- Close the cursor
CLOSE ordernumbers;END //DELIMITER ;
这里的FETCH在REPEAT内,因此反复执行直到done为真。
上面这条语句定义了一个CONTINUE HANDLER,它是在条件出现时被执行的代码。指出当SQLSTATE '02000'出现时,SET done=1。
DECLARE语句的次序
i. DECLARE语句定义的局部变量必须在定义任意游标或句柄之前定义
ii. 句柄必须在游标之后定义(如循环的条件等)
(5) 触发器
触发器是一种和数据操作有关的数据库对象。当触发器所在的表出现指定的事件时,将调用该对象。
1) 创建触发器
MYSQL创建触发器的命令如下
CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt ;
trigger_name:标识触发器名称,用户自行指定;
trigger_time:标识触发时机,取值为 BEFORE 或 AFTER;
trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;
tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句。
不能在同一张表建立多个相同类型的触发器。所以,一张表最多能建立6个触发器。
2) NEW和OLD详解
NEW和OLD用来表示触发器的所在表中,触发了触发器的那一行数据。具体如下:
在INSERT触发器中。NEW用来表示将要BEFORE或者已经AFTER插入的数据。
在UPDATE触发器中,OLD用来表示将要或者已经被修改的原数据。NEW用来表示将要或者已经被修改后的新数据。
在DELETE触发器中。OLD用来表示将要或者已经被删除的原数据。
使用方法:
NEW.columnName (columnName 为相应数据表某一列名)
OLD 是只读的,而 NEW 则可以在触发器中使用 SET 赋值,这样不会再次触发触发器,造成循环调用(例如,在一列前添加前缀等)
3) 删除触发器
Drop trigger [IF EXISTS] trigger_name ;
4) 触发器的执行顺序
触发器一般建立InnoDB引擎的MYSQL.所以,触发器也是事务安全的。
- 如果BRFORE 触发器执行失败,SQL无法执行。
- 如果SQL执行失败,则AFTER触发器就不会执行。
- 如果AFTER触发器执行失败,SQL就会回滚。
二. DML数据库操作语言
Data Manipulation Language (数据操作语言)是指INSERT,UPDATE和DELETE语句
DML允许自己添加/修改/删除数据。
(1) 增-插入数据
插入数据的同时,会插入数据对应的索引。所以,比较耗时。如果,需要尽快将数据插入,方便及时查询数据。可以先插入数据。之后再生成索引。
在insert into之间加入关键字。LOW_PRIORITY. => INSERT LOW_PRIORITY INTO
1) 插入单行数据
INSERT INTO TABLE_NAME(column1,...column_N) values(value1,... value_N)
2) 插入多行数据
INSERT INTO TABLE_NAME(column1,...column_N) values(value1,... value_N),(value1,... value_N),(value1,... value_N)...,(value1,... value_N);
3) 插入查询数据 insert into select
INSERT INTO TABLE_NAME(column1,...column_N) select column1 , ... column_N from TABLE_NAME2;
(2) 删-删除数据
DELETE FROM TABLE WHERE 子句;
Truncate 和 delete 比较 ; -删除整张表。比delete from table 速度快。主要原因是,先删除原来的表,再创建一个新表。
(3) 改-修改数据
UPDATE TABLE SET COLUMN = “xxx” WHERE 子句;
三. DQL 数据库查询语言
Data Query Language (数据查询语言)是指SELECT,SHOW和HELP语句(查询)
SELECT是主要的DQL指令。它会检索您需要的数据。SHOW检索有关元数据的信息。HELP...适合需要帮助的人。
(1) 基本查询
Select 的子句顺序如下:
Select -> from ->where ->group by -> having -> order by ->limit
1) Select
Select columns|* from table ;字段别名使用 column as alias
1.常规字段
Select子句中,column 一个或者多个或者*
2.拼接字段
使用拼接函数concat(),拼接一个或者多个字符/字段 作为一个字段返回。
3.计算字段
多个字段进行四则计算,作为一个字段返回。
4.测试使用
Select 可以不配合 from 子句,自己直接运行。通常用来测试/验证函数。
5.去重
在select 和 form 之间 使用distinct。对检索出的数据集去重。
2) Aggregate function
聚集函数
需注意两点:
其一:一种是ALL模式,也是默认的模式。另外一种DISTINCT模式。DISTINCT是对数据先进行去重,之后再进行聚合运算。
其二:聚合函数和分组子句并不需要一定配合使用。也就是说,聚合函数单独使用就是对当前数据集进行聚合运算。聚合函数和分组子句配合使用,就是先分组,然后在各个组上再进行聚合运算。
1.Count(*|column)
有两种使用,count(*) 和 count(column) 。都是确定表中的行数。区别。第一个count(*)代表所有的行数,真正查出集合的行数。第二个column(column)代表所有行中column非空的行数。
2.Avg(column)
针对column 如果为null,在计算平均值的时候,不计算在内(总值不会加,行数也不会加)。
3.Sum(column)
返回列之和
4.Max(column)
返回列中最大值
5.Min(column)
返回列中最小值
3) Where
搜索条件、过滤条件。复杂逻辑的时候,最好使用小括号,逻辑关系更清楚一些。
1.单条件过滤
- 等于、不等于、大于、小于等直接过滤
- 范围 Where column begin start_value and end_value ;
- 空值 where column is null ;
2.组合Where
- And 操作
Where column1_condition and column2_condition ;
可以是2个或者多个条件,使用and链接。相当于逻辑且。检索出的数据集合必须两个条件都满足。
- Or 操作
Where column1_condition or column2_condition ;
相当于逻辑或,只要满足多个条件中的一个就行。
- In 操作
Where column in (值域集合,用逗号隔开);
功能上类似or,column是集合中任何一个即可。
- Not 操作
否定它之后跟的任何条件。Not 只和IN、Between和Exists 三个配合使用。
3.Like
模糊匹配,对不确定的进行匹配。是整列匹配。意思是,描述的是整列的结构。整列的结构和通配符描述的结构一致,才可以。通配符:用来匹配值的一部分的特殊字符。
模糊匹配效率比较低,所以在多个条件过滤的时候,将模糊匹配放在最后执行。
Where column like XXX(使用通配符)
- %
%表示任意字符出现任意多次【0或者多个】。
- _
只匹配单个字符而不是多个字符。
4.Regexp
正则表达式的作用是匹配文本。将一个模式(正则表达式)和一个文本进行比较。不是整列匹配。只要正则描述的单元在列中出现,这行数据即匹配上了。
Where column regexp “model” ;
- 基本字符匹配
- 进行OR匹配
Or 在正则中表示”|”
- 匹配几个字符之一
用中括号[]
- 匹配范围
[1-5]
- 匹配特殊字符
转义字符 \\紧跟特殊字符。
- 匹配多个实例
*代表0或者多个;+代表一个或多个;?代表0个或者1个;{n}代表指定数据个;{n,}不少于指定数目个;{n,m}匹配数据的范围
- 定位符
^代表文本的开始。$代表文本的结束。[[:<:]]代表词的开始;[[:>:]]代表词的结束。
4) Group By
数据分组:允许对数据逻辑分组,以便对每个组进行聚合计算。但是聚集函数不是必须需要和分组子句配合使用的。
1.创建分组
通常在where 子句后 ,使用Group By columns;
- 如果多个分组字段,使用逗号隔开。
- Group by 语句中的对应的select 子句。必须是聚集函数或者是group by 后的字段。
- 如果有where 子句。则group by 出现在where 子句之后,在order by 子句之前。
- Rollup,使用with ROLLUP关键字,可以使得每个分组以及每个分组汇总级别的值。
2.Having 分组过滤
所有的where 都可以使用having替代。唯一差别是where是过滤行,having是过滤分组。
Having aggregate function() 比较符 数值。
3.分组和排序
Order by 可以和Group By配合使用,通常order by 跟在group By 子句之后。对数据集合分组聚合之后,再按照指定的字段进行排序。
5) Order by
排序
后面跟一个或多个字段。升序或者降序排列的确定,需要给每个字段指定。比如 order by column1 desc ,column2 asc
其中 desc 为降序,asc为升序。
6) Limit 限制返回结果
1.Limit 2
返回最前面2行。如果总行数小于2,则全部返回。
2.Limit 2,3
从第2行开始,返回3行,即为行3至行5。检索出来第一行是0而不是1.
(2) 复杂查询
1) 子查询
嵌套在其它查询中的查询。
子查询的执行顺序是由内向位处理的。
1.子查询做过滤
即在where 子句中使用子查询。子查询的结果作为外层查询的过滤集合。
2.子查询作为计算字段
即在select 子句中,某些字段使用子查询来实现。
2) 关联组
关联的本质是将第一张表的每一行和第二张表中的每一行配对。
1.内关联
Inner join
使用格式为select XXX from table1 inner join table2 on condition
最后选择出的是两侧都有值的行。
2.外关联
Left/right join
假设 A left/right B ,如果是左关联,则可以理解为A是主表。如果是右关联,则B表位主表;主表的所有的行都存在,附表中只有关联上的行才存在。
3.自关联
同一张表和自己关联。称之为自关联。关联需要使用别名。
3) 组合查询
Union 将多个查询结果并起来返回 称之为组合查询。
场景:其一:两种表结构类似的表查询,返回后union。其二:对同一张表多次查询,结果合并返回。
1.Union 和 union all 区别
Union 是去除重复的。
Union All 是不去重复的。多个元素行,如果有重复的。会保留。
2.组合查询排序
Union 的 最后一条select语句之后,使用order by 子句。结果就是对整个union 句子进行排序。
(3) 操作符
1) 比较操作符
大于>小于 <等于 =不能于 !=
2) 算数操作符
加+减-乘*除/
3) 连接操作符
且and 或or
4) 逻辑操作符
Between ... and
like/not like
in/not in
(4) 通配符
% 代表0个或多个字符
_ 代表一个字符
(5) 常用函数
1) 字符串函数
- Left(str,length)、right(str,length)
从左开始截取指定长度的字符串
从右开始截取指定长度的字符串
- Length(str)
返回字符串的长度
- Locate(substr,str)
返回子串在字符串中第一个位置。
- Lower(str)、Upper(str)
字符串转小写、字符串转大写
- Trim(Str)、LTrim(str)、RTrim(str)
字符串两边去空格、字符串左边去空格、字符串右边去空格
- substring(str, pos),substring(str, pos, length)
分别代表
字符串从pos位置开始截取,直至字符串尾部。
字符串从pos位置开始截取,截取长度为length个字符的字符串。
2) 聚集函数
3) 数值处理函
4) 数日期函数
AddDate()、DayOfWeek()
(6) 复杂函数
(7) 全文本搜索
四. DCL数据库控制语言
data control language (数据控制语言)是指GRANT和REVOKE语句
DCL用于授予/撤消对数据库及其内容的权限。DCL很简单,但MySQL的权限相当复杂。DCL是关于安全性的。
MYSQL数据库的安全基础是:用户对自己需要的数据具有适当的权限。
DCL思维导图
(1)权限
- 权限类型
常用权限(pri_type)包括:ALL, SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, DROP等
- 级别
- 全局级
*.* 所有数据库
- 数据库级
<db_name>.* 某一个数据库,例如:test.*
- 表级
<db_name>.<t_name> 某个数据库的某个表:test.students
(2)用户权限操作
- 给用户授权
grant pri_type on db_name.t_name to 'username'@'host' ; grant pri_type on db_name.t_name to 'username'@'host' ;
- 删除用户权限
revoke pri_type on db_name.t_name from 'user'@'host';
- 查看权限
- 指定用户(root用户)
show grants for 'username'@'%';
- 自己
show grants;
(1) 用户管理
1) 创建用户
MYSQL是一个数据库管理系统。有自带数据库和用户创建的数据库。用户创建数据库的结构在自带数据库中保存。同样,创建的用户在mysql数据库的user表中保存。
Create USER ‘用户名’@’允许其登录的地址’ identified by ‘密码’;
说明
- 创建的用户需同时指定该用户可以在哪个地址进行登录。
其中“%”代表“任何地址”。
- 用户创建之后,自动在mysql的user表中添加了一条记录,但该用户还没有权限。
2) 删除用户
DROP USER ‘用户名’@’允许其登录的地址’;
3) 修改用户密码
- 修改自己密码
set password = password(‘新密码’);
- 修改其它用户密码
set password for ‘用户名’@’允许其登录的地址’ = password(‘新密码’);
(2) 权限分配
1) 添加权限
Grant
添加权限至少包含三部分内容。要授予的权限、被授予权限的数据库或者表、用户名。
格式:
Grant 权限名1,...权限名n ON 数据库名.对象名 TO ‘用户名’@’允许登录的地址’ ;
常用权限(pri_type)包括:ALL, SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, DROP等
对象名:代表数据库中的东西,通常是表、视图、存储过程。
其中”*.*”代表所有数据库的所有对象。
2) 收回权限
Revoke,格式如下
revoke 权限名1,权限名2, .... on 数据库名.对象名 from ‘用户名’@’允许其登录的地址’ ;
五. DTL事务控制语言
Data Transaction Language(数据事务语言)是指START TRANSACTION,SAVEPOINT,COMMIT和ROLLBACK [TO SAVEPOINT]语句。
DTL用于管理事务(包含更多指令的操作,如果其中一个指令失败,则不能执行这些指令)。
(1) 是什么事务
事务就是用来保证多条”增删改”语句执行的一致性。要么都执行,要么都不执行。
MYSQL 的执行引擎,innoDB支持事务。MyISAM不支持事务。
(2) 事务的特点
1) 原子性
一个事务中的所有语句,应该做到:要么都做,要么都不作。
2) 一致性
数据在逻辑上保持”合理性”。
3) 隔离性
如果多个事务并发执行,每个事务都像各自独立执行一样。
4) 持久性
一个事务执行成功,对数据而言,是一个明确的磁盘数据更改(而不是仅仅内存的变化)。
(3) 事务模式
在cmd命令行模式中,是否开启了”一行命令就是一个事务”的这个开关。这个称谓自动提交模式。
1.自动提交模式
MYSQL默认是自动提交模式。autocommit=1;
2.手动提交模式
Set autocommit=0;如果设置为手动提交模式,则所有的增删改操作都需要手动的提交。即在执行SQL语句后,再执行 commit才能生效;
(4) 事务执行流程
1.事务的几个概念
- 事务Transaction
指一组SQL语句。
- 回退Rollback
指撤销执行指定SQL语句的过程。
- 提交Commit
指将为未存储的SQL语句结果写入数据库。
- 保留点Savepoint
指事务处理中设置的临时占位符。可以对它发布回退。可以在之前定义一个位置为保留点,需要回滚的时候,可以回滚到指定的保留点。
2.事务的执行流程
- 开始事务
Start transaction ;
- 执行多条增删改语句
- 根据语句的执行结果,提交或者回退
If(没有出错){
Commit; //事务提交,所都都执行
}else {
Rollback; //回滚事务,所有都没执行
}