系統環境: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(無符號型)。