数据库(database)就是存储数据的仓库。为了方便数据的存储和管理,将数据按照特定的规律在磁盘上,经过数据库管理系统,有效地组织和管理存储在数据库中的数据。
数据库系统和数据库不是一个概念,数据库系统(DBS),比数据库大不少,由数据库、数据库管理系统,应用开发工具构成。
数据库管理系统(DataBase Management System,简称 DBMS),是用来定义数据,管理和维护数据的软件。它是数据库系统的一种重要组成部分。
常见的数据库系统:甲骨文Oracle数据库,IBM的DB2,微软SQL Server、Access,PostgreSql、MySQL。html
MySQL数据库特色:开放源代码的数据库,MySQL的跨平台性(Unix、Linux、Windows等),开源免费,功能强大使用方便。
SQL:(Structured Query Language),结构化查询语句,数据库管理系统经过 SQL 语言来管理数据库中的数据。
SQL 语言组成部分:mysql
官网下载 有两个版本,一个是二进制分发版(.msi 安装文件),一个是 免安装版(.zip 压缩文件)。二进制分发版和安装普通软件同样的,在选择须要安装的文件时,若是只是学习 MySql,能够只选择安装 MySQL Server。默认安装路径是:C:\Program Files\MySQL\MySQL Server 5.6
。8.x 版本的压缩包版本没有 .ini 文件,和 5.x 版本的不同,配置方式也不同,如下内容以 5.x 版本为例。正则表达式
目录 | 备注 | ||
---|---|---|---|
bin目录 | 存储可执行文件 | ||
data 目录 | 存储数据文件 | ||
include 目录 | 存储包含的头文件 | ||
lib 目录 | 存储库文件 | ||
docs 目录 | 文档 | ||
share 目录 | 错误信息和字符集文字 | ||
my.ini文件 | MySQL的配置文件,默认的是 my-default.ini,须要复制并重命名为 my.ini | 设置字符集 | 客户端字符集[mysql]:default-character-set=utf8 |
服务器端字符集[masqld]:character-set-server=utf8 |
运行 MySql 的步骤:算法
C:\Program Files\MySQL\MySQL Server 5.6\bin
MySQL56
的服务,开启服务有两个方式,一是打开系统的服务,手动开启;二是在控制台输入:net start mysql56
,关闭服务是:net stop mysql56
default-character-set=utf8
,服务器端[mysqld] character-set-server=utf8
mysql -u root -p
登陆命名:mysql [参数][参数值]
,好比 mysql -uroot -p
。sql
经常使用参数 | 备注 |
---|---|
-u | 用户名 |
-p | 密码 |
-h | 服务器名称,-h localhost ,-h 127.0.0.1 |
-P | 端口号,默认安装端口号 3306 |
-D,--database=name | 打开指定数据库 |
--prompt=name | 设置命令提示符,--prompt=>>> ,登陆以后也能够设置,prompt \h~\u~\D~\d ,服务器名称当前用户名完整的日期~当前数据库 |
--delimiter=name | 指定分隔符,登陆以后也能够修改,DELIMITER //,输入语句后以// 结束,默认分隔符; 、\g |
-V,--version | 输出版本信息而且退出 |
退出命名:exit
| quit
| \q
shell
扩展语句:数据库
\g
等同于;
\t
MySql 语句规范:编程
1.建立数据库,数据库保存在 data 文件夹中缓存
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [[DEFAULT] CHARACTER SET [=] charset_name]
数据库名称:DATABASE 或 SCHEMA;
{ }
表明必需要出现的,[ ]
表明能够选的;
db_name表示数据库名称;
CHARACTER SET [=] charset_name 表示编码方式,如 utf8安全
2.查看当前服务器下的数据库列表:SHOW {DATABASES | SCHEMAS}
3.查看制定数据库的定义:SHOW CREATE {DATABASE | SCHEMA} db_name
4.修改制定数据库的编码方式:ALTER {DATABASE | SCHEMA} db_name [DEFAULT] CHARACTER SET [=] character_name
5.打开指定数据库:USE db_name
6.删除指定数据库:DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
数据表:
CREATE TABLE [IF NOT EXISTS] tbl_name(
字段名称 字段类型 [完整性约束条件]
...
)ENGINE=引擎名称 CHARSET='编码方式';
CREATE TABLE [IF NOT EXISTS] tbl_name(
字段名称 字段类型 [UNSIGNED | ZEROFILL] [NOT NULL] [DEFAULT 默认值] [[PRIMARY] KEY] [UNIQUE [KEY]]
)ENGINE=INNODB CHARSET=UTF8 AUTO_INCREMENT=数值;
CREATE TABLE IF NOT EXISTS `user`(
id SMALLINT,
username VARCHAR(20),
age TINYINT,
sex ENUM('男','女','保密'),
email VARCHAR(50),
addr VARCHAR(20),
birth YEAR,
salary FLOAT(8,2),
tel INT,
# COMMENT 是给字段添加注释
married TINYINT(1) COMMENT '0表明未结婚,非0表明结婚'
)ENGINE=INNODB CHARSET=UTF8;
注释:# 注释内容 或者 -- 注释内容
完整性约束条件:
字段类型:查看数据类型help [数据类型]
或\h [数据类型]
整数类型:
浮点类型:
内部以字符串形式存储数值
字符串类型:
日期时间类型:
存储引擎
存储引擎就是指表的类型。数据库的存储类型决定了表在计算机中的存储方式。用户能够根据不一样的存储方式,是否进行事务处理等来选择合适的存储引擎。
查看数据库的存储引擎:
SHOW ENGINES; 或者 SHOW ENGINES\G
SHOW VARIABLES LIKE 'have%'
SHOW VARIABLES LIKE 'storage_engine'
经常使用存储引擎及特色:
1.查看数据库下的数据表:SHOW TABLES
2.查看指定表的表结构:DESC tbl_name, DESCRIBE tbl_name, SHOW COLUMNS FROM tbl_name
3.查看建立表的定义:SHOW CREATE TABLE tbl_name;
1.修改表名:ALTER TABLE tbl_name RENAME [TO | AS] new_name 或者 RENAME TABLE tbl_name TO new_name
2.添加字段:ALTER TABLE tbl_name ADD 字段名称 字段类型 [完整性约束条件] [FIRST | AFTER 字段名称]
3.删除字段:ALTER TABLE tbl_name DROP 字段名称,或者 ALTER TABLE tbl_name DROP 字段1,DROP 字段2,...;
4.修改字段:ALTER TABLE tbl_name MODIFY 字段名称 [完整性约束条件] [FIRST | AFTER 字段名称] ,主键有自增加不能直接删除主键,须要先去掉自增加,修改字段能够去掉自增加
5.修改字段名称:ALTER TABLE tbl_name CHANGE 旧字段名称 新字段名称 字段类型 [完整性约束条件] [FIRST | AFTER 字段名称]
6.添加删除默认值:ALTER TABLE tbl_name ALTER 字段名称 SET DEFAULT 默认值 , ALTER TABLE tbl_name ALTER 字段名称 DROP DEFAULT
7.添加主键:ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (字段名称, ...)
8.删除主键:ALTER TABLE tbl_name DROP PRIMARY KEY;
9.添加惟一:ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY] [索引名称](字段名称, ...) ,索引名称不能带有单引号,可使用反引号。
10.删除惟一:ALTER TABLE tbl_name DROP {INDEX | KEY} index_name
11.修改表的存储引擎:ALTER TABLE tbl_name ENGINE=存储引擎名称
12.设置自增加的值:ALTER TABLE tbl_name AUTO_INCREMENT=值
13.删除数据表:DROP TABLE [IF EXISTS] tbl_name[, tbl_name...]
1.插入数据:
2.更新数据:UPDATE tbl_name SET 字段名称=值,... [WHERE 条件] [ORDER BY 字段名称] [LIMIT 限制条数]
3.删除数据:
DELETE删除不会重置AUTO_INCREMENT的值
完全清空数据表
: TRUNCATE [TABLE] tbl_name;1.查询记录:
SELECT select_expr[,select_expr...]
[
FROM table_references
[WHERE 条件]
[GROUP BY {col_name | position} [ASC | DESC],...分组]
[HAVING 条件 对分组结果进行二次筛选]
[ORDER BY {col_name | position} [ASC | DESC],...排序]
[LIMIT 限制显示条数]
]
2.查询表达式:
*
表示全部列,tbl_name.*
表示命名表的全部列,tb_name.tbl_name.*
表示哪一个数据库中的哪一个表里的全部列[AS]alias_name
为表赋予别名3.WHERE 条件:
查询条件 | 符号 |
---|---|
比较 | = 、< 、<= 、> 、>= 、!= 、<> 、!> 、!< 、<=> (能够判断是否是 NULL) |
指定范围 | BETWEEN AND 、NOT BETWEEN AND |
指定集合 | IN 、 NOT IN |
匹配字符 | LIKE 、 NOT LIKE (模糊查询,% 表明0个一个或者多个任意字符,_ 表明1个任意字符) |
是否为空值 | IS NULL 、 IS NOT NULL |
多个查询条件 | AND 、 OR |
4.GROUP BY 查询结果分组
5.HAVING 子句
经过 HAVING 子句对分组结果进行二次筛选,和 WHERE 差很少,只能用于分组以后进行筛选。SELECT * FROM tbl_name GROUP BY 字段名称 HAVING 条件1 [[AND | OR...] 条件2]
若是没有 GROUP BY 进行分组,结果可能和 WHERE 同样的。
6.ORDER BY 排序
ORDER BY 对查询结果进行排序,默认排序是 ASC 升序排序,DESC 是降序排列。SELECT * FROM tbl_name ORDER BY 字段名称 [ASC|DESC]
SELECT * FROM tbl_name ORDER BY RAND(); 随机数排序
7.LIMIT 限制查询结果显示条数
对查询结果,限制显示条数,SELECT * FROM tbl_name LIMIT 条数
SELECT * FROM tbl_name LIMIT 起始条数偏移量(以0开始), 每页显示条数
链接查询
是将两个或两个以上的表按某个条件链接起来,从中选取须要的数据。链接查询是同时查询两个或两个以上的表时使用的,当不一样的表中存在相赞成义的字段时,能够经过该字段链接这几个表。
SELECT cms_user.id,username,proName FROM cms_user,provinces
WHERE cms_user.proId=provinces.id;
SELECT u.id,u.username,u.email,u.sex,p.proName
FROM cms_user AS u
INNER JOIN provinces AS p
ON u.proId=p.id;
SELECT u.id,u.username,u.regTime,a.proName,u.sex,COUNT(*) AS totalUsers,GROUP_CONCAT(username)
FROM cms_user AS u
LEFT JOIN
provinces AS a
ON u.proId=a.id
WHERE sex='女'
GROUP BY a.proName
HAVING COUNT(*)>=1
ORDER BY u.id DESC
LIMIT 0,2;
1.内链接查询:
2.外链接查询
3.外键
外键是表的一个特殊字段。被参照的表是主表,外键所在字段的表为子表。设置外键的原则:就是依赖于数据库中已存在的表的主键。外键的做用是创建该表与其父表的关联关系。父表中对记录作操做时,子表中与之对应的信息也应有相应的改变。
外键的做用保持数据的一致性和完整性;能够实现一对一或一对多的关系。
注意:
外键约束的参照操做:
CONSTRAINT 父表_fk_子表 FOREIGN KEY(链接子表字段名称) REFERENCES 父表名(链接父表字段名称) ON DELETE CASCADE ON UPDATE CASCADE;
CONSTRAINT 父表_fk_子表 FOREIGN KEY(链接子表字段名称) REFERENCES 父表名(链接父表字段名称) ON DELETE SET NULL ON UPDATE SET NULL;
在链接查询中,若是一个字段在父表和子表中有关联,则不能直接用DELETE FROM tbl_name [ WHERE 条件 ]去删除父表中的字段(由于子表还会存在该字段),因此为了完全删除,此时须要给子表建立一个外键,当须要删除一个字段时,必需先删除子表中的字段才能删除父表中的字段。
CREATE TABLE IF NOT EXISTS department(
id TINYINT AUTO_INCREMENT KEY,
dep VARCHAR(20) NOT NULL UNIQUE
)ENGINE=INNODB;
CREATE TABLE IF NOT EXISTS employee(
id SMALLINT AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL,
depId TINYINT,
CONSTRAINT em_fk_dep FOREIGN KEY(depId) REFERENCES department(id)
)ENGINE=INNODB;
4.联合查询:查询的数目要一致
子查询是将一个查询语句嵌套在另外一个查询语句中。内层查询语句的查询结果,能够为外层查询语句提供条件。由内向外执行
引起子查询的状况:
运算符 | ANY | SOME | ALL |
---|---|---|---|
>、>= | 最小值 | 最小值 | 最大值 |
<、<= | 最大值 | 最大值 | 最小值 |
= | 任意值 | 任意值 | |
<>、!= | 任意值 |
将查询结果写入到数据表:
-- 向已经存在的表中插入数据
INSERT [INTO] tbl_name [(col_name,...)] SELECT ...
INSERT employee(username)
SELECT username FROM department
-- 在存储过程当中向变量插入数据
SELECT value1 INTO var_anem FROM tbl_name
建立数据表同时将查询结果写入到数据表:
CREATE TABLE [IF NOT EXISTS] tbl_name[(create_definition,...)] select_statement
CREATE TABLE test(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
num TINYINT UNSIGNED
)SELECT id,score FROM student;
1.REGEXP '匹配模式'
SELECT * FROM cms_user WHERE username REGEXP '^A';
SELECT * FROM cms_user WHERE username REGEXP '[^ABC]';
2.经常使用匹配方式
模式字符 | 含义 |
---|---|
^ | 匹配字符开始的部分 |
$ | 匹配字符串结尾部分 |
. | 表明字符串中的任意一个字符,包括回车和换行,至关于 LIKE 语句中的_ |
[字符集合] | 匹配字符集合中的任何一个字符 |
[^字符集合] | 匹配除了字符集合之外的任何一个字符 |
s1 | s2 |
* | 表明0个1个或者多个其前的字符,至关于 LIKE 语句中的 % |
+ | 表明1个或者多个其前的字符 |
String{N} | 字符串出现 N 次 |
字符串{M, N} | 字符串至少出现 M 次,最多 N 次 |
1.算数运算符:SELECT 3/0;
符号 | 表达式 | 做用 |
---|---|---|
+ | X1+X2 | 加法 |
- | X1-X2 | 减法 |
* | X1*X2 | 乘法 |
/ | X1/X2 | 除法 |
DIV | X1 DIV X2 | 除法 |
% | X1 % X2 | 取余 |
MOD | MOD(X1,X2) | 取余 |
2.比较运算符:结果只能为真或假,1为真,0为假
符号 | 形式 | 做用 |
---|---|---|
= | X1=X2 | 判断是否相等 |
<>或!= | X1<>X2或 X1!=X2 | 判断是否不相等 |
<=> | X1<=>X2 | 判断是否相等,能够判断是否等于NULL |
>、>= | X1>X2或 X1>=X2 | 判断是否大于等于 |
<、<= | X1<X2或 X1<=X2 | 判断是否小于等于 |
IS NULL或IS NOT NULL | X1 IS NULL 或 X1 IS NOT NULL | 判断是否等于NULL |
BETWEEN AND或NOT BETWEEN AND | X1 BETWEEN m AND n | 判断是否在范围内 |
IN 或 NOT IN | X1 IN(值,...) | 判断是否在某一固定范围内 |
LIKE 或 NOT LIKE | X1 LIKE 表达式 | 判断是否撇配 |
REGEXP | REGEXP 正则表达式 | 判断是否正则匹配 |
3.逻辑运算符
符号 | 形式 | 做用 |
---|---|---|
&&或者AND | 与 | 而且 |
或者OR | ||
!或者NOT | 非 | 取反 |
XOR | 异或 | 不一样为真 |
4.运算符的优先级:经过括号()改变优先级
优先级 | 运算符 | 优先级 | 运算符 |
---|---|---|---|
1 | ! | 8 | |
2 | ~ | 9 | =、<=>、<、<=、>、>=、!=、<>、IN、IS NULL、LIKE、REGEXP |
3 | ^ | 10 | BETWEEN AND、CASE、WHEN、THEN、ELSE |
4 | *、/、DIV、%、MOD | 11 | NOT |
5 | +、- | 12 | &&、AND |
6 | >>、<< | 13 | |
7 | & | 14 | ;= |
1.数学函数
名称 | 描述 |
---|---|
CEIL() | 进一取整 |
MOD | 取余数(取模) |
ROUND() | 四舍五入,SELECT ROUND(3.123,2); 3.12 |
ABS() | 取绝对值 |
FLOOR() | 舍一取整 |
POWER(X,n) | 幂运算 |
TRUNCATE() | 数字截取,SELECT TRUNCATE(43.125,1); 43.1 |
PI() | 圆周率 |
RAND()和RAND(X) | 返回0~1之间的随机数,RAND(X),X相同时返回的随机数相同 |
SIGN(X) | 返回X的符号,X为负数、0、正数,分别返回-1和0和1 |
EXP(X) | 计算e的几回方 |
2.字符串函数
名称 | 描述 |
---|---|
CHAR_LENGTH (S) | 返回字符串的字符数 |
LENGTH | 返回字符串的长度 |
CONCAT (S1,S2,...) | 将字符串合并为一个字符串 |
CONCAT_WS (X,S1,S2,...) | 以指定分隔符链接字符串 |
UPPER (S) /UCASE (S) | 将字符串转换为大写 |
LOWER (S) /LCASE (S) | 将字符串转换为小写 |
LEFT(S,N) /RIGHT(S,N) | 返回字符串的前/后n个字符 |
LPAD (S1,LEN,S2) /RPAD (S1,LEN,S2) | 将字符串S1用S2填充到指定的LEN |
LTRIM(S)/RTRIM(S)/TRIM(S) | 去掉字符串中的空格 |
TRIM(S1 FROM S) | 去掉字符串S中开始出现和结尾处的字符串S1 |
REPEAT(S,N) | 重复字符串指定次数 |
SPACE(N) | 返回N个空格 |
REPLACE(S,S1,S2) | 将字符串S中搜索S1替换成S2 ,会区分大小写 |
STRCMP(S1,S2) | 比较字符串,>=<分别返回1,0,-1 ,比较不会区分大小写 |
SUBSTRING(S,P,LEN) | 截取字符串,从第P个位置截取LEN个字符,包括截取字符 |
REVERSE(S) | 反转字符串 |
ELT(N,S1,S2) | 返回指定位置的字符串,字符串起始点从1开始 |
3.日期时间函数
名称 | 描述 |
---|---|
CURDATE(),CURRENT_DATE() | 返回当前日期 |
CURTIME(),CURRENT_TIME() | 返回当前时间 |
NOW() | 返回当前日期和时间 |
MONTH(D) | 返回日期中月份的值 *MONTH(NOW()) |
MONTHNAME(D) | 返回日期中月份名称,January *MONTHNAME(NOW()) |
DAYNAME(D) | 返回日期是几,Monday *MONTHNAME(NOW()) |
DAYOFWEEK(D) | 返回一周内的第几天,1表明星期日 *DAYOFWEEK(NOW()) |
WEEKDAY(D) | 返回日期是星期几,0表明是星期一 *WEEKDAY(NOW()) |
WEEK(D) | 一年中的第多少个星期 *WEEK(NOW()) |
YEAR(D) | 返回年份值 |
HOUR(T) | 返回小时值 |
MINUTE() | 返回分钟值 |
SECOND(T) | 返回秒数 |
DATEDIFF(D1,D2) | 计算两个日期之间的相隔的天数 |
4.条件判断函数
名称 | 描述 |
---|---|
IF(EXPR,V1,V2) | 若是表达式EXPR成立,返回结果v1;不然v2 |
IFNULL (V1,V2) *IFNULL间没有空格 | 若是v1的不为空,就显示v1的值;不然v2 |
CASE WHEN exp1 | CASE表示函数开始,END表示函数结束。 |
THEN v1[ WHEN exp2 | 若是exp1成立时,返回v1。若是表达式exp2成立时,返回v2值。 |
THEN v2 ] [ ELSE vn ] END | 依次类推,最后遇到ELSE时,返回vn的值 |
5.系统函数
名称 | 描述 |
---|---|
VERSION() | 返回数据库版本号 |
CONNECTION_ID() | 返回服务器的链接数 |
DATABASE(),SCHEMA() | 返回当前数据库名 |
USER(),SYSTEM_USER() | 返回当前用户 |
CURRENT_USER(),CURENT_USER | 返回当前用户 |
CHARSET(STR) | 返回字符串STR的字符集 |
COLLATION(STR) | 返回字符串STR的校验字符集 |
LAST_INSERT_ID() | 返回最近生成的AUTO_INCREMENT值 |
6.其余
名称 | 描述 |
---|---|
MD5(str) | 信息摘要算法 |
PASSWORD(str) | 密码算法 |
ENCODE(str,pwd,str) | |
DECODE(crypt_str,pwd_str) | 对经过ENCODE加密以后的内容解密 |
FORMAT(x,n) | 将数字x进行格式化,将x保留到小数点后n 位 |
ASCII(s) | 返回字符串s的第一个字符的ASCII码 |
BIN(x) | 返回x的二进制编码 |
HEX(x) | 返回x的十六进制编码 |
OCT(x) | 返回x的八进制编码 |
CONV(x,f1,f2) | 将x从f1进制数变成f2进制数 |
INET_ATON(IP) | 将IP地址转换成数字 |
INET_NTOA(n) | 将数字转换成IP地址 |
GET_LOCT(name,time) | 定义锁,IS_FREE_LOCK(name)判断是否使用锁,0表示存在锁,1表示不存在锁 |
RELEASE_LOCK(name) | 解锁 |
索引由数据库中一列或多列组合而成,其做用是提升对表中数据的查询速度。优势是能够提升检索数据的速度,缺点是建立和维护索引须要耗费时间,索引能够提升查询速度,会减慢写入速度。
索引分类:
1.建立表的时候建立索引
CREATE TABLE tbl_name(
字段名称 字段类型 [完整性约束条件],
...,
[UNIQUE | FULLTEXT |SPATIAL] INDEX | KEY [索引名称](字段名称[(长度)]
[ASC | DESC])
);
2.在已经存在的表上建立索引
CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX 索引名称 ON 表名{字段名称[(长度)] [ASC | DESC] }
ALTER TABLE tbl_name ADD [UNIQUE | FULLTEXT | SPATIAL] INDEX 索引名称(字段名称[(长度)] [ASC | DESC]);
删除索引
DROP INDEX 索引名称 ON tbl_name;
ALTER TABLE tbl_name DROP INDEX 索引名称
1.服务器编码设定:为解决客户端链接乱码
net start mysql56
开启mysql服务,mysql -u root -h 127.0.0.1 -p root
打开mysql。
导入数据库:source 数据库所在路径.数据库名加后缀
,如 source C:/Develop/mysql/test.sql,\
变为/
。
查看数据库建立方式SHOW CREATE TABLE tbl_name
,若是编码方式是CHARSET=latin1
,在插入中文和在CMD上查看是能够看到,但在客户端链接工具中查看是乱码的。
打开命令窗口,SHOW VARIABLES LIKE 'CHAR%'
,查看客户端编码方式,若是不是utf8方式则进行修改。在my.ini文件中修改客户端编码 default-character-set=utf8 ,服务端编码 character-set-server=utf8 。
若是配置文件中修改了不能生效,则用下面的方法,但只在当前状态下有效,当重启数据库服务后失效
:
SET character_set_client = utf8;
SET character_set_connection = utf8;
SET character_set_database = utf8;
SET character_set_results = utf8;
SET character_set_server = utf8;
或 SET names 'utf8';
若是已经修改了my.ini,重启了服务仍是不能生效,能够查看服务可执行文件的路径
:
"C:\Program Files\MySQL\MySQL Server 5.6\bin\mysqld.exe" --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.6\my.ini" MySQL56 这里显示my.ini文件不是执行Program Files里添加的,而是ProgramData里的。则有两种方式让本身添加的数据生效。 1、修改ProgramData里的my.ini文件 2、修改服务里的可执行文件的路径,这个须要在运行里输入regedit,打开注册表,找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL56,修改ImagePath
2.数据表的编码设定:已存在的表
备份命令:mysqldump -h [ip地址] -P [端口号] -u [用户名] -p [数据库] > [sql脚本文件] 还原命令:mysql -h [ip地址] -P [端口号] -u [用户名] -p [数据库] < [sql脚本文件]
注意:导入导出不要使用 powershell ,直接使用 cmd。
1.会话变量
2.全局变量
3.区别:会话变量只针对当前用户有效,全局变量是针对整个mysql数据库。
经常使用的操做数据库语言SQL语句在执行的时候须要先编译,而后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户经过指定的存储过程的名字并给定参数(若是该存储过程带有参数)来调用执行它。
一个存储过程是一个可编程的函数,它在数据库中建立并保存。它能够有SQL语句和一些特殊的控制结构组成。当但愿在不一样的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是很是有用的。数据库中的存储过程能够看作是对编程中的面向对象方法的模拟。它容许控制数据的访问方式。
存储过程的优势:加强了SQL语言的功能和灵活性;存储过程容许标准组件是编程;存储过程能实现较快的执行速度。
1.建立存储过程:
;
做为执行结束的标记,DELIMITER 新的分隔符
,好比DELIMITER ~
CREATE PROCEDURE p_name()
BEGIN
语句1;
语句2;
END~
-- 调用存储过程
CALL p_name~
2.参数和变量
CREATE PROCEDURE p_vartest1(IN p_var INT)
BEGIN
SELECT p_var;
SET p_var=p_var+1;
SELECT p_var;
END~
-- 建立一个名为@P的变量,没有@符号是不能建立成功的
SET @P=3~
-- 调用存储过程,并传递参数
CALL p_vartest1(@P)~
-- 查看调用存储过程后的@P值,是否有变化
SELECT @P;
3.流程控制
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF
CREATE PROCEDURE p_if(in age INT)
BEGIN
IF age>=18 && age<30 THEN
SELECT '成年人';
ELSEIF age>=30 && age<60 THEN
SELECT '中年人';
ELSE
SELECT '老年人';
END IF;
END~
-- case_value即是条件判断的变量,when_value表示变量的取值
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE;
CREATE PROCEDURE p_case(in salaryId INT)
BEGIN
DECLARE addS INT;
CASE salaryId
WHEN 1001 THEN SET addS = 1500;
WHEN 1002 THEN SET addS = 2000;
WHEN 1003 THEN SET addS = 2500;
ELSE SET addS=1000;
END CASE;
UPDATE salaries SET salary=addS WHERE id=salaryId;
END~
CREATE PROCEDURE p_while()
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE result INT DEFAULT 0;
WHILE i<=100 DO
SET result=result+i;
SET i=i+1;
END WHILE;
SELECT result;
END~
CREATE PROCEDURE p_repeat()
BEGIN
DECLARE min_var INT DEFAULT 1;
DECLARE max_var INT DEFAULT 1;
SELECT MIN(id) INTO min_var FROM tbl_name;
SELECT MAX(id) INTO max_var FROM tbl_name;
REPEAT
IF min_var%2 = 0 THEN
UPDATE tbl_name SET gender='F' WHERE id=min_var;
END IF;
SET min_var = min_var + 1;
UNTIL min_var > max_var
END REPEAT;
END~
CREATE PROCEDURE p_loop()
BEGIN
DECLARE min_var INT DEFAULT 1;
DECLARE max_var INT DEFAULT 1;
SELECT MIN(id) INTO min_var FROM tbl_name;
SELECT MAX(id) INTO max_var FROM tbl_name;
loop_name:LOOP
IF min_var%2 = 0 THEN
UPDATE tbl_name SET gender='F' WHERE id=min_var;
END IF;
SET min_var = min_var + 1;
IF min_var > max_var THEN
LEAVE loop_name;
END IF;
END LOOP;
END~
4.定义条件和处理
条件的定义和处理能够用来定义过程当中遇到问题时相应的处理步骤。
DECLARE CONTINUE HANDLER FOR sqlstate '错误代码值' SET 变量=变量值
CREATE PROCEDURE p_insert()
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @X=1;
INSERT INTO test11(username) VALUES('aaa');
INSERT INTO test2(username,password) VALUES('abc','aab');
END~
ERROR 1146 (42S02):Table 'test11' doesn't exists -- 错误代码 42S02 是表不存在,添加了CONTINUE就会直接跳过错误向下执行
5.存储过程管理
默认函数功能时关闭的,SHOW VARIABLES LIKE '%fun%'
能够查看到函数功能是否关闭,若是显示OFF,能够设置为ONSET global log_bin_trust_function_creators=1
。
-- 返回是 RETURNS 不是 RETURN,数据类型和返回的数据类型要一致
CREATE FUNCTION 函数名( 变量1, 变量2,... )
RETURNS 数据类型
BEGIN
...执行的程序代码
RETURN 数据;
END;
CREATE FUNCTION add_f(a INT,b INT)
RETURNS INT
BEGIN
RETURN a + b;
END~
SELECT add_f(3,4)~ --> 7
DROP FUNCTION [IF EXISTS] 函数名
DROP FUNCTION IF EXISTS add_f~
视图是由查询结果造成的一张虚拟表。
若是某个查询结果出现的很是频繁,也就是,要常常拿这个查询结果来作子查询,就可使用视图。
视图的好处:简化查询语句;能够进行权限控制;大数据表分表的时候,好比某张表的数据由100万条,那么能够将这张表分红四个视图。
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
该语句能建立新的视图,若是给定了OR REPLACE子句,该语句还能替换已有的视图。select_statement是一种SELECT语句,它给出了视图的定义。该语句可从基表或其余视图进行选择。
-- 把一张表分红4个视图,分红四部分查询
CREATE OR REPLACE VIEW view_employee1
AS
SELECT * FROM employees WHERE emp_id % 4 = 0;
CREATE OR REPLACE VIEW view_employee2
AS
SELECT * FROM employees WHERE emp_id % 4 = 1;
CREATE OR REPLACE VIEW view_employee3
AS
SELECT * FROM employees WHERE emp_id % 4 = 2;
CREATE OR REPLACE VIEW view_employee4
AS
SELECT * FROM employees WHERE emp_id % 4 = 3;
视图存放在 information_schema数据库下的views表里。
1.视图的算法
对于Merge,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。
对于Temptable,视图的结果将被置于临时表中,而后使用它执行语句。
对于UNDEFINED,MySql将选择所要使用的算法。若是可能,它倾向于MERGE而不是TEMPTABLE,这是由于MERGE一般更有效,并且若是使用了临时表,视图是不可更新。
2.查看视图的定义:SHOW table status [FROM 数据库名] [LIKE '匹配']
3.删除视图定义:只能删除视图的定义,不能删除数据,必须有DROP权限
4.查看权限:mysql>SELECT Drop_priv FROM mysql.user WHERE USER='root';
5.删除视图
6.删除多个
7.视图更新:某些视图是可更新的。也就是说,能够在诸如UPDATE、DELETE 或 INSERT 等语句中使用它们,以更新基表的内容。对于可更新的视图,在视图中的行和基表汇总的行之间必须具备一对一的关系。还有一些特定的其余结构,这类结构会是的视图不可更新。更具体地讲,若是视图包含下面中的任何一种,那么它就是不可更新的:
8.with check option的理解和应用:经过视图进行的修改,必须也能经过该视图看到修改后的结果。更新视图的数据,那么必须先知足视图的条件,知足以后才可以更新到基表中。
触发器是一种特殊的存储过程,它在插入、删除或修改特定表中的数据时触发执行,它比数据库自己标准的功能有更精细和更复杂的数据控制能力。
触发器的特性:
触发器不能直接被调用,是由数据库主动去执行。
CREATE TRIGGER 语法:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。
触发程序与命名为tbl_name的表相关,tbl_name必须引用永久性表,不能将触发程序与TEMPORARY表或视图关联起来。
trigger_time是触发程序的动做时间。它能够是BEFORE或AFTER,以指明触发程序是在激活它的语句以前或以后触发。
trigger_event指明了激活触发程序的语句的类型。trigger_event能够是下述值之一:
特别说明:
CREATE TRIGGER tr_insert AFTER INSERT
ON employee FOR EACH ROW
BEGIN
INSERT salaries VALUES(new.emp_no,0,'2019-05-10');
END~
CREATE TRIGGER tr_delete AFTER DELETE
ON employee FOR EACH ROW
BEGIN
DELETE FROM salaries WHERE emp_no=old.emp.no;
END~
1.查看全部触发器:SHOW TRIGGERS;
2.MYSQL中有一个information_schema.TRIGGERS表,存储全部库中的全部触发器,DESC information_schema.TRIGGERS,能够查看到触发器结构。
3.查看触发器名字:SELECT * FROM information_schema.TRIGGERS WHERE TRIGGER_NAME='触发器名字'\G
4.删除触发器:DROP TRIGGER [schema_name.]trigger_name
锁是计算机协调对个进程或线程并发访问某一资源的机制。在数据库中,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是全部数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来讲,锁对数据库而言显得尤为重要,也更加复杂。
MYSQL锁机制相比其余数据库,最显著的特色是不一样的存储引擎支持不一样锁机制。好比MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;INNODB既支持行级锁(row-level locking),也支持表级锁,但默认是行级锁。
先把数据库导出,在导出的.sql文件中添加set storage_engine = MyISAM;
,而后再导入,确保成为MyISAM存储引擎。
MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。
对于MyISAM表的读操做,不会阻塞其余用户对同一表的读请求,但会阻塞对同一表的写请求;对于写操做,则会阻塞其余用户对同一表的读和写操做;读操做和写操做之间,以及写操做之间是串行的。
一个SESSION使用LOCK TABLE命令给表加了读锁,这个SESSION能够查询锁定表中的记录,但更新或访问其余表会提示错误;同时,另一个SESSION能够查询表中的记录,但更新就会出现锁等待。
1.加共享读锁:LOCK TABLE tbl_name READ;
2.解锁:UNLOCK TABLES;
1.加独占写锁:LOCK TABLE tbl_name WRITE;
2.解锁:UNLOCK TABLES;
MyISAM表的读和写是串行的,但就整体而言,在必定条件下,MyISAM表也支持查询和插入操做的并发进行。
该引擎有一个系统变量consurrent_insert,专门用以控制其并发插入的行为,其值分别能够为0、1和2.
锁调度:一个进程请求读锁,另外一个进程请求同一表的写锁;写进程先得到锁。MYSQL任务写请求更重要。MyISAM不适合有大量更新操做和查询操做。
解决方法:执行set low_priority_updates=1
,使该链接发出的更新请求优先下降,其中insert、delete也能够经过此方法指定。
1.查看数据库是否支持事务(INNODB支持):SHOW ENGINES;
2.查看MYSQL当前默认的存储引擎:SHOW VARIABLES LIKE '%storage_engine%'
3.查看某张表的存储引擎:SHOW CREATE TABLE tbl_name
4.修改表的存储结构:
事务是为了保证数据的一致性,开启事务以后须要提交以后数据才会生效。
START TRANSACTION; 开启事务
COMMIT; 提交
SET AUTOCOMMIT=1; 自动提交
回到事务发生以前的数据状态,经过 ROLLBACK;
补充:
还原点:
Set autocommit=0;
insert into userinfo values(6,’test1’,’128’);
savepoint s1;
insert into userinfo values(6,’test2’,’128’);
savepoint s2;
执行完三条插入语句,select * from userinfo能够看到三条。若是你想回滚到最初roolback就是最初什么都没有作的状态。若是你想回到savepoint s1的状态(也就是插入一条test1那里): rollback to savepoint s1; 。
事务更改被锁定: lock table 事务名称 writes;
解锁,让其余客户端可读: start transaction;
事务的4个属性:原子性、一致性、隔离性、持久性,这四个属性一般称为ACID特性。
MYSQL 记录下查询超过指定时间的语句,咱们将超过指定时间的SQL语句查询成为‘慢查询’。
查看慢查询设定时间:SHOW VARIABLES LIKE '%long%';
SHOW status语句,获取当前数据库运行的时间:
启动慢查询须要以安全模式启动mysql服务,安全模式能够经过日志恢复数据库:mysql.exe --safe-mode --slow-query-log
数据库存储日志存放位置能够在my.ini中的datadir=‘...’查看到,而后打开到该文件夹,就能看到ZY-slow.log文件。超过设定时间,一般是5s-10s,就能在.log文件中看到。
在mysql的配置文件中添加参数:
-- 文件和文件夹是已经建立好的
log-slow-queries=C:/MySQL/log/mysqld-slow-query.log
-- 慢查询的时间设置
long-query-time=5
-- 及时没有超过期间,但若是没有使用到索引,也会记录SQL语句
log-queries-not-using-indexes
在关系数据库中,索引是一种与表有关的数据库结构,它可使对于于表的SQL语句执行更快。
1.主键索引:ALTER TABLE tbl_name PRIMARY KEY(字段名)
2.惟一索引:惟一索引所在的列能够为NULL值;惟一索引所在的列不能为空字符串。注:列名即字段名
CREATE UNIQUE INDEX 索引名称 ON tbl_name(列名)
3.普通索引: CREATE INDEX 索引名称 ON tbi_name(字段名)
4.全文(FULL TEXT)索引: 用于全文搜索,只有MyISAM表类型支持FULL TEXT索引;FULL TEXT索引只能够从CHAR、VARCHAR和TEXT列中建立;整个列都会被编入索引,不支持部分列编索引。
-- 查看数据表articles中title,body字段中包含database单词的
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database');
-- 查看全文匹配度
SELECT id,MATCH(title,body) AGAINST ('Tutorial') FROM articles;
1.查看索引:SHOW KEYS FROM tbl_name 或者 SHOW INDEXS FROM tbl_name
2.删除索引:ALTER TABLE tbl_name DROP INDEX 索引名称
3.经过Explain分析具体有没有使用索引,执行低效SQL的执行计划:
EXPLAIN SELECT 索引名称(字段名) FROM tbl_name\G;
EXPLAIN SELECT 字段名 FROM tbl_name\G;
索引原理:主要经过二叉树去寻找索引文件,效率:log2N 检索10次:2的10次方,1024条记录
索引带来的开销:
哪些不适合建立索引:更新很是频繁的字段;惟一性比较差的字段,好比人的性别。
建立索引的条件:确定在WHERE条件中常用到的;该字段的变化不会太频繁。
经过 SHOW PROFILE 分析 SQL 具体消耗时间:
表的分析、检查、优化:
1.按期分析表:ANALYZE [ LOCAL | NO_WRITE_TO_BINLOG ] TABLE tbl_name [,tbl_name]
2.按期检查表:CHECK TABLE tbl_name [,tbl_name ] [option]
备注:CHECK TABLE 也能够检查视图是否有错误,好比在视图定义中被引用的表已不存在
3.按期优化表:OPTIMIZE [ LOCAL | NO_WRITE_TO_BINLOG ] TABLE tbl_name [,tbl_name]
对于MyISAM表,OPTIMIZE TABLE按以下方式操做:
注意:不管是ANALYZER,CHECK仍是OPTIMIZE在执行期间将对表进行锁定,所以请注意这些操做要在数据库不繁忙的时候执行。
SHOW TABLE STATUS 获取表的信息
SHOW TABLE STATUS LIKE 'tableName'\G
1.Name:表名称
2.Engine:表的存储引擎
3.Version:版本
4.Row_format:行格式
5.Rows:表中的行数
6.Avg_row_length:平均每行包括的字节数
7.Data_length:整个表的数据量(单位:字节)
8.Max_data_length:表能够容纳的最大数据量
9.Index_length:索引占用磁盘的空间大小
10.Data_free:未使用空间
11.Auto_increment:下一个自增加值
12.Create_time:表建立时间
13.Update_time:表最近更新时间
14.Check_time:使用check table或myisamchk工具检查表的最近时间
15.Collation:表的默认字符集和字符排序规则
16.Checksum:启用则对整个表的内容计算时的检验和
17.Create_options:指表建立时的其余全部选项
18.Comment:包含了其余额外信息
当数据量过大的时候,须要将一张表的数据划分几张表存储。一些查询能够获得极大的优化,这主要是有助于知足一个给定WHERE语句的数据能够值保存在一个或多个分区内,这样在查找时就不用查找其余剩余的分区。
查看是否支持分区:SHOW VARIABLES LIKE '%partition%'; yes表示支持分区。
分区的分类:
CREATE TABLE employees(
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NU;; DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT NOT NULL,
store_id INT NOT NULL
)
partition BY RANGE(store_id)(
partition p0 VALUES LESS THAN(6),
partition p1 VALUES LESS THAN(11),
partition p2 VALUES LESS THAN(16),
partition p3 VALUES LESS THAN MAXVALUE
);
-- 查看分区
SHOW CREATE TABLE employees\G
分区的删除:ALTER TABLE 表名 DROP PARTITION 分区名
增长分区:ALTER TABLE 表名 ADD PARTITION(PARTITION 分区名字 VALUES LESS THEN 具体的某个值)
myisam内存优化:
1.key_buffer_size设置,决定索引块缓存区的大小,通常的myisam数据库,建议用1/4可用内存分配给key_buffer_size:
key_buffer_size=2G
2.read_buffer_size,常常顺序扫描myisam表,就须要设置,该值是每一个session独占的,若是默认值设置太大,就会形成内存浪费。
3.read_rnd_buffer_size,须要作排序的myisam表查询,如带有order by子句的sql,适当增长该值。但须要注意,该值是每一个session独占的,设置太大内存浪费。
innodb内存优化:
1.innodb_buffer_pool_size,决定表数据和索引数据的最大缓存区大小
2.innodb_log_buffer_size,决定innodb重作日志缓存的大小,对应有大量更新记录的事务,增长该值大小,能够避免在事务提交前就执行没必要要的日志写入磁盘操做。
mysql并发参数:
1.max_connections,提升并发链接
2.thread_cache_size,加快链接数据库的速度,控制mysql缓存客户服务线程的数量
3.innodb_lock_wait_timeout,控制innodb事务等待行锁的时间
1.访问数据库采用链接池优化,就是链接数据库的客户端放在一个链接池里。
2.采用缓存减小对mysql的访问:
3.负载均衡(读写分离):一个主MYSQL服务器(MASTER)服务器与多个从属MYSQL服务器(STAVE)创建复制(replication)链接,主服务器与从属服务器实现必定程度上的数据同步,多个从属服务器存储相同的数据副本,实现数据冗余,提供容错功能。部署开发应用系统时,对数据库操做代码进行优化,将写操做(如UPDATE、INSERT)定向到主服务器,把大量的查询操做(SELECT)定向到从属服务器,实现集群的负载均衡功能。
若是主服务器发生故障,从属服务器将转换角色成为主服务器,是应用系统为终端用户提供不剪短的网络服务;主服务器恢复运行后,将其转换为从属服务器,存储数据库副本,继续对终端用户提供数据查询检索服务。
查看用户:
mysql>USE mysql;
mysql>SELECT host,user,password FROM user;
1.GRANT命令使用
对于ZY用户,赋予SELECT的权限,能查看全部数据库和全部数据表
GRANT SELECT ON . TO ZY@'localhost' IDENTIFIED BY 'PWD' WITH GRANT OPTION;;
对应YZ用户,赋予test下索引数据表的索引权限
GRANT ALL PRIVILEGES ON test.* TO YZ@'localhost' IDENTIFIED BY 'PWD' WITH GRANT OPTION;;
2.查看用户的权限:
SHOW GRANTS FOR ‘root’@'localhost'
3.删除用户,不只仅要删除用户的名称,还要删除用户拥有权限。
使用DELETE删除,并不能删除权限,新建同名用户后会继承之前的权限,正确的作法是使用DROP命令:
DROP USER ‘zy’@'localhost' ;
4.修改密码
SET PASSWORD FOR 'ty'@'localhost'=password('123');
5.对帐号权限的资源设置
GRANT SELECT ON employees.* TO test@localhost IDENTIFIED BY 'pwd' WITH max_queries_per_hour 5 max_user_connections 6;
随着软件后期的不断升级,mysql的服务器数量愈来愈多,软硬件故障的发生几率也愈来愈高。这个时候须要一套监控系统,当主机发生异常时,此时经过监控系统发现和处理。
1.常见监控方式的分类:下面语句没有分号;
mysql 设置定时器,从5.1开始才支持event的。查看版本SELECT VERSION();
1.查看是否开启event与开启event
2.建立定时器,建立事件test_event:
DROP EVENT IF EXISTS test_event;
CREATE EVENT test_event
ON schedule every 1 second
ON completion preserve disable
DO CALL p_test_proce();
-- 当为on completion preserve的时候,当event到期了,event会被disable,但该event还会存在
-- 当为on completion not preserve的时候,当event到期时,该event会被自动删除
-- p_test_proce是一个存储过程的名字
1.备份:
2.还原