1.数据库:高效的存储和处理数据的介质(介质主要有两种:硬盘和内存)。redis
2.数据库的分类:
一:按数据库存储介质的不一样
1)关系型数据库DBMS
2)非关系型数据库NoSQL(not only SQL)算法
3.数据库产品:
一:关系型数据库产品:
1)大型:Oracle、DB2
2)中型:SQLServer、Mysql
3)小型:access
二:非关系型数据库产品:
membird、mongodb、redissql
4.两种数据库的区别:
一:关系型数据库:安全(保存在磁盘数据基本不可能丢失)、浪费空间
二:非关系型数据库:效率高(保存在磁盘)、数据(断电)容易丢失mongodb
5.关系型数据库:数据库
(1)关系型数据库:是一种创建在关系模型(数学模型)上的数据库。express
(2)关系模型:一种创建在关系上的模型,关系模型包含三个方面:
数据结构:解决数据存储的问题、二维表(行、列)
操做指令集合:全部的SQL语句
完整性约束:表内数据约束(字段与字段),表与表之间的约束(外键)编程
(3)关系型数据库的设计?
从须要存储的需求中分析,若是是一类数据(实体)应该设计成一张二维表,
表是由表头(字段名:用来规定数据的名称)和数据(实际存储的数据单元)部分组成。
案例:分析教学系统进行处理:讲师负责教学,教学生,在教室教学生
1)找出系统中存在的实体:
讲师表、学生表、班级表
2)找出实体中存在的数据信息:
讲师:姓名、性别、年龄、工资
学生:姓名、性别、学号、学科
班级:班级名称、教室编号数组
(4)关系型数据库维护的关系:维护实体内部,实体与实体之间的联系。安全
(5)服务器
(6)
-- ============================
数据库操做:
一:建立:
CREATE DATABASE DBNAME [DEFAULT] CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;
字符集:CHARACTER SET UTF8 CHARACTER SET = CHARSET
校对集:COLLATE UTF8_GENERAL_CI CI不区分大小写、CS区分大小写
###### 校对集依赖于字符集
#显示全部的校对集: SHOW COLLATION [LIKE 'pattern(%_)']
#显示全部的字符集:SHOW CHARACTER SET [LIKE 'pattern(%_)'] CHARACTER SET = CHARSET
例子:
CREATE DATABASE 中国 DEFAULT CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;
SET NAMES GBK; -- 告诉服务器SQL使用的编码
二:删除:DROP DATABASE DBNAME;
三:查询:
1)查看数据库:SHOW DATABASES [LIKE 'pattern(%_)'];
2)查看数据库建立语法:SHOW CREATE DATABASE DBNAME;
四:修改数据库:
1)修改数据库名称:低版本支持(5.1.7)、高版本不支持(5.1.23)
2)修改数据库字符集:ALTER DATABASE DBNAME [DEFAULT] CHARACTER SET GBK/UTF8
3)修改数据库校对集:ALTER DATABASE DBNAME [DEFAULT] COLLATE UTF8_GENERAL_CI
4)修改字符集和校对集:ALTER DATABASE DBNAME [DEFAULT] CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;
五:进入数据库环境:USE DBNAME[;]
表操做:
一:建立表:
CREATE TABLE [IF NOT EXISTS] [DBNAME.]TABLENAME(
字段名称1 数据类型1 约束1,
字段名称2 数据类型2 约束2,
......
字段名称n 数据类型n 约束n
)[表选项];
IF NOT EXISTS:检查做用
表选项:控制表的表现:
1)字符集:CHARACTER SET/CHARSET 具体字符集、保证表中存储数据的字符集
2)校对集:COLLATE 具体的校对集
3)存储引擎:ENGINE具体的存储引擎(innodb、myisam)
二:删除数据表:
DROP TABLE TABLENAME1,TABLENAME2,... ;
当删除数据表的SQL指定执行以后,该表和表中的数据都会被删除。
******删除有危险,操做需谨慎(不可逆)
三:查看表
1)查看表:SHOW TABLES [LIKE 'pattern(%_)'];
2)查看表建立语法:SHOW CREATE TABLE TABLENAME \G (纵向)\g(横向)
3)查看表结构:SHOW COLUMNS FROM/DESC/DESCRIBE TABLENAME;
四:修改数据表:
表自己存在,还包含字段:
1)修改表自己:
修改表名:RENAME TABLE OLDTABLENAME TO NEWTABLENAME;
修改表选项:ALTER TABLE TABLENAME OPTION [=] OPTIONVALUE
例如:ALTER TABLE t_test1 CHARSET [=] GBK;
2)修改表字段:
新增字段:
ALTER TABLE TABLENAME ADD COLUMNNAME 数据类型 [约束] [POSITION(FIRST/AFTER)];
FIRST : 第一个位置。
AFTER : 在哪一个字段的后面。
删除字段:
ALTER TABLE TABLENAME DROP COLUMNNAME;
修改字段:
修改字段类型或属性:
ALTER TABLE TABLENAME MODIFY COLUMNNAME 数据类型 [属性] [POSITION(FIRST/AFTER)];
修改字段名称:
ALTER TABLE TABLENAME CHANGE OLDCOLUMNNAME NEWCOLUMNNAME 数据类型 [属性] [POSITION(FIRST/AFTER)];
******若是表中字段已经存在数据,删除字段会删除该字段的全部数据,并且是不可逆的。
数据操做:
一:新增数据:
INSERT INTO TABLENAME VALUES(...),(...),...;
INSERT INTO TABLENAME(FIELD1,FIELD2,FIELD3...) VALUES(...),(...),...;
******有时候使用VALUE代替VALUES也能够。
二:删除数据:
DELETE FROM
三:查看数据
SELECT */COLUMN1,COLUMN2,... FEROM TABLENAME1,TABLENAME2,... [WHERE条件];
四:更新数据:
UPDATE TABLE1,TABLE2,... SET COLUMN1=VALUE1,COLUMN2=VALUE2,...[WHERE条件];
中文数据问题:
SHOW CHARACTER SET [LIKE 'pattern(%_)']; -- 查看数据库支持的字符集
SHOW VARIABLES [LIKE 'pattern(%_)']; -- 查看数据库变量
查看服务器对外使用的字符集:
SHOW VARIABLES LIKE 'CHARACTER_SET%';
修改服务器默认客户端使用的字符集:
SET CHARACTER_SET_CLIENT=GBK;
修改服务器给定客户端使用的字符集:
SET CHARACTER_SET_RESULTS=GBK;
******SET 变量=值; -- 只是会话级别的修改,只对当前客户端窗口有效。
设置服务器对客户端的字符集的认知:
SET NAMES GBK;
校对集:
数据比较的方式。
三种格式:
_bin:binary,二进制进行比较,取出二进制位,一位一位的比较,
从左到右,区分大小写。
_cs:case sensitive,大小写敏感。
_ci:case insensitive,大小写不敏感。
查看数据库全部的校对集:
SHOW COLLATION [LIKE 'pattern(%_)'];
******校对集应用:
只有当数据进行比较的时候,校对集才会生效。
校对集必须在没有数据以前声明好,
若是有了数据,再声明校对集,那么校对集对数据无效。
列属性:
空属性:NULL、NOT NULL
默认值:DEFAULT
注解:COMMENT
主键:PRIMARY KEY
惟一键:UNIQUE KEY
自增加:AUTO_INCREMENT
CREATE TABLE t_pri(
stu_code VARCHAR(50) PRIMARY KEY,
-- 第一种方式建立PRIMARY KEY
-- 优势:很是直接、缺点:只能只用一个字段;
stu_name VARCHAR(20) NOT NULL
)ENGINE INNODB DEFAULT CHARSET UTF8 COLLATE UTF8_GENERAL_CI;
CREATE TABLE db_test1.t_pri2(
univ_code VARCHAR(50),
stu_code VARCHAR(50),
PRIMARY KEY(univ_code,stu_code)
-- 第二种方式建立PRIMARY KEY
-- 能够建立复合主键
)ENGINE INNODB DEFAULT CHARSET UTF8 COLLATE UTF8_GENERAL_CI;
-- 第三种方式:追加主键
ALTER TABLE TABLENAME MODIFY COLUMNNAME ...;
ALTER TABLE TABLENAME ADD PRIMARY KEY(主键字段);
删除主键:一个表只能有一个主键,因此删除起来很方便
ALTER TABLE TABLENAME DROP PRIMARY KEY;
自增加:AUTO_INCREMENT
如何肯定下一次自增加呢?
经过查看表的建立语句就能够看到。
修改下一个自增加的值:
只能向上修改,向下修改对自增加无效。
ALTER TABLE TABLENAME AUTO_INCREMENT = 值;
查看自增加变量:
SHOW VARIABLES LIKE 'AUTO_INCREMENT%';
修改自增加起始值、步长是对整个数据的修改
会话级修改(SET):
SET AUTO_INCREMENT_INCREMENT = 值;
SET AUTO_INCREMENT_OFFSET = 值;
删除自增加:
ALTER TABLE TABLENAME MODIFY COLUMNNAME DATATYPE;
惟一键:UNIQUE KEY
一张表能够有多个惟一键。
删除惟一键:(删除索引)
ALTER TABLE TABLENAME DROP INDEX 索引名称;
索引:
几乎全部的索引都是创建在字段之上。
索引:系统根据某种算法,将已经有的数据(将来可能新增的数据),
单独创建一个文件;可以实现快速的匹配数据,而且可以快速的找到对应
表中的记录。
索引的意义:
提高数据的查询效率、
约束数据的有效性。
增长索引的前提条件:
索引自己会产生索引文件(
有时候可能比数据文件大)
会很是耗费磁盘空间。
若是某个字段须要做为查询的常用,
那么可使用索引(必定会想办法增长)
若是某个字段须要进行数据的有效性约束,
也可能使用索引。
MySQL中提供了多种索引:
1)主键索引:PRIMARY KEY
2)惟一索引:UNIQUE KEY
3)全文索引:FULLTEXT INDEX
4)普通索引:INDEX
全文索引:FULLTEXT
针对文章内部的关键字进行索引。
全文索引的最大问题:在于如何肯定关键字。
英文很容易:英文单词与单词之间都有空格。
中文肯定关键字很难:
没有空格、并且中文能够各类随意组合(分词:SPHINX)
修改索引:
ALTER TABLE TABLENAME ADD INDEX INDEXNAME ON COLUMNNAME 数据类型;
表关系:
将实体与实体之间的关系最终反应到数据库表的设计上来,
将关系分为三种:一对1、一对多(多对一)、多对多
全部的关系都是指表与表之间的关系。
范式:
NORMAL FORMAT,是一种离散数学中的知识,是为了
解决一种数据的存储与优化的问题:保存数据存储以后,
凡是可以经过关系找出来的数据,坚定再也不重复存储。
范式的终极目标是为了减小数据的冗余。
范式:是一种分层结构的规范。
能够分为六层。每一层都比上一层更加严格。
若要知足下一层的范式,前提是须要知足上一层的范式。
1NF、2NF、3NF、4NF、5NF、6NF
MYSQL属于关系型数据库:
有空间的浪费,为了致力于节省存储空间的,与范式全部
解决的问题不谋而合,在设计数据库的时候,会利用范式来知
指导设计。
可是数据库不单是要解决空间问题、还要保证效率问题、
可是范式只为解决空间问题,因此数据库的设计又不可能彻底按照范式的要求实现,通常状况下,数据库设计
只须要吗,知足前三种范式的需求便可。
范式在数据库的设计当中具备指导的意义,
但不是强制规范。
-- =================================================
数据的高级操做:
1.新增数据:
基本语法:
INSERT INTO 代表[(字段列表)] VALUES(值列表1),(值列表2)...(值列表n);
在插入数据的时候,假设主键对应的值已经存在
插入时必定会失败。
问题:主键冲突?
当主键存在冲突的时候、咱们能够选择性的进行处理、
更新和替换。
主键冲突时更新操做?
INSERT INTO 代表[(字段列表(包含主键))]
VALUES(值列表) ON DUPLICATE KEY UPDATE
字段=新值;
主键冲突时替换操做?
REPLACE INTO 代表[(字段列表(包含主键))] VALUES(值列表);
蠕虫复制:
蠕虫:分裂生长
从已有的数据中去获取数据,而后又将数据进行新增操做、
数据成倍的增长。
表建立的高级操做:从已有的表中新建表结构。
CREATE TABLE 表名 LIKE 数据库名称.表名称;
蠕虫复制:先查询出表数据,而后将查出来的数据新增一遍
INSERT INTO 代表[(字段列表)] SELECT 字段列表/* FROM 表名;
蠕虫复制的意义:
从已有表复制数据到新表。
能够迅速让表中的数据膨胀到必定的数量级别、
测试表的压力和效率。
2.更新数据:
基本语法:
UPDATE 表名 SET 字段=值 [WHERE条件];
高级新增语法:
UPDATE 表名 SET 字段=值 [WHERE条件][LIMIT 更新数量];
3.删除数据:
与更新相似、可使用LIMIT来限制删除数量
DELETE FROM 表名 [WHERE条件][LIMIT 删除数量];
删除:若是表中存在自增加、那么当删除表中数据以后、
自增加不会还原。
先删除表、又新建立表:
清空表、重置自增加。
TRUNCATE 表名称;
4.查询数据:
完整语句结构:
SELECT [SELECT选项(ALL(默认)、DISTINCT)] 字段/* FROM
表名称1,表名称2,...,表名称n
[WHERE子句] [GROUP BY子句] [HAVING 子句]
[ORDER BY子句] [LIMIT 子句];
字段别名:
当数据进行查询出来的时候、有时候名字不必定知足需求(多表查询时),
可能会出现字段重名的状况、这时就须要对字段名称进行重命名、别名
字段 [AS] 别名
外键(FOREIGN KEY):外面的键(再也不本身的表)
若是一张表中有一个字段(非主键)指向另外一张表的
主键,那么该字段被称为外键。
外键能够在建立表的时候或建立表以后增长(可是要考虑数据的问题)
一张表能够有多个外键。
外键的建立方式:
1.建立表的时候增长外键:
在全部表字段以后,格式:
[CONSTRAINT 外键名字(方便维护外键)] FOREIGN KEY(外键字段) REFERENCES(外键的引用) 另外一张表(表字段);
2.在新增表以后增长外键:
ALTER TABLE 表名 ADD [CONSTRAINT 外键名字] FOREIGN KEY REFERENCES 另外一张表(表字段);
修改(删除)外键:
外键不可修改、只能先删除、后新增。
格式:
ALTER TABLE 表名 DROP FOREIGN KEY 外键名字;
(一张表能够有多个外键、可是每一个外键的名字不能相同!)
外键的删除不能经过查看表结构语句体现、
能够经过查看表的建立语句体现。
外键的做用:
默认有两点做用:
1.对父表的约束:
父表进行读写操做时,(删除、更新都涉及到主键自己),
若是对应的主键在表中已经被数据所引用,那么就不容许操做。
2.对子表的约束:子表在进行数据的读写操做时,外键字段值
在父表中不存在、则操做失败。
外键条件:
1.外键要存在:首先必须保证表的存储引擎是INNODB(MYSQL 默认的存储引擎)
若是不是INNODB存储引擎、那么外键虽然能够建立成功、
可是没有约束效果
2.外键字段的字段类型(列类型)必须与父表的主键类型彻底一致。
3.一张表中的外键名字不能重复。
4.增长外键的字段数据已经存在,必须保证数据和父表中的数据相对应。
外键的约束模式:
外键的约束指的是外键的做用。
上面讲得做用,都是外键默认的做用。
外键有三种约束模式:(都是针对父表的约束)
1.DISTRICT:严格模式(默认的)、父表不能删除或更新一个已经被子表数据引用的记录。
2.CASCADE:级联模式、父表的操做、对应的子表也跟着被删除。
3.SET NULL:置空模式、父表操做以后、子表对应的数据(外键字段)被置空。
一般一个合理的约束模式:
删除的时候子表置空、更新的时候子表级联操做。
指定外键约束模式的语法格式:
FOREIGN KEY(外键字段) REFERENCES 父表(主键字段)
ON DELETE SET NULL
ON UPDATE CASCADE;
****** 删除置空的前提条件:外键字段容许为空。
若是不知足条件、外键没法建立。
外键虽然很强大、可以进行各类约束、
可是对于JAVA来讲、外键的约束下降了JAVA对程序的可控性、
一般在实际开发中,不多使用外键来处理。
外键在关系型数据库中的地位很是重要、可是咱们不多使用。
联合查询:
讲屡次查询(多SELECT语句),在记录数上进行拼接(字段不增长)。
基本语法:
多条SELECT语句构成:每一条SELECT语句获取的字段数必须严格一致。
格式:
SELECT 语句1
UNION[UNION ALL]
SELECT 语句2
...
UNION[UNION ALL]
SELECT 语句n;
UNION 选项:链接两个SELECT语句。
UNION ALL:保留全部(无论重复)
DISTINCT:去重(整个重复)默认的。
联合查询只要求字段数同样,
联合查询的意义:
1.查询同一张表、可是需求不一样。
2.多张表的结构是彻底同样的,保存的数据(结构)也是同样的。
【数据库分表】
1.垂直分表。
2.水平分表。
******联合查询中ORDER BY 的使用:
在联合查询中要使用ORDER BY进行排序、
要使用"()"将SELECT语句括起来
******要使得联合查询中的ORDER BY语句生效,
SELECT查询语句还得搭配LIMIT使用。
子查询:SUB QUERY,就是在某个查询的结果之上进行的。
(一条SELECT语句内包含了另一条SELECT语句。)
子查询分类:
子查询有两种分类方式:
1.按位置分类。
2.按结果分类。
按位置分类:
1)FROM 子查询:子查询跟在FROM以后。
2)WHERE 子查询:子查询出如今WHERE条件中。
3)EXISTS子查询:子查询出如今EXISTS里面。
按结果分类:
根据子查询获得的数据进行分类(
理论上任何一个查询的结果均可以理解为二维表)
1)标量子查询:结果是一行一列。
2)列子查询:一列多行(一排记录)
3)行子查询:子查询获得的结果是多列一行或多行多列。
1)、2)、3)出如今WHERE以后。
4)表子查询获得的结果是多行多列(出如今FROM以后)
标量子查询:
SELECT 一个字段名 FROM 表名 WHERE 字段名=(SELECT 字段名 FROM ...)
列子查询:
SELECT id FROM ... WHERE id IN(SELECT id FROM ...)
几个相似的条件:ALL 、SOME 、ANY
ANY 、SOME 在确定句中两个条件是同样的。
ANY 、SOME 在否认句中是不同的。
=ANY
=SOME
=ALL
!=ANY
!=SOME
!=ALL
******NULL空字段值不参与比较。
行子查询:
SELECT * FROM ... WHERE (age,height) = (SELECT MAX(age),MAX(height) FROM ...)
******行元素的比较(age,height) = (SELECT MAX(age),MAX(height) FROM ...)
表子查询:
子查询结果返回的是一个多行多列的二维表。
子查询返回的结果当作二维表来使用。
EXISTS子查询:
EXISTS:是否存在的意思。
用来判断某些条件是否知足、一般是跨表的条件。
EXISTS是接在WHERE以后,返回的结果是0或1。
SELECT * FROM ... WHERE EXISTS(SELECT * FROM ... WHERE ...)
视图:view
是一种有结构(行、列)可是没结果(结构中不真实存放数据)的虚拟表。
虚拟表的结构来源不是本身定义,而是从对应的基表中产生(视图的数据来源)。
建立视图基本语法:
CREATE VIEW 视图名称
AS (SELECT ... [普通查询|链接查询|联合查询|子查询]);
建立单表视图:
基表来源只有一个。
建立多表视图:
基原本源至少有两个。
*注意字段重名问题。
查看视图:
查看视图的结构。
SHOW TABLES [LIKE ''];
SHOW CREATE TABLE/VIEW 视图名称;
DESC 视图名称;
使用视图:
主要是为了查询,将视图当作表同样查询就OK.
视图的执行:
其实本质就是执行封装的SELECT语句。
应用于封装基表的查询。
修改视图:
视图自己不可修改,可是视图自己的来源是能够修改。
修改视图语法:
ALTER VIEW 视图名称 AS 新的SELECT语句;
删除视图:
语法:DROP VIEW 视图名称;
视图的意义:
1.视图能够减小SQL语句,将一条复杂的查询语句使用视图进行保存,
之后能够直接对视图进行操做。
2.数据安全,视图操做主要是针对查询的,若是的视图进行结构处理,
不会影响基表数据(相对安全)。
3.视图每每是在大项目中使用,并且是多系统使用.
能够对外可提供有用的数据,隐藏关键数据,数据安全。
4.视图能够对外提供友好型,不一样的视图提供不一样的数据,
对外好像专门设计。
5.视图能够更好的进行权限控制。
视图数据操做:
视图确实是能够进行数据写操做的,可是有不少限制。
将数据直接在视图上进行操做。
视图新增数据:
单表视图能够新增数据、可是表中包含不为空字段可是不出如今视图中
就不能够插入。
视图删除数据:
多表视图不能删除。
单表视图能够删除。
视图更新数据:
单表、多表视图均可以更新数据。
******视图更新数据限制:WITH CHECK OPTION , 若是对视图
进行新增的时候,限定了某个字段有限制:
那么对视图进行数据更新操做,系统会进行验证:要
保证更新以后,数据依然能够被实体查询出来,不然不让更新。
视图算法:
系统对视图以及外部查询视图的SELECT语句的一种解析方式。
视图算法分为三种:
1.UNDEFINED:未定义(默认的),
这不是一种实际使用的算法,告诉系统,视图没有定义算法。
2.TEMPTABLE:临时表算法。系统应该先执行视图的SELECT
语句,后执行外部查询语句。
3.MERGE:合并算法,系统现将视图对应的SELECT语句与外部视图的
的算法进行合并查询,效率高。
指定视图算法的语法规则:
CREATE ALGORITHM=视图算法 VIEW 视图名称 AS SELECT ...;
如何选用视图算法:
若是视图语句中会包含一个查询子句(五子句),并且颇有可能
顺序比外部查询语句高后,必定要使用TENPTABLE算法,
其余状况能够不用指定(默认便可)。
数据的备份与还原:
备份:将当前已有的数据或者记录保留。
还原:将已经保存的数据恢复到对应表中。
为何要作备份还原?
1.防止数据丢失:被盗,误操做。
2.保存数据记录。
数据备份还原的方式有不少种:
1.数据表备份
2.单表数据备份
3.SQL备份
4.增量备份
数据表备份:不须要经过sql备份:
直接进入到数据库文件夹复制对应的表结构以及
数据文件,之后还原的时候,直接将备份的内容放进去便可。
数据表备份有前提条件:
根据不一样的存储引擎有不一样的区别
存储引擎:
MYSQL进行数据存储的方式:
1.INNODB
2.MYISAM
对比MYISAM和INNODB:
INNODB:自由表结构,数据所有存储到ibdata1文件中
依赖当前数据库
MYISAM:表、数据、索引所有单独分开存储。
不依赖任何数据库,直接放到对应的数据库下便可使用。
单表数据备份:
每次只能备份一张表,只能备份数据,不能备份表结构。
一般的应用:将表中的数据进行导出到文件。
备份:从表中选出一部分数据保存到外部的文件。
语法:(前提:外部文件不存在)
SELECT */字段列表 INTO OUTFILE 文件所在路径 FROM 数据源;
高级备份语法:
本身制定字段和行的处理方式。
字段处理FIELDS:
ENCLOSED BY : 字段使用什么内容包裹,默认是空字符串''。
TERMINATED BY : 字段以什么结束,默认是tab键'\t'
行处理LIENS:
STARTING BY : 每行以什么开始,默认是''空字符串
TERMINATED BY : 每行以什么结束,默认是换行符'\r\n'
SELECT */字段列表 INTO OUTFILE 文件所在路径
FIELDS
...
LINES
...
FROM 数据源;
单表数据还原:
将一个外部保存的数据恢复到表中(若是表不存在,那么SORRY)
LOAD DATA INFILE 文件路径 INTO TABLE 表名
FIELDS
...
LINES
...;
SQL备份:
备份的是SQL语句,系统就会对表结构以及数据进行处理,
编程对应的SQL语句,而后进行备份,还原的时候只要执行
SQL指令就能够了。
MYSQL自己没有提供备份的指令。
须要利用MYSQL提供的备份软件:MYSQLDUMP.EXE指令
MYSQLDUMP.EXE也是一种客户端,须要操做服务器,必须进行
链接认证。
语法:·
MYSQLDUMP/MYSQLDUMP.EXE -H ip -P 端口 -U 用户 -P 密码
数据库名称 [数据表1][数据表2]...[数据表n]
> 文件所在路径
整个数据库备份:
MYSQLDUMP/MYSQLDUMP.EXE -H ip -P 端口 -U 用户 -P 密码
数据库名称
> 文件所在路径
SQL还原:
两种方式:
1.MYSQL客户端还原:
MYSQL/MYSQL.EXE -H ip -P 端口 -U 用户 -P 密码 数据库名称 < 备份文件路径
2.使用SQL指令:SOURCE
语法:SOURCE 文件所在路径;
SQL备份的以优缺点:
1.优势:能够备份表、库结构。
2.缺点:会浪费空间(增长额外的SQL指令)。
增量备份:
不是针对数据或者SQL指令进行备份,
是针对MYSQL服务器的日志文件进行备份。
增量备份:指定时间段开始备份,备份数据不会重复,
并且全部的操做都会备份。
事务安全:
事务(transaction):一系列要发生的连续的操做。
事务安全:一种保护连续操做同时知足(实现)的一种机制。
事务安全的意义:保证数据操做的完整性。
事务操做:
事务操做分为两种:
1.自动事务
2.手动事务
手动事务:
1.开启事务:告诉系统一下全部的增删改操做,不要直接操做数据表,
先存放到事务日志。
START TRANSACTION;
2.操做数据表。
3.关闭事务:
选择性的将日志文件中的操做结果保存到数据表或
清空事务日志。
a)提交事务:COMMIT
b)回滚事务:ROLLBACK
使用事务的前提:
数据库的存储引擎必须是INNODB(免费)、BDB(收费)
事务原理:
事务操做原理:事务开启以后,全部的操做都会保存到事务日志,
事务日志只有在获得COMMIT命令才会同步到数据表,其它任何命令
都会清空事务日志。
客户端 服务端 数据库
1.链接认证: 验证身份,创建链接
开启一个临时事务日志(当前用户当次链接有效)
临时日志文件
2.直接SQL增删改操做 接收SQL语句,执行SQL语句: ---->同步到数据库
结果直接写入到数据表。
3.开启事务: 改变原来的操做机制:
后续的全部写操做,先写入临时
日志文件。
SQL操做: 接收SQL语句,执行SQL语句:
结果先写入临时事务日志文件。
查询操做结果: 会从数据表查询,通过临时日志文件
结果加工后返回。
事务结束:COMMIT/ 清空临时事务日志文件:
ROLLBACK/ COMMIT会同步日志结果到数据表,
其它 ROLLBACK是直接清空日志文件。
事务:回滚点
回滚点:在某个成功的操做完成以后,
后续的操做有可能成功或失败,可是无论后续的
操做时成功或失败,前面操做都已经成功,能够在当前成功的
位置,设置一个回滚点,能够供后续失败操做返回到该位置,
而不是返回全部操做。
设置回滚点语法:
SAVEPOINT 回滚点名称;
回滚到回滚点语法:
ROLLBACK TO 回滚点名称;
自动事务处理:
在MYSQL中,默认的都是自动事务处理,
用户操做完会当即同步到数据表中。
自动事务:系统经过AUTOCOMMIT变量控制。
查看系统自动事务变量:
SHOW VARIABLES LIKE 'AUTOCOMMIT';
关闭自动事务:
SET AUTOCOMMIT = OFF;
注意:一般状况下都会使用自动事务。
事务特性:
事务的四大特性:
1.ATOMIC原子性。事务的整个操做是一个总体,不可分割,
要么所有成功,要么所有失败。
2.CONSISTENCY,一致性,事务操做先后,数据表中的数据没有变化。
3.ISOLATION,隔离性,事务操做相互隔离不受影响。
4.DURBILITY,持久性,数据一旦提交,不可改变,永久的改变数据表数据。
锁机制:
在MYSQL中,INNODB存储引擎默认使用的是行锁,
当在事务操做的过程当中,若是没有使用索引,SQL操做
就会全表检索,锁机制就会自动升级到表锁。
事务的隔离级别:
READ UNCOMMITTED
READ COMMITTED
REAPTABLE READ
SERIALIZABLE
SQL变量:
变量分为两种:
系统变量和自定义变量。
查看系统变量:
SHOW VARIABLES [LIKE '%_'];
查看系统具体变量值:
SELECT @@变量名1,@@变量名2,...,@@变量名n;
修改系统变量:
两种方式:
会话级别的修改和全局级别的修改
会话级别:
SET 变量名 = 值;或SET @@变量名 = 值;
全局级别:
SET GLOBAL 变量名 = 值;
自定义变量:
系统为了区分系统变量,
规定用户自定义变量必须使用一个@符号。
定义自定义变量:
SET @变量名 = 值;
SET @变量名 := 值;
查看自定义变量:
SELECT @变量名;
MYSQL容许从数据表中获取数据,而后赋值给变量,
两种方式:
方案一:
SELECT @变量名1 := 字段名1,@变量名2 := 字段名2,...,@变量名n := 字段名n FROM ...;
方案二:
只有赋值,不看结果,要求很严格,数据记录最多只容许获取一条,
由于MYSQL不支持数组。
SELECT 字段名1,字段名2,...,字段名n FROM ... INTO 变量名1,变量名2,...,变量名n;
******全部的自定义变量都是会话级别,当次用户链接有效,不区分数据库。
MYSQL触发器TRIGGER:
需求:有两张表,一张订单表,一张商品表,每生成一个订单,
意味着商品的库存要对应的减小。
触发器trigger:事先为某张表绑定好一段代码,当表中的某些内容
发生改变的时候(增删改),系统会自动触发(执行)代码。
触发器:事件类型、触发事件、触发对象
事件类型:增INSERT 删DELETE 改UPDATE 三种类型。
触发时间:BEFORE AFTER
触发对象:表中的每一条记录(行)。
******一张表中只能拥有一种触发时间的一种类型的触发器:
最多一张表有6个触发器。
建立触发器:
语法格式:
-- 临时修改语句结束符
-- 自定义符号:后续代码中只有遇到自定义符号才算结束。
DELIMITER
CREATE TRIGGER 触发器名称 事件类型 ON 表名 FOR EACH ROW
BEGIN -- 表明左大括号,开始
END -- 表明右大括号,结束
-- 语句结束符
-- 自定义符号
-- 将临时结束符号修正:
DELIMITER ;
***在MYSQL中,没有大括号和小括号之说。
对需求制做触发器:订单生成一个,商品库存对应减小。
查看触发器:
SHOW TRIGGERS [LIKE '%_']
查看触发器建立语句:
SHOW CRAETE TRIGGER 触发器名称;
***全部的触发器都会保存到一张表中:INFOMATION_SCHEMA.TRIGGERS
使用触发器:
不须要手动调用,而是某种状况发生时,触发器会自动触发(执行)。
修改触发器和删除触发器:
触发器不能修改、只能先删除后新增。
删除触发器语法:
DROP TRIGGER 触发器名称;
触发器记录:
触发器记录:是使无论触发器是否触发了,
只要是当某种操做准备执行,系统就会将当前要操做的记录的当前状态
和即将执行以后的新的状态分别保留下来,供触发器使用。其中要操做当前状态
保存到old中,操做以后的可能形态保存到new中.
触发器的意义:
能够很好的协调表内部的数据处理顺序和关系.
可是从Java角度出发, 触发器会增长数据库维护的难度, 因此较少使用触发器.
MYSQL代码执行结构:
循环控制: 在循环内部进行循环判断和控制.
Mysql中没有对应continue和break. 可是有替代品.
Iterate: 迭代 , 相似continue, 后面的代码不执行, 循环从新来过.
Leave: 离开, 相似break,整个循环接收.
使用方式: Iterate/Leave 循环名字;
MYSQL代码执行结构:
1.顺序结构(默认)
2.判断结构
3.循环结构
2.判断结构:
结构语法:
IF express1 THEN handlerResult1
ELSEIF express2 THEN handlerResult2
...
ELSEIF expressn THEN handlerResultn
ELSE handlerResultELSE
END IF;
3.循环结构:
循环名称:WHILE ... DO ... END WHILE;
循环名称:REPEAT ... UNTIL ... END REPEAT;
循环名称:LOOP ... 判断语句(iterate/leave) END LOOP;
MYSQL中if , case 语句使用总结:
1.IF函数:
IF(express1,express2,express3)
express1为true,函数返回express2,不然返回express3.
2.IFNULL函数:
IFNULL(express1,express2)
express1不为空返回自己,不然返回express2.
3.CASE表达式:
结构:
CASE 字段名
WHEN 值1 THEN 结果值1
WHEN 值2 THEN 结果值2
...
WHEN 值n THEN 结果值n
ELSE 结果值else
END
4.IF判断语句:
语法格式:
IF express1 THEN handlerResult1
ELSEIF express2 THEN handlerResult2
...
ELSEIF expressn THEN handlerResultn
ELSE handlerResultELSE
END IF;
MYSQL函数:
函数:讲一段代码块封装到一个结构中,在须要执行
代码块的时候,调用结构执行便可。
系统函数:系统定义好的函数,直接调用便可。
任何函数都有返回值,所以函数的调用是经过SELECT调用。
MYSQL中,字符串的基本操做单位(最多见的是字符)
自定义函数:
函数的要素:
1.函数名
2.参数列表(形参、实参)
3.返回值
4.函数体(做用域)
建立函数:
格式:
DELIMITER $$
CREATE FUNCTION 函数名([形参列表]) RETURNS 数据类型
BEGIN
函数体;
RETURN 返回值;
END
$$
DELIMITER ;
自定义函数和系统函数的调用方式同样。
查看函数:
SHOW FUNCTION STATUS [LIKE '%_'];
******函数属于特定的数据库下。
查看函数的建立语法:
SHOW CREATE FUNCTION 函数名;
修改和删除函数:
函数不能修改,只能先删除再建立。
删除语法:
DROP FUNCTION 函数名;
函数参数:
参数分为两种:
定义的参数叫形参。
调用时的参数叫实参。能够是数值,也能够是变量。
形参:必须指定类型。
******@定义的变量为全局变量,没有@定义的变量为局部变量。
全局变量能够在任何地方使用,局部变量只能在函数内部使用。
局部函数只能在函数体执行以前定义。
全局变量声明语法:
SET @变量名 = 值;
局部变量声明语法:
DECLARE 变量名 变量类型 DEFAULT 值;
******要修改变量必须使用SET关键字,无论是全局变量仍是局部变量。
存储过程:
存储过程简称过程PROCEDURE,是一种用来处理数据的方式。
存储过程是一种没有返回值的函数。
建立存储过程:
语法格式:
DELIMITER $$
CREATE PROCEDURE 存储过程名称([参数列表])
BEGIN
过程体;
END
$$
DELIMITER ;
查看存储过程:
SHOW PROCEDURE STATUS [LIKE '%_'];
查看存储过程建立语法:
SHOW CREATE PROCEDURE 存储过程名称;
调用存储过程:
存储过程没有返回值,意味着不能使用SELECT来调用。
CALL 存储过程名称([实参列表]);
修改和删除存储过程:
存储过程只能先删除后新增。
删除存储过程格式:
DROP PROCEDURE 储存过程名称;
存储过程参数:
函数的参数须要数据类型指定, 过程比函数更严格.
存储过程还有本身的类型限定: 三种类型
IN: 数据只是从外部传入给内部使用(值传递): 能够是数值也能够是变量
OUT: 只容许过程内部使用(不用外部数据), 给外部使用的.(引用传递: 外部的数据会被先清空才会进入到内部): 只能是变量
INOUT: 外部能够在内部使用,内部修改也能够给外部使用: 典型的引用传递: 只能传变量
******OUT和INOUT类型属于引用传递,内部改变影响外部值。
******存储过程对于变量的操做(返回)是滞后的: 是在存储过程调用结束的时候,
才会从新将内部修改的值赋值给外部传入的全局变量.
******在存储过程调用结束以后:OUT类型和INOUT类型会将内部 对应的局部变量值从新返回给传入的对应全局变量。