MySQL完整筆記
阿新 • • 發佈:2020-02-05
注:本篇大部分內容都是尚矽谷mysql課程的筆記。如果需要課程以及原始碼,請至官網下載:
下載地址
資料庫
介紹
1.概念
1、DB:資料庫,儲存一組有組織的資料的容器
2、DBMS:資料庫管理系統,又稱為資料庫軟體(產品),用於管理DB中的資料
3、SQL:結構化查詢語言,用於和DBMS通訊的語言
1、將資料放到表中,表再放到庫中
2、一個數據庫中可以有多個表,每個表都有一個的名字,用來標識自己。表名具有唯一性。
3、表具有一些特性,這些特性定義了資料在表中如何儲存,類似java中 “類”的設計。
4、表由列組成,我們也稱為欄位。所有表都是由一個或多個列組成的,每一列類似java 中的”屬性”
2.安裝
參照視訊,基本一致Next就行.
3.MySQL服務的啟動和停止
方式一:通過命令列
net start 服務名
net stop 服務名
方式二:計算機——右擊——管理——服務
4.MySQL服務的登入和退出
#登入:
mysql 【-h 主機名 -P 埠號】 -u 使用者名稱 -p密碼(之間不能有空格)
#退出:
exit或ctrl+C
5.MySQL的常見命令
#1.檢視當前所有的資料庫 show databases; #2.開啟指定的庫 use 庫名 #3.檢視當前庫的所有表 show tables; #4.檢視其它庫的所有表 show tables from 庫名; #5.建立表 create table 表名( 列名 列型別,列名 列型別, 。。。 ); #6.查看錶結構 desc 表名; #顯示錶中的所有資料 select * from 表名;
6.MySQL的語法規範
1.不區分大小寫,但建議關鍵字大寫,表名、列名小寫
2.每條命令最好用分號結尾;
3.每條命令根據需要,可以進行縮排 或換行
4.註釋
單行註釋:#註釋文字
單行註釋:-- 註釋文字 (-- 後面有一個空格)
多行註釋:/* 註釋文字 */
SQL的語言分類
DQL(Data Query Language):資料查詢語言
select where
DML(Data Manipulate Language):資料操作語言
insert 、update、delete
DDL(Data Define Languge):資料定義語言
TCL(Transaction Control Language):事務控制語言
commit、rollback
DQL(Data Query Language):資料查詢語言
1.基礎查詢
一、語法
select 查詢列表 from 表名;
二、特點
1、查詢列表可以是欄位、常量、表示式、函式,也可以是多個
2、查詢結果是一個虛擬表
三、示例
#1、查詢單個欄位
select 欄位名 from 表名;
#2、查詢多個欄位
select 欄位名,欄位名 from 表名;
#3、查詢所有欄位
select * from 表名
#4、查詢常量
select 常量值;
#注意:字元型和日期型的常量值必須用單引號引起來,數值型不需要
#5、查詢函式
select 函式名(實參列表);
#6、查詢表示式
select 100/1234;
#7、起別名(便於理解,區分欄位)
#①as
SELECT 100%98 AS 結果;
#②空格(空格代替AS)
SELECT 100%98 結果;
#8、去重
select distinct 欄位名 from 表名;
#9、+
#作用:做加法運算
#直接運算
select 數值+數值;
#先試圖將字元轉換成數值,如果轉換成功,則繼續運算;否則轉換成0,再做運算
select 字元+數值;
#結果都為null
select null+值;
#10、【補充】concat函式
#功能:拼接字元
select concat(字元1,字元2,字元3,...);
#11、【補充】ifnull函式
#功能:判斷某欄位或表示式是否為null,如果為null 返回指定的值,否則返回原本的值
select ifnull(commission_pct,0) from employees;
#12、【補充】isnull函式
#功能:判斷某欄位或表示式是否為null,如果是,則返回1,否則返回0
2.條件查詢
條件查詢:根據條件過濾原始表的資料,查詢到想要的資料
語法:
select
要查詢的欄位|表示式|常量值|函式
from
表
where
條件 ;
條件分類:
一、條件表示式
示例:salary>10000
條件運算子:
> < >= <= = != <>
二、邏輯表示式
邏輯運算子:
and(&&):兩個條件如果同時成立,結果為true,否則為false
or(||):兩個條件只要有一個成立,結果為true,否則為false
not(!):如果條件成立,則not後為false,否則為true
#示例
salary>10000 AND salary<20000
三、模糊查詢
like:一般搭配萬用字元使用,可以判斷字元型或數值型
萬用字元:% 任意多個字元,_ 任意單個字元 (\可以轉義 escape '$')
#示例
last_name like 'a%'
between and (包含區間值[閉區間])
in
#示例
job_id IN ('IT_PROT','AD_VP')
is null 或 is not null:用於判斷null值
is null PK <=>(安全等於)
普通型別的數值 null值 可讀性
is null × √ √
<=> √ √ ×
3.排序查詢
一、語法
select 查詢列表
from 表
where 篩選條件
order by 排序列表 【 asc|desc】
二、特點
1、 asc :升序,如果不寫預設升序
desc:降序
2、排序列表 支援: 單個欄位、多個欄位、函式、表示式、別名
3、 order by 的位置一般放在查詢語句的最後(除 limit 語句之外)
4.常見函式
一、概述
功能: 類似於java中的方法
好處: 提高重用性和隱藏實現細節
呼叫: select 函式名(實參列表);
二、單行函式
1、字元函式
concat:連線
substr:擷取子串 注意:SQL中索引從 1 開始
instr:獲取子串第一次出現的索引 找不到返回0
upper:變大寫
lower:變小寫
replace:替換
length:獲取位元組長度
trim:去 前 後 空格
#示例:去除指定字元
SELECT TRIM('a' FROM 'aaaa趙笑傲aaaa') AS out_put
lpad:左填充
rpad:右填充
2、數學函式
round:四捨五入
ceil:向上取整
floor:向下取整
mod:取餘 ?
truncate:截斷
rand:獲取隨機數,返回 0-1之間的小數
3、日期函式
now :返回當前日期+時間
year:返回年
month:返回月
day:返回日
date_format:將日期轉換成字元
curdate:返回當前日期(不包含時間)
str_to_date:將字元轉換成日期(有張表)
curtime:返回當前時間
hour:小時
minute:分鐘
second:秒
datediff:返回兩個日期相差的天數
monthname:以英文形式返回月
4、其他函式
version 當前資料庫伺服器的版本
database 當前開啟的資料庫
user 當前使用者
password('字元'):返回該字元的密碼形式
md5('字元'):返回該字元的md5加密形式
5、流程控制函式
1.if(條件表示式,表示式1,表示式2):
如果條件表示式成立,返回表示式1,否則返回表示式2
2.#case情況1
case 變數或表示式或欄位
when 常量1 then 值1
when 常量2 then 值2
...
else 值n
end
3.#case情況2
case
when 條件1 then 值1
when 條件2 then 值2
...
else 值n
end
三、分組函式(用作統計使用)
1、分類
max 最大值
min 最小值
sum 和
avg 平均值
count 計算個數
2、特點
1.語法
select max(欄位) from 表名;
2.支援的型別
sum 和 avg 一般用於處理數值型
max、 min、 count可以處理任何資料型別
3.以上分組函式都忽略null
4.都可以搭配 distinct使用,實現去重的統計
select sum(distinct 欄位) from 表;
5.count函式
count(欄位):統計該欄位非空值的個數
count(*):統計結果集的行數
# 案例:查詢每個部門的員工個數
1 xx 10
2 dd 20
3 mm 20
4 aa 40
5 hh 40
count(1):統計結果集的行數
效率上:
MyISAM儲存引擎,count(*)最高
InnoDB儲存引擎,count(*)和count(1)效率>count(欄位)
6. 和分組函式一同查詢的欄位,要求是 group by 後出現的欄位
5.分組查詢
一、語法
select 分組函式,#分組後的欄位#
from 表
【 where 篩選條件】
group by 分組的欄位
【 having 分組後的篩選】
【 order by 排序列表】
二、特點
使用關鍵字 篩選的表 位置
分組前篩選 where 原始表 group by的前面
分組後篩選 having 分組後的結果 group by 的後面
6.連線查詢
含義:又稱多表查詢,當查詢的欄位來自於多個表時,就會用到連線查詢
一、含義
#錯誤語法
select name,boyName from beauty,boys;
#產生笛卡爾乘積的錯誤
select count(*) from beauty;#輸出12行
select count(*) from boys;#輸出4行
#最終輸出48行
#笛卡爾乘積:當查詢多個表時,沒有新增有效的連線條件,導致多個表所有行實現完全連線
#如何解決:新增有效的連線條件
二、分類
按年代分類:
#sql92:
等值
非等值
自連線
也支援一部分外連線(用於oracle、sqlserver,mysql不支援)
#sql99【推薦使用】
內連線
等值
非等值
自連線
外連線
左外
右外
全外(mysql不支援)
交叉連線
三、SQL92語法
1、等值連線
#語法:
select 查詢列表
from 表1 別名,表2 別名
where 表1.key=表2.key
【 and 篩選條件】
【 group by 分組欄位】
【 having 分組後的篩選】
【 order by 排序欄位】
特點:
① 一般為表起別名
②多表的順序可以調換
③n表連線至少需要 n-1個連線條件
④等值連線的結果是多表的交集部分
2、非等值連線
語法:
select 查詢列表
from 表1 別名,表2 別名
where 非等值的連線條件
【 and 篩選條件】
【 group by 分組欄位】
【 having 分組後的篩選】
【 order by 排序欄位】
3、自連線
語法:
select 查詢列表
from 表 別名1,表 別名2
where 等值的連線條件
【 and 篩選條件】
【 group by 分組欄位】
【 having 分組後的篩選】
【 order by 排序欄位】
四、SQL99語法
1、內連線
語法:
select 查詢列表
from 表1 別名 【 inner 】(連線型別)
join 表2 別名
on 連線條件
where 篩選條件
group by 分組列表
having 分組後的篩選
order by 排序列表
limit 子句;
特點:
①表的順序可以調換
②內連線的結果=多表的交集
③n表連線至少需要n-1個連線條件
分類:
等值連線
非等值連線
自連線
2、外連線
用於查詢一個表中有另一個表中沒有的東西
語法:
select 查詢列表
from 表1 別名
left|right|full【outer】 join 表2 別名
on 連線條件
where 篩選條件
group by 分組列表
having 分組後的篩選
order by 排序列表
limit 子句;
特點:
①查詢的結果=主表中所有的行,如果從表和它匹配的將顯示匹配行,如果從表沒有匹配的則顯示null
② left join 左邊的就是主表, right join 右邊的就是主表
full join 兩邊都是主表
③一般用於查詢除了交集部分的剩餘的不匹配的行
3、交叉連線
語法:
select 查詢列表
from 表1 別名
cross join 表2 別名;
特點:
類似於笛卡爾乘積
7.子查詢
一、含義
巢狀在其他語句內部的 select 語句稱為子查詢或內查詢,
外面的語句可以是 insert 、 update 、 delete 、 select 等,一般select作為外面語句較多
外面如果為select語句,則此語句稱為外查詢或主查詢
二、分類
1、按出現位置
select後面:
僅僅支援標量子查詢
from後面:
表子查詢
where 或 having 後面:
#標量子查詢
#列子查詢
行子查詢
exists後面:(相關子查詢)//關心有沒有(1,有 0,沒有)
標量子查詢
列子查詢
行子查詢
表子查詢
2、按結果集的行列
標量子查詢(單行子查詢):結果集為一行一列
列子查詢(多行子查詢):結果集為多行一列
行子查詢:結果集為一(多)行多列
表子查詢:結果集為多行多列
3.特點
1.子查詢放在小括號內
2.子查詢一般放在條件的右側
3.標量子查詢,一般搭配著單行操縱符使用(< > >= = <>)
4.列子查詢,一般搭配著多行操作符使用#(in any/some all)
5.子查詢優先於主查詢
三、示例
where或having後面
1、標量子查詢
案例:查詢最低工資的員工姓名和工資
①最低工資
select min(salary) from employees
②查詢員工的姓名和工資,要求工資=①
select last_name,salary
from employees
where salary=(
select min(salary) from employees
);
2、列子查詢
案例:查詢所有是領導的員工姓名
①查詢所有員工的 manager_id
select manager_id
from employees
②查詢姓名,employee_id屬於①列表的一個
select last_name
from employees
where employee_id in(
select manager_id
from employees
);
8.分頁查詢
一、應用場景
當要查詢的條目數太多,一頁顯示不全
二、語法
select 查詢列表
from 表
limit 【 offset】size;
注意:
offset代表的是起始的條目索引,預設從0卡死(從 0 開始 ####)
size 代表的是顯示的條目數
公式:
假如要顯示的頁數為page,每一頁條目數為size
select 查詢列表
from 表
limit (page-1)*size,size;
9.聯合查詢
一、含義
union:合併、聯合,將多次查詢結果合併成一個結果
二、語法
查詢語句1
union 【 all 】
查詢語句2
union 【 all 】
...;
三、意義
1、將一條比較複雜的查詢語句拆分成多條語句
2、適用於查詢多個表的時候,查詢的列基本是一致
四、特點
1、要求多條查詢語句的查詢列數必須一致
2、要求多條查詢語句的查詢的各列型別、順序最好一致
3、 union 去重, union all包含重複項
10.查詢總結
語法:
select 查詢列表 ⑦
from 表1 別名 ①
連線型別 join 表2 ②
on 連線條件 ③
where 篩選 ④
group by 分組列表 ⑤
having 篩選 ⑥
order by排序列表 ⑧
limit 起始條目索引,條目數; ⑨
DML(Data Manipulate Language):資料操作語言
1.insert
一、方式一
語法:
insert into 表名(欄位名,...) values(值,...);
特點:
1、要求值的型別和欄位的型別要一致或相容
2、欄位的個數和順序不一定與原始表中的欄位個數和順序一致
但必須保證值和欄位一一對應
3、假如表中有可以為null的欄位,注意可以通過以下兩種方式插入null值
①欄位和值都省略
②欄位寫上,值使用null
4、欄位和值的個數必須一致
5、欄位名可以省略,預設所有列
二、方式二
語法:
insert into 表名 set 欄位=值,欄位=值,...;
兩種方式 的區別:
1.方式一
#支援一次插入多行,語法如下:
insert into 表名【(欄位名,..)】 values(值,..),(值,...),...;
2.方式一支援子查詢,語法如下:
insert into 表名
查詢語句;
2.update、
一、修改單表的記錄 ★
語法: update 表名 set 欄位=值,欄位=值 【 where 篩選條件】;
二、修改多表的記錄【補充】
語法:
update 表1 別名
left|right|inner join 表2 別名
on 連線條件
set 欄位=值,欄位=值
【where 篩選條件】
3.delete
方式一:使用delete
一、刪除單表的記錄★
語法:delete from 表名 【where 篩選條件】【limit 條目數】
二、級聯刪除[補充]
語法:
delete 別名1,別名2 from 表1 別名
inner|left|right join 表2 別名
on 連線條件
【 where 篩選條件】
方式二:使用 truncate(清空)
語法: truncate table 表名
兩種方式的區別【面試題】★
1.truncate刪除後,如果再插入,標識列從1開始
delete刪除後,如果再插入,標識列從斷點開始
2.delete可以新增篩選條件
truncate不可以新增篩選條件
3.truncate效率較高
4.truncate沒有返回值
delete可以返回受影響的行數
5.truncate不可以回滾
delete可以回滾
DDL(Data Define Languge):資料定義語言
1.庫的管理
一、建立庫
create database 【 if not exists】 庫名【 character set 字符集名】;
二、修改庫
alter database 庫名 character set 字符集名;
三、刪除庫
drop database 【 if exists】 庫名;
2.表的管理
一、建立表 ★
create table 【 if not exists】 表名(
欄位名 欄位型別 【約束】,欄位名 欄位型別 【約束】,。。。
欄位名 欄位型別 【約束】
)
二、修改表
1.新增列
alter table 表名 add column 列名 型別 【 first|(after 欄位名)】;
2.修改列的型別或約束
alter table 表名 modify column 列名 新型別 【新約束】;
3.修改列名
alter table 表名 change column 舊列名 新列名 型別;
4 .刪除列
alter table 表名 drop column 列名;
5.修改表名
alter table 表名 rename 【 to 】 新表名;
三、刪除表
drop table【 if exists】 表名;
四、複製表
1、複製表的結構
create table 表名 like 舊錶;
2、複製表的結構+資料
create table 表名
select 查詢列表 from 舊錶【 where 篩選】;
3.資料型別
一、數值型
1、整型
tinyint、 smallint、 mediumint、 int/ integer、 bigint
1(位元組) 2 3 4 8
特點:
①都可以設定無符號和有符號,預設有符號,通過 unsigned 設定無符號
②如果超出了範圍,會報 out or range異常,插入臨界值
③長度可以不指定,預設會有一個長度
長度代表顯示的最大寬度,如果不夠則左邊用0填充,
但需要搭配 zerofill,並且預設變為無符號整型
2、浮點型
定點數:
decimal(M,D)
浮點數:
float(M,D) 4(位元組)
double(M,D) 8
特點:
①M代表整數部位+小數部位的個數,D代表小數部位
②如果超出範圍,則報 out or range異常,並且插入臨界值
③M和D都可以省略( float,double 可以隨著插入的數值精度來決定精度),
但對於定點數,M預設為10,D預設為0
④如果精度要求較高,則優先考慮使用定點數
二、字元型
char、 varchar、 binary、 varbinary、 enum、 set、 text、 blob(較大的二進位制)
char:固定長度的字元,寫法為char(M),最大長度不能超過M,其中M可以省略,預設為1
varchar:可變長度的字元,寫法為varchar(M),最大長度不能超過M,其中M不可以省略
三、日期型
year年
date日期
time時間
datetime 日期+時間 8
timestamp 日期+時間 4 比較容易受時區、語法模式、版本的影響,更能反映當前時區的 真實時間
4.常見約束
一、常見的約束
NOT NULL :非空,該欄位的值必填
UNIQUE:唯一,該欄位的值不可重複
DEFAULT:預設,該欄位的值不用手動插入有預設值
CHECK:檢查,mysql不支援
PRIMARY KEY:主鍵,該欄位的值不可重複並且非空 unique+not null
FOREIGN KEY:外來鍵,該欄位的值引用了另外的表的欄位
主鍵和唯一
1、區別:
①、一個表至多有一個主鍵,但可以有多個唯一
②、主鍵不允許為空,唯一可以為空
2、相同點
都具有唯一性
都支援組合鍵,但不推薦
外來鍵:
1、用於限制兩個表的關係,從表的欄位值引用了主表的某欄位值
2、外來鍵列和主表的被引用列要求型別一致,意義一樣,名稱無要求
3、主表的被引用列要求是一個key(一般就是主鍵)
4、插入資料,先插入主表
刪除資料,先刪除從表
可以通過以下兩種方式來刪除主表的記錄
#方式一:級聯刪除
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;
#方式二:級聯置空
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL;
二、建立表時新增約束
create table 表名(
欄位名 欄位型別 not null,#非空
欄位名 欄位型別 primary key,#主鍵
欄位名 欄位型別 unique,#唯一
欄位名 欄位型別 default 值,#預設
[constraint 約束名](可省略) foreign key(欄位名) references 主表(被引用列)
)
注意:
支援型別 可以起約束名
列級約束 除了外來鍵 不可以
表級約束 除了非空和預設 可以,但對主鍵無效
列級約束可以在一個欄位上追加多個,中間用空格隔開,沒有順序要求
三、修改表時新增或刪除約束
1、非空
新增非空
alter table 表名 modify column 欄位名 欄位型別 not null;
刪除非空
alter table 表名 modify column 欄位名 欄位型別 ;
2、預設
新增預設
alter table 表名 modify column 欄位名 欄位型別 default 值;
刪除預設
alter table 表名 modify column 欄位名 欄位型別 ;
3、主鍵
新增主鍵
#1.表級約束
alter table 表名 add【 constraint 約束名】 primary key(欄位名);
#2.列級約束
alter table 表名 modify column 欄位名 欄位型別 primary key;
刪除主鍵
alter table 表名 drop primary key;
4、唯一
新增唯一
alter table 表名 add【 constraint 約束名】 unique(欄位名);
刪除唯一
alter table 表名 drop index 索引名;
5、外來鍵
新增外來鍵
alter table 表名 add【 constraint 約束名】 foreign key(欄位名) references 主表(被引用列);
刪除外來鍵
alter table 表名 drop foreign key 約束名;
四、自增長列
特點:
1、不用手動插入值,可以自動提供序列值,預設從1開始,步長為1
auto_increment_increment
如果要更改起始值:手動插入值
如果要更改步長:更改系統變數
set auto_increment_increment=值;
2、一個表至多有一個自增長列
3、自增長列只能支援數值型
4、自增長列必須為一個key
一、建立表時設定自增長列
create table 表(
欄位名 欄位型別 約束 auto_increment
)
二、修改表時設定自增長列
alter table 表 modify column 欄位名 欄位型別 約束 auto_increment
三、刪除自增長列
alter table 表 modify column 欄位名 欄位型別 約束
TCL(Transaction Control Language):事務控制語言
一、含義
事務:一條或多條sql語句組成一個執行單位,一組sql語句要麼都執行要麼都不執行
二、特點(ACID)
A 原子性(Atomicity):一個事務是不可再分割的整體,要麼都執行要麼都不執行
C 一致性(Consistency):一個事務可以使資料從一個一致狀態切換到另外一個一致的狀態
I 隔離性(Isolation):一個事務不受其他事務的干擾,多個事務互相隔離的
D 永續性(Durability):一個事務一旦提交了,則永久的持久化到本地
三、事務的使用步驟 ★
瞭解:
隱式(自動)事務:沒有明顯的開啟和結束,本身就是一條事務可以自動提交,比如insert、update、delete
顯式事務:具有明顯的開啟和結束
使用顯式事務:
1.開啟事務
set autocommit=0;
start transaction;#可以省略
2.編寫一組邏輯sql語句
注意:sql語句支援的是 insert、 update 、 delete 、 select
設定回滾點:
savepoint 回滾點名;
3.結束事務
提交: commit;
回滾: rollback;
回滾到指定的地方: rollback to 回滾點名;
四、併發事務
1、事務的併發問題是如何發生的?
多個事務 同時 操作 同一個資料庫的相同資料時
2、併發問題都有哪些?
#髒讀:
一個事務讀取了其他事務還沒有提交的資料,讀到的是其他事務“更新”的資料
#不可重複讀:
一個事務多次讀取,結果不一樣
#幻讀:
一個事務讀取了其他事務還沒有提交的資料,只是讀到的是 其他事務“插入”的資料
3、如何解決併發問題
通過設定隔離級別來解決併發問題
4、隔離級別
(能否避免) 髒讀 不可重複讀 幻讀
read uncommitted:讀未提交 × × ×
read committed:讀已提交 √ × ×
repeatable read:可重複讀 √ √ ×(預設級別)
serializable:序列化 √ √ √
檢視隔離級別:
select @@tx_isolation;
設定隔離級別:
set session|global transaction isolation level 隔離級別名;
delete 支援回滾
truncate 不支援回滾
其他
1.檢視
一、含義
mysql5.1版本出現的新特性,本身是一個虛擬表,它的資料來自於表,通過執行時動態生成。
好處:
1、簡化sql語句
2、提高了sql的重用性
3、保護基表的資料,提高了安全性
二、建立
create view 檢視名
as
查詢語句;
三、修改
方式一:
create or replace view 檢視名
as
查詢語句;
方式二:
alter view 檢視名
as
查詢語句
四、刪除
drop view 檢視1,檢視2,...;
五、檢視
desc 檢視名;
show create view 檢視名;
六、使用(相當於在新的檢視中增改刪查)
1.插入
insert
2.修改
update
3.刪除
delete
4.檢視
select
#注意:
檢視一般用於查詢的,而不是更新的,所以具備以下特點的檢視都不允許更新
①包含分組函式、 group by、 distinct、 having、 union、
② join
③常量檢視
④ where後的子查詢用到了 from中的表
⑤用到了不可更新的檢視
七、檢視和表的對比
關鍵字 是否佔用物理空間 使用
檢視 view 佔用較小,只儲存sql邏輯 一般用於查詢
表 table 儲存實際的資料 增刪改查
2.變數
分類
一、系統變數
說明:變數由系統提供的,不用自定義
1、全域性變數
伺服器層面上的,必須擁有super許可權才能為系統變數賦值,作用域為整個伺服器,
也就是針對於所有連線(會話)有效
2、會話變數
伺服器為每一個連線的客戶端都提供了系統變數,作用域為當前的連線(會話)
語法:
①檢視系統變數
show 【 global|session 】variables like ''; 如果沒有顯式宣告global還是session,則預設是session
②檢視指定的系統變數的值
select @@【 global|session】.變數名; 如果沒有顯式宣告global還是session,則預設是session
③為系統變數賦值
方式一:
set 【 global|session 】 變數名=值; 如果沒有顯式宣告global還是session,則預設是session
方式二:
set @@global.變數名=值;
set @@變數名=值;
二、自定義變數
說明:
1、使用者變數
作用域:針對於當前連線(會話)生效
位置: begin end裡面,也可以放在外面
使用:
①宣告並賦值:
set @變數名=值;或
set @變數名:=值;或
select @變數名:=值;
②更新值
方式一:
set @變數名=值;或
set @變數名:=值;或
select @變數名:=值;
方式二:
select xx into @變數名 from 表;
③使用
select @變數名;
2、區域性變數
作用域:僅僅在定義它的 begin end中有效
位置:只能放在 begin end中,而且只能放在第一句
使用:
①宣告
declare 變數名 型別 【 default 值】;
②賦值或更新
方式一:
set 變數名=值;或
set 變數名:=值;或
select @變數名:=值;
方式二:
select xx into 變數名 from 表;
③使用
select 變數名;
作用域 定義位置 語法
使用者變數 當前會話 會話的任何地方 加@符號,不用指定型別
區域性變數 定義它的 BEGIN END中 BEGIN END的第一句話 一般不用加@,需要指定型別
3.儲存過程和函式
說明:都類似於java中的方法,將一組完成特定功能的邏輯語句包裝起來,對外暴露名字
好處:
1、提高重用性
2、sql語句簡單
3、減少了和資料庫伺服器連線的次數,提高了效率(?不太懂)
儲存過程
含義:一組預先編譯好的SQL語句的集合,理解成批處理語句.
一、建立 ★
1、需要設定新的結束標記
delimiter 新的結束標記
示例:
delimiter $
CREATE PROCEDURE 儲存過程名(IN|OUT|INOUT 引數名 引數型別,...)
BEGIN
sql語句1;
sql語句2;
END $
2、儲存過程體中可以有多條sql語句,如果僅僅一條sql語句,則可以省略begin end
3、引數前面的符號的意思
in:該引數只能作為輸入 (該引數不能做返回值)
out:該引數只能作為輸出(該引數只能做返回值)
inout:既能做輸入又能做輸出
注意:
1.引數模式: in、 out、 inout,其中 in可以省略
2.儲存過程體的每一條sql語句都需要用分號結尾
1、無返回無參
2、僅僅帶 in型別,無返回有參
3、僅僅帶 out型別,有返回無參
4、既帶 in又帶 out,有返回有參
5、帶 inout,有返回有參
1.in、 out、 inout都可以在一個儲存過程中帶多個
二、呼叫
call 儲存過程名(實參列表)
舉例:
呼叫in模式的引數: call sp1(‘值’);
呼叫out模式的引數:set @name; call sp1(@name);select @name;
呼叫inout模式的引數:set @name=值; call sp1(@name); select @name;
三、檢視
show create procedure 儲存過程名;
四、刪除
drop procedure 儲存過程名;
函式
與儲存過程的區別:
儲存過程:可以有0個返回,也可以有多個返回 適合做批量的增刪改
函式:有且僅有一個返回 適合處理資料並返回一個值
關鍵字 呼叫語法 返回值 應用場景
函式 FUNCTION SELECT 函式() 只能是一個 一般用於查詢結果為一個值並返回 時,當有返回值而且僅僅一個
儲存過程 PROCEDURE CALL 儲存過程() 可以有0個或多個 一般用於更新
一、建立
create function 函式名(引數名 引數型別) returns 返回型別
begin
函式體
end
注意:函式體中肯定需要有return語句
二、呼叫
select 函式名(實參列表);
三、檢視
show create function 函式名;
四、刪除
drop function 函式名;
4.流程控制結構
分支結構
一、 if函式
語法: if(條件,值1,值2)
位置:可以用在任何位置
二、 case語句
語法:
情況一:類似於switch
case 表示式|表示式|欄位
when 值1 then 結果1或語句1(如果是語句,需要加分號)
when 值2 then 結果2或語句2(如果是語句,需要加分號)
...
else 結果n或語句n(如果是語句,需要加分號)
end 【 case】(如果是放在begin end中需要加上case,如果放在select後面不需要)
情況二:類似於多重if
case
when 條件1 then 結果1或語句1(如果是語句,需要加分號)
when 條件2 then 結果2或語句2(如果是語句,需要加分號)
...
else 結果n或語句n(如果是語句,需要加分號)
end 【 case】(如果是放在begin end中需要加上case,如果放在select後面不需要)
位置:可以放在任何位置,
如果放在begin end 外面,作為表示式結合著其他語句使用
如果放在begin end 裡面,一般作為獨立的語句使用
三、if結構
功能:實現多分支
語法:
if 條件1 then 語句1;
elseif 條件2 then 語句2;
...
else 語句n;
end if;
位置:
只能放在 begin end中
三者比較:
應用場合
if函式 簡單雙分支
case結構 等值判斷 的多分支
if結構 區間判斷 的多分支
迴圈
分類:
while loop repeat
迴圈控制:
iterate類似於 continue繼續:結束本次迴圈,繼續下一次
leave類似於 break跳出:結束當前所在迴圈
語法:
【標籤:】 WHILE 迴圈條件 DO
迴圈體
END WHILE 【標籤】;
特點:
只能放在 BEGIN END裡面
如果要搭配leave跳轉語句,需要使用標籤,否則可以不用標籤
leave類似於java中的break語句,跳出所在迴圈!!!