MySQL安装
在windows10 安装。
-
从MySQL官方下载地址下载
-
将包解压到确定目录(示例: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
结果
-
管理员身份打开cmd
-
进入mysql的bin文件夹目录,初始化数据库,得到一个root用户的初始默认密码uctXgWLE5t-t,安装mysql,启动mysql
mysql根目录下多了一个data文件夹
-
登录mysql时输入以下命令
mysql -h 主机名 -u 用户名 -p
,示例:登录本机MySQL数据库,输入上面生成的默认密码 -
此时输入SQL命令会报错,如图,要求更改密码
调查发现使用命令ALTER USER "root"@"localhost" IDENTIFIED BY "你的新密码";
可以解决问题。
示例:设置新密码为123之后再使用SQL命令不再报错
基本概念
名称 | 定义 |
---|---|
数据库 | database, 一个以某种有组织的方式存储的数据集合 |
数据库管理系统 | DBMS,创建和操纵数据库 |
表 | table,某种特定类型数据的结构化清单 |
模式 | schema,关于数据库和表的布局及特性的信息 |
列 | column,表中的一个字段。所有表都是由一个或多个列组成的 |
数据类型 | datatype, 所容许的数据的类型 |
行 | row,表中的一个记录 |
关系表 | 把信息分解成多个表,一类数据一个表,各表通过某些常用的值(即关系relational)互相关联 |
主键 | primary key,一列(或一组列),能够唯一区分表中每个行 |
外键 | foreign key,一列,包含另一个表的主键值,定义了两个表之间的关系 |
SQL | 结构化查询语言,专门用来与数据库通信的语言 |
MySQL数据类型:
串数据类型 | 说明 |
---|---|
CHAR | 1~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 | 单精度浮点值 |
REAL | 4字节的浮点值 |
日期和时间数据类型 | 说明 |
---|---|
TIME | 格式为HH:MM:SS |
DATE | 表示1000-01-01~9999-12-31的日期,格式为 YYYY-MM-DD |
YEAR | 用2位数字表示,范围是70(1970年)~69(2069 年),用4位数字表示,范围是1901年~2155年 |
DATETIME | DATE和TIME的组合 |
TIMESTAMP | 功能和DATETIME相同(但范围较小) |
二进制数据类型 | 说明 |
---|---|
TINYBLOB | Blob最大长度为255字节 |
BLOB | Blob最大长度为64 KB |
MEDIUMBLOB | Blob最大长度为16 MB |
LONGBLOB | Blob最大长度为4 GB |
MySQL必知必会附录样例表创建
- 在下载地址下载两个SQL脚本文件,放在bin目录下。
- 创建一个新的数据源,使用命令
create schema 数据源名;
,示例中命名为crashsource,然后选择该数据源,使用命令use 数据源名
。
- 执行两个脚本,使用命令
source 脚本名.sql
,先创建表格,再填充各表
至此,实验所需要的数据库准备完毕,可以使用show
命令查看建好的表格
简单命令
show
前面已经使用了显示数据库、表、列的用法,还可以:
- SHOW STATUS,用于显示广泛的服务器状态信息;
- SHOW CREATE DATABASE和SHOW CREATE TABLE,分别用来显示创建特定数据库或表的MySQL语句;
- SHOW GRANTS,用来显示授予用户(所有用户或特定用户)的安全权限;
- SHOW ERRORS和SHOW WARNINGS,用来显示服务器错误或警告消息。
select
- 检索一列
select 列名 from 表名;
- 检索多列
select 列名1,列名2,列名3 from 表名;
- 检索所有列
select * from 表名;
- 检索不同行
select distinct 列名 from 表名;
- 返回前几行
select 列名 from 表名 limit 行数
- 返回特定几行
select 列名 from 表名 limit 位置,行数;
- 完全限定的名字
select 表名.列名 from 表名;
where
select 列名 from 表明 where 公式;
公式可以是<, <=, >, >=, <>或!=(不等于), is null, between…and…- 逻辑操作符:公式用and或or联结,and优先级高于or;
- in操作符:
where 公式 in (A,B);
,in可以包含其他select语句; - not操作符:否定它之后所跟的任何条件;
- 通配符:
where 列名 like 含有通配符的语句;
常用通配符有%(表示任何字符出现任意次数),_(匹配单个字符)。把通配符置于搜索模式的开始处,搜索起来是最慢的。
正则表达式
MySQL仅支持多数正则表达式实现的一个很小的子集,使用格式为where 列名 regexp 正则表达式;
正则表达式 | 含义 |
---|---|
‘ABCD’ | 包含ABCD的所有行 |
. | 匹配任意一个字符 |
A|B | A或B |
[ABC]D | AD或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)的行
出以一个数(包括以小数点开始的数)开始的所有产品
计算字段
- 拼接字段
select concat(A,B,C)
,使用别名select concat(A,B,C) as 别名
,任何客户机应用都可以按名引用这个列;
- 进行算术计算
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的产品平均价格。
分组数据
-
创建分组用group by子句,指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集。不加rolllup没有null。示例:返回提供10个以上产品的供应商。
-
过滤分组用having子句,类似where。where子句不起作用,因为过滤是基于分组聚集值而不是特定行值的。where在数据分组前进行过滤,having在数据分组后进行过滤。示例:列出至少有两个订单的所有顾客。
子查询
orders表:对于包含订单号、客户ID、订单日期的每个订单。
orderitems表:各订单的物品。
customers表:实际的客户信息。
- 示例:订购物品TNT2的所有客户
- 包含计算字段。示例:要显示customers表中每个客户的订单总数。红框中叫相关联子查询,当列名有多义性时使用。
联结
- 等值联结:where子句作为过滤条件,要用到完全限定的列名。没有联结条件的表关系返回的结果为笛卡尔积,行数等于第一个表的行数乘第二个表的行数。示例:
- 内部联结:
from 表1 inner join 表2 on 联结条件;
。上面的例子重写:
用联结多个表的方法重写上一章子查询的第一个例子——订购物品TNT2的所有客户:
-
自联结:可以在单条select语句中多次引用同一张表。示例:生产DTNTR的供应商生产的其他物品
-
自然联结:每个列只返回一次,操作者手动完成这一工作,对某个表选择所有列,对其他表选择明确的子集。示例:
-
外部联结:包含了在相关表中没有关联行的行。
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的两个行每行都有一个等级值,文本中词靠前的行的等级值比词靠后的行的等级值高。
-
查询扩展:MySQL对数据和索引进行两遍扫描来完成搜索,找出可能相关的结果。首先,对搜索条件进行基本的全文本搜索;其次,检查匹配行并选出所有关键词;最后,对关键词进行全文本搜索。选关键词的标准是什么呢?我还没有找到。可能是因为出现次数和语法结构??示例:对rabbit使用查询扩展
-
布尔文本搜索:以布尔方式,可以提供关于如下内容的细节:要匹配的词;要排斥的词(如果某行包含这个词,则不返回该行,即使它包含其他指定的词也是如此);排列提示(指定某些词比其他词更重要,更重要的词等级更高); 表达式分组。即使没有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数据库引擎中支持全文本搜索。
插入数据
- 插入整行:
insert into 表名 values(列1,列2,列3……);
每个列必须提供一个值,并按在表中定义的顺序给出,如果没有就设为NULL。更安全的做法是insert into 表名 (列名1,列名2,……) values(列1,列2,……);
这时若列定义为允许NULL值或在表定义中给出默认值,则可以省略列。insert操作很费时,可以采用insert low priority into
降低语句的优先级。 - 插入多行:
insert into 表名 (列名1,列名2,……) values(列1,列2,……),(列1',列2',……)
每组值用圆括号括起来,用逗号分隔。 - 插入检索出的数据:
insert into 表1 (列1,列2,……) select 列1',列2',…… from 表2
把表2合并到表1。MySQL不关心列名,使用的是列的位置。
更新数据
- 更新特定行:
update 表名 set 列名=新值 where 过滤条件
如果没有where子句,将会更新每一行 - 更新多个列:
update 表名 set 列名1=新值 ,列名2=新值2 where 过滤条件
示例:
更新发生错误时update操作会被取消,如果要不取消,使用update ignore 列名
- 删除某个列的值:设置它未null
删除数据
- 删除特定行:
delete from 表名 where 过滤条件
如果没有where子句,将会删除所有行 - 删除表:
truncate table
并重新创建一个表
表操作
- 创建表:
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。
复杂的表结构更改需要手动删除过程。
- 删除表:
drop table 表名 ;
删除表没有确认,也不能撤销,执行这条语句将永久删除该表。 - 重命名表:
rename table 表1 to 表2 ;
视图
-
概念:视图仅仅是用来查看存储在别处的数据的一种设施。 视图本身不包含数据,因此它们返回的数据是从其他表中检索出来的。每次使用视图时,都必须处理查询执行时所需的任一个检索。如果你用多个联结和过滤创建了复杂的视图或者嵌套了视图,可能会发现性能 下降得很厉害。
-
规则:视图必须唯一命名。为了创建视图,必须具有足够的访问权限。这些限制通常由数据 库管理人员授予。视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造 一个视图。ORDER BY可以用在视图中,但如果从该视图检索数据SELECT中也 含有ORDER BY,那么该视图中的ORDER BY将被覆盖。视图不能索引,也不能有关联的触发器或默认值。视图可以和表一起使用。
-
创建视图:
create view viewname ;
-
查看创建视图:
show create view viewname;
-
删除视图:
drop view viewname;
-
更新视图:先drop再create,或
create or replace view
更新一个视图将更新其基表。如果视图定义中存在以下语句,则不能进行更新,分组(使用GROUP BY和HAVING);联结;子查询;并;聚集函数(Min()、Count()、Sum()等); DISTINCT;导出(计算)列。
存储过程
- 概念:为以后的使用而保存 的一条或多条MySQL语句的集合。 MySQL将编写存储过 程的安全和访问与执行存储过程的安全和访问区分开来。
- 执行存储过程:
call 存储过程名 (@参数1 ,@参数2 ,……);
参数允许的数据类型与表中使用的数据类型相同。记录集不是允许的类型,因此,不能通过一个参数返回 多个行和列。 - 创建存储过程:
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,可以验证该存储过程功能正确。
- 删除存储过程:
drop procedure 存储过程名;
- 检查存储过程:
show create procedure 存储过程名;
显示用来创建一个存储过程的CREATE语句。show procedure status like '存储过程名';
获得包括何时、由谁创建等详细信息的存储过程列表。示例:
可以看到comment语句的内容。
使用游标
- 概念:游标(cursor)是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。MySQL游标只能用于 存储过程(和函数)。
- 规则:使用前必须声明(定义),结束使用时必须关闭,声明后比徐徐打开。
- 创建游标:
declare 游标名 cursor for select语句
- 打开游标:
open 游标名;
- 关闭游标:
close 游标名;
如果你不明确关闭游标,MySQL将会在到达END语句时自动关闭它。 - 使用游标: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语句的语法使它更适合于对游标进行循环。
调用结果:
触发器
- 概念:MySQL响应以下任意语句而 自动执行的一条MySQL语句:delete、insert、update。
- 创建触发器:需要包括 唯一的触发器名;触发器关联的表;触发器应该响应的活动(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触发器,把删掉的行保存到存档表中
示例:保证州名缩写总是大写
事务处理
- 事务处理:保证成批的MySQL操作要么完全执行,要么完全不执行。如果发生错误,则进行回退(撤销)以恢复数据库到某个已知且安全的状态。MyISAM不支持明确的事务处理管理,而InnoDB支持。
- 事务开始:
strat transaction;
- 回退(撤销)MySQL语句:
rollback;
回退start transaction之后的所有语句。事务处理用来管理INSERT、UPDATE和 DELETE语句。你不能回退SELECT语句。(这样做也没有什么意 义。)你不能回退CREATE或DROP操作。 - 提交:
commit;
在事务处理块中,提交不会隐含地进行。为进行明确的提交, 使用COMMIT语句。当COMMIT或ROLLBACK语句执行后,事务会自动关闭。 - 创建占位符:
savepoint 占位符名;
可以仅对部分事务进行处理。保留点越多越好。保留点在事务处理完成(执行一条ROLLBACK或 COMMIT)后自动释放。 - 更改默认的提交行为:
set autocommit=0;
指示MySQL不自动提交更改。
全球化和本地化
- MySQL中使用何种字符集和校对的决定在服务器、数据库和表级进行。
- 使用
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,则使用数据库默认。
示例:在创建表时指定字符集,队列也设置
安全管理
- 访问控制:你需要给用户提供他们所需的访问权,且仅提供他们所需的访问权。不应该在日常的MySQL操作中使用root。
- 管理用户:MySQL用户账号和信息存储在名为mysql的MySQL数据库中。使用
create user 用户名 identified by 口令;
可以创建用户账号。使用rename use 原用户名 to 新用户名 ;
重命名用户。使用drop user 用户 ;
删除用户账号和所有相关权限。使用grant 权限 on 表或数据库 to 用户 ;
赋予用户账号权限。使用revoke 权限 on 表或数据库 from 用户 ;
撤销权限。 - 控制访问权限的层次:整个服务器用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 | 无访问权限 |
- 更改口令:
set password for 用户 = password('新密码 ');
使用set password = password('新密码');
可以设置自己的口令。
数据库维护
- 备份数据:使用命令行实用程序mysqldump转储所有数据库内容到某个外部文件;可用命令行实用程序mysqlhotcopy从一个数据库复制所有数据 (并非所有数据库引擎都支持这个实用程序);可以使用MySQL的BACKUP TABLE或SELECT INTO OUTFILE转储所有数据到某个外部文件,数据可以用RESTORE TABLE来复原。为了保证所有数据被写到磁盘(包括索引 数据),可能需要在进行备份前使用FLUSH TABLES语句刷新所有未写数据。
- 进行数据库的维护:(1)使用
analyze table 表名;
可以检查表键是否正确。(2)check table 表名;
用来针对许多问题对表进行检查。CHANGED检查自最后一次检查以来改动过的表。EXTENDED执行最彻底的检查,FAST只检查未正常关闭的表,MEDIUM检查所有被删除的链接并进行键检验,QUICK只进行快速扫描。(3)如果MyISAM表访问产生不正确和不一致的结果,可能需要用 REPAIR TABLE来修复相应的表。(4)如果从一个表中删除大量数据,应该使用OPTIMIZE TABLE来收回所用的空间。 - 诊断启动问题:(1)MySQL 服务器自身通过在命令行上执行mysqld启动。(2)help显示帮助——一个选项列表;(3) safe-mode装载减去某些最佳配置的服务器;(4)verbose显示全文本消息(为获得更详细的帮助消息与help 联合使用);(5)version显示版本信息然后退出。
- 查看日志文件:(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。
- 于表的使用和内容的更改,理想的优化和配置也会改变。
- 最重要的规则就是,每条规则在某些条件下都会被打破。