數據庫Mysql


數據庫的好處

​ 1.持久化數據到本地
​ 2.可以實現結構化查詢,方便管理

數據庫相關概念

​ 1、DB:數據庫,保存一組有組織的數據的容器
​ 2、DBMS:數據庫管理系統,又稱為數據庫軟件(產品),用於管理DB中的數據
​ 3、SQL:結構化查詢語言,用於和DBMS通信的語言

數據庫存儲數據的特點

​ 1、將數據放到表中,表再放到庫中
​ 2、一個數據庫中可以有多個表,每個表都有一個的名字,用來標識自己。表名具有唯一性。
​ 3、表具有一些特性,這些特性定義了數據在表中如何存儲,類似java中 “類”的設計。
​ 4、表由列組成,我們也稱為字段。所有表都是由一個或多個列組成的,每一列類似java 中的”屬性”
​ 5、表中的數據是按行存儲的,每一行類似於java中的“對象”。

MySQL產品的介紹和安裝

MySQL服務的啟動和停止

​ 方式一:計算機——右擊管理——服務
​ 方式二:通過管理員身份運行
​ net start 服務名(啟動服務)
​ net stop 服務名(停止服務)

MySQL服務的登錄和退出

​ 方式一:通過mysql自帶的客戶端
​ 只限於root用戶

方式二:通過windows自帶的客戶端
登錄:
mysql 【-h主機名 -P端口號 】-u用戶名 -p密碼

退出:
exit或ctrl+C


MySQL的常見命令

1.查看當前所有的數據庫
show databases;
2.打開指定的庫
use 庫名
3.查看當前庫的所有表
show tables;
4.查看其它庫的所有表
show tables from 庫名;
5.創建表
create table 表名(

	列名 列類型,
	列名 列類型,
	。。。
);
6.查看表結構
desc 表名;


7.查看服務器的版本
方式一:登錄到mysql服務端
select version();
方式二:沒有登錄到mysql服務端
mysql --version
或
mysql --V

MySQL的語法規范

​ 1.不區分大小寫,但建議關鍵字大寫,表名、列名小寫
​ 2.每條命令最好用分號結尾
​ 3.每條命令根據需要,可以進行縮進 或換行
​ 4.注釋
​ 單行注釋:#注釋文字
​ 單行注釋:-- 注釋文字
​ 多行注釋:/* 注釋文字 */


SQL的語言分類

​ DQL(Data Query Language):數據查詢語言
​ select
​ DML(Data Manipulate Language):數據操作語言
​ insert 、update、delete
​ DDL(Data Define Languge):數據定義語言
​ create、drop、alter
​ TCL(Transaction Control Language):事務控制語言
​ commit、rollback

SQL的常見命令

show databases; 查看所有的數據庫
use 庫名; 打開指定 的庫
show tables ; 顯示庫中的所有表
show tables from 庫名;顯示指定庫中的所有表
create table 表名(
	字段名 字段類型,	
	字段名 字段類型
); 創建表

desc 表名; 查看指定表的結構
select * from 表名;顯示表中的所有數據

DQL語言的學習

進階1:基礎查詢

​ 語法:
​ SELECT 要查詢的東西
​ 【FROM 表名】;

類似於Java中 :System.out.println(要打印的東西);
特點:
①通過select查詢完的結果 ,是一個虛擬的表格,不是真實存在
② 要查詢的東西 可以是常量值、可以是表達式、可以是字段、可以是函數
#進階1:基礎查詢
/*
語法:
select 查詢列表 from 表名;


類似於:System.out.println(打印東西);

特點:

1、查詢列表可以是:表中的字段、常量值、表達式、函數
2、查詢的結果是一個虛擬的表格
*/

USE myemployees;

#1.查詢表中的單個字段

SELECT last_name FROM employees;

#2.查詢表中的多個字段
SELECT last_name,salary,email FROM employees;

#3.查詢表中的所有字段

#方式一:
SELECT 
    `employee_id`,
    `first_name`,
    `last_name`,
    `phone_number`,
    `last_name`,
    `job_id`,
    `phone_number`,
    `job_id`,
    `salary`,
    `commission_pct`,
    `manager_id`,
    `department_id`,
    `hiredate` 
FROM
    employees ;
#方式二:  
 SELECT * FROM employees;
 
 #4.查詢常量值
 SELECT 100;
 SELECT 'john';
 
 #5.查詢表達式
 SELECT 100%98;
 
 #6.查詢函數
 
 SELECT VERSION();
 
 
 #7.起別名
 /*
 ①便於理解
 ②如果要查詢的字段有重名的情況,使用別名可以區分開來
 
 */
 #方式一:使用as
SELECT 100%98 AS 結果;
SELECT last_name AS 姓,first_name AS 名 FROM employees;

#方式二:使用空格
SELECT last_name 姓,first_name 名 FROM employees;


#案例:查詢salary,顯示結果為 out put
SELECT salary AS "out put" FROM employees;


#8.去重


#案例:查詢員工表中涉及到的所有的部門編號
SELECT DISTINCT department_id FROM employees;


#9.+號的作用

/*

java中的+號:
①運算符,兩個操作數都為數值型
②連接符,只要有一個操作數為字符串

mysql中的+號:
僅僅只有一個功能:運算符

select 100+90; 兩個操作數都為數值型,則做加法運算
select '123'+90;只要其中一方為字符型,試圖將字符型數值轉換成數值型
			如果轉換成功,則繼續做加法運算
select 'john'+90;	如果轉換失敗,則將字符型數值轉換成0

select null+10; 只要其中一方為null,則結果肯定為null

*/

#案例:查詢員工名和姓連接成一個字段,並顯示為 姓名


SELECT CONCAT('a','b','c') AS 結果;

SELECT 
	CONCAT(last_name,first_name) AS 姓名
FROM
	employees;

進階2:條件查詢

​ 條件查詢:根據條件過濾原始表的數據,查詢到想要的數據
​ 語法:
​ select
​ 要查詢的字段|表達式|常量值|函數
​ from
​ 表
​ where
​ 條件 ;

分類:
一、條件表達式
	示例:salary>10000
	條件運算符:
	> < >= <= = != <>

二、邏輯表達式
示例:salary>10000 && salary<20000

邏輯運算符:

	and(&&):兩個條件如果同時成立,結果為true,否則為false
	or(||):兩個條件只要有一個成立,結果為true,否則為false
	not(!):如果條件成立,則not后為false,否則為true

三、模糊查詢
示例:last_name like 'a%'
#進階2:條件查詢
/*

語法:
	select 
		查詢列表
	from
		表名
	where
		篩選條件;

分類:
	一、按條件表達式篩選
	
	簡單條件運算符:> < = != <> >= <=
	
	二、按邏輯表達式篩選
	邏輯運算符:
	作用:用於連接條件表達式
		&& || !
		and or not
		
	&&和and:兩個條件都為true,結果為true,反之為false
	||或or: 只要有一個條件為true,結果為true,反之為false
	!或not: 如果連接的條件本身為false,結果為true,反之為false
	
	三、模糊查詢
		like
		between and
		in
		is null
	
*/
#一、按條件表達式篩選

#案例1:查詢工資>12000的員工信息

SELECT 
	*
FROM
	employees
WHERE
	salary>12000;
	
	
#案例2:查詢部門編號不等於90號的員工名和部門編號
SELECT 
	last_name,
	department_id
FROM
	employees
WHERE
	department_id<>90;


#二、按邏輯表達式篩選

#案例1:查詢工資z在10000到20000之間的員工名、工資以及獎金
SELECT
	last_name,
	salary,
	commission_pct
FROM
	employees
WHERE
	salary>=10000 AND salary<=20000;
#案例2:查詢部門編號不是在90到110之間,或者工資高於15000的員工信息
SELECT
	*
FROM
	employees
WHERE
	NOT(department_id>=90 AND  department_id<=110) OR salary>15000;
#三、模糊查詢
/*
like

	
	
between and
in
is null|is not null

*/
#1.like
/*
特點:
①一般和通配符搭配使用
	通配符:
	% 任意多個字符,包含0個字符
	_ 任意單個字符
*、

#案例1:查詢員工名中包含字符a的員工信息

select 
	*
from
	employees
where
	last_name like '%a%';#abc
#案例2:查詢員工名中第三個字符為e,第五個字符為a的員工名和工資
select
	last_name,
	salary
FROM
	employees
WHERE
	last_name LIKE '__n_l%';



#案例3:查詢員工名中第二個字符為_的員工名

SELECT
	last_name
FROM
	employees
WHERE
	last_name LIKE '_$_%' ESCAPE '$';
#2.between and
/*
①使用between and 可以提高語句的簡潔度
②包含臨界值
③兩個臨界值不要調換順序

*/


#案例1:查詢員工編號在100到120之間的員工信息

SELECT
	*
FROM
	employees
WHERE
	employee_id >= 120 AND employee_id<=100;
#----------------------
SELECT
	*
FROM
	employees
WHERE
	employee_id BETWEEN 120 AND 100;

#3.in
/*
含義:判斷某字段的值是否屬於in列表中的某一項
特點:
	①使用in提高語句簡潔度
	②in列表的值類型必須一致或兼容
	③in列表中不支持通配符
	

*/
#案例:查詢員工的工種編號是 IT_PROG、AD_VP、AD_PRES中的一個員工名和工種編號

SELECT
	last_name,
	job_id
FROM
	employees
WHERE
	job_id = 'IT_PROT' OR job_id = 'AD_VP' OR JOB_ID ='AD_PRES';


#------------------

SELECT
	last_name,
	job_id
FROM
	employees
WHERE
	job_id IN( 'IT_PROT' ,'AD_VP','AD_PRES');

#4、is null
/*
=或<>不能用於判斷null值
is null或is not null 可以判斷null值




*/

#案例1:查詢沒有獎金的員工名和獎金率
SELECT
	last_name,
	commission_pct
FROM
	employees
WHERE
	commission_pct IS NULL;


#案例1:查詢有獎金的員工名和獎金率
SELECT
	last_name,
	commission_pct
FROM
	employees
WHERE
	commission_pct IS NOT NULL;

#----------以下為×
SELECT
	last_name,
	commission_pct
FROM
	employees

WHERE 
	salary IS 12000;
	
	
#安全等於  <=>


#案例1:查詢沒有獎金的員工名和獎金率
SELECT
	last_name,
	commission_pct
FROM
	employees
WHERE
	commission_pct <=>NULL;
	
	
#案例2:查詢工資為12000的員工信息
SELECT
	last_name,
	salary
FROM
	employees

WHERE 
	salary <=> 12000;
	

#is null pk <=>

IS NULL:僅僅可以判斷NULL值,可讀性較高,建議使用
<=>    :既可以判斷NULL值,又可以判斷普通的數值,可讀性較低

進階3:排序查詢

語法:
select
	要查詢的東西
from
	表
where 
	條件

order by 排序的字段|表達式|函數|別名 【asc|desc】

進階4:常見函數

一、單行函數

​ 1、字符函數
​ concat拼接
​ substr截取子串
​ upper轉換成大寫
​ lower轉換成小寫
​ trim去前后指定的空格和字符
​ ltrim去左邊空格
​ rtrim去右邊空格
​ replace替換
​ lpad左填充
​ rpad右填充
​ instr返回子串第一次出現的索引
​ length 獲取字節個數

​ 2、數學函數
​ round 四舍五入
​ rand 隨機數
​ floor向下取整
​ ceil向上取整
​ mod取余
​ truncate截斷
​ 3、日期函數
​ now當前系統日期+時間
​ curdate當前系統日期
​ curtime當前系統時間
​ str_to_date 將字符轉換成日期
​ date_format將日期轉換成字符
​ 4、流程控制函數
​ if 處理雙分支
​ case語句 處理多分支
​ 情況1:處理等值判斷
​ 情況2:處理條件判斷

​ 5、其他函數
​ version版本
​ database當前庫
​ user當前連接用戶

二、分組函數

	sum 求和
	max 最大值
	min 最小值
	avg 平均值
	count 計數

	特點:
	1、以上五個分組函數都忽略null值,除了count(*)
	2、sum和avg一般用於處理數值型
		max、min、count可以處理任何數據類型
    3、都可以搭配distinct使用,用於統計去重后的結果
	4、count的參數可以支持:
		字段、*、常量值,一般放1

	   建議使用 count(*)

進階5:分組查詢

語法:
select 查詢的字段,分組函數
from 表
group by 分組的字段


​ 特點:
​ 1、可以按單個字段分組
​ 2、和分組函數一同查詢的字段最好是分組后的字段
​ 3、分組篩選
​ 針對的表 位置 關鍵字
​ 分組前篩選: 原始表 group by的前面 where
​ 分組后篩選: 分組后的結果集 group by的后面 having

​ 4、可以按多個字段分組,字段之間用逗號隔開
​ 5、可以支持排序
​ 6、having后可以支持別名

進階6:多表連接查詢

笛卡爾乘積:如果連接條件省略或無效則會出現
解決辦法:添加上連接條件

一、傳統模式下的連接 :等值連接——非等值連接

1.等值連接的結果 = 多個表的交集
2.n表連接,至少需要n-1個連接條件
3.多個表不分主次,沒有順序要求
4.一般為表起別名,提高閱讀性和性能

二、sql99語法:通過join關鍵字實現連接

含義:1999年推出的sql語法
支持:
等值連接、非等值連接 (內連接)
外連接
交叉連接

語法:

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 排序的字段或表達式】

好處:語句上,連接條件和篩選條件實現了分離,簡潔明了!


三、自連接

案例:查詢員工名和直接上級的名稱

sql99

SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m ON e.`manager_id`=m.`employee_id`;

sql92

SELECT e.last_name,m.last_name
FROM employees e,employees m 
WHERE e.`manager_id`=m.`employee_id`;

進階7:子查詢

含義:

一條查詢語句中又嵌套了另一條完整的select語句,其中被嵌套的select語句,稱為子查詢或內查詢
在外面的查詢語句,稱為主查詢或外查詢

特點:

1、子查詢都放在小括號內
2、子查詢可以放在from后面、select后面、where后面、having后面,但一般放在條件的右側
3、子查詢優先於主查詢執行,主查詢使用了子查詢的執行結果
4、子查詢根據查詢結果的行數不同分為以下兩類:
① 單行子查詢
	結果集只有一行
	一般搭配單行操作符使用:> < = <> >= <= 
	非法使用子查詢的情況:
	a、子查詢的結果為一組值
	b、子查詢的結果為空
	
② 多行子查詢
	結果集有多行
	一般搭配多行操作符使用:any、all、in、not in
	in: 屬於子查詢結果中的任意一個就行
	any和all往往可以用其他查詢代替

進階8:分頁查詢

應用場景:

實際的web項目中需要根據用戶的需求提交對應的分頁查詢的sql語句

語法:

select 字段|表達式,...
from 表
【where 條件】
【group by 分組字段】
【having 條件】
【order by 排序的字段】
limit 【起始的條目索引,】條目數;

特點:

1.起始條目索引從0開始

2.limit子句放在查詢語句的最后

3.公式:select * from  表 limit (page-1)*sizePerPage,sizePerPage
假如:
每頁顯示條目數sizePerPage
要顯示的頁數 page

進階9:聯合查詢

引入:
union 聯合、合並

語法:

select 字段|常量|表達式|函數 【from 表】 【where 條件】 union 【all】
select 字段|常量|表達式|函數 【from 表】 【where 條件】 union 【all】
select 字段|常量|表達式|函數 【from 表】 【where 條件】 union  【all】
.....
select 字段|常量|表達式|函數 【from 表】 【where 條件】

特點:

1、多條查詢語句的查詢的列數必須是一致的
2、多條查詢語句的查詢的列的類型幾乎相同
3、union代表去重,union all代表不去重

DML語言

插入

語法:
insert into 表名(字段名,...)
values(值1,...);

特點:

1、字段類型和值類型一致或兼容,而且一一對應
2、可以為空的字段,可以不用插入值,或用null填充
3、不可以為空的字段,必須插入值
4、字段個數和值的個數必須一致
5、字段可以省略,但默認所有字段,並且順序和表中的存儲順序一致

修改

修改單表語法:

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 表名

兩種方式的區別【面試題】

#1.truncate不能加where條件,而delete可以加where條件

#2.truncate的效率高一丟丟

#3.truncate 刪除帶自增長的列的表后,如果再插入數據,數據從1開始
#delete 刪除帶自增長列的表后,如果再插入數據,數據從上一次的斷點處開始

#4.truncate刪除不能回滾,delete刪除可以回滾

DDL語句

庫和表的管理

庫的管理:

一、創建庫
create database 庫名
二、刪除庫
drop database 庫名

表的管理:
#1.創建表

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;

常見類型

整型:
	
小數:
	浮點型
	定點型
字符型:
日期型:
Blob類型:

常見約束

NOT NULL
DEFAULT
UNIQUE
CHECK
PRIMARY KEY
FOREIGN KEY

數據庫事務

含義

通過一組邏輯操作單元(一組DML——sql語句),將數據從一種狀態切換到另外一種狀態

特點

(ACID)
原子性:要么都執行,要么都回滾
一致性:保證數據的狀態操作前和操作后保持一致
隔離性:多個事務同時操作相同數據庫的同一個數據時,一個事務的執行不受另外一個事務的干擾
持久性:一個事務一旦提交,則數據將持久化到本地,除非其他事務對其進行修改

相關步驟:

1、開啟事務
2、編寫事務的一組邏輯操作單元(多條sql語句)
3、提交事務或回滾事務

事務的分類:

隱式事務,沒有明顯的開啟和結束事務的標志

比如
insert、update、delete語句本身就是一個事務

顯式事務,具有明顯的開啟和結束事務的標志

	1、開啟事務
	取消自動提交事務的功能
	
	2、編寫事務的一組邏輯操作單元(多條sql語句)
	insert
	update
	delete
	
	3、提交事務或回滾事務

使用到的關鍵字

set autocommit=0;
start transaction;
commit;
rollback;

savepoint  斷點
commit to 斷點
rollback to 斷點

事務的隔離級別:

事務並發問題如何發生?

當多個事務同時操作同一個數據庫的相同數據時

事務的並發問題有哪些?

臟讀:一個事務讀取到了另外一個事務未提交的數據
不可重復讀:同一個事務中,多次讀取到的數據不一致
幻讀:一個事務讀取數據時,另外一個事務進行更新,導致第一個事務讀取到了沒有更新的數據

如何避免事務的並發問題?

通過設置事務的隔離級別
1、READ UNCOMMITTED
2、READ COMMITTED 可以避免臟讀
3、REPEATABLE READ 可以避免臟讀、不可重復讀和一部分幻讀
4、SERIALIZABLE可以避免臟讀、不可重復讀和幻讀

設置隔離級別:

set session|global  transaction isolation level 隔離級別名;

查看隔離級別:

select @@tx_isolation;

視圖

含義:理解成一張虛擬的表

視圖和表的區別:

	使用方式	占用物理空間

視圖	完全相同	不占用,僅僅保存的是sql邏輯

表	完全相同	占用

視圖的好處:

1、sql語句提高重用性,效率高
2、和表實現了分離,提高了安全性

視圖的創建

語法:
CREATE VIEW  視圖名
AS
查詢語句;

視圖的增刪改查

1、查看視圖的數據 ★

SELECT * FROM my_v4;
SELECT * FROM my_v1 WHERE last_name='Partners';

2、插入視圖的數據
INSERT INTO my_v4(last_name,department_id) VALUES('虛竹',90);

3、修改視圖的數據

UPDATE my_v4 SET last_name ='夢姑' WHERE last_name='虛竹';


​ 4、刪除視圖的數據
​ DELETE FROM my_v4;

某些視圖不能更新

包含以下關鍵字的sql語句:分組函數、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;

視圖結構的查看

DESC test_v7;
SHOW CREATE VIEW test_v7;

存儲過程

含義:一組經過預先編譯的sql語句的集合
好處:

1、提高了sql語句的重用性,減少了開發程序員的壓力
2、提高了效率
3、減少了傳輸次數

分類:

1、無返回無參
2、僅僅帶in類型,無返回有參
3、僅僅帶out類型,有返回無參
4、既帶in又帶out,有返回有參
5、帶inout,有返回有參
注意:in、out、inout都可以在一個存儲過程中帶多個

創建存儲過程

語法:

create procedure 存儲過程名(in|out|inout 參數名  參數類型,...)
begin
	存儲過程體

end

類似於方法:

修飾符 返回類型 方法名(參數類型 參數名,...){

	方法體;
}

注意

1、需要設置新的結束標記
delimiter 新的結束標記
示例:
delimiter $

CREATE PROCEDURE 存儲過程名(IN|OUT|INOUT 參數名  參數類型,...)
BEGIN
	sql語句1;
	sql語句2;

END $

2、存儲過程體中可以有多條sql語句,如果僅僅一條sql語句,則可以省略begin end

3、參數前面的符號的意思
in:該參數只能作為輸入 (該參數不能做返回值)
out:該參數只能作為輸出(該參數只能做返回值)
inout:既能做輸入又能做輸出

調用存儲過程

call 存儲過程名(實參列表)

函數

創建函數

學過的函數:LENGTH、SUBSTR、CONCAT等
語法:

CREATE FUNCTION 函數名(參數名 參數類型,...) RETURNS 返回類型
BEGIN
	函數體

END

調用函數

SELECT 函數名(實參列表)

函數和存儲過程的區別

		關鍵字		調用語法	返回值			應用場景
函數		FUNCTION	SELECT 函數()	只能是一個		一般用於查詢結果為一個值並返回時,當有返回值而且僅僅一個
存儲過程	PROCEDURE	CALL 存儲過程()	可以有0個或多個		一般用於更新

流程控制結構

系統變量

一、全局變量

作用域:針對於所有會話(連接)有效,但不能跨重啟

查看所有全局變量
SHOW GLOBAL VARIABLES;
查看滿足條件的部分系統變量
SHOW GLOBAL VARIABLES LIKE '%char%';
查看指定的系統變量的值
SELECT @@global.autocommit;
為某個系統變量賦值
SET @@global.autocommit=0;
SET GLOBAL autocommit=0;

二、會話變量

作用域:針對於當前會話(連接)有效

查看所有會話變量
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 字段名或表達式 INTO 變量
FROM 表;

使用:

select @變量名;

二、局部變量

聲明:

declare 變量名 類型 【default 值】;

賦值:

方式一:一般用於賦簡單的值
SET 變量名=值;
SET 變量名:=值;
SELECT 變量名:=值;


方式二:一般用於賦表 中的字段值
SELECT 字段名或表達式 INTO 變量
FROM 表;

使用:

select 變量名

二者的區別:

		作用域			定義位置		語法

用戶變量 當前會話 會話的任何地方 加@符號,不用指定類型
局部變量 定義它的BEGIN END中 BEGIN END的第一句話 一般不用加@,需要指定類型

分支

一、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后面不需要)

特點:
可以用在任何位置

三、if elseif語句

語法:

if 情況1 then 語句1;
elseif 情況2 then 語句2;
...
else 語句n;
end if;

特點:
只能用在begin end中!!!!!!!!!!!!!!!

三者比較:
應用場合
if函數 簡單雙分支
case結構 等值判斷 的多分支
if結構 區間判斷 的多分支

循環

語法:

【標簽:】WHILE 循環條件  DO
	循環體
END WHILE 【標簽】;

特點:

只能放在BEGIN END里面

如果要搭配leave跳轉語句,需要使用標簽,否則可以不用標簽

leave類似於java中的break語句,跳出所在循環!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM