mysql 學習總結

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語句,而是被該語句檢索出來的結構集。在存儲了遊標以後,應用程序能夠根據須要滾動或瀏覽或更改其中的數據。

遊標使用步驟:

  1. 使用前須要先聲明

  2. 使用時必須打開遊標(執行相關的sql查詢語句),遊標打開後使用FETCH語句分別訪問每一行、FETCH指定檢索什麼數據、存儲在何地,同時會將遊標指向下一行(即下一條FETCH就會檢索下一行)

  3. 根據須要行數據,使用完畢後必須關閉

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 #導出一張表的所有內容

相關文章
相關標籤/搜索