本篇均爲博主學習數據庫MysSQL基礎篇時的知識點總結,給大家推薦一下超詳細的學習網址:MySQL
基礎篇知識點
1.MySQL使用小技巧
1.tab自動補齊
2.F12自動調整代碼
3.光標放上雙擊字段名直接出代碼
4.使用*號的缺點,不能改變查詢結果字段順序
5.查詢前先打開庫,查詢前用:USE 表名
6.字段用單引號表示,用以區分
7.對哪條代碼操作,選中哪條代碼
2.關於查詢
(1)查詢常量值
SELECT 100;
SELECT 'john';
(數據庫沒有字符與字符串的差別)
(2)查詢表達式
SELECT 100%98;
(查詢計算結果)
(3)查詢函數
SELECT VERSION();
(查詢函數返回值)
3.查詢結果取別名
方法一:
SELECT 字段名 AS 別名 FROM 表名;
方法二:
SELECT 字段名 別名 FROM 表名;
注意:當別名遇到特殊符號時,要加單/雙引號
4.查詢結果去重
加DISTINCT去重
SELECT DISTINCT 字段名 FROM 表名;
5.+號的作用
在mysql中,加好僅代表運算符
SELECT 90+100; --如果兩個字段都爲數值型,則進行運算
SELECT '90'+100; --如果一個是字符型,一個是數值型,嘗試將字符型轉化爲數值型
進行運算,如果轉換成功,則進行運算,如果轉換失敗,將字符型轉換爲0
SELECT NULL+99; --只要一方爲NULL,結果肯定爲NULL
6.使用CONCAT實現連接字段
SELECT CONCAT('a','b','c'); --查詢結果:abc
7.顯示錶結構
DESC 表名
8.IFNULL
判斷字段是否爲空,如果爲空返回相應值
SELECT IFNULL(待判斷字段名,爲空時返回值);
9.篩選條件
一.條件運算符:大於> 小於< 等於= 不等於<> !=
二.邏輯運算符:&& || !
and or not
三.模糊查詢:
**like** :
通配符:‘%’:任意多個字符,包含0個字符
‘_’:任意單個字符
注意:當模糊查詢出現通配符時
解決:用轉義字符
第一種轉義
LIKE ' _/_*'; --代表查找第二個字符是‘_’的字段
第二種轉義
LIKE '_&*' ESCAPE '&'; --說明'&'是一個轉義字符
**BETWEEN and**:
WHERE 字段名 BETWEEN 'a' and 'b'; --篩選出字段在[a,b]區間的數據
注意:包含臨界值,且兩個值不能顛倒
**IN**:
WHERE 字段名 IN('a','b','c'); --判斷字段中的值是否滿足列表中的某一項
注意:列表中值類型必須統一或兼容,且不支持通配符
**is null**:
WHERE 字段名 IS NULL; --篩選爲空的字段
SHERE 字段名 IS NOT NULL; --篩選不爲空的字段
注意:'='不能判斷空值,IS NUL 只能用於判空值
**安全等於<<==>>**:
WHERE 字段 <<=>> 'a'; --判斷字段等於某一個值
WHERE 字段 <<=>> NULL; --判斷字段爲空
10.排序查詢
語法:
select 查詢列表
from 表
【where 篩選條件】
order by 排序列表 【asc | desc】//desc降序,asc升序,默認升序
特點:
1.order by子句可以支持單個字段、多個字段、表達式、函數、別名
2.order by子句一般是放在查詢語句的最後面,limit子句除外
11.常用函數
概念:類似於java的方法,將一組邏輯語句封裝在方法體中,對外暴露方法名
好處:1.隱藏了實現細節 2.提高代碼的重用性
調用:select 函數名(實參列表)【from 表】;
特點:
1.叫什麼(函數名)
2.幹什麼(函數功能)
分類:
1.單行函數:concat、length、ifnull等
2.分組函數
功能:做統計使用,又稱爲統計函數、聚合函數、組函數
一.字符函數
1.lenght 獲取參數值的字節個數
SELECT LENGTH('john'); --返回4
2.concat 拼接字符串
cancat(a,'_',b); --結果:a_b
3.upper(轉換爲大寫) lower(轉換爲小寫)
SELECT UPPER('a'); --結果:A
SELECT lower('A'); --結果:a
4.substr、substring 截取字符串
注意:索引從1開始
SELECT substr('abcd',3); --結果:cd
SELECT substr('abcd',3,1); --結果:c
5.instr 返回子串第一次出現的索引,如果找不到返回0
SELECT INSTR('abcdef','cd'); --結果:3
SELECT INSTR('acdbcdef','cd'); --結果:2
6.trim 去前後空格
SELECT TRIM(' abc '); --結果:3
也可以實現去前後指定字符
SELECT TRIM('a' FROM 'aaaaooaaaa'); --結果:oo
7.lpad 用指定的字符實現左填充指定長度
SELECT LPAD('abc',5,'*'); --結果:**abc
8.rpad 用指定的字符實現右填充指定長度
SELECT RPAD('abc',5,'*'); --結果:abc**
9.replace 替換
SELECT REPLACE('oxoxoxox','o','x'); --結果:xxxxxxxx
二.數學函數
1.round 四捨五入
SELECT ROUND(1.56); --結果:2
SELECT ROUND(1.567,2) --結果:1.57 (保留兩位小數)
2.ceil 向上取整
SELECT CEIL(1.02) --結果:2
3.floor 向下取整
SELECT FLOOR(9.99) --結果:9
4.truncate 截斷
SELECT TRUNCATE(1.6999,1); --結果:1.6 (截斷保留一位小數,且不會四捨五入)
5.mod 取餘
SELECT MOD(10,3); --結果:1
三.日期函數
1.now 返回當前系統日期+時間
SELECT NOW();
2.curdate 返回當前系統日期,不包含時間
SELECT CURDATE();
3.curtime 返回當前時間,不包含日期
4.獲取指定部分,年,月,日,小時,分鐘,秒
SELECT YEAR('1999-11-16'); 結果:1999
SELECT MONTH('1999-11-16'); 結果:11
SELECT DAY('1999-11-16'); 結果:16
四.其他函數
SELECT VERSION();
SELECT DATABASE(); 查看當前數據庫
SELECT USER(); 查看當前用戶
五.分組函數
功能:用於統計使用,又稱爲聚合函數或統計函數或組函數
分類:
sum(求和)、avg(平均值)、max(最大值)、min(最小值)、count(計算個數)
特點:
1、sum、avg一般用於處理數值型
max、min、count可以處理任何類型
2.以上分組函數都忽略null值
3.可以和DISTINCT搭配去重使用
4.count單獨介紹
一般使用count(*)用作統計行數
5.和分組函數一同查詢的字段要求是group by後的字段
12.分組查詢
語法:
select 分組函數,列(要求出現在group by的後面)
from 表
【where 篩選條件】 --分組前的篩選
group by 分組的列表
【order by 子句】
【having 篩選條件】 --分組後的篩選
注意:查詢列表必須特殊,要求是分組函數和group by後出現的字段
特點:
1.分組查詢中的篩選條件分爲兩類
數據源 位置 關鍵字
分組前篩選 原始表 group by前面 where
分組後篩選 分組後的結果集 group by後面 having
**1.分組函數做條件肯定放在having字句中**
**2.能用分組前篩選的就儘量使用分組前篩選**
2.group by 子句支持單個字段分組,多個字段分組(多個字段之間逗號隔開沒有順序要求),表達式或函數(用的較少)
3.也可以添加排序(排序放在整個分組查詢的最後)
13.連接查詢
含義:又稱多表查詢,當查詢的字段來自於多個表時,就會用到連接查詢
笛卡爾乘積現象:表1 有m行,表2 有n行,結果=m*n行
發生原因:沒有有效的連接條件
如何避免:添加有效的連接條件
爲提高語句簡潔度,可以爲表取別名
格式:WHERE 表名 AS 新表名
注意:如果取了別名,則查詢的字段就不能使用原始表名去限定
1.等值連接
1.多表等值連接的結果爲多表的交集部分
2.n表連接,至少需要n-1個連接條件
3.多表的順序沒有要求
4.一般需要爲表起別名
5.可以搭配前面介紹的所有子句使用,比如排序、分組、篩選
2.非等值連接
笛卡爾積後,按取值範圍篩選比如
A表:工資
B表:工資等級 最低工資 最高工資
查詢工資的工資等級:
SELECT 工資,工資等級
FROM A,B
WHERE 工資>=最低工資 AND 工資<=最高工資
3.自連接
相當於創了一張相同的表
A表:員工編號 員工姓名 員工上級編號
查詢員工姓名和他的上級姓名
分析:執行順序:A表的員工姓名 → 員工上級編號 → A表的員工編號 → 員工姓名
SELECT a.員工姓名,b.員工姓名
FROM A AS a,A AS b --相當於創了一張b表
WHERE a.員工上級編號=b.員工編號
4.外連接(sql99語法)
語法:
select 查詢列表
from 表1 別名 【連接類型】
join 表2 別名
on 連接條件
【where 篩選條件】
【group by 分組】
【having 篩選條件】
【order by 排序列表】
分類:
內連接(※):inner
外連接:
左外連接(※):left【outer】
右外連接(※):right【outer】
全外連接:full【outer】
交叉連接:cross(笛卡爾積)
(一)內連接
語法:
select 查詢列表
from 表1 別名
inner join 表2 別名 on 連接條件
【inner join 表3 別名 on 連接條件】
分類:
(1)等值
特點:
1.添加排序、分組、篩選
2.inner可以省略
3.篩選條件放在where後面,連接條件放在on後面,提交分離性,便於閱 讀
4.inner join連接和sql92語法中的等值連接效果是一樣的,都是查詢多 表交集
(2)非等值(與sql92一樣)
(3)自連接(與sql92一樣)
(二)外連接
應用場景:用於查詢一個表中有,另一個表中沒有的記錄
特點:
1.外連接的查詢結果爲主表中的所有記錄,如果從表中有和他匹配的,則顯示匹配的值
如果從表中沒有和它匹配的,則顯示null
外連接查詢結果=內連接結果+主表中有而從表中沒有的記錄
2.左外連接,left outer join左邊的是主表(FROM 後面跟主表)
右外連接,right outer join右邊的是主表 (FROM 後面跟從表)
3.左外和右外交換兩個表的順序,可以實現同樣的效果
14.子查詢
含義:
出現在其他語句中的select語句,稱爲子查詢或內查詢
外部的查詢語句,稱爲主查詢或外查詢
分類:
按查詢出現的位置:
select後面:
標量子查詢
from後面:
支持表子查詢
where或having後面:
標量子查詢(單行),列子查詢(多行)
exists後面(相關子查詢):
表子查詢
語法:exists(完整的查詢語句) 結果1或0
按結果集的行列數不同:
標量子查詢(結果只有一行一列)
列子查詢(結果集只有一列多行)
行子查詢(結果集有一行多列)
表子查詢(結果集一般有多行)
一.where或having後面
1.標量子查詢(單行子查詢)
2.列子查詢(多行子查詢)
3.行子查詢(一行多列)
特點:
(1)子查詢放在小括號內
(2)子查詢一般放在條件右側
(3)標量子查詢,一般搭配着單行操作符使用 > < >= <= = <>
列子查詢,一般搭配着多行操作符使用
in、any/some、all
15.分頁查詢
應用場景:當顯示的數據,一頁顯示不全,需要分頁提交sql請求
語法:
select 查詢列表
from 表1
【join type join 表2
on 連接條件
where 篩選條件
group by 分組字段
having 分組後的篩選
order by 排序的字段】
limit offset,size;(offset 表示要顯示條目的起始索引,從0開始;size表示要顯示的條數)
特點:
1.limit放在查詢語句的最後
2.公式:
要顯示的頁數page,每頁的條目數size
*select 查詢列表
form 表
limit (page-1)size,size;
下面是所有語句執行過程:
16.聯合查詢
union 聯合 合併:將多條查詢語句的結果合併成一個結果
語法:
查詢語句1
union
查詢語句2
union
........
應用場景:
要查詢的結果來自於多個表,且多個表沒有直接的連接關係,但查詢的信息一致
特點:
1.要求多條查詢語句的查詢列數是一致的
2.要求多條查詢語句的查詢的每一列的類型和順序最好一致
3.union關鍵字默認去重,如果使用union all可以包含重複項
17.插入語句
方式一:
語法:
insert into 表名(列名,....)values(值1,,....)
特點:
1.支持插入多行
insert into 表名
values(值1,值2),(值a,值b)
2.支持子查詢
insert into 表名
子查詢 //將子查詢結果集插入表中
方式二:
語法:
insert into 表名
set 列名=值,列名=值
18.修改語句
1.修改單表記錄
語法:
update 表名
set 列=新值,列=新值.....
where 篩選條件
2.修改多表記錄【補充】
語法:
sql92語法;
update 表1 別名,表2 別名
set 列=值,....
where 連接條件 and 篩選條件
sql99語法:
update 表1 別名
inner|left|right join 表2 別名
on 連接條件
set 列=值,...
where 篩選條件
19.刪除語句
方式一:delete
語法:
1.單表刪除
delete from 表名 where 篩選條件
2.多表刪除【補充】
sql92語法:
delete 表1的別名,表2的別名
from 表1 別名,表2 別名
where 連接條件
and 篩選條件;
sql99語法:
delete 表1的別名,表2 的別名
from 表1 別名
inner|left|right join 表2 別名 on 連接條件
where 篩選條件
方式二:truncate
語法 truncate table 表名; //刪除表的全部數據
注意:
1.假如刪除表中有自增長列,如果用delete刪除後,再插入數據,自增長列的值從斷點開始,而truncate刪除後,在插入數據,自增長列的值從1開始
2.truncate刪除沒有返回值,delete刪除有返回值(返回受影響行數)
3.truncate刪除不能回滾,delete刪除可以回滾
4.delete 可以加where條件,truncate不能加
5.truncate刪除,效率高一點
10.庫的管理
一.庫的創建
語法:
create database 【if not exists】庫名;
二.庫的修改
更改字符集
語法:
ALTER DATABASE 庫名 CHARACTER SET 新字符集
三.庫的刪除
語法:
DROP DATABASE 【IF EXISTS】 庫名
21.表的管理
一.表的創建
create table 【IF NOT EXISTS】表名(
列名 列的類型【(長度) 約束】,
列名 列的類型【(長度) 約束】,
列名 列的類型【(長度) 約束】,
....
列名 列的類型【(長度) 約束】,
)
二.表的修改
核心語法:
alter table 表名 add|drop|modify|change column 列名 【列類型 約束】
1.修改列名
ALTER TABLE 表名 CHANGE COLUMN 舊列名 新列名 類型;
2.修改列的類型或約束
ALTER TABLE 表名 MODIFY COLUMN 列名 新類型 約束條件;
3.添加列
ALTER TABLE 表名 ADD COLUMN 列名 類型;
4.刪除列
ALTER TABLE 表名 DROP COLUMN 列名;
5.修改表名
ALTER TABLE 表名 RENAME TO 新表名;
三.表的刪除
語法:
DROP TABLE 【IF EXISTS】 表名;
四.表的複製
1.僅僅複製表的結構
CREATE TABLE 新表名 LIKE 舊錶名;
2.複製表的結構+數據
CREATE TABLE 新表名
SELECT * FROM 舊錶名
3.複製表的結構+部分數據
CREATE TABLE 新表名
SELECT 複製的字段
FROM 舊錶名
WHERE 篩選條件
工作中通用的寫法:
DROP DATABASE IF EXISTS 舊庫名;
CREATE DATABASE 新庫名;
DROP TABLE IF EXISTS 舊錶名;
CREATE TABLE 表名();
22.數據類型
一.整型
分類:
tinyint、smallint、mediumint、int/integer、bigint
字節: 1 2 3 4 8
特點:
1.如果不設置無符號還是有符號,默認是有符號,如果想設置無符號,需要添加unsigned關鍵字
2.如果插入的數值超出了整型的範圍,會報 out of range 異常,並且插入臨界值
3.如果不設置長度,會有默認長度
長度代表了顯示的最大寬度,如果不夠會用0在左邊填充,但必須搭配zerofill使用,展示寬度和該類型數字能表示的取值範圍是沒有關係的,取值範圍直接由類型決定
二.浮點型
分類:
1.浮點型
float(M,D)
double(M,D)
2.定點型
dec(M,D)
decimal(M,D)
特點:
1.M:整數部位+小數部位
D:小數部位
如果超過範圍,則插入臨界值
2.M和D都可以省略
如果是decimal,則M默認爲10,D默認爲0
如果是float和double,則會根據插入的數值的精度來決定精度
3.定點型的精度較高,如果要求插入數值的精度較高如貨幣運算則考慮使用,一般用浮點型
三.字符型
較短的文本:
char(M)
varchar(M)
其他:
binary和varbinary用於保存較短的二進制
enum用於保存枚舉
set用於保存集合
較長的文本:
test
blod(較大的二進制)
特點:
M的意思 特點 空間的耗費 效率
char(M) 最大的字符數,可以省略 固定長度字符 比較耗費 高
varchar(M) 最大字符數,不可以省略 可變長度字符 比較節省 低
四.日期型
分類:
date 只保存日期
time 只保存時間
year 只保存年
datetime 保存日期+時間
timestamp保存日期+時間
特點:
字節 範圍 時區等影響
datetime 8 1000-9999 不受
timestamp 4 1970-2038 受
選取類型原則:
所選類型越簡單越好,能保存數值的類型越小越好
23.常見約束
含義:一種限制,用於限制表中的數據,爲了保證表中的數據的準確和可靠性
分類:六大約束
NOT NULL:非空,用於保證該字段值不能爲空
DEFAULT:默認,用於保證該字段有默認值
PRIMARY KEY:主鍵,用於保證該字段的值具有唯一性,並且非空
UNIQUE:唯一,用於保證該字段的值具有唯一性,可以爲空
CHECK:檢查約束【mysql不支持】
FOREIGE KEY:外鍵,用於限制兩個表的關係,用於保證該字段的值必須來自主表的關聯列的值
在從表添加外鍵約束,用於引用主表中某列的值號
添加約束的時機:
1.創建表時
添加列級約束:
語法:
直接在字段名和類型後面追加 約束類型即可
只支持:默認、非空、主鍵、唯一,可以添加多個列級約束
添加表級約束:
語法:在各個字段最下面
【constraint 約束名】 約束類型(字段名)
外鍵:FOREIGN KEY(外鍵字段) REFERENCES 主鍵表(主鍵字段)
2.修改表時
添加列級約束:
語法:
ALTER TABLE 表名 MODIFY COLUMN 列名 字段類型 新約束條件;
添加表級約束:
語法:
ALTER TABLE 表名 ADD【constraint 約束名】 約束類型(字段名) 【外鍵引用】
外鍵:ALTER TABLE 外鍵表名 ADD 【constraint 約束名】 FOREIGN KEY(外鍵字段) REFERENCES 主鍵表(主鍵字段)
刪除約束:
語法:
使用*表的修改語法*,將類型空着就會有刪除的效果
刪除主鍵:
ALTER TABLE 表名 DROP PRIMARY KEY;
刪除外鍵:
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名
刪除唯一:
ALTER TABLE 表名 DROP INDEX 唯一鍵名
主鍵和唯一的對比:
保證唯一性 允許非空 一個表可以有多少個 是否允許組合
主鍵 √ × 至多一個 √,但不推薦
唯一 √ √ 可以有多個 √,但不推薦
外鍵:
1.要求在從表設置外鍵關係
2.從表的外鍵列的類型和主表的關聯列的類型要求一致或兼容,名稱無要求
3.主表的關聯列必須是一個key(一般是主鍵或唯一)
4.插入數據時,先插入主表,再插入從表
刪除數據時,先刪除從表,再刪除主表
列級約束與表級約束的區別:
位置 支持的約束類型 是否可以取約束名
列級約束: 列的後面 語法都支持,但外鍵沒有效果 不可以
表級約束: 所有列下面 默認和非空不支持,其他支持 可以(主鍵沒有效果)
24.標識列
又稱自增列
含義:可以不用手動的插入值,系統提供默認的序列值
語法:
創建標識設置標識列:
列名 類型 約束條件 AUTO_INCREMENT
修改表時設置標識列:
ALTER TABLE 表名 MODIFY COLUMN 列名 INT 類型 約束條件 AUTO_INCREMENT;
修改表時刪除標識列:
ALTER TABLE 表名 MODIFY COLUMN 列名 INT 類型 約束條件 ;
特點:
1.標識列要求是一個key,不一定是主鍵
2.一個表至多一個標識列
3.標識列的類型只能是數值型
4.標識列可以通過SET auto_increment_increment=3;設置步長
可以通過手動插入值,設置起始值
一.創建表時設置標識列
25.事務
含義:一個或一組sql語句組成一個執行單元,這個執行單元要麼全部執行,要麼全部不執行
一.事務的創建
隱式的事務:事務沒有明顯的開啓和結束的標記
比如insert、update、delect語句
顯式事務:事務具有明顯的開啓和結束標記
前提:必須設置自動提交功能爲禁用:set autocommit=0
步驟1:開啓事務
set autocommit=0; --針對當前會話有效
start transaction; 可選的
步驟2:編寫事務的sql語句(select insert update delete)
語句1;
語句2
步驟3:結束事務
commit;提交事務
rollback;回滾事務
補充:savepoint 節點名; --設置保存點,放在語句之間
使用:搭配rollback使用
語法:
rollback to 保存點節點名 --回滾到保存點狀態
二.delete和truncate在事務使用時的區別
delete支持回滾,trucate不支持回滾
26.視圖
含義:虛擬表,和普通表一樣使用
特點:1.重用sql語句
2.簡化複雜的sql操作,不必知道它的查詢細節
3.保護數據,提高安全性
一.創建視圖
語法:
creat view 視圖名
AS
查詢語句
二.修改視圖
方式一:
create or replace view 視圖名
as
查詢語句;
方式二:
alter view 視圖名
as
查詢語句;
三.刪除視圖
drop view 視圖名,視圖名,...;
四.查看視圖
方式一:DESC 視圖名;
方式二: SHOW CREATE VIEW 視圖名;
五.更新視圖
視圖的可更新性和視圖中查詢的定義有關係,以下類型的視圖是不能更新的。
1.包含以下關鍵字的sql語句:分組函數、distinct、group by、having、union、或者union all
2.常量視圖
3.select包含子查詢
4.join
5.from一個不能更新的視圖
6.where子句的子查詢引用了from子句的表
如果可以更新,語句與表的更新一樣
視圖與表的區別
創建語法關鍵字 是否實際佔用物理空間 使用
視圖 create view 只是保存了sql邏輯 增刪改查,一般不能增刪改
表 create table 保存了數據 增刪改查
27.變量
這部分的詳細介紹:MySQL變量
系統變量:全局變量,會話變量
自定義變量:用戶變量,自定義變量
一系統變量:
說明:變量由系統提供,不是用戶定義,屬於服務器層面
注意:如果是全局級別,則需要加global,如果是會話級別,則需要加session,如果不寫默認,則默認session
全局變量作用域:服務器每次啓動將爲所有的全局變量賦初值,針對於所有會話(連接)有效,但不能跨重啓
會話變量作用域:僅僅針對於當前會話(連接)有效
使用的語法:
1.查看所有的系統變量
show global|【session】 variables;
2.查詢滿足條件的部分系統變量
show global|【session】variables like '%char%';
3.查看指定的某個系統變量的值
select @@globall|【session】.系統變量名;
4.爲某個系統變量賦值
方式一:
set global|【session】 系統變量名 = 值
方式二:
set @@global|【session】.系統變量名=值
二.自定義變量:
說明:變量是用戶自定義的,不是由系統的
使用步驟:
聲明
賦值
使用(查看、比較、運算等)
1.用戶變量
作用域:針對於當前會話(連接)有效,同會話變量的作用域
應用在任何地方,也就是begin end
賦值符號:=或:=
(1)聲明並初始化
方式一:SET @用戶變量名 = 值
方式二:SET @用戶變量名:= 值
方式三:SELECT @用戶變量名:= 值
(2)賦值(更新用戶變量的值)
方式一:通過SET或SELECT
SET @用戶變量名 = 值
SET @用戶變量名:= 值
SELECT @用戶變量名:= 值
方式二:通過SELECT INTO
SELECT 字段 INTO @變量名
FROM 表;
(3)使用(查看用戶變量的值)
SELECT @變量名
2.局部變量
作用域:僅僅在定義他的begin end中有效
應用在begin end中的第一句話
(1)聲明
DECLARE 變量名 類型;
DECLARE 變量名 類型 DEFAULT 值; (聲明並初始化)
(2)賦值
方式一:通過SET或SELECT
SET 局部變量名 = 值
SET 局部變量名:= 值
SELECT @用戶變量名:= 值
方式二:通過SELECT INTO
SELECT 字段 INTO 局部變量名
FROM 表;
(3)SELECT 局部變量名;
對比用戶變量和局部變量
作用域 定義和使用位置 語法
用戶變量 當前會話 會話中的任何地方 必須加@符號,不用限定類型
局部變量 BEGIN END中 只能在BEGIN END中,且爲第一句話 一般不用加@符號,需要限定類型
28.存儲過程
這部分的詳細介紹:MySQL存儲過程
存儲過程:類似於java中的方法
好處:
1.提高代碼的重用性
2.簡化操作
含義:一組預先編譯號的SQL語句的集合,理解成批處理語句
好處:
1.提高代碼的重用性
2.簡化操作
3.減少了編譯器次數並且減少了和數據庫服務器的連接次數,提高了效率
一.創建語法
CREATE PROCEDURE 存儲過程名(參數列表)
BEGIN
存儲過程體(一組合法的SQL語句)
END
注意:
1.參數列表包含三部分
參數模式 參數名 參數類型
參數模式:
IN:該參數可以作爲輸入,該參數需要調用方傳入值
OUT:該參數可以作爲輸出,也就是該參數可以作爲返回值
INOUT:該參數即可以作爲輸入又可以作爲輸出,也就是該參數既需要傳入值,又可以返回值
2.如果存儲過程體僅僅只有一句話,BEGIN END可以省略
3.存儲過程體中的每條SQL語句的結尾要求必須加分號
存儲過程的結尾可以使用DELIMITER重新設置
語法:
DELIMITER 結束標記
案例:
DELIMITER $
二.調用語法
CALL 存儲過程名(實參列表);
三.刪除存儲過程
語法:DROP procedure 存儲過程名;
四.查看存儲過程的信息
SHOW CREATE PROCEDURE 存儲過程名;
29.函數
含義:一組預先編譯號的SQL語句的集合,理解成批處理語句
函數:類似於java中的方法
好處:
1.提高代碼的重用性
2.簡化操作
3.減少了編譯器次數並且減少了和數據庫服務器的連接次數,提高了效率
函數與存儲過程的區別:
存儲過程:可以有0個返回,也可以有多個返回,適合做批量插入、批量更新
函數:有且僅有1個返回,適合做處理數據後返回一個結果
一.創建語法
CREATE FUNCTION 函數名(參數列表) RETURNS 返回類型
BEGIN
函數體
END
注意:
1.參數列表包含兩部分:參數名、參數類型
函數體:肯定會有return語句,如果沒有會報錯(如果return語句沒有放在函數體2.的最後也不報錯,但不建議)
3.函數體中僅有一句話,則可以省略begin end
4.使用delimiter語句設置結束標記
二.調用函數
SELECT 函數名(參數列表)
三.查看函數
SHOW CREATE FUNCTION 函數名;
四.刪除函數
DROP FUNCTION 函數名;
30.流程控制結構
順序結構:程序從上往下依次執行
分支結構:程序從兩條或多條路徑中選擇一條
循環結構:程序滿足一定條件的基礎上,重複執行一段代碼
31.分支結構
一.if函數 if else 的效果
SELECT IF(10>5,'大','小'); --結果:大
SELECT IF(10<5,'大','小'); --結果:小
二.case結構
1.作爲表達式(應用在任何地方)
使用一:switch case 的效果
case 表達式
when 常量1 then 返回的值1
when 常量2 then 返回的值2
when 常量3 then 返回的值3
......
else 返回的值n
end;
使用二:類似 多重if
case
when 條件1 then 返回的值1
when 條件2 then 返回的值2
.....
else 返回的值n
end;
2.作爲獨立語句(應用在BEGIN END 中)
使用一:switch case 的效果
case 表達式
when 常量1 then 語句1;
when 常量2 then 語句2;
when 常量3 then 語句3;
......
else 語句n;
end case;
使用二:類似 多重if
case
when 條件1 then 語句1;
when 條件2 then 語句2;
.....
else 語句n;
end case;
特點:
1.可以作爲表達式,嵌套在其他語句中使用,可以放在任何地方,BEGIN END中或BEGIN END 的外面,可以作爲獨立的語句去使用,只能放在BEGIN END中
2.如果WHEN中的值滿足或條件成立,則執行對應的THEN後面的語句,並且結束CASE,如果都不滿足,則執行ELSE中的語句或值
3.ELSE可以省略,如果ELSE省略了,並且所有WHEN條件都不滿足,則返回NULL
3.if結構(應用在BEGIN END中)
功能:實現多重分支
語法:
if 條件1 then 語句1;
else 條件2 then 語句2;
...
【else 語句n;】
end if;
32.循環結構
應用範圍:應用在BEGIN END中
分類:while、loop、repeat
循環控制:
iterate 類似於 continue,繼續,結束本次循環,繼續下一次
語法:iterate 循環標籤;
leave 類似於 break,跳出,結束當前所在的循環
語法:leave 循環標籤;
1.while
語法:
【標籤:】while 循環條件 do
循環體;
end while【標籤】;
2.loop
語法:
【標籤:】loop
循環體;
end loop 【標籤】;
可以用來模擬簡單的死循環
3.repeat
語法
【標籤:】repeat
循環體;
until 結束循環條件
end repeat 【標籤】;