mysql基礎(chǔ)
##數(shù)據(jù)庫的好處
1.持久化數(shù)據(jù)到本地
2.可以實現(xiàn)結(jié)構(gòu)化查詢,方便管理
##數(shù)據(jù)庫相關(guān)概念
1、DB:數(shù)據(jù)庫,保存一組有組織的數(shù)據(jù)的容器
2、DBMS:數(shù)據(jù)庫管理系統(tǒng),又稱為數(shù)據(jù)庫軟件(產(chǎn)品),用于管理DB中的數(shù)據(jù)
3、SQL:結(jié)構(gòu)化查詢語言,用于和DBMS通信的語言
##數(shù)據(jù)庫存儲數(shù)據(jù)的特點
1、將數(shù)據(jù)放到表中,表再放到庫中
2、一個數(shù)據(jù)庫中可以有多個表,每個表都有一個的名字,用來標(biāo)識自己。表名具有唯一性。
3、表具有一些特性,這些特性定義了數(shù)據(jù)在表中如何存儲,類似java中 “類”的設(shè)計。
4、表由列組成,我們也稱為字段。所有表都是由一個或多個列組成的,每一列類似java 中的”屬性”
5、表中的數(shù)據(jù)是按行存儲的,每一行類似于java中的“對象”。
##MySQL產(chǎn)品的介紹和安裝
###MySQL服務(wù)的啟動和停止
方式一:計算機——右擊管理——服務(wù)
方式二:通過管理員身份運行
net start 服務(wù)名(啟動服務(wù))
net stop 服務(wù)名(停止服務(wù))
###MySQL服務(wù)的登錄和退出
方式一:通過mysql自帶的客戶端
只限于root用戶
方式二:通過windows自帶的客戶端
登錄:
mysql 【-h主機名 -P端口號 】-u用戶名 -p密碼
退出:
exit或ctrl+C
###MySQL的常見命令
1.查看當(dāng)前所有的數(shù)據(jù)庫
show databases;
2.打開指定的庫
use 庫名
3.查看當(dāng)前庫的所有表
show tables;
4.查看其它庫的所有表
show tables from 庫名;
5.創(chuàng)建表
create table 表名(
列名 列類型,
列名 列類型,
。。。
);
6.查看表結(jié)構(gòu)
desc 表名;
7.查看服務(wù)器的版本
方式一:登錄到mysql服務(wù)端
select version();
方式二:沒有登錄到mysql服務(wù)端
mysql --version
或
mysql --V
###MySQL的語法規(guī)范
1.不區(qū)分大小寫,但建議關(guān)鍵字大寫,表名、列名小寫
2.每條命令最好用分號結(jié)尾
3.每條命令根據(jù)需要,可以進行縮進 或換行
4.注釋
單行注釋:#注釋文字
單行注釋:-- 注釋文字
多行注釋:/* 注釋文字 */
###SQL的語言分類
DQL(Data Query Language):數(shù)據(jù)查詢語言
select
DML(Data Manipulate Language):數(shù)據(jù)操作語言
insert 、update、delete
DDL(Data Define Languge):數(shù)據(jù)定義語言
create、drop、alter
TCL(Transaction Control Language):事務(wù)控制語言
commit、rollback
###SQL的常見命令
show databases; 查看所有的數(shù)據(jù)庫
use 庫名; 打開指定 的庫
show tables ; 顯示庫中的所有表
show tables from 庫名;顯示指定庫中的所有表
create table 表名(
字段名 字段類型,
字段名 字段類型
); 創(chuàng)建表
desc 表名; 查看指定表的結(jié)構(gòu)
select * from 表名;顯示表中的所有數(shù)據(jù)
##DQL語言的學(xué)習(xí)
###進階1:基礎(chǔ)查詢
語法:
SELECT 要查詢的東西
【FROM 表名】;
類似于Java中 :System.out.println(要打印的東西);
特點:
①通過select查詢完的結(jié)果 ,是一個虛擬的表格,不是真實存在
② 要查詢的東西 可以是常量值、可以是表達(dá)式、可以是字段、可以是函數(shù)
###進階2:條件查詢
條件查詢:根據(jù)條件過濾原始表的數(shù)據(jù),查詢到想要的數(shù)據(jù)
語法:
select
要查詢的字段|表達(dá)式|常量值|函數(shù)
from
表
where
條件 ;
分類:
一、條件表達(dá)式
示例:salary>10000
條件運算符:
> < >= <= = != <>
二、邏輯表達(dá)式
示例:salary>10000 && salary<20000
邏輯運算符:
and(&&):兩個條件如果同時成立,結(jié)果為true,否則為false
or(||):兩個條件只要有一個成立,結(jié)果為true,否則為false
not(!):如果條件成立,則not后為false,否則為true
三、模糊查詢
示例:last_name like 'a%'
like
between and
in (in列表的值類型必須一致或兼容)
is null (=或<>不能用于判斷null值is null或is not null 可以判斷null值)
###進階3:排序查詢
語法:
select
要查詢的東西
from
表
where
條件
order by 排序的字段|表達(dá)式|函數(shù)|別名 【asc|desc】
###進階4:常見函數(shù)
一、單行函數(shù)
1、字符函數(shù)
concat拼接 SELECT CONCAT(last_name,'_',first_name) 姓名 FROM employees;
substr截取子串 SELECT SUBSTR('李莫愁愛上了陸展元',7) out_put; 注意:索引從1開始
upper轉(zhuǎn)換成大寫 SELECT UPPER('john');
lower轉(zhuǎn)換成小寫
trim去前后指定的空格和字符
ltrim去左邊空格 SELECT TRIM('aa' FROM 'aaaaaaaaa張aaaaaaaaaaaa翠山aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa') AS out_put;
rtrim去右邊空格
replace替換 SELECT REPLACE('周芷若周芷若周芷若周芷若張無忌愛上了周芷若','周芷若','趙敏') AS out_put;
lpad左填充 SELECT LPAD('殷素素',2,'*') AS out_put;
rpad右填充
instr返回子串第一次出現(xiàn)的索引 SELECT INSTR('楊不殷六俠悔愛上了殷六俠','殷八俠') AS out_put;
length 獲取字節(jié)個數(shù) SELECT LENGTH('john');
2、數(shù)學(xué)函數(shù)
round 四舍五入 SELECT ROUND(-1.55); SELECT ROUND(1.567,2);
rand 隨機數(shù)
floor向下取整 SELECT FLOOR(-9.99);
ceil向上取整 SELECT CEIL(-1.02);
mod取余 mod(a,b) : a-a/b*b
truncate截斷 SELECT TRUNCATE(1.69999,1);
3、日期函數(shù)
now當(dāng)前系統(tǒng)日期+時間
curdate當(dāng)前系統(tǒng)日期
curtime當(dāng)前系統(tǒng)時間
str_to_date 將字符轉(zhuǎn)換成日期 SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d') AS out_put;
date_format將日期轉(zhuǎn)換成字符 SELECT DATE_FORMAT(NOW(),'%y年%m月%d日') AS out_put;
4、流程控制函數(shù)
if 處理雙分支
case語句 處理多分支
情況1:處理等值判斷
情況2:處理條件判斷
SELECT salary 原始工資,department_id,
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工資
FROM employees;
SELECT salary,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
END AS 工資級別
FROM employees;
5、其他函數(shù)
version版本
database當(dāng)前庫
user當(dāng)前連接用戶
二、分組函數(shù)
sum 求和
max 最大值
min 最小值
avg 平均值
count 計數(shù)
特點:
1、以上五個分組函數(shù)都忽略null值,除了count(*)
2、sum和avg一般用于處理數(shù)值型max、min、count可以處理任何數(shù)據(jù)類型
3、都可以搭配distinct使用,用于統(tǒng)計去重后的結(jié)果
4、count的參數(shù)可以支持:字段、*、常量值,一般放1 建議使用 count(*)
##進階5:分組查詢
語法:
select 查詢的字段,分組函數(shù)
from 表
group by 分組的字段
特點:
1、可以按單個字段分組
2、和分組函數(shù)一同查詢的字段最好是分組后的字段
3、分組篩選
針對的表 位置 關(guān)鍵字
分組前篩選: 原始表 group by的前面 where
分組后篩選: 分組后的結(jié)果集 group by的后面 having
4、可以按多個字段分組,字段之間用逗號隔開
5、可以支持排序
6、having后可以支持別名
#分組前的篩選
#案例:查詢有獎金的每個領(lǐng)導(dǎo)手下員工的平均工資
SELECT AVG(salary),manager_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;
#分組后的篩選
案例:查詢哪個部門的員工個數(shù)>5
#①查詢每個部門的員工個數(shù)
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id;
#添加排序
#案例:每個工種有獎金的員工的最高工資>6000的工種編號和最高工資,按最高工資升序
SELECT job_id,MAX(salary) m
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING m>6000
ORDER BY m ;
##進階6:多表連接查詢
笛卡爾乘積:如果連接條件省略或無效則會出現(xiàn)
解決辦法:添加上連接條件
一、傳統(tǒng)模式下的連接 :等值連接——非等值連接
1.等值連接的結(jié)果 = 多個表的交集
2.n表連接,至少需要n-1個連接條件
3.多個表不分主次,沒有順序要求
4.一般為表起別名,提高閱讀性和性能
二、sql99語法:通過join關(guān)鍵字實現(xiàn)連接
含義:1999年推出的sql語法
支持:
等值連接、非等值連接 (內(nèi)連接)
外連接
交叉連接
語法:
select 字段,...
from 表1
【inner|left outer|right outer|cross】join 表2 on 連接條件
【inner|left outer|right outer|cross】join 表3 on 連接條件
【where 篩選條件】
【group by 分組字段】
【having 分組后的篩選條件】
【order by 排序的字段或表達(dá)式】
好處:語句上,連接條件和篩選條件實現(xiàn)了分離,簡潔明了!
三、自連接
案例:查詢員工名和直接上級的名稱
sql99
SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m ON e.`manager_id`=m.`employee_id`;
#進階7:子查詢
含義:出現(xiàn)在其他語句中的select語句,稱為子查詢或內(nèi)查詢
外部的查詢語句,稱為主查詢或外查詢
分類:
按子查詢出現(xiàn)的位置:
select后面:
僅僅支持標(biāo)量子查詢
from后面:
支持表子查詢
where或having后面:★
標(biāo)量子查詢(單行) √
列子查詢 (多行) √
行子查詢
exists后面(相關(guān)子查詢)
表子查詢
按結(jié)果集的行列數(shù)不同:
標(biāo)量子查詢(結(jié)果集只有一行一列,只有一個值)
列子查詢(結(jié)果集只有一列多行)
行子查詢(結(jié)果集有一行多列)
表子查詢(結(jié)果集一般為多行多列)
特點:
1、子查詢都放在小括號內(nèi)
2、子查詢可以放在from后面、select后面、where后面、having后面,但一般放在條件的右側(cè)
3、子查詢優(yōu)先于主查詢執(zhí)行,主查詢使用了子查詢的執(zhí)行結(jié)果
4、子查詢根據(jù)查詢結(jié)果的行數(shù)不同分為以下兩類:
① 單行子查詢
結(jié)果集只有一行
一般搭配單行操作符使用:> < = <> >= <=
非法使用子查詢的情況:
a、子查詢的結(jié)果為一組值
b、子查詢的結(jié)果為空
② 多行子查詢
結(jié)果集有多行
一般搭配多行操作符使用:any、all、in、not in
in: 屬于子查詢結(jié)果中的任意一個就行
any和all往往可以用其他查詢代替
#標(biāo)量子查詢★ 子查詢優(yōu)先于主查詢,作為著查詢的結(jié)果
#案例1:誰的工資比 Abel 高?
#①查詢Abel的工資
SELECT salary
FROM employees
WHERE last_name = 'Abel'
#②查詢員工的信息,滿足 salary>①結(jié)果
SELECT *
FROM employees
WHERE salary>(
SELECT salary
FROM employees
WHERE last_name = 'Abel'
);
#列子查詢(多行子查詢)★
#案例1:返回location_id是1400或1700的部門中的所有員工姓名
#①查詢location_id是1400或1700的部門編號
SELECT DISTINCT department_id
FROM departments
WHERE location_id IN(1400,1700)
#②查詢員工姓名,要求部門號是①列表中的某一個
SELECT last_name
FROM employees
WHERE department_id <>ALL(
SELECT DISTINCT department_id
FROM departments
WHERE location_id IN(1400,1700)
);
##進階8:分頁查詢
應(yīng)用場景:
實際的web項目中需要根據(jù)用戶的需求提交對應(yīng)的分頁查詢的sql語句
語法:
select 字段|表達(dá)式,...
from 表
【where 條件】
【group by 分組字段】
【having 條件】
【order by 排序的字段】
limit 【起始的條目索引,】條目數(shù);
特點:
1.起始條目索引從0開始
2.limit子句放在查詢語句的最后
3.公式:
select 查詢列表 from 表 limit (page-1)*size,size;
limit 【offset,】size;
offset要顯示條目的起始索引(起始索引從0開始) -->(page-1)*size
size 要顯示的條目個數(shù)
##進階9:聯(lián)合查詢
引入:
union 聯(lián)合、合并
語法:
select 字段|常量|表達(dá)式|函數(shù) 【from 表】 【where 條件】 union 【all】
select 字段|常量|表達(dá)式|函數(shù) 【from 表】 【where 條件】 union 【all】
select 字段|常量|表達(dá)式|函數(shù) 【from 表】 【where 條件】 union 【all】
.....
select 字段|常量|表達(dá)式|函數(shù) 【from 表】 【where 條件】
特點:
1、多條查詢語句的查詢的列數(shù)必須是一致的
2、多條查詢語句的查詢的列的類型幾乎相同
3、union代表去重,union all代表不去重
##DML語言
###插入
語法:
insert into 表名(字段名,...)
values(值1,...);
特點:
1、字段類型和值類型一致或兼容,而且一一對應(yīng)
2、可以為空的字段,可以不用插入值,或用null填充
3、不可以為空的字段,必須插入值
4、字段個數(shù)和值的個數(shù)必須一致
5、字段可以省略,但默認(rèn)所有字段,并且順序和表中的存儲順序一致
###修改
修改單表語法:
update 表名 set 字段=新值,字段=新值
【where 條件】
修改多表語法:
update 表1 別名1,表2 別名2
set 字段=新值,字段=新值
where 連接條件
and 篩選條件
###刪除
方式1:delete語句
單表的刪除: ★
delete from 表名 【where 篩選條件】
多表的刪除:
delete 別名1,別名2
from 表1 別名1,表2 別名2
where 連接條件
and 篩選條件;
方式2:truncate語句
truncate table 表名
兩種方式的區(qū)別【面試題】
#1.truncate不能加where條件,而delete可以加where條件
#2.truncate的效率高一丟丟
#3.truncate 刪除帶自增長的列的表后,如果再插入數(shù)據(jù),數(shù)據(jù)從1開始
#delete 刪除帶自增長列的表后,如果再插入數(shù)據(jù),數(shù)據(jù)從上一次的斷點處開始
#4.truncate刪除不能回滾,delete刪除可以回滾
##DDL語句
###庫和表的管理
庫的管理:
一、創(chuàng)建庫
create database 庫名
二、刪除庫
drop database 庫名
表的管理:
#1.創(chuàng)建表
CREATE TABLE IF NOT EXISTS stuinfo(
stuId INT,
stuName VARCHAR(20),
gender CHAR,
bornDate DATETIME
);
DESC studentinfo;
#2.修改表 alter
語法:ALTER TABLE 表名 ADD|MODIFY|DROP|CHANGE COLUMN 字段名 【字段類型】;
#①修改字段名
ALTER TABLE studentinfo CHANGE COLUMN sex gender CHAR;
#②修改表名
ALTER TABLE stuinfo RENAME [TO] studentinfo;
#③修改字段類型和列級約束
ALTER TABLE studentinfo MODIFY COLUMN borndate DATE ;
#④添加字段
ALTER TABLE studentinfo ADD COLUMN email VARCHAR(20) first;
#⑤刪除字段
ALTER TABLE studentinfo DROP COLUMN email;
#3.刪除表
DROP TABLE [IF EXISTS] studentinfo;
###常見類型
整型:
小數(shù):
浮點型
定點型
字符型:
日期型:
Blob類型:
###常見約束
分類:六大約束
NOT NULL:非空,用于保證該字段的值不能為空
比如姓名、學(xué)號等
DEFAULT:默認(rèn),用于保證該字段有默認(rèn)值
比如性別
PRIMARY KEY:主鍵,用于保證該字段的值具有唯一性,并且非空
比如學(xué)號、員工編號等
UNIQUE:唯一,用于保證該字段的值具有唯一性,可以為空
比如座位號
CHECK:檢查約束【mysql中不支持】
比如年齡、性別
FOREIGN KEY:外鍵,用于限制兩個表的關(guān)系,用于保證該字段的值必須來自于主表的關(guān)聯(lián)列的值/在從表添加外鍵約束,用于引用主表中某列的值
主鍵(PRIMARY KEY)和唯一(UNIQUE)的對比:
保證唯一性 是否允許為空 一個表中可以有多少個 是否允許組合
主鍵 √ × 至多有1個 √,但不推薦
唯一 √ √ 可以有多個 √,但不推薦
外鍵:
1、要求在從表設(shè)置外鍵關(guān)系
2、從表的外鍵列的類型和主表的關(guān)聯(lián)列的類型要求一致或兼容,名稱無要求
3、主表的關(guān)聯(lián)列必須是一個key(一般是主鍵或唯一)
4、插入數(shù)據(jù)時,先插入主表,再插入從表
刪除數(shù)據(jù)時,先刪除從表,再刪除主表
#1.添加列級約束
語法:
直接在字段名和類型后面追加 約束類型即可。
只支持:默認(rèn)、非空、主鍵、唯一
主表:CREATE TABLE major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
);
從表:CREATE TABLE stuinfo(
id INT PRIMARY KEY,#主鍵
stuName VARCHAR(20) NOT NULL UNIQUE,#非空
gender CHAR(1) CHECK(gender='男' OR gender ='女'),#檢查
seat INT UNIQUE,#唯一
age INT DEFAULT 18,#默認(rèn)約束
majorId INT REFERENCES major(id)#外鍵
);
#查看stuinfo中的所有索引,包括主鍵、外鍵、唯一
SHOW INDEX FROM stuinfo;
#2.添加表級約束
語法:在各個字段的最下面
【constraint 約束名】 約束類型(字段名)
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT,
CONSTRAINT pk PRIMARY KEY(id),#主鍵
CONSTRAINT uq UNIQUE(seat),#唯一鍵
CONSTRAINT ck CHECK(gender ='男' OR gender = '女'),#檢查
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)#外鍵
);
##數(shù)據(jù)庫事務(wù)
###含義
通過一組邏輯操作單元(一組DML——sql語句),將數(shù)據(jù)從一種狀態(tài)切換到另外一種狀態(tài)
###特點
(ACID)
原子性:要么都執(zhí)行,要么都回滾
一致性:保證數(shù)據(jù)的狀態(tài)操作前和操作后保持一致
隔離性:多個事務(wù)同時操作相同數(shù)據(jù)庫的同一個數(shù)據(jù)時,一個事務(wù)的執(zhí)行不受另外一個事務(wù)的干擾
持久性:一個事務(wù)一旦提交,則數(shù)據(jù)將持久化到本地,除非其他事務(wù)對其進行修改
相關(guān)步驟:
步驟1:開啟事務(wù)
set autocommit=0;不自動提交
start transaction;開啟(可省略)
步驟2:編寫事務(wù)中的sql語句(select insert update delete)
語句1;
語句2;
...
步驟3:結(jié)束事務(wù)
commit;提交事務(wù)
rollback;回滾事務(wù)
###事務(wù)的分類:
隱式事務(wù),沒有明顯的開啟和結(jié)束事務(wù)的標(biāo)志
比如
insert、update、delete語句本身就是一個事務(wù)
顯式事務(wù),具有明顯的開啟和結(jié)束事務(wù)的標(biāo)志
1、開啟事務(wù)
取消自動提交事務(wù)的功能
2、編寫事務(wù)的一組邏輯操作單元(多條sql語句)
insert
update
delete
3、提交事務(wù)或回滾事務(wù)
###使用到的關(guān)鍵字
set autocommit=0;
start transaction;
commit;
rollback;
savepoint 斷點
commit to 斷點
rollback to 斷點
###事務(wù)的隔離級別:
事務(wù)并發(fā)問題如何發(fā)生?
當(dāng)多個事務(wù)同時操作同一個數(shù)據(jù)庫的相同數(shù)據(jù)時
事務(wù)的并發(fā)問題有哪些?
臟讀:一個事務(wù)讀取到了另外一個事務(wù)未提交的數(shù)據(jù)
不可重復(fù)讀:同一個事務(wù)中,多次讀取到的數(shù)據(jù)不一致
幻讀:一個事務(wù)讀取數(shù)據(jù)時,另外一個事務(wù)進行更新,導(dǎo)致第一個事務(wù)讀取到了沒有更新的數(shù)據(jù)
如何避免事務(wù)的并發(fā)問題?
通過設(shè)置事務(wù)的隔離級別
1、READ UNCOMMITTED
2、READ COMMITTED 可以避免臟讀
3、REPEATABLE READ 可以避免臟讀、不可重復(fù)讀和一部分幻讀
4、SERIALIZABLE可以避免臟讀、不可重復(fù)讀和幻讀
設(shè)置隔離級別:
set session|global transaction isolation level 隔離級別名;
查看隔離級別:
select @@tx_isolation;
##視圖
含義:理解成一張?zhí)摂M的表
視圖和表的區(qū)別:
使用方式 占用物理空間
視圖 完全相同 不占用,僅僅保存的是sql邏輯
表 完全相同 占用
視圖的好處:
1、sql語句提高重用性,效率高
2、和表實現(xiàn)了分離,提高了安全性
###視圖的創(chuàng)建
語法:
CREATE VIEW 視圖名
AS
查詢語句;
###視圖的增刪改查
1、查看視圖的數(shù)據(jù) ★
SELECT * FROM my_v4;
SELECT * FROM my_v1 WHERE last_name='Partners';
2、插入視圖的數(shù)據(jù)
INSERT INTO my_v4(last_name,department_id) VALUES('虛竹',90);
3、修改視圖的數(shù)據(jù)
UPDATE my_v4 SET last_name ='夢姑' WHERE last_name='虛竹';
4、刪除視圖的數(shù)據(jù)
DELETE FROM my_v4;
###某些視圖不能更新
包含以下關(guān)鍵字的sql語句:分組函數(shù)、distinct、group by、having、union或者union all
常量視圖
Select中包含子查詢
join
from一個不能更新的視圖
where子句的子查詢引用了from子句中的表
###視圖邏輯的更新
#方式一:
CREATE OR REPLACE VIEW test_v7
AS
SELECT last_name FROM employees
WHERE employee_id>100;
#方式二:
ALTER VIEW test_v7
AS
SELECT employee_id FROM employees;
SELECT * FROM test_v7;
###視圖的刪除
DROP VIEW test_v1,test_v2,test_v3;
###視圖結(jié)構(gòu)的查看
DESC test_v7;
SHOW CREATE VIEW test_v7;
##存儲過程
含義:一組經(jīng)過預(yù)先編譯的sql語句的集合
好處:
1、提高了sql語句的重用性,減少了開發(fā)程序員的壓力
2、提高了效率
3、減少了傳輸次數(shù)
分類:
1、無返回?zé)o參
2、僅僅帶in類型,無返回有參
3、僅僅帶out類型,有返回?zé)o參
4、既帶in又帶out,有返回有參
5、帶inout,有返回有參
注意:in、out、inout都可以在一個存儲過程中帶多個
###創(chuàng)建存儲過程
語法:
create procedure 存儲過程名(in|out|inout 參數(shù)名 參數(shù)類型,...)
begin
存儲過程體
end
類似于方法:
修飾符 返回類型 方法名(參數(shù)類型 參數(shù)名,...){
方法體;
}
注意
1、需要設(shè)置新的結(jié)束標(biāo)記
delimiter 新的結(jié)束標(biāo)記
示例:
delimiter $
CREATE PROCEDURE 存儲過程名(IN|OUT|INOUT 參數(shù)名 參數(shù)類型,...)
BEGIN
sql語句1;
sql語句2;
END $
2、存儲過程體中可以有多條sql語句,如果僅僅一條sql語句,則可以省略begin end
3、參數(shù)前面的符號的意思
in:該參數(shù)只能作為輸入 (該參數(shù)不能做返回值)
out:該參數(shù)只能作為輸出(該參數(shù)只能做返回值)
inout:既能做輸入又能做輸出
#調(diào)用存儲過程
call 存儲過程名(實參列表)
##函數(shù)
###創(chuàng)建函數(shù)
學(xué)過的函數(shù):LENGTH、SUBSTR、CONCAT等
語法:
CREATE FUNCTION 函數(shù)名(參數(shù)名 參數(shù)類型,...) RETURNS 返回類型
BEGIN
函數(shù)體
END
###調(diào)用函數(shù)
SELECT 函數(shù)名(實參列表)
###函數(shù)和存儲過程的區(qū)別
關(guān)鍵字 調(diào)用語法 返回值 應(yīng)用場景
函數(shù) FUNCTION SELECT 函數(shù)() 只能是一個 一般用于查詢結(jié)果為一個值并返回時,當(dāng)有返回值而且僅僅一個
存儲過程 PROCEDURE CALL 存儲過程() 可以有0個或多個 一般用于更新
##流程控制結(jié)構(gòu)
###系統(tǒng)變量
一、全局變量
作用域:針對于所有會話(連接)有效,但不能跨重啟
查看所有全局變量
SHOW GLOBAL VARIABLES;
查看滿足條件的部分系統(tǒng)變量
SHOW GLOBAL VARIABLES LIKE '%char%';
查看指定的系統(tǒng)變量的值
SELECT @@global.autocommit;
為某個系統(tǒng)變量賦值
SET @@global.autocommit=0;
SET GLOBAL autocommit=0;
二、會話變量
作用域:針對于當(dāng)前會話(連接)有效
查看所有會話變量
SHOW SESSION VARIABLES;
查看滿足條件的部分會話變量
SHOW SESSION VARIABLES LIKE '%char%';
查看指定的會話變量的值
SELECT @@autocommit;
SELECT @@session.tx_isolation;
為某個會話變量賦值
SET @@session.tx_isolation='read-uncommitted';
SET SESSION tx_isolation='read-committed';
###自定義變量
一、用戶變量
聲明并初始化:
SET @變量名=值;
SET @變量名:=值;
SELECT @變量名:=值;
賦值:
方式一:一般用于賦簡單的值
SET 變量名=值;
SET 變量名:=值;
SELECT 變量名:=值;
方式二:一般用于賦表 中的字段值
SELECT 字段名或表達(dá)式 INTO 變量
FROM 表;
使用:
select @變量名;
二、局部變量
聲明:
declare 變量名 類型 【default 值】;
賦值:
方式一:一般用于賦簡單的值
SET 變量名=值;
SET 變量名:=值;
SELECT 變量名:=值;
方式二:一般用于賦表 中的字段值
SELECT 字段名或表達(dá)式 INTO 變量
FROM 表;
使用:
select 變量名
二者的區(qū)別:
作用域 定義位置 語法
用戶變量 當(dāng)前會話 會話的任何地方 加@符號,不用指定類型
局部變量 定義它的BEGIN END中 BEGIN END的第一句話 一般不用加@,需要指定類型
###分支
一、if函數(shù)
語法:if(條件,值1,值2)
特點:可以用在任何位置
二、case語句
語法:
情況一:類似于switch
case 表達(dá)式
when 值1 then 結(jié)果1或語句1(如果是語句,需要加分號)
when 值2 then 結(jié)果2或語句2(如果是語句,需要加分號)
...
else 結(jié)果n或語句n(如果是語句,需要加分號)
end 【case】(如果是放在begin end中需要加上case,如果放在select后面不需要)
情況二:類似于多重if
case
when 條件1 then 結(jié)果1或語句1(如果是語句,需要加分號)
when 條件2 then 結(jié)果2或語句2(如果是語句,需要加分號)
...
else 結(jié)果n或語句n(如果是語句,需要加分號)
end 【case】(如果是放在begin end中需要加上case,如果放在select后面不需要)
特點:
可以用在任何位置
三、if elseif語句
語法:
if 情況1 then 語句1;
elseif 情況2 then 語句2;
...
else 語句n;
end if;
特點:
只能用在begin end中!!!!!!!!!!!!!!!
三者比較:
應(yīng)用場合
if函數(shù) 簡單雙分支
case結(jié)構(gòu) 等值判斷 的多分支
if結(jié)構(gòu) 區(qū)間判斷 的多分支
###循環(huán)
語法:
【標(biāo)簽:】WHILE 循環(huán)條件 DO
循環(huán)體
END WHILE 【標(biāo)簽】;
特點:
只能放在BEGIN END里面
如果要搭配leave跳轉(zhuǎn)語句,需要使用標(biāo)簽,否則可以不用標(biāo)簽
leave類似于java中的break語句,跳出所在循環(huán)!!!

浙公網(wǎng)安備 33010602011771號