MYSQL的增、刪、查、改mysql
註冊、受權sql
#建立一個對數據庫中的表有一些操做權限的用戶,其中OPERATION能夠用all privileges替換,DBNAME、TABLENAME能夠用*替換,表示所有數據庫
mysql> grant OPERATION on DBNAME.TABLENAME to 'USERNAME'@'IP_ADDR' [identified by 'PASSWD'];安全
mysql> create user 'USERNAME'@'IP_ADDR' identified by 'PASSWD';服務器
mysql> revoke OPERATION on DBNAME.TABLENAME from USERNAME; #收回用戶的某些權限ide
mysql> show grants for 'USERNAME'[@'IP_ADDR']; #查詢用戶權限函數
$ mysqladmin -u USERNAME -p [OLD_PWD] password NEW_PWD #更新密碼(注:若是原來沒有密碼OLD_PWD就不要寫)性能
mysql字段的數據類型spa
int[(M)] #整型命令行
double[(M,D)] #雙精度浮點型
date #日期類型 格式YYYY-MM-DD 範圍1000-01-01——》9999-12-31
char(M) #字符類型
blob text #定長字符串(會用空格填滿)
varchar #變長字符串類型
timestamp #時間戳
mysql數據類型相關函數
INET_ATON(expr) #將一個表示ip地址的字符串轉換爲整數
INET_NTOA(expr) #將一個整數轉換爲表示ip地址的字符串
NOW() #獲取當前時間戳
TO_DAYS(timestamp) #一年中的哪一天
DAYOFWEEK(expr) #一週中的哪一天,週日開始,從1計數
WEEKDAY(expr) #一週中的哪一天,週一開始,從0計數
DAYOFMONTH(expr) #一月中的哪一天,從1計數
DAYOFYEAR(expr) #一年中的哪一天,從1計數
MONTH(expr) #月份1-12
DAYNAME(expr) #星期的名字
MONTHNAME(expr) #月份的名字
QUARTER(expr) #一年中季度1-4
WEEK(expr) #一年中的週數0-52
YEAR(expr) #年份
HOUR(expr) #小時0-23
MINUTE(expr) #分鐘0-59
SECOND(expr) #秒0-59
PERIOD_ADD(expr1, expr2) #增長N個月,expr1爲日期字符串,expr2爲增長的時間(與expr1最小單位同樣)
PERIOD_DIFF(expr1, expr2) #兩個最小單位相同的日期字符串比較
DATE_ADD(expr1, INTERVAL expr2 date_type) #增長以date_type爲單位的expr2個時間間隔
DATE_SUB(expr1, INTERVAL expr2 date_type) #減小以date_type爲單位的expr2個時間間隔
DATA_FROMAT(expr1, format) #將expr1表示的時間以format格式輸出,其中format的相關字符含義以下:
%W 星期名字(Sunday……Saturday)
%D 有英語前綴的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 數字, 4 位
%y 年, 數字, 2 位
%a 縮寫的星期名字(Sun……Sat)
%d 月份中的天數, 數字(00……31)
%e 月份中的天數, 數字(0……31)
%m 月, 數字(01……12)
%c 月, 數字(1……12)
%b 縮寫的月份名字(Jan……Dec)
%j 一年中的天數(001……366)
%H 小時(00……23)
%k 小時(0……23)
%h 小時(01……12)
%I 小時(01……12)
%l 小時(1……12)
%i 分鐘, 數字(00……59)
%r 時間,12 小時(hh:mm:ss [AP]M)
%T 時間,24 小時(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一個星期中的天數(0=Sunday ……6=Saturday )
%U 星期(0……52), 這裏星期天是星期的第一天
%u 星期(0……52), 這裏星期一是星期的第一天
%% 一個文字「%」。
數據庫的增、刪、查
mysql> create database DBNAME; #建立數據庫
mysql> use DBNAME; #鏈接數據庫
mysql> select database(); #查看當前鏈接的數據庫
mysql> show databases; #查看全部的數據庫
mysql> drop database DBNAME; #刪除數據庫
表的增、刪、查、改
mysql> drop table if exists TABLENAME; create table if not exists TABLENAME (KEY1 varchar(128) TYPENAME1, KEY2 TYPENAME2, ....); #建表
mysql> show tables; #查看當前鏈接數據庫中全部的表名
mysql> desc TABLENAME; #查看錶結構
mysql> rename table TABLENAME_OLD to TABLENAME_NEW; #表的重命名
mysql> drop table TABLENAME; #刪除表
mysql> alter table TABLENAME add KEY TYPENAME; #表中增長一列
mysql> alter table TABLENAME modify column KEY1 TYPENAME1 [(befor | after) KEY2] ; #修改字段類型
mysql> alter table TABLENAME drop KEY; #刪除表的一個字段
mysql> insert into TABLENAME [(KEY1, KEY2, ....)] values(VALUE1, VALUE2, ....); #表中插入數據
mysql> select KEY1, KEY2, ... from TABLENAME where EXPRESSION; #查詢表中數據
mysql> delete from TABLENAME where EXPRESSION; #刪除表中數據
mysql> update TABLENAME set KEY1=VALUE1, KEY2=VALUE2, .... where EXPRESSION; #更新表中數據
注:因爲mysql中不支持datetime字段設置默認值,因此只能採用timestamp,可是timestamp只能到2038年
表查詢的高級用法
謂詞:ALL(符合條件的所有)、DISTINCT(相同字段數據只返回一條)、DISTINCTROW(相同記錄只返回一條)、TOP(頭尾的若干記錄,當使用百分比的時候,爲TOP N PERCENT,N爲數字)、AS(爲結果字段取別名,AS前面是原名、後面爲別名)
比較符:
= #等於 > #大於 < #小於 >= #大於等於
<= #小於等於 <> #不等於 !> #不大於 !< #不小於 NOT #用於比較表達式前表示相反
模式匹配(必須在LIKE以後):
% #替代一個或者多個字符
- #僅替代一個字符
[charlist] #字符列中任何單一字符
[^charlist] #不在字符列中的任何單一字符
[NOT] BETWEEN ... AND .. #指定要搜索的閉區間[以外]的範圍
[NOT] IN #用於[不]匹配列表中的任何一個值
ORDER BY KEY1 (ASC|DESC), KEY2 (ASC|DESC) ... #將結果以KEY的(升/降)序排列,默認是ASC
... AND ... #同時知足兩個條件
GROUP BY KEY1, KEY2... [HAVING CONDITION] #以KEY一、KEY2等進行分組,HAVING 調用一些彙集函數來過濾分組的查詢結果
彙集函數:
SUM(KEY) #求和
AVG(KEY) #求均值
COUNT(KEY) #計數
COUNT(*) #全部記錄計數
MAX(KEY) #最大值
MIN(KEY) #最小值
VAR(KEY) #方差
STDEV(KEY) #標準差
FIRST(KEY) #第一個
LAST(KEY) #最後一個
CONCAT(KEY1, KEY2, ...) #將keys鏈接起來成爲字符串
#將查詢結果寫入到另外一個表TABLENAME1中
mysql> select KEY1, KEY2, ... into TABLENAME1 from TABLENAME2 where EXPRESSION;
#將從TABLENAME一、TABLENAME2兩個表中的查詢數據合併展現
mysql> select KEY1, KEY2, ... from TABLENAME1 where EXPRESSION1 union select KEY3, KEY4, .. from TABLENAME2 where EXPRESSION2;
#TABLENAME1表中key3大於子查詢結果的記錄
mysql> select KEY1, KEY2, ... from TABLENAME1 where KEY3 (>|=|<|<>) (ANY|ALL|SOME) (select KEY3 from TABLENAME2 where EXPRESSION);
#TABLENAME1表中key3[不]屬於子查詢結果列表中的記錄
mysql> select KEY1, KEY2, ... from TABLENAME1 where KEY3 [NOT] IN (select KEY3 from TABLENAME2 where EXPRESSION);
#根據子查詢的結果來決定是否執行從TABLENAME1表中進行查詢
mysql> select KEY1, KEY2, ... from TABLENAME1 where exists (select KEY3 from TABLENAME2 where EXPRESSION);
查詢(刪除)5min以前的內容
select * from email_info where minute(now() - c_time) > 5; 該方法若是跨整點就會有問題
select * from email_info where timestampdiff(minute, c_time, now()) > 5;
delete from email_info where timestampdiff(minute, c_time, now()) > 5;
注:minute是將時間轉換成分鐘的函數,相似的還有year、dayofyear、month、monthname、dayofmonth、week、weekday、dayname、hour、minute、second等
索引、視圖、觸發器、存儲過程、遊標、事務
視圖是虛擬表,至關於一個sql語句的別名,特定狀況下能夠對視圖進行增、刪、改操做,前提是:沒有group by分組、沒有union鏈接、沒有子查詢、沒有並、沒有彙集函數、沒有DISTINCT、導出(計算)列
索引、視圖的增、刪、改
mysql> create index INDEX_NAME on TABLENAME(KEY); #建立索引
mysql> show index from TABLENAME; #查詢索引
mysql> drop index INDEX_NAME; #刪除索引
mysql> create view VIEW_NAME(KEY1, KEY2, ...) as select KEY3, KEY4 from TABLENAME; #建立視圖
mysql> drop view VIEW_NAME; #刪除視圖
存儲過程簡單來講,就是爲之後的使用而保存的一條或多條MySQL語句的集合。可將其視爲批文件,雖然它們的做用不只限於批處理。存儲過程3個主要的好處:簡單、安全、高性能。
存儲過程的建立、刪除、調用
#建立一個存儲過程PROC_NAME, 其中DELIMITER//告訴命令行實用程序使用//做爲新的語句結束符,能夠看到表示存儲過程結束的END定義END//而不是END;做爲語句結束。最後使用DELIMITER; 恢復原來的語句結束符,由於mysql中;默認爲結束符,爲了存儲過程正常使用,因此須要替換procedure中的存儲過程。
#參數中的IN/OUT表示參數是傳入的仍是輸出的,參數是無類型的,能夠是一個簡單變量,也能夠是一個表名(此時能夠直接select @arg來查詢結果),一般存儲過程使用select ... into ... 語句將結果保存到輸出變量中
delimiter //
create procedure PROC_NAME([IN/OUT] ARG1 TYPENAME, [IN/OUT]ARG2 TYPENAME, ...)
BEGIN
SQL_SENTENCES;
END//
delimiter ;
mysql> call PROC_NAME(@arg1, @arg2, ...); #調用存儲過程,mysql中變量前面須要加@
mysql> drop procedure PROC_NAME if exists; #刪除存儲過程
mysql> show create procedure PROC_NAME; #查看建立存儲過程的sql語句
mysql> show procedure status like 'EXP'; #查看存儲過程的相關信息
遊標是一個存儲在MySQL服務器上的數據庫查詢,它不是一條SELECT語句,而是被該語句檢索出來的結構集。在存儲了遊標以後,應用程序能夠根據須要滾動或瀏覽或更改其中的數據。
遊標使用步驟:
使用前須要先聲明
使用時必須打開遊標(執行相關的sql查詢語句),遊標打開後使用FETCH語句分別訪問每一行、FETCH指定檢索什麼數據、存儲在何地,同時會將遊標指向下一行(即下一條FETCH就會檢索下一行)
根據須要行數據,使用完畢後必須關閉
declare CURSOR_NAME cursor for select KEY1, KEY2, ... from TABLENAME; #聲明一個遊標
open CURSOR_NAME; #打開遊標
FETCH CURSOR_NAME into TABLENAME2; #將遊標獲取的一行記錄存到數據表中。
close CURSOR_NAME; #關閉遊標
觸發器是MySQL響應INSERT、UPDATE、DELETE三個中的任意一個語句而自動執行的一條sql語句。觸發器建立條件:名稱惟1、有具體表關聯(視圖、臨時表不行)、與相關的操做(INSERT/UPDATE/DELETE)關聯響應、在關聯語句執行前/後執行。
觸發器的建立、刪除
mysql> create trigger TRI_NAME (before/after) (INSERT/UPDATE/DELETE) on TABLENAME for each row BEGIN SQL_SENTENSE END;
mysql> drop trigger TRI_NAME;
事務處理能夠用來維護數據庫的完整性,它保證成批的mysql操做要麼徹底執行,要麼徹底不執行。管理事務處理的關鍵在於將sql語句組分解成邏輯快,並明確規定數據什麼時候應該回退、什麼時候不回退。 start transaction 表示事務的開始。
事務的建立
start transaction; #事務開始
SQL_SENTENCE1;
SQL_SENTENCE2;
...
(commit/rollback); #事務提交/回滾
#注:一般狀況下是判斷上一條sql語句的執行結果,若是執行失敗,則執行rollback進行回滾操做,若事務中全部的sql語句成功執行,則執行commit將更改實際寫到數據庫中。
數據導入、導出
導入txt格式的數據
mysql> load data local infile 'FILENAME.txt' into table TABLENAME; #注:txt中各字段用tab分隔
導入sql格式的數據庫 (注:這裏的sql文件是包含建表語句和表中數據)
mysql> use DBNAME; source FILENAME.sql #方法一
$ mysqldump -u USERNAME -p DBNAME <FILENAME.sql #方法二
$ mysql -u USERNAME -p -D DBNAME <FILENAME.sql #方法三
導出整個數據庫中全部的表結構
$ mysqldump -uUSERNAME -p [-hIP_ADDR] DBNAME>FILENAME.sql #包含建表語句以及插入數據的insert語句
$ mysqldump -uUSERNAME -p -d [-hIP_ADDR] DBNAME >FILENAME.sql #僅包含建表語句
$ mysqldump -uUSERNAME -p [-hIP_ADDR] --no-create-info DBNAME>FILENAME.sql #僅包含插入數據的insert
$ mysqldump -uUSERNAME -p [-hIP_ADDR] DBNAME TABLENAME >FILENAME.sql #導出一張表的所有內容