1. 程式人生 > 實用技巧 >MySQL知識點整理

MySQL知識點整理

SQL指令碼集錦

sql複製表結構

create table newTableName like sourceTableName

sql複製表結構和資料

create table newTableName select * from sourceTableName

 如果只需要複製部分欄位和資料,把*改成需要複製的欄位即可。比如我只需要複製id和username:create table newTableName select id,username from sourceTableName

sql刪除表

drop table tableName

修改表名稱

alter table oldTableName rename newTableName

刪除表的某列

alter table tableName drop fieldName

新增表的列

alter table tableName add fieldName VARCHAR(36)  

插入資料

INSERT INTO tableName (column1,column2,column3,...) VALUES (value1,value2,value3,...);

更新資料

UPDATE tableName SET column1=value1,column2=value2,... WHERE some_column=some_value;

刪除資料

DELETE FROM tableName WHERE some_column =some_value;

查詢去除重複的資料

select distinct fieldName from tableName

查詢前10行的資料

 select * from tableName LIMIT 10

查詢第2行到第10行的資料

select * from tableName LIMIT 1,10

內連線查詢:將多個表中符合連線條件的資料查詢出來

select * from tableA [inner]  join tableB on 連線條件

左外連線查詢:以左表為基礎,過濾另外一張表(左表所有資訊都會顯示,右表中匹配的資訊會顯示,不匹配的使用空來填充)

select * from tableA left join tableB on 連線條件

交叉連線查詢

select  *  from tableA,tableB where 關聯條件

結果集:將查詢出來的一個結果集作為一個表繼續進行查詢

select * from (select * from tableA) 別名, tableB where 關聯條件

合併查詢:將多個查詢結果合併為一個結果集

select fieldName from tableA  WHERE 條件 union select fieldName from tableB  WHERE 條件

函式

求和 ——> sum()

平均值 ——> avg()

統計行數 ——> count()

最大值 ——> max()

最小值 ——> min()

獲取當前日期和時分秒 ——> now()

獲取當前日期 ——> curdate()

獲取當前時分秒 ——> curtime()

計算2個時間相差的天數 ——> datediff(d1,d2)

在d日期的基礎上增加n天 ——> adddate(d,n)

在d日期的基礎上減少n天 ——> subdate(d,n)

在d日期時間的基礎上增加/減少n單位 ——> date_add(d,interval n type)

type表示單位型別

type

說明

microsecond

微秒

second

minute

分鐘

hour

小時

day

week

星期

month

quarter

季度

year

second_microsecond

秒和微秒

minute_microsecond

分鐘和微秒

minute_second

分鐘和秒

hour_microsecond

小時和微秒

hour_second

小時和秒

hour_minute

小時和分鐘

day_microsecond

日期和微秒

day_second

日期和秒

day_minute

日期和分鐘

day_hour

日期和小時

year_month

年和月

舉例1:select date_add(NOW(),interval -2 DAY) 這是查詢兩天的日期

舉例2:select date_add(NOW(),interval +2 MONTH) 這是查詢兩個月的日期

獲取日期或時間中某個單位的整數

年份 ——> year(d)

月份 ——> month(d)

日 ——> dayofmonth(d)

小時 ——> hour(d)

分鐘 ——> minute(d)

秒 ——> second(d)

一週中的第幾天(週一為0) ——> weekday(d)

一年中的第幾周 ——> week(d)

一年中的第幾天 ——> dayofyear(d)

舉例:select year('2020-8-26 7:30:00') -- 輸出2020

四捨五入後的整數 ——> round(x)

四捨五入後的小數,y表示小數位數 ——> round(x,y)

保留y位小數的值,只舍不入 ——> truncate(x,y)

返回大於等於x的最小整數(向上取整) ——> ceil(x)

與ceil相反,返回小於等於x的最大整數(向下取整) ——> floor(x)

返回0-1之間的隨機數,包括0不包括1 ——> rand()

將多個字串拼接 ——> concat(s1,s2,…)

將多個字串使用指定字元進行拼接 ——> concat_ws('指定字元',s1,s2,…)

擷取x字串的前面n個字元 ——> left(x,n)

擷取x字串的後面n個字元 ——> right(x,n)

對x字串進行擷取,從start位置開始擷取length個 ——> substring(x,start,length)

轉化為大寫 ——> upper(s)

轉化為小寫 ——> lower(s)

在s1的字串中查詢s2字串並替換成s3字串 ——> replace(s1,s2,s3)

獲取字元的長度 ——> char_length(s)

獲取字元的位元組數(注意:一個漢字佔3個位元組) ——> length(s)

將字串s轉化為md5編碼 ——> md5(s)

變數

區域性變數:使用declare定義,只能在函式、儲存過程、觸發器中使用,區域性變數不需要@字首

一個變數語法:declare 變數名 資料型別 default 預設值;

多個變數語法:declare nnum1,nnum2 int default 0;

系統變數:由系統定義,以@@開頭,可以直接使用。

常用的系統變數

@@version:獲取MySQL版本

@@last_insert_id:上一次新增記錄的自增列的值(注意:@@identity也可以達到同樣的效果)

會話變數:在客戶端的本次連線過程中可以使用,當客戶端斷開後,無法再使用,以@開頭。

建立變數並賦值:set @變數名=值;

一次性建立多個變數並賦值:set @num1=2,@num2=3;

自定義函式

語法:

create function 函式名(引數名 資料型別,引數名 資料型別…) returns 返回型別

begin

-- 程式碼

return 返回值;

end;

定義函式注意事項:

1) 必須有返回型別

2) 函式名建議使用fn_開頭命名

3) 函式中不能產生查詢結果集

呼叫函式:可以在增刪改查語句中使用函式,引數可以是列名

刪除函式: drop function 函式名

IF語句

if 條件表示式1 then

程式碼塊1;

elseif 條件語句2 then

程式碼塊2;

else

程式碼塊3;

end if;

CASE語句

case

when 表示式 then 值

when 表示式 then 值

else 值

end;

WHILE語句

while 條件表示式 do

迴圈體;

end while;

leave語句:跳出迴圈,類似java中的break

iterate語句:跳過本次迴圈,類似java中的continue

標記:在while迴圈開始和結束定義,標記名稱自己設定,在leave和iterate中使用標記。

檢視

解釋:檢視中儲存的僅僅是一條select語句,檢視中的資料都來自於資料庫表,資料庫表稱為基本表或者基表,檢視稱為虛擬表,檢視不能儲存資料。

建立檢視語法:

create view 檢視名

as

select 語句

刪除檢視語法:

drop view 檢視名

修改檢視:

alter view 檢視名

as

select語句

索引

建立索引語法:create index 索引名 on 表名(列名)

刪除索引語法:drop index 索引名 on 表名

聚集索引和非聚集索引(普通索引)的區別

聚集索引

非聚集索引

表中的主鍵會自動建立聚集索引,資料在索引頁中的順序和在資料表中的順序一致,每個表最多隻能有1個聚集索引。

資料在索引頁中的順序和在資料表中的順序不一致,每個表可以有多個非聚集索引。

儲存過程

無引數的儲存過程語法

create procedure 儲存過程名()

begin

儲存過程語句;

end;

call 儲存過程名稱(); -- 呼叫儲存過程

帶輸入引數的儲存過程

create procedure 儲存過程名(in 引數名 資料型別,in 引數名 資料型別,…)

begin

儲存過程語句;

end;

call 儲存過程名稱(值,值,…); -- 呼叫儲存過程

帶輸出引數的儲存過程

create procedure 儲存過程名(in 引數名 資料型別,out 引數名 資料型別,…)

begin

儲存過程語句;

end;

set @value=值;

call 儲存過程名稱(值,@value,…); -- 呼叫儲存過程

select @value;

刪除儲存過程

drop procedure 儲存過程名稱

事務

解釋:事務(TRANSACTION)是作為單個邏輯工作單元執行的一系列操作,多個操作作為一個整體向系統提交,要麼都執行、要麼都不執行。事務是一個不可分割的工作邏輯單元。

事務的四個屬性

原子性(Atomicity)

事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是一個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。

一致性(Consistency)

當事務完成時,資料必須處於一致狀態。

隔離性(Isolation)

併發事務之間彼此隔離、獨立,它不以任何方式依賴或影響其他事務。

永續性(Durability

事務完成後,事務對資料庫的所有更新將被永久儲存到資料庫。

管理事務的sql語句

開始事務:start transaction;

提交事務:commit;

回滾事務:rollback;

觸發器

解釋:在增刪改操作過程中觸發並執行相應行為,在觸發器中可以進行資料驗證,也可以進行其他操作。

作用:實現檢查約束、實現關聯操作

種類:insert、update、delete

表new和old

觸發器都是操作的這兩張臨時表;

insert觸發器新增的資料在new中;

delete觸發器需要刪除的資料在old中;

update觸發器修改前的資料在old中,修改後的資料在new中;

一個表每種型別的觸發器只能有一個;

使用時new.field或old.field即可;

語法

CREATE TRIGGER myTrigger BEFORE INSERT ON tableName FOR EACH ROW

BEGIN

觸發器程式碼

END;

遊標

解釋:遊標用於從select語句的結果集中每次提取一條記錄。

宣告遊標:declare 遊標名 cursor for select語句

開啟遊標:open 遊標名

從遊標中獲取資料:fetch 遊標名 into 變數名1,變數名2…

關閉遊標:close 遊標名