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 遊標名