一、引言:
这本来是我自己做的笔记,然后发现还不错,于是就直接发到博客了。由于笔记做的实在太多,省的自己每次查看笔记还要去寻找文件夹,这样对于复习就太不高效了,发到博客直接看博客就行了!
二,数据库的基本概念
英文单词:database 简称DB
是一个用于存储和管理数据的仓库
长期存储在计算机内的,有组织的,有共享的,统一管理的数据集合
特点:
1,持久化存储数据,起始数据库就是一个文件系统
2,方便存储和管理数据 //重在于管理
3,使用了统一的操作数据库 --SQL
三.常见数据库
Orancle数据库:Orancle收购sum公司
MySql数据库:
SQL Sever数据库:微软公司
SQLite:主要用于手机端,嵌入式的小型数据库
3.常用数据库:Orancle,MySQL
四.配置
1,MySql服务启动
1,手动 2,cmd-> services.msc 打开服务的窗口 3,使用管理员打开cmd net start mysql:启动 net stop mysql:关闭
2,mysql登录
1,mysql -u root -p 密码 2,mysql -hip -u root -p//连接别人的数据库
3,mysql退出
1,exit 2,quit
4,mysql目录结构
1.mysql安装目录:配置文件 my.ini 2.mysql数据目录: 几个概念: 1,数据库:就是文件夹 2,表:就是文件 3,数据:数据
五,
1,什么是SQL:就是结构化查询语言
其实就是定义了操作所有关系数据库的原则
每一种数据库操作的方式存在不一样的地方,称为“方言”
2,sql语句的通用方法
1,sql语句可以单行或多行书写,以分号结尾
2,可以使用空格和缩进来增强语句的可读性
3,mysql的sql语句不区分大小写,关键字建议使用大写
4,单行注释:-- 或 #(#为mysql特有的注释)
多行注释:/* */
3,sql分类
1,DDL:数据库定义语言 用来定义数据库对象:数据库,表,列等;关键字:create,drop,alter 2,DML:数据操作语言 用来对数据库表中的数据进行增删改;关键字:insert,delete,update等 3,DQL:数据查询语言 用来查询数据表中的数据和记录;关键字:select,where 4,DCL:数据控制语言 用来定义数据库的访问权限和安全级别,及创建用户;关键字:grant,remove
六、关系型数据模型
以关系模型为基础的数据库,是根据表,元组,字段之间的关系进行组织和访问数据的一种数据库
关系数据库是目前应用最为广泛的数据库
关系(relation):一个二维表就是一个关系3
元组(Tuple):二维表中的一行就是一个元组
属性(Attribute):二维表中的一列就是一个属性,给每一个属性名称取个名就位属性名
域(Domain):属性的取值范围
数据库系统有三部分组成:
数据库:用与存储数据的地方 数据库管理系统:用于管理数据库的软件 数据库应用程序:为了提高数据库系统的处理能力所使用的管理数据库的软件补充
mysql服务器端的实用工具
mysqlid:SQL后台程序(即MYSQL进程),只有该程序运行后客户端才能进行连接 mysqlid_safe:服务器启动脚本 mysql.server:服务器启动脚本 mysqlid_mulit:服务器启动脚本,可以启动或停止系统上安装的多个服务器 myisamchk:用来描述,检查,优化和维护NyISAM表的使用工具 mysqlbug:MYSQL血线报告脚本 mysql_install_db:该脚本用默认的权限创建MySQl授权表,通常只在系统上首次安装MySql时执行一次
七,操作数据库和表
1,操作数据库:CRUD
creare:创建 retrieve:查询 update :修改 delete:删除 命令行模式: SHOW DATABASES; :查询所有的数据库 CREATE DATABASE 数据库名称; :创建数据库 SHOW CREATE DATABASE 数据库名称; :查看指定的数据库 USE 数据库名称;:选择数据库 DROP DATABASE 数据库名称;:删除数据库 提示:在删除数据库后会将数据库中的所有信息删除,并且在删除数据库后查询指定的数据库会报错
2,操作表:
use 数据库:用来选择数据库,如果没有选择数据库,则会出现“No database selected” 创建表: create table <表名> (字段1 数据类型 等等) 查看表: DESCRIBE(DESC) <表名>; 查询表字段信息,字段名,字段数据类型,是否为主键,是否有默认值等,用于查看标的基本结构 SHOW CREATE TABLE <表名\G>; :用于查看标的详细信息 修改数据表:
常见的修改表操作有:
1,修改表名 ALTER table 旧表名 rename 新表名; 2,修改字段类型(通过字段名修改数据类型) alter table 表名 modify 字段名 数据类型; 2.1,修改字段名 alter table 表名 change 旧字段名 新字段名 新字段数据类型 3,添加字段 alter table 表名 ADD 字段名 数据类型 4,删除字段 alter table 表名 drop 字段名 5,修改字段排序 根据工作的实际需求修改字段的排序顺序 alter table 表名 modify 字段1 数据类型 first|after <字段2> 6,更改表的引擎 先查看当前引擎 desc 表名;(show create table 表名\g) alter table 表名 engine = (要修改的引擎) 7,删除表的外键约束 如果不在需要,可以删除,一旦删除,就会失去主表与外表之间的联系 查看当前外键约束 :show create table 表名\g ` alter table 表名 drop primary key 外键名称 删除数据表 drop table 表的名称 命令行模式: show tables;:查询该数据库中所有的表 DESCRIBE(DESC) <表名>; 查询表字段信息,字段名,字段数据类型,是否为主键,是否有默认值等,用于查看标的基本结构 SHOW CREATE TABLE <表名\G>; :用于查看标的详细信息
注意事项:
1,不区分大小写,不能使用SQL中的关键字 2, 数据表中如果有多列,则需要用逗号隔开
3,约束
主键约束:又称为主码,是表中一列或多列的组合 该约束要求主键列的数据唯一,并且不允许为空,能够唯一识别表中的一条记录,加快数据库中查询的信息 单字段主键:可以在属性后面直接加primary key,也可以在所有语句后面直接加primary key(属性名) 多字段主键:可以在属性后面直接加primary key,也可以在所有语句后面直接加primary key(属性名,属性名) 外键约束:在两个表建立连接,外键可以为空值,如果不为空值,则外键值必须等于另一个表中的主键值、 在定义外键后不允许删除与另一个表中具有关联的行 语法:constraint 外键约束 foreign key(属性名) references 关联表(主键) 非空约束:not null constraint 对于使用了非空约束的字段,如果用户再添加数据时没有指定值,则会报错 唯一约束:unique constraint 要求某列唯一,允许为空,但只能出现一个空值。可以保证一列或者几列都不会出现重复的值 默认约束:default constraint 如果插入的值为空,系统则会将该值为默认值 自增属性:auto_increment
八,视图
被称为虚拟表,类似于窗户,因此视图也被称为虚拟的表,程序员可以通过视图查看数据表中的数据
保障了数据的安全性,又大大的提高了数据查询的效率
1,视图的概念
视图是一个由查询语句定义定义数据内容的表,表中的数据内容就是SQL查询语句的结果集 视图并不在数据库中真是存在,而在引用视图是动态生成的,不占空间 视图一经定义就被存储在数据库中,对应的数据并没有像表那样在数据库中再存储一份
2,使用视图和查询数据表优势:
(1)使用视图简单,操作视图和操作数据表完全是两个不同的概念,用户不用再清理数据表之间的复杂的逻辑关系, 而且将经常使用的SQL查询语句定义为视图,可以有效的避免代码重复,从而减少工作量 (2)使用视图安全,用户只访问到视图给定的内容集合,这些都是数据表中的某些列和行,避免用户直接操作数据表引发的一系列错误 (3)使用视图相对独立,应用程序访问是通过视图访问数据表,从而程序和视图之间分离,如果数据表有变化, 完全不用修改SQL语句,只需要调整视图定义的内容,不用调整应用程序代码 (4)复杂的查询需求:可以进行问题分解,如何创建多个视图获取数据,将视图联合起来就能得到想要的结果了 视图的工作机制:在调用视图的时候才会执行视图中的SQL进行取数据操作。 视图这样设计的好处就是比较节省空间,当数据内容总是一样时,就不需要维护视图中的内容
3,视图中的基本操作.
1,创建视图 创建视图基本语法: create view 视图的名称 as select 查询的字段(列名) from 表名 查看创建的视图:desc 视图的名称 查看视图中的内容:select * from 视图的名称 注意事项:视图必须具有唯一的列名,不能有重复,就想基表那样 也可以在两个或多个表中建立视图: 示例 :> my3_view (name,bumen) -> as select employee.name , office.depatment -> from employee , office -> where employee.id = office.id; 查看:select * from my3_view; 2,查看视图的基本信息 show table status like '视图的名称'(一定要加单引号) \g; 3,查看视图详细信息 show create view 视图名称 4,修改视图(结构) 与创建视图几乎一致,唯一不同点为如果视图不存在,则进行视图的创建,如果视图存在,则进行视图的修改 create or replace view 视图的名称 as select 查询的字段(列名) from 表名 还可以以alter来修改视图 view 视图的名称 as select 查询的字段(列名) from 表名 alter只能修改已经存在的视图 5,更新视图 即对视图的内容进行修改 update 视图的名称 set name=“新名字” where id=1; insert into 表的名称 values(id,'name'); //表的修改视图也回随着修改 delete from 视图的名称 where id=1(条件); 6,删除视图 视图本身是一个虚拟表,没有物理文件存在,所以删除视图并不会删除数据,只是删除视图的结构定义 drop view if exists 视图的名称 最后可以使用create show view 视图的名称 查看操作结果
九,数据的类型和运算符
浮点数和定点数 都可以用(M,D)来表示,M表示精度,即总位数,D表示标度,即小数的位数 浮点数(单精度和双精度)标度长度超出取值范围时不会出现警告,而定点数出现警告 日期和时间类型 YEAR:日期范围:1901~2155 如果以两位字符表示YEAR,则在'00'(0)~69和70到99之间分别进行转换,前者为2000到2069,后者为1970到1999 以数字表示时,0表示0000,而不是2000 TIME:日期范围:-838:59:59~838:59:59 允许小时大于24,用来表示一段时间间隔 存在格式:'D HH:MM:SS' , 'D HH:MM' , 'D HH' ,'SS' , 'HH:MM:SS' 也可以直接一窜数字表示,如果存在超出合理范围,比如分钟等,则会在存储时变成00:00:00 查看当前时间:CURRENT_TIME , NOW(); DATE:日期范围:1000-01-01~9999-12-31 以'yyyy-mm-dd'或者'yy-mm-dd'表示,也可以不用单引号直接用数字表示 如果直接用数字表示yymmdd时,yy由于不确定年份,则00~69为2000~2069,70~99表示1970~1999 DATETIME:包含日期和时间信息,范围1000-01-01 00:00:00' ~ 9999-12-31 23:59:59' 以'yyyy-mm-dd hh:mm:ss'或者'yyyymmddhhmmss' 也可以使用'yy-mm-dd hh:mm:ss'或者'yymmddhhmmss'表示 也可以使用数字yymmddhhmmss表示,遵循00~69以及70~99的原则 mysql允许用不严格的语法插入日期 字符串类型 char和varchar区别 char为固定字符串长度,varchar为可变的字符串长度 char不过存入字符串的长度为多少,长度最终都为固定长度的大小,而varchar实际的字符串长度为最终字符串的长度加1 char实际长度小于固定时,会将存储的字符串后面多余的空格删除 text:保存非二进制字符串 titytext:最大长度为2的8次方-1 text:最大长度为2的16次方-1 mediumtext:最大长度为2的24次方-1 longtext:最大长度为2的32次方-1 set:没有重复值 set(值1,值2....) 逻辑运算符 NOT或者! :操作0返回1,1返回0,null为null; AND或者&&:非0非null为1,有0为0,其余为空 OR或者||:00为0,0空为空,空空为空,其余为1 位运算符 位或运算符:有1为1,其余为0 位与运算符: 11为1,其余为0 位异或运算符:01为1,其余为0 左移运算符(<<):转化为二进制高位抛弃,低位补0,例如6<<2,6左移两位,6的二进制位00000110,左移后为00011000,等于24 右移运算符 (>>):与左移运算符相反 取反运算符(~):将二进制0变1,1变0
十,MySQL函数
数学函数 abs();求绝对值 pi();:求圆周率 MOD(a,b);:求余 sort(a);:求平方根 ceil(a);:返回不小于a的最小整数 floor(a);:返回不大于a的最大整数 rand(a);:随机数 round(a,b);:四舍五入,b表示小数点后几位 pow(x,y);:x的y次幂 sign(x);:符号函数,-,0,+一次返回-1,0,1 log(x);:x的对数 字符串函数 char_length();:计算字符串字符数的函数 length();:计算字符串的长度函数 concat(s1,s2...);:合并字符串的函数 concat_ws(a,s1,s2...);:a作为其他字符之间的分隔符 insert(s1,x,len,s2);:返回字符串s1,s1中起始于x位置,长度为len的子字符串将被s2给替换,如果x小于0,则直接返回原字符串 lower(str)或者lcase(str):将字母转化为小写字母 upper(str)或者ucase(str):将字母转化为大写字母 left(str,len);:返回字符串中左边len个字符 right(str,len);:返回字符串中右边len个字符 lpad(s1,len,s2);:在s1左边填充字符串s2,使得s1的最终长度为len; trim(s);:删除字符串s两边的空格 ltrim(s);:删除字符串左边的空格 rtrim(s);:删除字符串右边的空格
十一.MySQL数据库查询语句详解
1,基本查询语句 select *(字段名) from 表名 where 表达式 group by 指定查询的属性 order by 以某种顺序显示(有升序和降序) 2,查询表中所有的字段 select 所有字段一一列出 from table表名 或者 select * from table表名 3,查询经过计算的值 在int属性值中可以在查询字段中直接加整数值 4,查询表中若干记录 使用where字句对数据进行过滤;条件判断符有:= !=(<>) < > <= => between and(介于两值之间) select a,b from table where c=x(int); 5,多条件查询数据 select a,b from table where c>x(int) and d>y(int) select a,b from table where c in ('x','y') in操作符用来查询满足指定条件范围内的记录,只需满足其中一条记录即可 使用distinct关键字可以消除重复元素: select distinct (属性值) from table 6,统计函数和分组数据记录查询 count(*):用于统计字段中指定条件的数目 as : 在查询结果中作为属性名显示 select count(*) as x from table where ... 以x作为属性名显示出 分组查询指的是对数据按照某个或多个字段进行查询,使用group by关键字进行分组 1,创建分组 select a,count(*) as c from table group by a; 使用group by对每个字段a的总数进行了分组 2,使用having过滤分组 group by和having一起限定显示记录所满足的条件,只有满足条件分组才能被显示出 3,在group by字句中使用with rollup 可以在查询分组记录之后增加一条记录,用来计算查询出所有记录的总和 select a,count(*) as c from table group by a with rollup;. 4,多字段分组 可以在group by后面添加添加属型可以查询所有值 7,排序查询结果 在正常查询的数据中并没有以一种特定的顺序显示,因此可以通过select使用order by字句对查询结果进行排序 1,单字段排序 select * from table order by x; order by排序方式是根据字母表的顺序进行排序 2,多字段排序 select a,b from table order by a,b; 先按a的字段排序,再按b的字段排序 8,使用limit限制查询结果的数量 limit 位移偏移量(可选),行数:位移偏移量为可选参数,并且默认0为起始数(对应的第一行),行数为限制的行数 9,连接查询 连接查询是关系数据库中最主要的查询,包括内连接,外连接等 1,内连接查询(inner join) 使用比较运算符进行表间的数据操作,并且列出表中与连接条件相匹配的数据行 select table1.a,table1.b,table2.c,table2.d... from table1,table2 where table.a = table.c; select table1.a,table1.b,table2.c,table2.d... from table1 inner join table2 on table.a = table.c; //使用on关键字,而不是用where关键字 使用where字句作为过滤条件,只有两个表符合连接查询这个条件,才能将结果返回 2,左外连接查询(left outer join) 将左边的连接行与右边的连接行进行比较,如果右边的表行中不存在与左边值相等的值,则为空值 select table1.a,table1.b,table2.c,table2.d... from table1 left outer join table2 on table.a = table.c; 3.右外连接查询(right outer join) 将右边的连接行与左边的连接行进行比较,如果右边的表行中不存在与左边值相等的值,则为空值 select table1.a,table1.b,table2.c,table2.d... from table1 left outer join table2 on table.a = table.c; 4,复合条件连接查询 指的是在连接查询的过程中通过添加过滤条件限制查询的结果 select table1.a,table1.b,table2.c,table2.d... from table1 left outer join table2 on table.a = table.c and table1.a = 1; 10,子查询 指的是一个查询语句嵌套在另一个查询语句的内部的查询 在select中先计算子查询,子查询作为外查询中的一个过滤条件,查询可以基于一个表或者多个表 1,带any和some关键字的子查询 表示满足其中任意一条件,他们允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询的任何一个条件就返回一个结果作为外层查询条件 any或some关键字跟在比较操作符后面 select * from coustomer where age > any (select age from coustomer where name = '郑辉盛'); 2,带all关键字的子查询 表示需要同时满足所有条件,他们允许创建一个表达式对子查询的返回值列表进行比较,只要同时满足内层子查询的全部条件就返回一个结果作为外层查询条件 all关键字跟在比较操作符后面 select * from coustomer where age >= all (select age from coustomer where name = '郑辉盛'); 3,exists关键字查询 该关键字后面为任意的一个子查询,对子查询进行运算判断是否返回行 即该关键字作为查询条件,如果后面的子查询为true,即存在,则执行前面的查询语句,否则不执行 select * from coustomer where exists (select age from coustomer where name = 'zhangqiang'); 4,带比较运算符的子查询 除了以上3个关键字查询,还有<,>,!=,<>,=,>=,<=比较运算符查询 11,合并查询 使用关键字union可以给出多条select语句,并将他们的结果合并组成单个结果集 如果在union后面添加all,则返回所有的行,如果不加,则返回一个不重复的结果集 对应的列数以及数据类型应该相同 select * from table_1 union(all) select * from table_2; 12,使用正则表达式查询 正则表达式通常用来检索或替换那些符合某个模式的文本内容 使用regexp关键字指定正则表达式的字符匹配模式 ^ : 匹配文本的开始字符 $ : 匹配文本的结束字符(符号放后面) . : 匹配任何单个字符(用.代替单个字符) * : 匹配0个或多个在他前面的字符(符号放后面) + : 匹配前面的字符一次或多次 <字符串> : 匹配包含指定的字符串文本,如果要匹配多个字符串,则需要使用 | 分开 [字符集合] : 匹配字符集合的任意一个字符 [^字符集合] :与前面相反 字符串{n,} : 匹配前面的字符串至少n次 ...regexp 'o{2,}' 字符串{n,m}: 匹配前面的字符串至少n次,至多m次 ...regexp '{2,4}'
十二,数据库的数据操作
1,插入数据记录 在使用数据库之前,数据库中必须要有数据,使用insert语句向数据库中插入新的数据内容 插入的方式有插入完整的记录,插入部分的记录,插入多条记录,以及插入另一个查询的结果 为表的指定字段插入数据 如果在没有设置自增条件下,如果在对表中插入部分数据的值时,未插入的值在创建表时需要设置默认值 2,修改数据记录 使用update关键字,可以修改特定的行,也可以修改全部的行 update 表名 set 属性 = 修改的内容 where 属性 = ''(已知条件) 3,删除数据记录 使用关键字delete delete from 表名 where ... (已知条件) 如: ...where id = 1;、 delete from 表名 where ... between .. and; //删除多条记录(范围记录) delete from 表名 ; //删除所有的记录
十三,索引操作
1,索引的概述 索引对数据库中一列或多列的值进行排序的一种结构,使用索引可以提高数据库中特定数据的查询速度 索引是一个单独的,存储在磁盘上的数据库结构,他包含着对数据表中所有数据的引用指针 2 ,索引的优点 1,通过创建唯一索引可以保证数据库表中每一行数据的唯一性 2,可以大大加快数据的查询速度这也是创建索引的最主要原因 3,在实现数据参考性方面可以加快表与表之间的连接 4,在使用分组和排序字句进行数据查询的同时也可以显著的减少查询中分组和排序的时间 3,索引的不利 1,创建索引和威武索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加 2,索引需要占用磁盘时间,除了数据表栈大量空间外,每一个物理索引也要占用一定的物理空间 如果有大量的索引,索引文件可能比数据文件更快的达到最大文件尺寸 3,当对表中的数据进行增加,删除和修改的时候索引也要动态维护,这就降低了数据的维护速度 4,索引的分类 1,普通索引和唯一索引: 普通索引:允许在定义索引的列中插入重复值和控制 唯一索引:列值必须唯一,但允许存在空值 2,单列索引和组合索引 单列索引:即一个索引只包含单个列,一个表中有多个单列索引 组合索引:在表的字段组合上创建的索引 3,全文索引 全文索引的类型为fulltext,在定义索引的列上支持值的全文查找,允许这些列中插入重复值和空值 4,空间索引 对空间数据类型的字段建立的索引,分别是geometry,point,linestring,polygon 创建空间索引的列必须将其声明为not null,空间索引必须只存在引擎为myisam的表中创建 5,创建和查看索引 unique:唯一索引 fulltext:全文索引 spatial:空间索引 index 和 key为同义词,两者的作用相同,用来指定创建索引 和创建主键一样,将primary key(属性) 改成 index (属性) 创建普通索引:index(属性) 创建唯一索引:unique index(属性) 创建和查看多列索引:index(属性1,属性2...) 创建和查看全文索引:fulltext index(属性),只有在nyisam存储引擎支持,并且只适应char,varchar,text explain:查看索引是否正在使用 explain select * from sy_fruit where子句; 查看表结构:show create table 表名 \G; 6,删除索引 drop index index名称 on 表名 alter table 表名 drop index index的名称
十四,存储过程与存储函数
存储过程的目的是将常用或复杂的工作预先用sql语句写好并用一个指定的名称存储起来 这个过程经过编译和优化后存储在数据库服务器中,因此成为存储过程 创建存储过程并不是一件简单的事,可能在存储过程中需要复杂的sql语句,并且要有创建存储过程的权限 但是使用存储过程将简化操作,减少冗余的操作步骤,同时还减少操作过程的失误,提高效率 1.1,创建存储过程 create procedure p_student() begin select * from student; end; 命令行操作模式: delimiter // create procedure p_student() begin selelt * from table(表名) end // 1.2,调用存储过程 使用call sp_name(参数)语句来调用一个使用create procedure创建好的存储过程 1.3,查看存储过程 1,show procedure status [like 'paramter'] \G //:返回存储过程的特征 该查询只能查询存储过程操作在哪一个数据库,存储过程的名称,类型,谁定义的等信息,不能查看存储过程的具体定义 2,show create procedure 存储过程的名称 \G // 执行该语句可以存储过程的具体定义语句以及存储过程的模型,数据库设置的一些信息 3,information-schema:信息数据库,保存着服务器维护其他数据库的相关信息,该数据库中的routines表 提供存储信息,通过该表可以查询相关的存储信息合作 select * from information-schema.Routines where routines_name(属性) = 存储过程名称 1.4,修改存储过程 alter 修改存储过程 alter procedure 存储过程名称 1.5,删除存储过程 drop procedure 存储过程名称 并可以使用select * from information-schema.Routinaes where routines_name = 存储过程名称 2.1,创建存储函数 create function fun_name(存储函数名称) [func_paramter] returns type roution_body func_paramter:参数列表:in | out | inout
十五,变量
变量的定义使用declare关键字,变量的作用域为begin…end之中
1,定义变量
declare 变量名 type 类型 default “默认值”
2,变量的赋值
set 变量 = ‘变量值’;
select 属性值 = into 变量值; //将查询的值赋值
3,流程控制语句
构造流程控制语句有if,case,loop,leave,iterate,reprat,while语句
1,if语句: if 判断条件 then 执行sql语句 else sql语句 end if(结束语句) if price > 30 then select '价格太高' else select '价格太低' end if; 2,case语句: 可现实比if更为复杂的判断条件 1, case 判断参数 when 与判断参数相符 then select '属性值'(...) case name when '1001' then select '一年级' 2,case when 判断参数 = '与判断参数相符' then select '属性值' case when name='1001' then select '一年级'(...) 3,loop语句 可以重复执行的特定语句,实现简单的特定循环,需要使用leave语句停止循环,跳出循环过程 4,leave语句 主要用来跳出任何被标注的流程控制语句 5,iterate 相当于continue,用来跳出当前循环,但只出现在loop,repate,while语句内 6,repeat 创建的是带条件判断的循环过程,每次执行完都会对表达式进行判断 7,while 有条件控制的循环条件,以while标签开始,end while标签结束
4,光标的使用
在存储过程或自定义函数中的查询可能会返回多条记录,可使用光标来逐条读取查询结果集中的记录
1,声明光标:declare cursor_name CURSOR for 查询语句 2,打开光标:open cursor_name 3,使用光标:fetch语句来操作和使用光标 fetch cursor_name into var_name...该参数必须在声明光标中声明好 4,关闭光标:close cursor_name 5,定义条件和处理程序
15,触发器(相当于java中事件)
一个特殊的存储过程,不同的是执行存储过程要使用call语句来调用,而触发器执行不需要啥用call语句调用
当对数据表进行插入,更新,删除等操作时可以激活触发器并执行触发器
触发程序的优点
1,触发程序的执行是自动的,当对触发程序的相关的数据做出相应的修改后立即执行 2,触发程序可以通过数据库中的相关叠层表修改另外的表 3,触发器可以实施比primary key 和check约束更为复杂的检查和操作
1,创建触发器
1,创建单条执行语句触发器 create trigger 触发器名称 时间(before/after) 事件(insert,update,delete) on table(表名) for each row 触发器程序体 create trigger in_chufaqi before insert on chufaqi for each row set @ss = new.id + 1 2,创建多条执行语句触发器 即通过一个触发器对多个属性进行操作,可以是不同表中的属性 create trigger 触发器名称 时间(before/after) 事件(insert,update,delete) on table(表名) for each row begin 多条触发器程序体 end //
2,查看触发器
1,通过执行语句查看 show triggers;(show triggers \G)加\G往往会使信息更加有条理,不会那么混乱 2,通过查看系统表查看触发器 select * from infomation_schema.triggers where trigger_name = '触发器名称' \G 3,删除触发器 drop trigger 触发器的名称;
十六,数据库的权限管理与恢复
root用户,该用户是超级管理员,拥有所有权限,包括创建用户,删除用户和修改用户的密码等管理权限
权限表存放在mysql数据库里,存储账户权限信息表主要有user,db,host,tables_priv,columns_priv和procs_priv
1,user表:
记录允许连接到服务器的账号信息, 用户列:其包括host,user,password,其中user和host为user表的联合主键,只有3个值匹配的时候才允许连接的建立 权限列:权限列字段决定用户的权限,描述了全局范围内允许对数据和数据库进行操作,普通权限用于操作数据库,高级权限用于管理数据库 权限列字段默认为N,可以通过update来更改user表中字段对应的权限 安全列:ssl用于加密,x509用于识别用户,plugin用于验证用户的身份插件 资源控制列:用来限制用户使用的资源,如每小时查询的次数,更新的次数等
2,db表和host表
db表中存储了用户对某个数据的操作权限,决定用户能从哪个主机存取哪个数据库 host中存储了某个主机对数据库的权限操作 db表中3个字段,分别是host,db,user。 host表中两个字段,分别是host,db
3,mysql数据库账户管理
通过mysql-help可以查看mysql命令的帮助信息 -h:主机名,可以使用该参数指定主机名和ip -u:用户名,只有该参数名可以指定指定用户 -p:密码,可以使用该参数指定密码 -P:端口号,该参数后面接mysql端口号,默认为3306 -e:执行sql语句 打开某个指定的数据库:mysql -u -h localhost(使用本地主机) root 数据库名称 -p(password) 关闭数据库:quit
4,创建普通用户
1,使用create user语句创建新用户 create user 用户的名称@host(主机的名称) identified by password(用来设置密码) str identified with auth_plugin(插件的名称) create user 'myuser'@'localhost' identified by '123456'; 为了避免指定的明文密码,密码的哈希值可以使用password()函数获取 2,使用grant语句创建新用户
5,删除用户账户
1,使用drop删除用户 drop user '用户的名称'@'localhost' //删除指定的用户 drop user ; //删除所有的用户 查询语句select host,user from mysql.user; 2,使用delete删除用户 delete from mysql.user where host = 'localhost' and user = '用户的名称'
6,修改root用户账户密码
mysqladmin -u username(用户的名称) -h localhost -p password (str); 修改普通账户的密码 1,使用set语句修改用户的密码 set password for 'user'@'localhost' = password(str); set password = password(str); //for语句可省略 2,使用update语句修改普通账户的密码 update mysql.user set password = password(str) where host = 'localhost' and user = '用户的名称'
7,数据库的备份
1,为什么要数据库备份 大到自然灾害,小到病毒,电源故障乃至操作人员的失误,多会影响系统的正常运行,针甚至造成整个系统完全瘫痪 数据备份的意义就相当于灾难发生过后通过数据的完整,快速,简捷,可靠的恢复原有系统 完整的备份包括自动化的数据管理与系统的全面恢复,因此从这个意义上说备份=复制+管理 2,数据库的备份的意义 提高系统的风险修复能力,在数据库奔溃时能及时找到备份数据 没有用户数据的应用没有任何意义,数据库的备份是一种防患未然的强力有效手段 数据库中的备份和还原始数据库中应急方案中代价最小的,是企业中保护数据的最佳选择 3,数据库管理员需要考虑做的事情 1,定期备份,在面对重要数据时,保证低端情况下的损失可以正常恢复 2,备份后同样需要做定期恢复测试,了解备份的正确性,可靠性,确保备份是有意义的,可恢复的 3,可以采取增量备份,异地备份等 4,使用mysqldump备份 使用该命令时,可以将数据库本备份成一个文本文件 命令:mysqldump -u user(root) -h host -p password 数据库名称 【也可以有表名】> filename(.sql的备份文件的名称) 1,使用mysqldump备份单个数据库中所有的表 mysqldump -u root -p 数据库 > 绝对路径 + name.sql mysqldump -u root -p login > d:databasedump/test.sql; 2,使用mysqldump备份数据库中的某个表 mysqldump -u root -p 数据库 某个表 > 绝对路径 + name.sql --:字符开头的是行注释语句 /*!开头,*/结尾的语句是可执行mysql注释,这些语句可以被mysql执行,但是在其他数据库会当做注释被忽略 5,使用mysqlhotcopy快速备份 在unix中运行 6,数据的还原与恢复 即将文件夹的数据导入到数据库中 1,使用mysql还原 mysql -u username -p daname(新建的数据库名称) < filename.sql 2,使用source导入sql语句 use 数据库名称 source 绝对路径; 4,6结合 mysqldump -u root -p login > d:databasedump/test.sql; mysql -u username -p daname(新建的数据库名称) < filename.sql 将备份的test.sql导入到新的数据库中
十八,事务
可以参考:https://blog.csdn.net/zhenghuishengq/article/details/113749995
事务的四大特征
1,原子性:是不可分割的最小的操作单位,要么同时成功,要么同时失败 2,持久性:当事务提交或回滚后,数据库会持久化的保存数据 3,隔离性:当多个事务之间,相互独立 4,一致性:事务操作前后,数据总量不变
十九,面试技巧与解析
如何查看当前的存储引擎? SHOW ENGINES查看,用户还可以以一种直接的方法查看默认的存储引擎,就是使用语句“SHOW VARIABLES LIKE'storage_engine'” 如何更改当前的存储引擎? 在Windows平台中修改数据库默认存储引擎需要修改配置文件my.ini。 mysql中如何输入特殊字符 使用转义字符反斜杠('\') mysql中如何执行区分大小写的字符串比较 在Windows平台下不区分大小写,如果非要进行大小写比较,可以在字符串前面添加BINARY关键字 为什么使用通配符格式正确,却没有找出符合条件的记录 在使用mysql存储字符串是可能会不小心将两端带有空格的字符保存到记录中,而在查看表中的记录是不能明确的显示空格, 操作数据库的作者不能直观的确定字符串两端是否有空格,因此解决方法是使用trim(str)函数将字符串两端的空格删除,在进行匹配 like与regexp的区别 like匹配整个列,如果被匹配的文本仅在列值中出现,like并不会找到他,相应的行也不会返回 regexp在列值内进行匹配,如果被匹配的文本在列值中出现,regexp就会找到他,相应的行也会被返回 在插入字段时一定要指定字段名称吗 不管使用哪种insert语法,都必须给出values的正确数目。如果不提供字段名,则必须给美个字段提供一个值, 如果提供字段名,必须对每个字段给出一个值,否则将产生一条错误信息,如果省略字段的话,即在某些字段 中需要满足一些条件,即定义为允许空值,或者给出默认值,当这些值为空时,将使用默认值 在修改或删除表时必须指定where子句吗 要的。如果省略了where子句,则update和delete将被应用到表中的所行,因此除非必须要更新或者删除 所有记录,否则绝对要使用带where子句的修改或者删除语句。建议在表进行这两个操作之前,先选用select确认记录 使用存储过程的好处 1,运行效率高,存储过程在创建时已经对他进行了语法分析和优化工作,并且存储过程一旦执行,在内存中就会保留该存储过程, 当数据库再次调用该存储过程时可以直接从内存中读取,所以执行速度快 2,降低了网络通信:使用存储过程可以实现客户机只需要网络向服务器发出存储过程的名字和参数就可以执行sql语句 3,业务实现可以封装在存储过程中,方便实施企业规则:容易维护,简化复杂的操作 存储过程的参数可以使用中文吗 在一般情况下可能会出现中文,例如存储过程使用用户名查找客户信息,传入的参数值可能为中文,这需要在定义存储过程的时候加上gbk,否则会报错 create procedure aqa(in u_name varchar(50) character set gbk, out u_age int) 存储过程的参数有几种 in out inout通过out inout将存储过程的执行结果输出,而且存储过程中可以有多个out,inout类型的变量,可以输出多个值 在存储过程中定义局部变量和会话变量相同吗 不同。在会话变量前面需要添加@符号,且会话变量的作用域是整个会话,存储过程体使用declare来声明变量,不需要加@ 一次存储过程中的参数被认为局部变量 在触发程序中能不能对本表进行操作? 为了避免触发器无限循环的执行,不能对本表进行更新操作 使用触发器需要注意什么问题? 在使用触发器时需要注意对相同的表,相同的事件只能创建一个触发器,比如在一个表中如果出现两个 before insert的触发器, 将会报错,不过可以创建after insert或者before update或者before delete 备份mysql数据库可以直接赋值整个数据库目录吗 因为mysql表保存为文件方式,所以可以直接复制mysql数据库的存储目录及文件进行备份 这是一种简单快速有效的备份方式,如果要保持备份的一致性,备份前需要对相关表执行lock tables操作,如何对表执行flush tables操作
二十:提示:
在主键列上不能出现两个相同的值,也不能出现空值,如果出现则会提示报错