《MySQL必知必会》安装&基本概念&常用命令&示例

MySQL安装

在windows10 安装。

  1. MySQL官方下载地址下载
    在这里插入图片描述

  2. 将包解压到确定目录(示例:D:\mysql),添加my.ini配置文件(我找了一个默认配置文件,修改了内容和名称),文件中编辑以下信息

[client]
# 设置mysql客户端默认字符集
default-character-set=utf8
 
[mysqld]
# 设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=D:\\mysql
# 设置 mysql数据库的数据的存放目录,MySQL 8+ 不需要以下配置,系统自己生成即可,否则有可能报错
# datadir=D:\\mysql\\sqldata
# 允许最大连接数
max_connections=20
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

结果
在这里插入图片描述

  1. 管理员身份打开cmd在这里插入图片描述

  2. 进入mysql的bin文件夹目录,初始化数据库,得到一个root用户的初始默认密码uctXgWLE5t-t,安装mysql,启动mysql
    在这里插入图片描述

mysql根目录下多了一个data文件夹
在这里插入图片描述

  1. 登录mysql时输入以下命令mysql -h 主机名 -u 用户名 -p,示例:登录本机MySQL数据库,输入上面生成的默认密码在这里插入图片描述

  2. 此时输入SQL命令会报错,如图,要求更改密码在这里插入图片描述

调查发现使用命令ALTER USER "root"@"localhost" IDENTIFIED BY "你的新密码";可以解决问题。
示例:设置新密码为123在这里插入图片描述之后再使用SQL命令不再报错在这里插入图片描述

基本概念

名称定义
数据库database, 一个以某种有组织的方式存储的数据集合
数据库管理系统DBMS,创建和操纵数据库
table,某种特定类型数据的结构化清单
模式schema,关于数据库和表的布局及特性的信息
column,表中的一个字段。所有表都是由一个或多个列组成的
数据类型datatype, 所容许的数据的类型
row,表中的一个记录
关系表把信息分解成多个表,一类数据一个表,各表通过某些常用的值(即关系relational)互相关联
主键primary key,一列(或一组列),能够唯一区分表中每个行
外键foreign key,一列,包含另一个表的主键值,定义了两个表之间的关系
SQL结构化查询语言,专门用来与数据库通信的语言

MySQL数据类型:

串数据类型说明
CHAR1~255个字符的定长串。它的长度必须在创建时指定,否则MySQL 假定为CHAR(1)
VARCHAR长度可变,最多不超过255字节。如果在创建时指定为VARCHAR(n), 则可存储0到n个字符的变长串(其中n≤255)
TEXT最大长度为64 K的变长文本
TINYTEXT与TEXT相同,但最大长度为255字节
MEDIUMTEXT与TEXT相同,但最大长度为16 K
LONGTEXT与TEXT相同,但最大长度为4 GB
SET接受最多64个串组成的一个预定义集合的零个或多个串
ENUM接受最多64 K个串组成的一个预定义集合的某个串
数值数据类型说明
BIT位字段,1~64位。(在MySQL 5之前,BIT在功能上等价于 TINYINT
BOOLEAN(或BOOL)布尔标志,或者为0或者为1,主要用于开/关(on/off)标志
TINYINT整数值,支持128~127(如果为UNSIGNED,为0~255)的数
SMALLINT整数值,支持32768~32767(如果是UNSIGNED,为0~ 65535)的数
INT(或INTEGER)整数值,支持2147483648~2147483647(如果是UNSIGNED, 为0~4294967295)的数
MEDIUMINT整数值,支持8388608~8388607(如果是UNSIGNED,为0~ 16777215)的数
BIGINT整数值,支持9223372036854775808~9223372036854775807 (如果是UNSIGNED,为0~18446744073709551615)的数
DECIMAL(或DEC)精度可变的浮点值
DOUBLE双精度浮点值
FLOAT单精度浮点值
REAL4字节的浮点值
日期和时间数据类型说明
TIME格式为HH:MM:SS
DATE表示1000-01-01~9999-12-31的日期,格式为 YYYY-MM-DD
YEAR用2位数字表示,范围是70(1970年)~69(2069 年),用4位数字表示,范围是1901年~2155年
DATETIMEDATE和TIME的组合
TIMESTAMP功能和DATETIME相同(但范围较小)
二进制数据类型说明
TINYBLOBBlob最大长度为255字节
BLOBBlob最大长度为64 KB
MEDIUMBLOBBlob最大长度为16 MB
LONGBLOBBlob最大长度为4 GB

MySQL必知必会附录样例表创建

  1. 下载地址下载两个SQL脚本文件,放在bin目录下。
  2. 创建一个新的数据源,使用命令create schema 数据源名;,示例中命名为crashsource,然后选择该数据源,使用命令use 数据源名
    在这里插入图片描述
  3. 执行两个脚本,使用命令source 脚本名.sql,先创建表格,再填充各表
    在这里插入图片描述

在这里插入图片描述
至此,实验所需要的数据库准备完毕,可以使用show命令查看建好的表格
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

简单命令

show

前面已经使用了显示数据库、表、列的用法,还可以:

  1. SHOW STATUS,用于显示广泛的服务器状态信息;
  2. SHOW CREATE DATABASE和SHOW CREATE TABLE,分别用来显示创建特定数据库或表的MySQL语句;
  3. SHOW GRANTS,用来显示授予用户(所有用户或特定用户)的安全权限;
  4. SHOW ERRORS和SHOW WARNINGS,用来显示服务器错误或警告消息。

select

  1. 检索一列select 列名 from 表名;
  2. 检索多列select 列名1,列名2,列名3 from 表名;
  3. 检索所有列select * from 表名;
  4. 检索不同行 select distinct 列名 from 表名;
  5. 返回前几行select 列名 from 表名 limit 行数
  6. 返回特定几行select 列名 from 表名 limit 位置,行数;
  7. 完全限定的名字select 表名.列名 from 表名;

where

  1. select 列名 from 表明 where 公式;公式可以是<, <=, >, >=, <>或!=(不等于), is null, between…and…
  2. 逻辑操作符:公式用and或or联结,and优先级高于or;
  3. in操作符:where 公式 in (A,B);,in可以包含其他select语句;
  4. not操作符:否定它之后所跟的任何条件;
  5. 通配符:where 列名 like 含有通配符的语句;常用通配符有%(表示任何字符出现任意次数),_(匹配单个字符)。把通配符置于搜索模式的开始处,搜索起来是最慢的。在这里插入图片描述

正则表达式

MySQL仅支持多数正则表达式实现的一个很小的子集,使用格式为where 列名 regexp 正则表达式;

正则表达式含义
‘ABCD’包含ABCD的所有行
.匹配任意一个字符
A|BA或B
[ABC]DAD或BD或CD
[A-C]D同上
[^ABC]除了ABC以外的
\\特殊字符查找.|[]等,或者引用元字符

匹配字符类:

说明
[:alnum:]任意字母和数字(同[a-zA-Z0-9])
[:alpha:]任意字母(同[a-zA-Z])
[blank:]空格和制表(同[\\t])
[cntrl:]ASCII控制字符(ASCII 0到31和127)
[:digit:]任意数字(同[0-9])
[:graph:]与[:print:]相同,但不包括空格
[:lower:]任意小写字母(同[a-z])
[:print:]任意可打印字符
[:punct:]既不在[:alnum:]又不在[:cntrl:]中的任意字符
[:space:]包括空格在内的任意空白字符(同[\f\n\r\t\v])
[:upper:]任意大写字母(同[A-Z])
[:xdigit:]任意十六进制数字(同[a-fA-F0-9])

空白元字符:

元字符说明
\\f换页
\\n换行
\\r回车
\\t制表
\\v纵向制表

重复元字符:

元字符说明
*0个或多个匹配
+1个或多个匹配(等于{1,})
?0个或1个匹配(等于{0,1})
{n}指定数目的匹配
{n,}不少于指定数目的匹配
{n,m}匹配数目的范围(m不超过255)

定位元字符:

元字符说明
^文本的开始
$文本的结尾
[[:<:]]词的开始
[[:>:]]词的结尾

示例:
任意数字出现四次的行
在这里插入图片描述
(任意数字+stick或sticks)的行
在这里插入图片描述

出以一个数(包括以小数点开始的数)开始的所有产品
在这里插入图片描述

计算字段

  1. 拼接字段select concat(A,B,C),使用别名select concat(A,B,C) as 别名,任何客户机应用都可以按名引用这个列;
    在这里插入图片描述
  2. 进行算术计算select 算式,可以进行加减乘除。
    在这里插入图片描述

数据处理函数

文本函数:

函数函数作用
RTrim()删除数据右侧多余的空格
LTrim()删除数据左侧多余的空格
Trim()删除掉数据左右两边的空格
upper()将文本转换为大写
Lower()将串转换为小写
Left()返回串左边的字符
Right()返回串右边的字符
Length()返回串的长度
Locate()找出串的一个子串
Soundex()返回串的SOUNDEX值
SubString()返回子串的字符

日期和时间处理函数:

函数函数作用
AddDate()增加一个日期(天、周等)
AddTime()增加一个时间(时、分等)
Date_Format()返回一个格式化的日期或时间串
DayOfWeek()对于一个日期,返回对应的星期几
CurDate()返回当前日期
CurTime()返回当前时间
Now() 返回当前日期和时间
Year()返回一个日期的年份部分
Date()返回日期时间的日期部分
Month()返回一个日期的月份部分
Day()返回一个日期的天数部分
Time()返回一个日期时间的时间部分
Hour()返回一个时间的小时部分
Minute()返回一个时间的分钟部分
Second()返回一个时间的秒部分
DateDiff()计算两个日期之差
Date_Add() 高度灵活的日期运算函数

示例:选择2005年9月的所有订单
在这里插入图片描述
数值处理函数:

函数说明
Abs()返回一个数的绝对值
Cos()返回一个角度的余弦
Sin()返回一个角度的正弦
Tan()返回一个角度的正切
Sqrt()返回一个数的平方根
Exp()返回一个数的指数值
Mod()返回除操作的余数
Pi()返回圆周率
Rand()返回一个随机数

聚集函数

函数说明
AVG()返回某列的平均值
COUNT()返回某列的行数
MAX()返回某列的最大值
MIN()返回某列的最小值
SUM()返回某列值之和

avg(),sum(),count(),可以用where限定返回特定行的值。
max(),min(),sum()忽略NULL值。
count(*)对表中行的数目进行计数,对空值(NULL)和非空值都技计数,count(column)忽略NULL值。
聚集函数可以组合使用所有的聚集函数默认指定ALL参数,也可以指定DISTINCT参数只考虑不同的值,count(*)不能用DISTINCT,示例:vend_id为1003的产品平均价格。

在这里插入图片描述

在这里插入图片描述

分组数据

  1. 创建分组用group by子句,指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集。不加rolllup没有null。示例:返回提供10个以上产品的供应商。
    在这里插入图片描述

  2. 过滤分组用having子句,类似where。where子句不起作用,因为过滤是基于分组聚集值而不是特定行值的。where在数据分组前进行过滤,having在数据分组后进行过滤。示例:列出至少有两个订单的所有顾客。
    在这里插入图片描述

子查询

orders表:对于包含订单号、客户ID、订单日期的每个订单。
orderitems表:各订单的物品。
customers表:实际的客户信息。

  1. 示例:订购物品TNT2的所有客户在这里插入图片描述
  2. 包含计算字段。示例:要显示customers表中每个客户的订单总数。红框中叫相关联子查询,当列名有多义性时使用。
    在这里插入图片描述

联结

  1. 等值联结:where子句作为过滤条件,要用到完全限定的列名。没有联结条件的表关系返回的结果为笛卡尔积,行数等于第一个表的行数乘第二个表的行数。示例:在这里插入图片描述
  2. 内部联结:from 表1 inner join 表2 on 联结条件;。上面的例子重写:在这里插入图片描述

用联结多个表的方法重写上一章子查询的第一个例子——订购物品TNT2的所有客户:在这里插入图片描述

  1. 自联结:可以在单条select语句中多次引用同一张表。示例:生产DTNTR的供应商生产的其他物品在这里插入图片描述

  2. 自然联结:每个列只返回一次,操作者手动完成这一工作,对某个表选择所有列,对其他表选择明确的子集。示例:
    在这里插入图片描述

  3. 外部联结:包含了在相关表中没有关联行的行。from 表1 outer join 表2 on 联结条件;示例:检索所有客户,包括没有订单的客户。left指外部联结左边的表(包括其所有的行),right指外部联结右边的表。
    在这里插入图片描述

6.带聚集函数的联结:示例: 要检索所有客户及每个客户所下的订单数在这里插入图片描述

组合

执行多个查询(多条select语句),并将结果作为单个查询结果集返回。直接在每条select语句后面加上union。union从查询结果集中自动去除了重复的行,不想去除就使用union all。 只能使用一条order by子句,放在最后一条select语句之后。在这里插入图片描述

全文本搜索

1 启动全文本搜索:创建表格时,使用fulltext(列名)的指示对列进行索引。数据库引擎MyISAM支持全文本搜索。示例:在脚本文件create.sql中可以看到这段代码。
在这里插入图片描述
2. 进行全文本搜索:match(列名)指定要进行搜索的列,against('表达式')指定要使用的搜索表达式
在这里插入图片描述
3. 全文本搜索工作原理:按照文本匹配的良好程度(文本中词靠前还是靠后)进行排序。示例:我用多个在这里插入图片描述
报错,错误代码1064。查找错误原因后发现是因为使用了MySQL包括字,本人使用的是版本8.0.21,查看官方文档官方文档地址后发现rank在这一版中是保留字。
官方文档截图
当使用mysql保留字的时候,要用反引号将其引起来,也就是键盘第二排的第一个(数字1的左边那个键)。
修改命令后输出结果如下:
在这里插入图片描述

Match()和Against()用来建立一个计算列(别名为rank),不包含词rabbit的行等级为0(因此不被前一例子中的WHERE子句选择)。确实包含词rabbit的两个行每行都有一个等级值,文本中词靠前的行的等级值比词靠后的行的等级值高。

  1. 查询扩展:MySQL对数据和索引进行两遍扫描来完成搜索,找出可能相关的结果。首先,对搜索条件进行基本的全文本搜索;其次,检查匹配行并选出所有关键词;最后,对关键词进行全文本搜索。选关键词的标准是什么呢?我还没有找到。可能是因为出现次数和语法结构??示例:对rabbit使用查询扩展
    在这里插入图片描述

  2. 布尔文本搜索:以布尔方式,可以提供关于如下内容的细节:要匹配的词;要排斥的词(如果某行包含这个词,则不返回该行,即使它包含其他指定的词也是如此);排列提示(指定某些词比其他词更重要,更重要的词等级更高); 表达式分组。即使没有FULLTEXT索引也可以使用布尔文本搜索。示例:包含rabbit但不包含任意以com开始的词。
    在这里插入图片描述
    对照上面只匹配rabbit的查询结果,第一行被去掉了。

布尔操作符说 明
+包含,词必须存在
-排除,词必须不出现
>包含,而且增加等级值
<包含,且减少等级值
()把词组成子表达式(允许这些子表达式作为一个组被包含、排除、排列等)
~取消一个词的排序值
*词尾的通配符
“”定义一个短语(与单个词的列表不一样,它匹配整个短语以便包含或排除这个短语)

示例:搜索匹配包含rabbit和bait中至少一个词的行
在这里插入图片描述
示例:搜索匹配包含rabbit和bait的行
在这里插入图片描述
示例:搜索匹配短语rabbit bait的行
在这里插入图片描述

注意事项:
在索引全文本数据时,短词被忽略且从索引中排除。短词定义为那些具有3个或3个以下字符的词(如果需要,这个数目可以更改)。 MySQL带有一个内建的非用词(stopword)列表,这些词在索引。如果需要,可以覆盖这个列表。
许多词出现的频率很高,搜索它们没有用处(返回太多的结果)。因此,MySQL规定了一条50%规则,如果一个词出现在50%以上
的行中,则将它作为一个非用词忽略。50%规则不用于IN BOOLEAN MODE。 
如果表中的行数少于3行,则全文本搜索不返回结果(因为每个词或者不出现,或者至少出现在50%的行中)。 
忽略词中的单引号。例如,don’t索引为dont。 
不具有词分隔符(包括日语和汉语)的语言不能恰当地返回全文本搜索结果。
仅在MyISAM数据库引擎中支持全文本搜索。

插入数据

  1. 插入整行:insert into 表名 values(列1,列2,列3……);每个列必须提供一个值,并按在表中定义的顺序给出,如果没有就设为NULL。更安全的做法是insert into 表名 (列名1,列名2,……) values(列1,列2,……);这时若列定义为允许NULL值或在表定义中给出默认值,则可以省略列。insert操作很费时,可以采用insert low priority into降低语句的优先级。
  2. 插入多行:insert into 表名 (列名1,列名2,……) values(列1,列2,……),(列1',列2',……)每组值用圆括号括起来,用逗号分隔。
  3. 插入检索出的数据:insert into 表1 (列1,列2,……) select 列1',列2',…… from 表2把表2合并到表1。MySQL不关心列名,使用的是列的位置。

更新数据

  1. 更新特定行:update 表名 set 列名=新值 where 过滤条件如果没有where子句,将会更新每一行
  2. 更新多个列:update 表名 set 列名1=新值 ,列名2=新值2 where 过滤条件示例:
    在这里插入图片描述
    更新发生错误时update操作会被取消,如果要不取消,使用update ignore 列名
  3. 删除某个列的值:设置它未null

删除数据

  1. 删除特定行:delete from 表名 where 过滤条件如果没有where子句,将会删除所有行
  2. 删除表:truncate table并重新创建一个表

表操作

  1. 创建表:create table 表名 (列信息)表定义在圆括号内,列的名字和定义用逗号分隔,列的定义包括列名、数据类型,主键用primary key指定。表名必须不存在,否则会报错。如果想仅在表不存在时创建它,应在表明后给出if not exists。示例:来源于脚本文件create.sql。
    在这里插入图片描述

NULL:允许NULL值的列也允许在插入行时不给出该列的值。不允许NULL值的列不接受该列没有值的行,在插入或更新行时,该列必须有值。NULL是默认设置。

AUTO_INCREMENT每个表只允许一个AUTO_INCREMENT列,而且它必须被索引(如,通过使它成为主键)。
DEFAULT:指定默认值,不允许使用函数作为默认值,它只支持常量
在这里插入图片描述
引擎:具体管理和处理数据。如果省略ENGINE=语句,则使用默认引擎。InnoDB是一个可靠的事务处理引擎,它不支持全文本搜索;
MEMORY在功能等同于MyISAM,但由于数据存储在内存(不是磁盘)中,速度很快(特别适合于临时表);MyISAM是一个性能极高的引擎,它支持全文本搜索,但不支持事务处理。引擎可以混用,但外键不能跨引擎。
2. 更新表:alter table 表名 操作 列名;添加列用add,删除列用drop。示例:添加电话列,再删除该列。
在这里插入图片描述
定义外码用foreign key。示例来源于脚本文件create.sql。
在这里插入图片描述

复杂的表结构更改需要手动删除过程。

  1. 删除表:drop table 表名 ;删除表没有确认,也不能撤销,执行这条语句将永久删除该表。
  2. 重命名表:rename table 表1 to 表2 ;

视图

  1. 概念:视图仅仅是用来查看存储在别处的数据的一种设施。 视图本身不包含数据,因此它们返回的数据是从其他表中检索出来的。每次使用视图时,都必须处理查询执行时所需的任一个检索。如果你用多个联结和过滤创建了复杂的视图或者嵌套了视图,可能会发现性能 下降得很厉害。

  2. 规则:视图必须唯一命名。为了创建视图,必须具有足够的访问权限。这些限制通常由数据 库管理人员授予。视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造 一个视图。ORDER BY可以用在视图中,但如果从该视图检索数据SELECT中也 含有ORDER BY,那么该视图中的ORDER BY将被覆盖。视图不能索引,也不能有关联的触发器或默认值。视图可以和表一起使用。

  3. 创建视图:create view viewname ;
    在这里插入图片描述

  4. 查看创建视图:show create view viewname;

  5. 删除视图:drop view viewname;

  6. 更新视图:先drop再create,或create or replace view更新一个视图将更新其基表。如果视图定义中存在以下语句,则不能进行更新,分组(使用GROUP BY和HAVING);联结;子查询;并;聚集函数(Min()、Count()、Sum()等); DISTINCT;导出(计算)列。

存储过程

  1. 概念:为以后的使用而保存 的一条或多条MySQL语句的集合。 MySQL将编写存储过 程的安全和访问与执行存储过程的安全和访问区分开来。
  2. 执行存储过程:call 存储过程名 (@参数1 ,@参数2 ,……);参数允许的数据类型与表中使用的数据类型相同。记录集不是允许的类型,因此,不能通过一个参数返回 多个行和列。
  3. 创建存储过程:create procedure 存储过程名 (参数) begin 语句 end;示例:求平均值,无参数
    在这里插入图片描述
    还没来得及输入end就执行了,因为遇到了分隔符;,解决办法是更改分隔符,写完后再恢复。除\符号外,任何字符都可以用作语句分隔符。
    在这里插入图片描述
    在这里插入图片描述
    示例:求最值和平均值,有参数
    在这里插入图片描述
    调用时必须传递刚好3个参数。
    在这里插入图片描述
    这条语句不显示数据,它返回以后可以显示(或 在其他处理中使用)的变量。
    在这里插入图片描述

示例:求给定订单号的合计,如果要求计税,就计算营业税加到订单合计上
在这里插入图片描述

-- name:ordertotal
-- parameters:onumber=order number
--           taxable=0 if not taxable, 1 if taxable
--           ototal=order total variable
create procedure ordertotal(
 in onumber int,
  in taxable boolean,
  out ototal decimal(8,2)
 ) comment 'obtain order total, optionally adding tax'
 begin
  -- declare variable for total
  declare total decimal(8,2);
  -- declare taxrate for percentage
  declare taxrate int default 6;
  -- get the order total
  select sum(item_price*quantity)
  from orderitems
  where order_num=onumber
  into total;
  -- is this taxable?
  if taxable then
   -- yes,so add taxrate to the total
   select total+(total/100*taxrate) into total;
  end if;
  -- and finally, save to out variable
  select total into ototal;
 end//

– 表示注释,注意和后面的文字之间一定要有空格,否则会报错;
COMMENT语句不是必需的,但如果给出,将在SHOW PROCEDURE STATUS的结果中显示;
DECLARE语句定义了两个局部变量;
IF…END IF语句检查布尔变量是否未真。
在这里插入图片描述
149.87*1.06=158.86,可以验证该存储过程功能正确。

  1. 删除存储过程:drop procedure 存储过程名;
  2. 检查存储过程:show create procedure 存储过程名;显示用来创建一个存储过程的CREATE语句。show procedure status like '存储过程名';获得包括何时、由谁创建等详细信息的存储过程列表。示例:
    在这里插入图片描述
    可以看到comment语句的内容。

使用游标

  1. 概念:游标(cursor)是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。MySQL游标只能用于 存储过程(和函数)。
  2. 规则:使用前必须声明(定义),结束使用时必须关闭,声明后比徐徐打开。
  3. 创建游标:declare 游标名 cursor for select语句
  4. 打开游标:open 游标名;
  5. 关闭游标:close 游标名;如果你不明确关闭游标,MySQL将会在到达END语句时自动关闭它。
  6. 使用游标:FETCH指定检索什么数据(所需的列),检索出来的数据存储在什么地方。 它还向前移动游标中的内部行指针,使下一条FETCH语句检索下一行(不重复读取同一行)
    示例:创建一个ordertotal表,保存每个订单的订单号和合计。
create procedure processorders()
begin 
 -- declare local variables
 declare done boolean default 0;
 declare o int;
 declare t decimal(8,2);
 -- declare the cursor
 declare ordernumbers cursor
 for 
 select order_num from orders;
 -- declare continue handler
 declare continue handler for sqlstate '02000' set done=1;
 -- create a table to store the results
 create table if not exists ordertotals
 (order_num int, total decimal(8,2));
 open ordernumbers;
 -- loop through all rows
 repeat
 -- get order number
 fetch ordernumbers into o;
 -- get the toatl for this order
 call ordertotal(o,1,t);
 -- insert order and total into ordertotals
 insert into ordertotals(order_num,total)
 values(o,t);
 -- end of loop
 until done end repeat;
 close ordernumbers;
end//

用DECLARE语句定义的局部变量必须在定义任意游标或句柄 之前定义,而句柄必须在游标之后定义。
CONTINUE HANDLER:在条件出现时被执行 。它指出当SQLSTATE '02000’出现时,SET done=1。SQLSTATE '02000’是一个未找到条件,当REPEAT由于没有更多的行供循环而不能继 续时,出现这个条件。
MySQL支持循环语句,它可用来重复执行代码,直到使用LEAVE语句手动 退出为止。通常REPEAT语句的语法使它更适合于对游标进行循环。
调用结果:
在这里插入图片描述

触发器

  1. 概念:MySQL响应以下任意语句而 自动执行的一条MySQL语句:delete、insert、update。
  2. 创建触发器:需要包括 唯一的触发器名;触发器关联的表;触发器应该响应的活动(DELETE、INSERT或UPDATE);触发器何时执行(处理之前或之后)。 示例:每次插入后返回product added。
    在这里插入图片描述

报错,因为MySQL5以后不支持触发器返回结果集,可以使用into @变量名把返回的product added放到变量里。
3. 删除触发器:drop trigger 触发器名 ;
4. 使用触发器:

触发器特点
insert触发器在insert触发器代码内,可引用一个名为new的虚拟表,访问被插入的行;before insert触发器中,new中的值也可以被更新;对于auto increment列,new在insert执行前包含0,在insert执行后包含自动生成值
delete触发器在delete触发器代码内,可引用一个名为old的虚拟表,访问被删除的行;old中的值都是只读的,不能更新
update触发器在update触发器代码内,可引用一个名为old的虚拟表,访问以前的值,引用一个名为new的虚拟表,访问以后的值;在before update触发器中,new的值也可能被更新;old中的值全都是只读的,不能更新

示例:建立一个archive_orders表,使用delete触发器,把删掉的行保存到存档表中
在这里插入图片描述
在这里插入图片描述
示例:保证州名缩写总是大写
在这里插入图片描述

事务处理

  1. 事务处理:保证成批的MySQL操作要么完全执行,要么完全不执行。如果发生错误,则进行回退(撤销)以恢复数据库到某个已知且安全的状态。MyISAM不支持明确的事务处理管理,而InnoDB支持。
  2. 事务开始:strat transaction;
  3. 回退(撤销)MySQL语句:rollback;回退start transaction之后的所有语句。事务处理用来管理INSERT、UPDATE和 DELETE语句。你不能回退SELECT语句。(这样做也没有什么意 义。)你不能回退CREATE或DROP操作。
  4. 提交:commit;在事务处理块中,提交不会隐含地进行。为进行明确的提交, 使用COMMIT语句。当COMMIT或ROLLBACK语句执行后,事务会自动关闭。
  5. 创建占位符:savepoint 占位符名;可以仅对部分事务进行处理。保留点越多越好。保留点在事务处理完成(执行一条ROLLBACK或 COMMIT)后自动释放。
  6. 更改默认的提交行为:set autocommit=0;指示MySQL不自动提交更改。

全球化和本地化

  1. MySQL中使用何种字符集和校对的决定在服务器、数据库和表级进行。
  2. 使用show character set;可以查看所支持的字符集完整列表。使用show collation;可以查看所支持校对的完整列表。使用show variables like 'character%'; show variables like 'collation%';可以查看所使用的字符集和校对。创建表时可以指定字符集和校对,对列也可以设置它们。也可以在select语句自身中选择,包括order by、group by、having子句,可以起到临时区分大小写的作用。如果指定CHARACTER SET和COLLATE两者,则使用这些值。如果只指定CHARACTER SET,则使用此字符集及其默认的校对(如 SHOW CHARACTER SET的结果中所示)。如果既不指定CHARACTER SET,也不指定COLLATE,则使用数据库默认。
    示例:在创建表时指定字符集,队列也设置
    在这里插入图片描述

安全管理

  1. 访问控制:你需要给用户提供他们所需的访问权,且仅提供他们所需的访问权。不应该在日常的MySQL操作中使用root。
  2. 管理用户:MySQL用户账号和信息存储在名为mysql的MySQL数据库中。使用create user 用户名 identified by 口令;可以创建用户账号。使用rename use 原用户名 to 新用户名 ;重命名用户。使用drop user 用户 ;删除用户账号和所有相关权限。使用grant 权限 on 表或数据库 to 用户 ;赋予用户账号权限。使用revoke 权限 on 表或数据库 from 用户 ;撤销权限。
  3. 控制访问权限的层次:整个服务器用grant all和revoke all;整个数据库用on database.*;特定的表用on database.table;特定的列;特定的存储过程。

示例:创建了两个账号,milkola和wools,wools有密码,赋予milkola只读权限,再撤销。
在这里插入图片描述
wools没有权限,不能选择使用crashsource数据库

在这里插入图片描述
在这里插入图片描述
赋予milkola整个数据库的select权限,milkola可以查看表的内容,但是不能删表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
撤销milkola的权限,USAGE表示根本没有权限。
在这里插入图片描述

可以授予或撤销的权限如下表所示:

权限说明
ALL除GRANT OPTION外的所有权限
ALTER使用ALTER TABLE
ALTER ROUTINE使用ALTER PROCEDURE和DROP PROCEDURE
CREATE使用CREATE TABLE
CREATE ROUTINE使用CREATE PROCEDURE
CREATE TEMPORARY TABLES使用CREATE TEMPORARY TABLE
CREATE USER使用CREATE USER、DROP USER、RENAME USER和REVOKE ALL PRIVILEGES
CREATE VIEW使用CREATE VIEW
DELETE使用DELETE
DROP使用DROP TABLE
EXECUTE使用CALL和存储过程
FILE使用SELECT INTO OUTFILE和LOAD DATA INFILE
GRANT OPTION使用GRANT和REVOKE
INDEX使用CREATE INDEX和DROP INDEX
INSERT使用INSERT
LOCK TABLES使用LOCK TABLES
PROCESS使用SHOW FULL PROCESSLIST
RELOAD使用FLUSH
REPLICATION CLIENT服务器位置的访问
REPLICATION SLAVE由复制从属使用
SELECT使用SELECT
SHOW DATABASES使用SHOW DATABASES
SHOW VIEW使用SHOW CREATE VIEW
SHUTDOWN使用mysqladmin shutdown(用来关闭MySQL)
SUPER使用CHANGE MASTER、KILL、LOGS、PURGE、MASTER 和SET GLOBAL。还允许mysqladmin调试登录
UPDATE使用UPDATE
USAGE无访问权限
  1. 更改口令:set password for 用户 = password('新密码 ');使用set password = password('新密码');可以设置自己的口令。

数据库维护

  1. 备份数据:使用命令行实用程序mysqldump转储所有数据库内容到某个外部文件;可用命令行实用程序mysqlhotcopy从一个数据库复制所有数据 (并非所有数据库引擎都支持这个实用程序);可以使用MySQL的BACKUP TABLE或SELECT INTO OUTFILE转储所有数据到某个外部文件,数据可以用RESTORE TABLE来复原。为了保证所有数据被写到磁盘(包括索引 数据),可能需要在进行备份前使用FLUSH TABLES语句刷新所有未写数据。
  2. 进行数据库的维护:(1)使用analyze table 表名;可以检查表键是否正确。(2)check table 表名;用来针对许多问题对表进行检查。CHANGED检查自最后一次检查以来改动过的表。EXTENDED执行最彻底的检查,FAST只检查未正常关闭的表,MEDIUM检查所有被删除的链接并进行键检验,QUICK只进行快速扫描。(3)如果MyISAM表访问产生不正确和不一致的结果,可能需要用 REPAIR TABLE来修复相应的表。(4)如果从一个表中删除大量数据,应该使用OPTIMIZE TABLE来收回所用的空间。
  3. 诊断启动问题:(1)MySQL 服务器自身通过在命令行上执行mysqld启动。(2)help显示帮助——一个选项列表;(3) safe-mode装载减去某些最佳配置的服务器;(4)verbose显示全文本消息(为获得更详细的帮助消息与help 联合使用);(5)version显示版本信息然后退出。
  4. 查看日志文件:(1)错误日志名为hostname.err,位于data目录中,日志名可用 log-error命令行选项更改。(2)查询日志记录所有MySQL活动, 日志通常名为hostname.log,位于data目录中,名字可以用log命令行选项更改。 (3)二进制日志记录更新过数据(或者可能更新过数据)的所有语句,通常名为hostname-bin,位于data目录内,名字可以用log-bin命令行选项更改。(4)缓慢查询日志通常名为 hostname-slow.log ,位于data 目录中,名字可以用 log-slow-queries命令行选项更改。FLUSH LOGS语句可以刷新和重新开始所有日志文 件。

改善性能

MySQL作者提出下列建议:

  • 首先,MySQL(与所有DBMS一样)具有特定的硬件建议。 对用于生产的服务器来说,应该坚持遵循这些硬件建议。 一般来说,关键的生产DBMS应该运行在自己的专用服务器上。 
  • MySQL是用一系列的默认设置预先配置的,从这些设置开始通常是很好的。但过一段时间后你可能需要调整内存分配、缓冲区大小等。
  • MySQL一个多用户多线程的DBMS,如果这些任务中的某一个执行缓慢,则所有请求都会执行缓慢。如果你遇到显著的性能不良,可使用SHOW PROCESSLIST 显示所有活动进程(以及它们的线程ID和执行时间)。用KILL命令终结某个特定的进程 。 
  • 总是有不止一种方法编写同一条SELECT语句。
  • 使用EXPLAIN语句让MySQL解释它将如何执行一条SELECT语句。 
  • 一般来说,存储过程执行得比一条一条地执行其中的各条MySQL 语句快。 
  • 应该总是使用正确的数据类型。 
  • 决不要检索比需求还要多的数据。
  • 有的操作(包括INSERT)支持一个可选的DELAYED关键字,使用它将把控制立即返回给调用程序
  • 在导入数据时,应该关闭自动提交。
  • 必须索引数据库表以改善数据检索的性能。如果一个简单的WHERE子句返回结果所花 的时间太长,则可以断定其中使用的列(或几个列)就是需要索引的对象。 
  • 你的SELECT语句中有一系列复杂的OR条件吗?通过使用多条 SELECT语句和连接它们的UNION语句,你能看到极大的性能改 进。 
  • 如果你有一些表,它们收集数据且不经常被搜索,则在有必要之 前不要索引它们。(索引可根据需要添加和删除。)
  • LIKE很慢。一般来说,最好是使用FULLTEXT而不是LIKE。 
  • 于表的使用和内容的更改,理想的优化和配置也会改变。 
  • 最重要的规则就是,每条规则在某些条件下都会被打破。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值