1. 程式人生 > 資料庫 >MySQL完整筆記

MySQL完整筆記

注:本篇大部分內容都是尚矽谷mysql課程的筆記。如果需要課程以及原始碼,請至官網下載:
下載地址

資料庫

介紹

1.概念

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

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

​ 5、表中的資料是按行儲存的,每一行類似於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):資料定義語言

​ create、drop、alter
​ 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語句,跳出所在迴圈!!!