## mysql
#### 1.sql語句
##### 1.增
? insert into 表 (字段,字段) values (val1,val2);
##### 2.刪
? delete from 表 where expresion;
##### 3.改
? update 表 set 字段1=val1,字段2=val2 where expression;
##### 4.查
? select 字段1,字段2 from 表;
#### 2.特殊關鍵字
##### 1. distinct 字段去重
? select distinct 字段 from 表
##### 2.concat 連接字段
? select concat(字段1,字段2) 別名 from 表
##### 3. as 或空格
? 起別名
##### 4. in關鍵字(數組)
? select * from 表 where 字段 in (20,23,23,23);
##### 5. between and關鍵字(區間)
? select * from 表 where 字段 between 1 and 20;
##### 6. is 關鍵字
? select * from 表 where 字段 is null;
? select * from 表 where 字段 is not null;
? null不能用等號
##### 7.安全等<=>
? select * from 表 where 字段 <=> null;
? 安全等判斷類型和值
#### 3.模糊查詢
##### 1. %通配符
##### 2. _代表一個字符
#### 4.轉義
? select * from 表 where 字段 like "$_sdad" escape"$"
#### 5.分組函數
? sum,avg,min,max.count 會忽略null值
? round()四舍五入保留小數
##### 1. groupe by 關鍵字
? 分組前條件where寫在groupe by前 對表中的數據篩選
? 分組后條件having寫在groupe by后 對處理后的數據篩選
#### 6.函數
##### 1.ifnull
##### 2.length
##### 3.substr
##### 4.instr
##### 5.replace
##### 6.concat
##### 7.datediff(date1,date2)
? 返回兩個日期相差的天數
#### mysql 99 語法
#### 1. 內連接
select 字段 from 表1
inner join 表2 on 連接條件
#### 2. 左外連接 右外連接
? 主表和從表,匹配和不匹配的主表信息都會顯示,只不過,沒匹配上的主表那一行,此行的從表信息為空 left join right join
#### 子查詢
##### 1. 列子查詢
? 子查詢結果為一列多行
##### 2. 行子查詢
? 子查詢結果為一行多列
##### 3. 表子查詢
? 子查詢結果為多行多列
##### 4.標量子查詢
? 子查詢結果只有一個標量
##### 5.exist
? 返回值為0或1 ,和where連用相當于true和false
### Mysql 事務
#### 1.事務是什么
? 事務是現實生活中的一組邏輯操作單元,這組操作要么全部成功,要么全部失敗。
#### 2.事務的特性
##### ACID
? 原子性:不可再分割,要么都執行,要么都不執行
? 一致性:一個事務的執行會使數據從一個一致狀態切換到另一個一致狀態
? 隔離性:一個事務的執行不受其他事務的干擾
? 持久性:一個事務一旦提交,則會永久的改變數據庫的數據
```mysql
set autocommit=0;
start transaction;
語句1;
語句2;
...
commit;(提交事務)
rollback;(回滾,撤銷)
```
### Mysql變量
#### 1.用戶變量
? set @變量名=值;
#### 2.局部變量
? declare @變量名 變量類型 default 值;
#### 3.賦值操作符:=或:=
##### ①聲明并初始化
SET @變量名=值;
SET @變量名:=值;
SELECT @變量名:=值;
##### ②賦值(更新變量的值)
#方式一:
SET @變量名=值;
SET @變量名:=值;
SELECT @變量名:=值;
#方式二:
SELECT 字段 INTO @變量名
FROM 表;
##### ③使用(查看變量的值)
SELECT @變量名;
### 存儲過程和函數
#### 存儲過程的含義:
一組預先編譯好的SQL語句的集合,理解成批處理語句
#### 存儲過程的優點:
1、提高代碼的重用性
2、簡化操作
3、減少了編譯次數并且減少了和數據庫服務器的連接次數,提高了效率
#### 一、創建語法
```mysql
CREATE PROCEDURE 存儲過程名(參數列表)
BEGIN
存儲過程體(一組合法的SQL語句);
END
```
注意:在命令行中使用時 ';'是結束語句的標志,但是在存儲過程體重,每一個語句必須以分號為結尾,所有就必須使用delimiter $來改變結束標志。
##### 傳參:
in:該參數可以作為輸入,也就是該參數需要調用方傳入值
out:該參數可以作為輸出,也就是該參數可以作為返回值
inout:該參數既可以作為輸入又可以作為輸出,也就是該參數既需要傳入值,又可以返回值
#### 二、調用語法
CALL 存儲過程名(實參列表);
#### 三、刪除存儲過程
語法:drop procedure 存儲過程名
DROP PROCEDURE p1;
DROP PROCEDURE p2,p3;#×
#### 四、查看存儲過程的信息
DESC myp2;
SHOW CREATE PROCEDURE myp2;
### 函數
#### 含義:
一組預先編譯好的SQL語句的集合,理解成批處理語句
#### 優點:
1、提高代碼的重用性
2、簡化操作
3、減少了編譯次數并且減少了和數據庫服務器的連接次數,提高了效率
#### 區別:
存儲過程:可以有0個返回,也可以有多個返回,適合做批量插入、批量更新
函數:有且僅有1 個返回,適合做處理數據后返回一個結果
#### 一、創建語法
CREATE FUNCTION 函數名(參數列表) RETURNS 返回類型
BEGIN
函數體
END
##### 注意:
1.參數列表 包含兩部分:
參數名 參數類型
2.函數體:肯定會有return語句,如果沒有會報錯
如果return語句沒有放在函數體的最后也不報錯,但不建議
return 值;
3.函數體中僅有一句話,則可以省略begin end
4.使用 delimiter語句設置結束標記
#### 二、調用語法
SELECT 函數名(參數列表)
#### 三、查看函數
SHOW CREATE FUNCTION myf3;
#### 四、刪除函數
DROP FUNCTION myf3;
### 流程控制
順序、分支、循環
#### 一、分支結構
##### 1. if函數
語法:if(條件,值1,值2)
功能:實現雙分支
應用在begin end中或外面
##### 2. case結構
語法:
情況1:類似于switch
case 變量或表達式
when 值1 then 語句1;
when 值2 then 語句2;
...
else 語句n;
end
##### 3.if結構
語法:
if 條件1 then 語句1;
elseif 條件2 then 語句2;
....
else 語句n;
end if;
功能:類似于多重if
只能應用在begin end 中
#### 二、循環結構
##### 1.while
語法:
【標簽:】while 循環條件 do
循環體;
end while【 標簽】;
聯想:
while(循環條件){
循環體;
}
##### 2.loop
語法:
【標簽:】loop
循環體;
end loop 【標簽】;
可以用來模擬簡單的死循環
##### 3.repeat
語法:
【標簽:】repeat
循環體;
until 結束循環的條件
end repeat 【標簽】;
##### mysql中的continue和breack
leave語句相當于breack
iterate語句相當于continue