系统环境:centOS
mysql基本介绍
安装了mysql之后,默认会有mysql数据库,里面会有一个user表,这个表就是存储了可以连接mysql的账户信息,包括各个账户的密码,权限等等。
mysql基本配置
▲启动和停止mysql
方法1:
service mysqld start
service mysqld stop
方法2:
/etc/init.d/mysqld start
/etc/init.d/mysqld stop
▲mysql配置文件
/etc/my.cnf
▲进入mysql
mysql -h ip -u username -p
然后会提示输入密码,输入密码后即可进入mysql命令交互。
还有一种方法:
mysql -h ip -uusername -ppassword
-u后面直接跟用户名,不加空格,-p后面直接跟密码,也不加空格,则直接登录进去。
刚安装好的mysql用户名是root,密码为空。
▲退出mysql
quit
▲mysql增加用户
本质就是去修改mysql数据库中的user表。
分2步走,先insert再grant。
step1:以root用户登录mysql,先insert。
结果如下:
这样就创建了一个用户(host=localhost,user=testuser,password=“12346”),但是权限全无,都是“N”。
step2:赋予用户权限。
首先为用户创建一个数据库testuserDB。
case1:赋予用户对testuserDB的所有权限。
case2:赋予用户对testuserDB的部分权限。
小结:
mysql> grant 权限1,权限2,…权限n on 数据库名称.表名称 to '用户名'@'用户连接地址' identified by '连接口令';
权限1,权限2,…权限n代表select,insert,update,delete,create,drop,index,alter,grant,references,reload,shutdown,process,file等14个权限。
当权限1,权限2,…权限n被all privileges或者all代替,表示赋予用户全部权限。
当数据库名称。表名称被*.*代替,表示赋予用户操作服务器上所有数据库所有表的权限。
用户地址可以是localhost,也可以是ip地址、机器名字、域名。也可以用’%’表示从任何地址连接。
‘连接口令’不能为空,否则创建失败。
举例:
mysql>grant select,insert,update,delete,create,drop on vtdc.employee to [email protected] identified by '123';
给来自10.163.225.87的用户jee分配可对数据库vtdc的employee表进行select,insert,update,delete,create,drop等操作的权限,并设定口令为123。
mysql>grant all privileges on vtdc.* to [email protected] identified by '123';
给来自10.163.225.87的用户jee分配可对数据库vtdc所有表进行所有操作的权限,并设定口令为123。
mysql>grant all privileges on *.* to [email protected] identified by '123';
给来自10.163.225.87的用户jee分配可对所有数据库的所有表进行所有操作的权限,并设定口令为123。
mysql>grant all privileges on *.* to jee@localhost identified by '123';
给本机用户jee分配可对所有数据库的所有表进行所有操作的权限,并设定口令为123。
▲mysql删除用户
▲新建mysql用户密码
刚装的mysql,默认没有密码,可以用mysqladmin新建密码。
方法一:mysqladmin -u root password "新密码"
▲修改mysql用户密码
方法一:mysqladmin -u root -h localhost -p password “新密码”
Enter password:是要先输入原来密码,执行完这条命令之后,就可以将密码改为123456了。
方法二:用password函数。
先进入mysql,然后执行命令set password for 'root'@'localhost' = password("123456");
方法三:通过update user表来修改密码。
mysql中有一个user表是用来管理mysql账号的,如下,使用Navicat for Mysql工具查看如下图:
使用upate命令可以直接修改密码,如下:
方法四:忘记密码的情况下,修改密码。
step1:先kill掉mysql所有进程。(可以用service mysqld stop命令)
step2:以不检查权限的方式启动mysql服务,使用命令mysqld_safe --skip-grant-tables &
step3:用root账户,空密码,登录mysql。
step4:使用上面讲到的方法三来修改root密码。
▲查看and修改字符集
查看字符集:
show variables like "%char%"; 或者 show variables like "character_set_%";
show variables like "collation_%";
修改字符集:
set names utf8;
上面一个语句相当于:
set character_set_client = utf8;
set character_set_connection = utf8;
set character_set_results = utf8;
set collation_connection = utf8_general_ci;
注意:
1、这个只是当前mysql会话窗口修改编码为utf8,不是永久修改。
2、一般只要在连接了数据库之后,先执行set names utf8;就可以解决编码问题。
3、配合地,创建数据库、创建数据表、(插入记录)的时候也要设置默认字体为utf8。
通过配置文件修改mysql服务器编码集:(永久改变)
要修改2个地方,
1、/etc/my.cnf
2、/var/lib/mysql/dbname/db.opt
将里面的编码做相应修改。
其中my.cnf做的修改如下:
在[mysqld]字段中添加
[mysqld]
skip-character-set-client-handshake
default-character-set = utf8
character_set_server = utf8 #这一句非必须
skip-character-set-client-handshake这一句的意思:
Don't ignore character set information sent by the client. To ignore client information and use the default server character set, use --skip-character-set-client-handshake; this makes MySQL behave like MySQL 4.0.
这样可以避免客户端使用其他字符集连接mysql写入数据,导致编码不兼容的错误。
mysql的基本操作
▲数据库相关操作
显示数据库:show databases;
创建数据库:create database [if not exists] 数据库名 [character set utf8];
删除数据库:drop database [if exists] 数据库名;
更换数据库:use 数据库名;
数据库改名:数据库直接改名比较容易出意外的错误,所以一般是再创建一个数据库,从旧的数据库导入数据到新的数据库。
显示当前用户:select user();
显示当前日期:select now();
▲数据表相关操作
显示数据表:show tables;
创建数据表:create table 表名 (字段名1 类型 [一些设定条件], 字段名2 类型 [一些设定条件], ...) [default charset=utf8];
删除数据表:drop table [if exists] 表名;
显示表的结构:describe 数据表名; 简写(desc 数据表名;)
显示当前表的建表语句:show create table 数据表名;
显示数据表中列的详细信息(包括权限、注释等):show full columns from 表名; full去掉,就是显示简略信息。
表改名:rename 旧表名 to 新表名;
改变表的编码:alter table 表名 character set gb2312;
修改表结构:
●增加字段:alter table 表名 add [column] 字段名 类型; column是可选,不写也可以。
●删除字段:alter table 表名 drop 字段名;
●修改字段的属性:alter table 表名 modify 字段名 新属性;
●增加主键:alter table 表名 add primary key(字段名);
●删除主键:alter table 表名 drop primary key;
修改数据:
●插入记录:
insert into 表名 (字段名列表) values(字段1的值, 字段2的值, ...,字段N的值);
insert into 表名 values(字段1的值, 字段2的值, ...,字段N的值);
上面两种区别,第一种,只需要给字段名列表中的字段赋值就可以,其他mysql按默认赋值;第二种,必须给表中的所有字段名都赋值,否则报不匹配的错误。
●删除记录:delete from 表名 where 条件;
举例:
delete from `website` where `id`='2';
delete from `website`; 清空数据表。
●修改记录:update 表名 set 字段名=新设置的字段值 where 条件; 如果条件为空,那么表中的每条记录都会改变。
举例:
update `website` set `namelen`='7' where `username`='testuser';
查询数据:
主要就是select语句,关键是大家要熟练运用各种运算符,数学运算符比较简单,重点在于字符型运算符like、关系运算符和逻辑运算符。
举例:
查找姓王的记录:select * from `用户表` where `姓名` like '王%';
查找姓名中有王的记录:select * from `用户表` where `姓名` like '%王%';
查找以王结尾的记录:select * from `用户表` where `姓名` like '%王';
显示第三条到第七条记录:select * from 表名 limit 2,5;
通配符含义:
% 通配零个或多个任意字符。
_(下划线) 通配任意一个字符。
注意:如果用like发现结果不正确,有可能是编码的问题。
记录排序:
select 字段名列表 from 表名 [where 条件] order by 排序字段名1 [asc ] [desc],[排序字段名2……]
举例:
按年龄对yuangong表进行升序排列!
select * from `yuangong` order by `年龄` asc;
select * from `yuangong` order by `年龄`;
按年龄对yuangong表进行降序排列!
select * from `yuangong` order by `年龄` desc;
对员工表先按性别升序排列,性别相同的再按年龄从大到小排序
select * from `员工表` order by `性别` asc,`年龄` desc;
聚集函数:
最大值:max(),最小值:min() ,平均值:avg(),求和:sum(),汇总:count()。
举例:
求每个部门的基本工资平均值
select `部门`,avg(`基本工资`) as `部门基本工资` from `员工表` group by `部门`;
显示平均基本工资大于3000的部门
select `部门`,avg(`基本工资`) from `员工表` group `部门` where avg(`基本工资`)>3000 此句错误,SQL规定在分组中使用条件不能用 where 而是用 having。
select `部门`,avg(`基本工资`) from `员工表` group `部门` having avg(`基本工资`)>3000
▲执行sql文件
source 文件路径
mysql备份与恢复
方法一:mysqldump(恢复之前,数据库名必须存在)
备份and恢复表:
备份表:mysqldump -h 主机名 –u 用户名 –p 数据库名 表名 > 文本文件
恢复表:mysql -h 主机名 –u 用户名 –p 数据库名 < 文本文件
备份一个数据库中的两个表或是多个表:
mysqldump –h 主机名 –u 用户名 –p 数据库名 表名1 表名2 > 文本文件
恢复的时候: mysql –h 主机名 –u 用户名 –p 数据库名 < 文本文件
备份and恢复数据库:
备份整个数据库:
mysqldump –u 用户名 -p 数据库名 > 文本文件
举例:
mysqldump -u root -p db1 > db1.txt
进行恢复:mysql -u root -p db1 < db1.txt
ERROR 1049 (42000): Unknown database 'db1'
报错,说找不到数据库db1。
必须先手工建立一个空的db1数据库,然后才能把数据导进来!
mysql -u root -p db1 < db1.txt
那还有一个问题,如果想同时备份两个以上的数据库怎么办?
mysqldump –u 用户名 -p -B 数据库1 数据库2 > 文本文件名
举例:mysqldump -u root -p -B db1 db2 > db1_db2.txt
然后删除db1和db2再进行恢复。
但是要注意:必须一个一个的恢复,不能同时恢复两个:
mysql -uroot -p -B db1 < db1_db2.txt
mysql -uroot -p -B db2 < db1_db2.txt
方法二:select into(恢复之前,表名必须存在)
备份and恢复表:
格式: select 语句 into outfile “路径及文件名”;
举例:mysql> select * from website into outfile 'website.txt';
在linux中,这个文件默认保存到了./var/lib/mysql/数据库名/这个目录下。
注意:不允许重写文本文件。否则出错如下:
恢复方法:用LOAD DATA来恢复。
格式:load data infile ‘路径及文件名’ into table 表名
举例:load data infile 'website.txt' into table `website`;
注意:恢复之前,表名必须存在。可用delete,清空其中的所有记录 或者 用:truncate 表名; 只删除记录,不删除结构。
备份and恢复数据库:
如果恢复出错怎么办?
1. 权限问题。
2. 分界符不匹配。
3. 路径和文件名不对。
mysql定时任务
自MySQL5.1.6起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录、对数据进行汇总等等),来取代原先只能由操作系统的计划任务来执行的工作。
使用mysql定时器,必须确保event_scheduler开启。
查看event是否开启 : show variables like 'event_scheduler';
将事件计划开启 : set global event_scheduler = 1; 或者在mysql配置文件中添加 event_scheduler=1
将事件计划关闭 : set global event_scheduler = 0;
关闭事件任务 : alter EVENT eventName on completion preserve disable;
开启事件任务 : alter EVENT eventName on completion preserve enable;
查看事件任务 : show events;
删除事件 : drop event if exists eventName;
创建事件
create EVENT [if not exists] eventName
on SCHEDULE schedule
[on completion [not] preserve]
[enable | disable]
[COMMENT 'comment']
DO sql_statement;
其中schedule的语法如下:
at timestamp [+ interval interval]
或者
every interval [starts timestamp] [ends timestamp]
其中interval的语法如下:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
举例:
set time_zone = '+8:00';
set GLOBAL event_scheduler = 1;
-- 设置该事件使用或所属的数据库base数据库
use test;
# 如果原来存在该名字的任务计划则先删除,upload_to_sdmp是自己取的事件名
drop event if exists upload_to_sdmp;
# 设置分隔符为 '$$' ,mysql默认的语句分隔符为 ';' ,这样在后续的 create 到 end 这段代码都会看成是一条语句来执行
DELIMITER $$
# 创建计划任务,设置第一次执行时间为'2014-07-30 10:00:00',并且每天执行一次
create event upload_to_sdmp
on schedule every 1 day starts timestamp '2017-11-02 07:00:00'
do
# 开始该计划任务要做的事
begin
-- do something 编写你的计划任务要做的事
INSERT aaa VALUES (3,'222');
INSERT aaa VALUES (2,'222');
-- 结束计划任务
end $$
# 将语句分割符设置回 ';'
DELIMITER ;
mysql使用注意事项
▲反引号和单引号的区别
mysql中经常出现反引号(`)和单引号('),反引号一般是键盘ESC键下面的那个按键。这2个有什么区别呢?
问题引入:
如果使用单引号,创建表的时候会出错,只能用反引号,才能正确。
反引号是为了区分MYSQL的保留字与普通字符而引入的符号。
举个例子:SELECT `select` FROM `test` WHERE select='字段值';
在test表中,有个select字段,如果不用反引号,MYSQL将把select视为保留字而导致出错,所以,有MYSQL保留字作为字段的,必须加上反引号来区分。
单引号一般用在字段的值,如果字段值是字符或字符串,则要加引号,如:select='字段值'。
不加反引号建的表不能包含MYSQL保留字,否则出错。
用单引号建表时,当输入左引号时,后面的内容因为引号没有关闭而默认作为引号内的内容。
保留字不能用于表名,比如desc,此时需要加入反引号来区别,但使用表名时可忽略反引号。
create table desc 报错
create table `desc` 成功
create table `test` 成功
drop table test 成功
保留字不能用于字段名,比如desc,此时也需要加入反引号,并且insert等使用时也要加上反引号。
create table `test`(`desc` varchar(255)) 成功
insert into test(desc) values(’fxf’) 失败
insert into test(`desc`) values(’fxf’) 成功
▲int(10)和int(2)的区别
int(M)在integer数据类型中,M表示最大显示宽度。该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。
当结合可选扩展属性ZEROFILL使用时, 默认补充的空格用零代替。例如,对于声明为INT(5) ZEROFILL的列,值4检索为00004。
例如:
所以int(10)与int(11)后的括号中的字符表示显示宽度,整数列的显示宽度与mysql需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,int类型的字段能存储的数据上限还是2147483647(有符号型)和4294967295(无符号型)。