Mysql基础运用(视图,变量,存储,流程控制)
前要:結(jié)尾彩蛋
目錄
一.視圖
1.視圖概述
2.創(chuàng)建視圖
1)語(yǔ)法格式
2)視圖示例
3.修改視圖
1)語(yǔ)法格式
4.查看視圖
5.刪除視圖
二.變量
1.變量分類
1)局部變量
2)用戶變量
3)會(huì)話變量
4)全局變量
2.使用系統(tǒng)變量
1)查看變量
2)變量賦值
3.使用用戶變量
4.使用局部變量
三.存儲(chǔ)過程
1.存儲(chǔ)過程的概述
2.使用存儲(chǔ)過程
1)創(chuàng)建存儲(chǔ)過程
2)調(diào)用存儲(chǔ)過程
3.查看存儲(chǔ)過程
4.刪除存儲(chǔ)過程
四.流程控制結(jié)構(gòu)
1.分支結(jié)構(gòu)
1)if語(yǔ)句
2)case語(yǔ)句
2.循環(huán)結(jié)構(gòu)
1)while循環(huán)
2)loop循環(huán)
3)repeat循環(huán)
一.視圖
1.視圖概述
視圖是由數(shù)據(jù)庫(kù)中的一個(gè)表或多個(gè)表導(dǎo)出的虛擬表,是一種虛擬存在的表,方便用戶對(duì)數(shù)據(jù)的操作。
視圖是一個(gè)虛擬表,是從數(shù)據(jù)庫(kù)中一個(gè)或多個(gè)表中導(dǎo)出來的表,其內(nèi)容由查詢定義。
同真實(shí)表一樣,視圖包含一系列帶有名稱的列和行數(shù)據(jù)
數(shù)據(jù)庫(kù)中只存放了視圖的定義,而并沒有存放視圖中的數(shù)據(jù)。這些數(shù)據(jù)存放在原來的表中。
使用視圖查詢數(shù)據(jù)時(shí),數(shù)據(jù)庫(kù)系統(tǒng)會(huì)從原來的表中取出對(duì)應(yīng)的數(shù)據(jù)。
一旦表中的數(shù)據(jù)發(fā)生改變,顯示在視圖中的數(shù)據(jù)也會(huì)發(fā)生改變。
使用視圖的原因
安全原因,視圖可以隱藏一些數(shù)據(jù),例如,員工信息表,可以用視圖只顯示姓名、工齡、地址,而不顯示社會(huì)保險(xiǎn)號(hào)和工資數(shù)等
另一個(gè)原因是可使復(fù)雜的查詢易于理解和使用。
2.創(chuàng)建視圖
1)語(yǔ)法格式
CREATE [OR REPLACE] [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}] VIEW 視圖名[(屬性清單)] AS SELECT語(yǔ)句 [WITH [CASCADED|LOCAL] CHECK OPTION];REPLACE:替換現(xiàn)有視圖
ALGORITHM:可選項(xiàng),表示視圖選擇的算法。
屬性清單:可選項(xiàng),指定視圖中各個(gè)屬性的名詞,默認(rèn)情況下與SELECT語(yǔ)句中的查詢的屬性相同。
SELECT語(yǔ)句:表示一個(gè)完整的查詢語(yǔ)句,將查詢記錄導(dǎo)入視圖中。
WITH CHECK OPTION:可選項(xiàng),表示更新視圖時(shí)要保證在該視圖的權(quán)限范圍之內(nèi)。
2)視圖示例
mysql> create view emp_sal_view-> as-> select name, date, basic+bonus as total-> from employees as e-> inner join salary as s-> on e.employee_id=s.employee_id; Query OK, 0 rows affected (0.00 sec) ? mysql> select * from emp_sal_view where year(date)=2020 and month(date)=12;創(chuàng)建包含員工名、email和部門名的視圖
mysql> use nsd2021; mysql> create view emp_view-> as-> select name, email, dept_name-> from employees as e-> inner join departments as d-> on e.dept_id=d.dept_id; Query OK, 0 rows affected (0.01 sec) ? # 查詢視圖中數(shù)據(jù) mysql> select * from emp_view; mysql> select * from emp_view where dept_name='運(yùn)維部'; +-----------+--------------------+-----------+ | name | email | dept_name | +-----------+--------------------+-----------+ | 廖娜 | liaona@tarena.com | 運(yùn)維部 | | 竇紅梅 | douhongmei@tedu.cn | 運(yùn)維部 | | 聶想 | niexiang@tedu.cn | 運(yùn)維部 | | 陳陽(yáng) | chenyang@tedu.cn | 運(yùn)維部 | | 戴璐 | dailu@tedu.cn | 運(yùn)維部 | | 陳斌 | chenbin@tarena.com | 運(yùn)維部 | +-----------+--------------------+-----------+ 6 rows in set (0.00 sec)3.修改視圖
1)語(yǔ)法格式
方式一:
mysql> alter view emp_sal_view-> as-> select name, date, basic, bonus, basic+bonus as total-> from employees as e-> inner join salary as s-> on e.employee_id=s.employee_id; Query OK, 0 rows affected (0.01 sec) ? mysql> select * from emp_sal_view where year(date)=2020 and month(date)=12;與創(chuàng)建視圖完全一樣
CREATE [OR REPLACE] [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}] VIEW 視圖名[(屬性清單)] AS SELECT語(yǔ)句 [WITH [CASCADED|LOCAL] CHECK OPTION];示例:
mysql> create or replace view emp_view-> as-> select name, email, d.dept_id, dept_name-> from employees as e-> inner join departments as d-> on e.dept_id=d.dept_id;mysql> select * from emp_view;方式二
ALTER VIEW 視圖名 AS 查詢語(yǔ)句4.查看視圖
?語(yǔ)法:
SHOW TABLESDESC 視圖5.刪除視圖
語(yǔ)法
DROP VIEW 視圖1, 視圖2, ...?示例:
mysql> drop view emp_view, emp_sal_view; Query OK, 0 rows affected (0.00 sec)二.變量
1.變量分類
?mysql變量可分為兩大類:
????????系統(tǒng)變量:由系統(tǒng)提供,不是由用戶定義的。包括全局變量、會(huì)話變量
????????用戶自定義變量:用?戶定義的變量。包括用戶變量、局部變量
1)局部變量
只能用在begin/end語(yǔ)句塊中,比如存儲(chǔ)過程中的begin/end語(yǔ)句塊。
2)用戶變量
用戶變量不用提前聲明,在用的時(shí)候直接用“@變量名”使用就可以了。
3)會(huì)話變量
服務(wù)器為每個(gè)連接的客戶端維護(hù)一系列會(huì)話變量
其作用域僅限于當(dāng)前連接,即每個(gè)連接中的會(huì)話變量是獨(dú)立的
4)全局變量
影響服務(wù)器整體操作,作用于所有會(huì)話
當(dāng)服務(wù)啟動(dòng)時(shí),它將所有全局變量初始化為默認(rèn)值
更改全局變量,必須具有super權(quán)限
其作用域?yàn)閟erver的整個(gè)生命周期,服務(wù)重啟消失
2.使用系統(tǒng)變量
1)查看變量
查看所有系統(tǒng)變量
mysql> show global variables; # 查看所有全局變量 mysql> show session variables; # 查看當(dāng)前會(huì)話變量查看滿足條件的部分變量
mysql> show global variables like '%char%'; # 不指定global的話,默認(rèn)為會(huì)話變量查看某個(gè)系統(tǒng)變量
# 變量結(jié)構(gòu)為@@變量名、@@global.變量名、@@session.變量名 mysql> select @@tx_isolation; # 默認(rèn)為會(huì)話變量 +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ 1 row in set (0.00 sec)mysql> select @@global.character_set_system; +-------------------------------+ | @@global.character_set_system | +-------------------------------+ | utf8 | +-------------------------------+ 1 row in set (0.00 sec)mysql> select @@session.tx_isolation; +------------------------+ | @@session.tx_isolation | +------------------------+ | REPEATABLE-READ | +------------------------+ 1 row in set (0.00 sec)2)變量賦值
為系統(tǒng)變量賦值
set global|session 系統(tǒng)變量名=值 或 set @@global|session.系統(tǒng)變量名=值示例:
mysql> set @@global.autocommit=0;Query OK, 0 rows affected (0.00 sec)mysql> select @@global.autocommit;+---------------------+| @@global.autocommit |+---------------------+| 0 |+---------------------+1 row in set (0.00 sec)3.使用用戶變量
作用域
????????僅對(duì)當(dāng)前會(huì)話有效,同于會(huì)話變量作用域
使用步驟
????????聲明并初始化
SET @用戶變量=值 或 SET @用戶變量:=值 或 SELECT @用戶變量:=值賦值
SET @用戶變量=值 或 SET @用戶變量:=值 或 SELECT @用戶變量:=值 或 SELECT 字段 INTO @用戶變量 FROM 表使用
SELECT @變量示例:
mysql> set @user='tom'; Query OK, 0 rows affected (0.00 sec)mysql> select count(*) from employees into @count; Query OK, 1 row affected (0.00 sec)mysql> select @user; +-------+ | @user | +-------+ | tom | +-------+ 1 row in set (0.00 sec)mysql> select @count; +--------+ | @count | +--------+ | 133 | +--------+ 1 row in set (0.00 sec)4.使用局部變量
作用域
????????僅在定義它的BEGIN/END中有效
使用步驟
????????聲明
DECLARE 變量 類型 DECLARE 變量 類型 DEFAULT 值賦值
SET 局部變量=值 或 SET 局部變量:=值 或 SELECT 局部變量:=值 或 SELECT 字段 INTO 局部變量 FROM 表使用
SELECT 局部變量三.存儲(chǔ)過程
1.存儲(chǔ)過程的概述
存儲(chǔ)過程是可編程的函數(shù),在數(shù)據(jù)庫(kù)中創(chuàng)建并保存,可以由一組SQL語(yǔ)句和控制結(jié)構(gòu)組成。
提高了代碼的重用性
減少了編譯次數(shù)并減少了和數(shù)據(jù)庫(kù)的連接次數(shù),提高了效率
2.使用存儲(chǔ)過程
1)創(chuàng)建存儲(chǔ)過程
語(yǔ)法:
CREATE PROCEDURE 存儲(chǔ)過程名(參數(shù)列表) BEGIN一組合法的sql語(yǔ)句; END?存儲(chǔ)過程前后最好使用DELIMITER //
參數(shù)列表包含三部分:
參數(shù)模式
????????IN:需要調(diào)用者傳值,與Python函數(shù)的參數(shù)作用類似
????????OUT:該參數(shù)可以作為輸入。與Python函數(shù)的返回值類似
????????INOUT:既可以作為輸入又可以作為輸出
參數(shù)名
參數(shù)類型
分隔符
MySQL默認(rèn)以";"為分隔符,如果沒有聲明分割符,則編譯器會(huì)把存儲(chǔ)過程當(dāng)成SQL語(yǔ)句進(jìn)行處理,因此編譯過程會(huì)報(bào)錯(cuò)
所以要事先用“DELIMITER //”聲明當(dāng)前段分隔符,讓編譯器把兩個(gè)"//"之間的內(nèi)容當(dāng)做存儲(chǔ)過程的代碼,不會(huì)執(zhí)行這些代碼
通過“DELIMITER ;”把分隔符還原。
2)調(diào)用存儲(chǔ)過程
語(yǔ)法
CALL 存儲(chǔ)過程(實(shí)參列表)存儲(chǔ)過程示例
空參列表
mysql> drop database if exists mydb; mysql> create database if not exists mydb default charset utf8mb4; mysql> use mydb; mysql> create table departments like nsd2021.departments;mysql> create procedure dep_pro()-> begin-> insert into departments values-> (1, '人事部'), (2, '財(cái)務(wù)部');-> end // Query OK, 0 rows affected (0.00 sec)mysql> call dep_pro() // Query OK, 2 rows affected (0.00 sec)mysql> select * from departments // +---------+-----------+ | dept_id | dept_name | +---------+-----------+ | 1 | 人事部 | | 2 | 財(cái)務(wù)部 | +---------+-----------+ 2 rows in set (0.00 sec)mysql> delimiter ; mysql> select * from departments;使用IN參數(shù)
mysql> use nsd2021;mysql> delimiter // mysql> create procedure empcount_pro(IN dept_no int)-> begin-> select dept_id, count(*) from employees-> where dept_id=dept_no-> group by dept_id;-> end // Query OK, 0 rows affected (0.00 sec)mysql> call empcount_pro(1)// +---------+----------+ | dept_id | count(*) | +---------+----------+ | 1 | 8 | +---------+----------+ 1 row in set (0.00 sec)mysql> delimiter ;使用OUT參數(shù)
mysql> use nsd2021; mysql> delimiter //mysql> create procedure empemail_pro(IN emp_name varchar(10), OUT mail varchar(25))-> begin-> select email into mail-> from employees-> where name=emp_name;-> end// Query OK, 0 rows affected (0.00 sec)mysql> call empemail_pro('劉倩', @m)// Query OK, 1 row affected (0.00 sec)mysql> select @m// +--------------------+ | @m | +--------------------+ | liuqian@tarena.com | +--------------------+ 1 row in set (0.00 sec)mysql> delimiter ;使用INOUT參數(shù)
mysql> delimiter // mysql> create procedure myadd(INOUT i int)-> begin-> set i=i+100;-> end // Query OK, 0 rows affected (0.00 sec)mysql> delimiter ; mysql> set @n=8; Query OK, 0 rows affected (0.00 sec)mysql> call myadd(@n); Query OK, 0 rows affected (0.00 sec)mysql> select @n; +------+ | @n | +------+ | 108 | +------+ 1 row in set (0.00 sec)3.查看存儲(chǔ)過程
mysql> select name from mysql.proc where db='nsd2021'; +--------------+ | name | +--------------+ | empcount_pro | | empemail_pro | | myadd | +--------------+ 3 rows in set (0.00 sec)mysql> show create procedure empemail_pro \G4.刪除存儲(chǔ)過程
mysql> drop procedure myadd; Query OK, 0 rows affected (0.00 sec)四.流程控制結(jié)構(gòu)
順序結(jié)構(gòu):自上向下執(zhí)行
分支結(jié)構(gòu):從多條路徑中選擇一條路徑執(zhí)行
循環(huán)結(jié)構(gòu):滿足某種條件,反復(fù)執(zhí)行一段代碼
1.分支結(jié)構(gòu)
1)if語(yǔ)句
語(yǔ)法:
IF 條件 THEN語(yǔ)句; END IF;IF 條件 THEN語(yǔ)句1; ELSE語(yǔ)句2; END IF;IF 條件1 THEN語(yǔ)句1; ELSEIF 條件2 THEN語(yǔ)句2; ELSE語(yǔ)句3; END IF;示例:?
mysql> use nsd2021; mysql> delimiter //mysql> create procedure deptype_pro(IN no int, OUT dept_type varchar(5))-> begin-> declare name varchar(5);-> select dept_name into name from departments-> where dept_id=no;-> if name='運(yùn)維部' then-> set dept_type='技術(shù)部';-> elseif name='開發(fā)部' then-> set dept_type='技術(shù)部';-> elseif name='測(cè)試部' then-> set dept_type='技術(shù)部';-> else-> set dept_type='非技術(shù)部';-> end if;-> end// Query OK, 0 rows affected (0.00 sec)mysql> call deptype_pro(1, @t)// Query OK, 1 row affected (0.00 sec)mysql> select @t// +--------------+ | @t | +--------------+ | 非技術(shù)部 | +--------------+ 1 row in set (0.00 sec)mysql> call deptype_pro(3, @t1)// Query OK, 1 row affected (0.00 sec)mysql> select @t1// +-----------+ | @t1 | +-----------+ | 技術(shù)部 | +-----------+ 1 row in set (0.00 sec)mysql> delimiter ;2)case語(yǔ)句
語(yǔ)法:
CASE 變量|表達(dá)式|字段 WHEN 判斷的值1 THEN 返回值1; WHEN 判斷的值2 THEN 返回值2; ... ... ELSE 返回值n; END CASE;示例
mysql> delimiter //mysql> create procedure deptype_pro2(IN no int, OUT dept_type varchar(5))-> begin-> declare name varchar(5);-> select dept_name into name from departments-> where dept_id=no;-> case name-> when '運(yùn)維部' then set dept_type='技術(shù)部';-> when '開發(fā)部' then set dept_type='技術(shù)部';-> when '測(cè)試部' then set dept_type='技術(shù)部';-> else set dept_type='非技術(shù)部';-> end case;-> end//mysql> call deptype_pro2(1, @tt)// Query OK, 1 row affected (0.00 sec)mysql> select @tt// +--------------+ | @tt | +--------------+ | 非技術(shù)部 | +--------------+ 1 row in set (0.00 sec)mysql> call deptype_pro2(3, @tt2)// Query OK, 1 row affected (0.00 sec)mysql> select @tt2// +-----------+ | @tt2 | +-----------+ | 技術(shù)部 | +-----------+ 1 row in set (0.00 sec)mysql> delimiter ;2.循環(huán)結(jié)構(gòu)
1)while循環(huán)
可能一次不執(zhí)行
語(yǔ)法:
WHILE 循環(huán)條件 DO循環(huán)體; END WHILE [標(biāo)簽];示例:
mysql> use nsd2021; mysql> delimiter //mysql> create procedure while_pro(IN i int)-> begin-> declare j int default 1;-> while j<i do-> insert into departments(dept_name) values('hr');-> set j=j+1;-> end while;-> end // Query OK, 0 rows affected (0.00 sec)mysql> call while_pro(3)// Query OK, 1 row affected (0.00 sec)mysql> delimiter ;使用LEAVE結(jié)束循環(huán)。此處LEAVE相當(dāng)于其他語(yǔ)言的break
mysql> delimiter //mysql> create procedure while_pro2(IN i int)-> begin-> declare j int default 1;-> a:while j<i do-> insert into departments(dept_name) values('hr');-> if j>=2 then-> leave a;-> end if;-> set j=j+1;-> end while a;-> end // Query OK, 0 rows affected (0.00 sec)mysql> call while_pro2(10)// Query OK, 1 row affected (0.00 sec)mysql> delimiter ;使用ITERATE跳過本次循環(huán)。此處的ITERATE相當(dāng)于其他整語(yǔ)言的continue
mysql> delimiter //mysql> create procedure while_pro3(IN i int)-> begin-> declare j int default 0;-> a:while j<i do-> set j=j+1;-> if mod(j, 2)=0 then-> iterate a;-> end if;-> insert into departments(dept_name) values(concat('hr', j));-> end while a;-> end // Query OK, 0 rows affected (0.00 sec)mysql> call while_pro3(10)// Query OK, 1 row affected (0.00 sec)mysql> delimiter ;2)loop循環(huán)
沒有條件的死循環(huán)
語(yǔ)法:
LOOP循環(huán)體; END LOOP [標(biāo)簽]示例:
mysql> delimiter //mysql> create procedure loop_pro()-> begin-> declare i int default 0;-> a:loop-> set i=i+1;-> if i>5 then leave a;-> end if;-> insert into departments(dept_name) values(concat('hr1', i));-> end loop a;-> end // Query OK, 0 rows affected (0.00 sec)mysql> call loop_pro()// Query OK, 1 row affected (0.00 sec)mysql> delimiter ;3)repeat循環(huán)
至少循環(huán)一次
語(yǔ)法:
REPEAT循環(huán)體; UNTIL 循環(huán)結(jié)束條件 END REPEAT [標(biāo)簽]示例:
mysql> delimiter //mysql> create procedure repeat_pro(IN i int)-> begin-> declare j int default 1;-> a:repeat-> set j=j+1;-> insert into departments(dept_name) values('sales');-> until j>i-> end repeat a;-> end // Query OK, 0 rows affected (0.00 sec)mysql> call repeat_pro(1)// Query OK, 1 row affected (0.00 sec)mysql> delimiter ;附:通過python3的pymysql模塊操作數(shù)據(jù)庫(kù)
import pymysqlconn = pymysql.connect(host='192.168.1.11',user='root',password='NSD2021@tedu.cn',db='mydb',charset='utf8mb4' )cur = conn.cursor()insert1 = 'insert into departments(dept_name) values(%s)'for dep in ('da', 'db', 'dc', 'dd'):cur.execute(insert1, (dep,))conn.commit()cur.close() conn.close() 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Mysql基础运用(视图,变量,存储,流程控制)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop的搭建
- 下一篇: Mysql索引,用户及授权(root密码