MySQL笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL笔记相关的知识,希望对你有一定的参考价值。
一 数据库基础
oracle,mysql,sqlserver是三大关系型数据库;
基本元素:数据库,表,列和数据类型(数值,字符,日期,文本),行,主键(必须有一个主键,每行主键值不相同,主键值不能为空),外键(是另一个表的主键,表示这是那个表的从键,数值要保持一致)
mysql是C/S架构:客户端起到服务端与用户之间的桥梁作用,将用户操作的请求给服务端,将服务端的处理结果返回给用户;
开关mysql服务:控制面板的服务中进行开关,或者cmd中net start mysql;net stop mysql;//windwos, service mysql start; service mysql stop//linux;
连接数据库:workbench--database--connect to database, cmd--切换安装bin目录--mysql -uroot -p123;
二 数据库语言
数据库定义和操作语言:
show databases; //查看有哪些数据库;
create database 数据库名; //创建数据库
use 数据库名;//使用数据库
drop database 数据库名;//删除数据库
show tables; #查看数据库所有的表
create table 表名 #创建一个表
(
列名 数据类型 约束;
...
);
show create table 表名;#查看创建此表的脚本语句
desc 表名;#查看表结构
rename table 旧表名 to 新表名;#修改表名
列操作:
alter table 表名 add 列名 类型 参数;#增加表中列
alter table 表名 modify 列名 新类型 新参数; #修改列类型或参数;
alter table 表名 change 旧列名 新列名 新类型 新参数;#修改列名或类型或参数;
alter table 表名 drop 列名; #删除列;
alter table 表名 add index 索引名 列名:#为一个或多个列创建索引
alter table 表名 add constraint 约束名 Foreign Key(列名)references 主表名(主表列名);#创建某列为外键
行操作:
select 列名,。。from 表名 where 条件; #按条件查询
insert into 表名(列名1,..)values(列值); #插入一条记录,指定列名赋值
upate 表名 set 列=列值 where 条件 #按条件修改行的某列对应值
delete from 表名 where 条件;#按条件删表记录
truncate table 表名;#删除表后重建表架构
drop table 表名;#删除表
数据库控制语言:
show status; #查看mysql数据库状态
show grants; #查看用户权限,show grants for 用户名
show errors; #查看错误信息
show warnings;#查看报警信息
三、注意点:
1.select distinct 列1,列运算或函数 as 别名 from 表名 where 运算或函数 group by 条件 having 条件 order by 列1,列2 desc/asc limit(n,m); # group by与having配套是按组查询,where是按行查询,order默认是升序asc,最大值除max()外还可以 order by desc limit 1降序取1条即为最大值的一条记录,最小值除min()外还可以order by asc limit 1 升序取1条即为最小的一条记录;
2.如果一个查询的结果作为另一个查询的条件,可以用子查询嵌套。一般是主从表之间的关联查询,视图,索引,自连接比多表查询效率高
3.where条件支持的操作符:=,>,<,>=,<=,<>,!=,between and ,and,or,(),is null,in,not between and,is not null,not in,like,regexp;#in比between and的效率高
4,通配符:
like:%指代0个或多个字符,_指代1个字符;
5.regexp:
‘200|100‘,200和100任取一个串
[],中括号内任匹配一个字符,
[^]不匹配中括号内任一字符,
[0-9],[a-z]匹配一个范围,
\\,特殊字符转义符,如小数点,\\.
字符集:[:alnum:][:alpha:][:blank:][:digit:][:xdigit:][:upper:][:lower:],
[:xdigit:]代表任意16进制数;
*,0个或多个,+,1个或多个,?,0或1个,{n},n个,{n,}n个或以上,{n,m},n个到m个;
^,文本开始如^a以开始的文本,^放中括号里面就是取反外面就是文本开始,
$,文本结束如5$以5结束,
[[:<:]]词的开始,[[:>:]]词的结尾,
6.like与regexp的区别:
like是对整个字符串的匹配,regexp只需要匹配包含的部分;
like匹配内容来自于表,regexp的匹配内容可以不来自表可以是其他指定文本内容;
7.group by主要是用来做集合统计,别名的作用是简化查询或进行列运算;
8.函数:concat(列1,列2,列3,...)字符拼接,=,-,*,/
聚集函数:max(),min(),avg(),sum(),count();
流程函数:if(value条件,ture值,false值),value条件为真取真值,为假取假值;
ifnull(value1,value2);
case when then else end;
文本函数:right(),left(),返回右边或左边几个字符,
length(),返回字符串长度;
Rtrim(),Ltrim(),去掉右边或左边的空格
upper(),lower(),转成大写或小写字母;
locate(),返回子串位置
日期与时间函数: adddate(),addtime(),year(),month(),day(),hour(),minute(),second(),date(),time(),dayofweek () ,curdate(),curtime(),datediff(),日期之差,date_format(),以yyyy-mm-dd格式返回日期,
算术函数:ads()取绝对值,sqrt()平方根,mod()取余数,exp()取指数,sin()cos()取 角sin/cos值,rand()随机数,pi()取圆周率,
9.表连接:是有外键关联的两个表的连接,没有外键关联的将做笛卡尔乘积次匹配连接;
内连接(等值连接)inner join on:值相等匹配才连接,
外左连接:左表全显示,表a left join 表b on 条件
外右连接:右表全显示,right join on
自连接:用别名在同一个表中做连接;将两条查询语句用自连接效率高于子查询嵌套
联合查询:union,选择的是同样的列,是结果的合并;
10.视图:是虚拟表,没有数据,只是一个存储方式,视图名字唯一,来源可以是一个或过个表,也可 以是一个或多个视图,可以和表一起用,可以order by,必须要先开视图权限,不能索引,不能触发 器,不能默认值;
create view 视图名 as 条件;
show create view 视图名,#查看创建视图的脚本语句
show table status where comment=‘view‘,查询视图信息,或show tables的结果中也包含视图,
无更新视图,需先删视图再创建视图来达到修改的目的;
drop view 视图名,删除视图
视图的增删改时同时也对基表进行了修改;如不能识别基表对应的值则不能修改基表,如用了分组、算术运算、函数等的视图的加工后的列值,无法找到对应基表数据进行修改;
11.存储过程:让用户自定义函数完成特定功能,模块化调用,简单,安全,高效,相当于批处理;
delimiter // 临时将分界符:转义为//
create procedure(in 变量名 类型,out 变量名 类型,inout 变量名 类型) #in,out参数不用@
begin
end;
delimiter ; 恢复分界符定义
调用: call 存储名()
删除:drop procedure 存储名()
查看存储:show procedure status where db =‘数据库名‘;
mysql里面变量要用@,定义变量 declare 变量名 类型,设置变量 set @变量名 = 值,显示变量 select @变量名;
12.游标:存储过程中使用的一个查询结果集,应用程序可以根据需要滚动或浏览其中数据,用于交互式应用中;存储过程结束游标消失
申明 declear cursor for select from where
打开 open 游标名
使用 fetch 游标名 into 变量名 # 每fetch一次取得一个数据,多个数据需要多次fetch, read_loop:loop #此处没有分号
end loop;
关闭 close 游标名
13.触发器:用来监控insert,update,delete三个操作的响应器,before和after都可以设置触发器,故共6种触发器;
创建,前或后触发器,所在表,每行插入/更新/删除:create trigger tg1 before insert on 表名 for each row 三种语句 ;
触发器只针对表不针对视图,不返回记录必须赋值给变量:
select into @result;#查询的返回值赋给result变量
insert NEW.列名 into @result,select @result;#插入的值赋给result变量
delete OLD.列名 into @result;select @result;#删除的值赋给result变量
insert into s valuse(@result); select * from s; #将结果记录生成一个新表s,显示插入记录;
查看触发器:show triggers;
14.事务:原子性,一致性,持久性,隔离性;要么成功要么失败不允许插入其他事务和异常结果;
只支持innoDB,不支持ISAM数据库引擎;
(innoDB比ISAM的查询速度慢,但是支持事务、外键、锁比ISAM功能强大)
申明事务开始:start transaction;
自动提交设置:set_autocommit =0禁止自动提交, set _autocommit=1;开启自动提交
回滚:rollback; rollback to savepoint1;
提交:commit;
保留点:savepoint 保留点;
15.索引:用于快速按照条件定位到查询记录,用在where子句;分普通索引,唯一索引,主键索引,单列或多列索引;经常用来被查询的放在where子句里面的列适合做索引,不经常被查的不适合做索引,like ‘%abc’太泛泛了不适合做索引,like ‘abc%‘适合做索引
普通索引:create index 索引名 on 表名;alter table 表名 add index 索引名,在创建表时申明index(列名1,..)
唯一索引:所有值只能出现一次不能重复,unique index,其他语句语法与普通索引一样;
主键:是一种唯一索引,alter table 表名 add primary key(列名);创建表时申明主键;
单列索引:申明一列索引,多列索引:申明多列组合为一个索引;
16.用户管理:
创建用户:create user [email protected] identified by ‘123’;‘jack‘@‘%‘表示任何IP地址访问
重命名用户:rename user [email protected] to [email protected];
修改用户密码:(1)update user set password=password(‘‘) where user=‘jack‘;
(2) set password for [email protected]=password(‘’);
删除用户:drop user ‘Jack’@‘%’;
查看用户及权限:show grants for ‘jack‘@‘%‘;
授予权限:grant select on crashcourse.* to [email protected];
撤销权限:revoke select on crashcourse.* from [email protected];
grant all on to ; revoke all on from;
权限层次:可对数据库、表,列,存储过程授权,
17、数据库维护:
备份:mysqldump -uroot -p 数据库名>备份文名;
恢复:use 数据库;source 备份文名;
检查表键是否正常:analyze table 表名;
优化表空间收回被清空的空间:optimize table 表名;
windows下my.ini文件中设置日志的位置和开关,linux下/etc/my.cnf文件中配置日志路径和开关;
以上是关于MySQL笔记的主要内容,如果未能解决你的问题,请参考以下文章