日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql基础运用(视图,变量,存储,流程控制)

發布時間:2025/3/21 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql基础运用(视图,变量,存储,流程控制) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前要:結尾彩蛋

目錄

一.視圖

1.視圖概述

2.創建視圖

1)語法格式

2)視圖示例

3.修改視圖

1)語法格式

4.查看視圖

5.刪除視圖

二.變量

1.變量分類

1)局部變量

2)用戶變量

3)會話變量

4)全局變量

2.使用系統變量

1)查看變量

2)變量賦值

3.使用用戶變量

4.使用局部變量

三.存儲過程

1.存儲過程的概述

2.使用存儲過程

1)創建存儲過程

2)調用存儲過程

3.查看存儲過程

4.刪除存儲過程

四.流程控制結構

1.分支結構

1)if語句

2)case語句

2.循環結構

1)while循環

2)loop循環

3)repeat循環


一.視圖

1.視圖概述

視圖是由數據庫中的一個表或多個表導出的虛擬表,是一種虛擬存在的表,方便用戶對數據的操作。

視圖是一個虛擬表,是從數據庫中一個或多個表中導出來的表,其內容由查詢定義。

同真實表一樣,視圖包含一系列帶有名稱的列和行數據

數據庫中只存放了視圖的定義,而并沒有存放視圖中的數據。這些數據存放在原來的表中。

使用視圖查詢數據時,數據庫系統會從原來的表中取出對應的數據。

一旦表中的數據發生改變,顯示在視圖中的數據也會發生改變。

使用視圖的原因

安全原因,視圖可以隱藏一些數據,例如,員工信息表,可以用視圖只顯示姓名、工齡、地址,而不顯示社會保險號和工資數等

另一個原因是可使復雜的查詢易于理解和使用。

2.創建視圖

1)語法格式

CREATE [OR REPLACE] [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}] VIEW 視圖名[(屬性清單)] AS SELECT語句 [WITH [CASCADED|LOCAL] CHECK OPTION];

REPLACE:替換現有視圖

ALGORITHM:可選項,表示視圖選擇的算法。

屬性清單:可選項,指定視圖中各個屬性的名詞,默認情況下與SELECT語句中的查詢的屬性相同。

SELECT語句:表示一個完整的查詢語句,將查詢記錄導入視圖中。

WITH CHECK OPTION:可選項,表示更新視圖時要保證在該視圖的權限范圍之內。

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;

創建包含員工名、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)

? # 查詢視圖中數據 mysql> select * from emp_view; mysql> select * from emp_view where dept_name='運維部'; +-----------+--------------------+-----------+ | name | email | dept_name | +-----------+--------------------+-----------+ | 廖娜 | liaona@tarena.com | 運維部 | | 竇紅梅 | douhongmei@tedu.cn | 運維部 | | 聶想 | niexiang@tedu.cn | 運維部 | | 陳陽 | chenyang@tedu.cn | 運維部 | | 戴璐 | dailu@tedu.cn | 運維部 | | 陳斌 | chenbin@tarena.com | 運維部 | +-----------+--------------------+-----------+ 6 rows in set (0.00 sec)

3.修改視圖

1)語法格式

方式一:

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;

與創建視圖完全一樣

CREATE [OR REPLACE] [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}] VIEW 視圖名[(屬性清單)] AS SELECT語句 [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 查詢語句

4.查看視圖

?語法:

SHOW TABLESDESC 視圖

5.刪除視圖

語法

DROP VIEW 視圖1, 視圖2, ...

?示例:

mysql> drop view emp_view, emp_sal_view; Query OK, 0 rows affected (0.00 sec)

二.變量

1.變量分類

?mysql變量可分為兩大類:

????????系統變量:由系統提供,不是由用戶定義的。包括全局變量、會話變量

????????用戶自定義變量:用?戶定義的變量。包括用戶變量、局部變量

1)局部變量

只能用在begin/end語句塊中,比如存儲過程中的begin/end語句塊。

2)用戶變量

用戶變量不用提前聲明,在用的時候直接用“@變量名”使用就可以了。

3)會話變量

服務器為每個連接的客戶端維護一系列會話變量

其作用域僅限于當前連接,即每個連接中的會話變量是獨立的

4)全局變量

影響服務器整體操作,作用于所有會話

當服務啟動時,它將所有全局變量初始化為默認值

更改全局變量,必須具有super權限

其作用域為server的整個生命周期,服務重啟消失

2.使用系統變量

1)查看變量

查看所有系統變量

mysql> show global variables; # 查看所有全局變量 mysql> show session variables; # 查看當前會話變量

查看滿足條件的部分變量

mysql> show global variables like '%char%'; # 不指定global的話,默認為會話變量

查看某個系統變量

# 變量結構為@@變量名、@@global.變量名、@@session.變量名 mysql> select @@tx_isolation; # 默認為會話變量 +-----------------+ | @@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)變量賦值

為系統變量賦值

set global|session 系統變量名=值 或 set @@global|session.系統變量名=值

示例:

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.使用用戶變量

作用域

????????僅對當前會話有效,同于會話變量作用域

使用步驟

????????聲明并初始化

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 局部變量

三.存儲過程

1.存儲過程的概述

存儲過程是可編程的函數,在數據庫中創建并保存,可以由一組SQL語句和控制結構組成。

提高了代碼的重用性

減少了編譯次數并減少了和數據庫的連接次數,提高了效率

2.使用存儲過程

1)創建存儲過程

語法:

CREATE PROCEDURE 存儲過程名(參數列表) BEGIN一組合法的sql語句; END

?存儲過程前后最好使用DELIMITER //

參數列表包含三部分:

參數模式

????????IN:需要調用者傳值,與Python函數的參數作用類似

????????OUT:該參數可以作為輸入。與Python函數的返回值類似

????????INOUT:既可以作為輸入又可以作為輸出

參數名

參數類型

分隔符

MySQL默認以";"為分隔符,如果沒有聲明分割符,則編譯器會把存儲過程當成SQL語句進行處理,因此編譯過程會報錯

所以要事先用“DELIMITER //”聲明當前段分隔符,讓編譯器把兩個"//"之間的內容當做存儲過程的代碼,不會執行這些代碼

通過“DELIMITER ;”把分隔符還原。

2)調用存儲過程

語法

CALL 存儲過程(實參列表)

存儲過程示例

空參列表

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, '財務部');-> 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 | 財務部 | +---------+-----------+ 2 rows in set (0.00 sec)mysql> delimiter ; mysql> select * from departments;

使用IN參數

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參數

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參數

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.查看存儲過程

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 \G

4.刪除存儲過程

mysql> drop procedure myadd; Query OK, 0 rows affected (0.00 sec)

四.流程控制結構

順序結構:自上向下執行

分支結構:從多條路徑中選擇一條路徑執行

循環結構:滿足某種條件,反復執行一段代碼

1.分支結構

1)if語句

語法:

IF 條件 THEN語句; END IF;IF 條件 THEN語句1; ELSE語句2; END IF;IF 條件1 THEN語句1; ELSEIF 條件2 THEN語句2; ELSE語句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='運維部' then-> set dept_type='技術部';-> elseif name='開發部' then-> set dept_type='技術部';-> elseif name='測試部' then-> set dept_type='技術部';-> else-> set dept_type='非技術部';-> 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 | +--------------+ | 非技術部 | +--------------+ 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 | +-----------+ | 技術部 | +-----------+ 1 row in set (0.00 sec)mysql> delimiter ;

2)case語句

語法:

CASE 變量|表達式|字段 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 '運維部' then set dept_type='技術部';-> when '開發部' then set dept_type='技術部';-> when '測試部' then set dept_type='技術部';-> else set dept_type='非技術部';-> end case;-> end//mysql> call deptype_pro2(1, @tt)// Query OK, 1 row affected (0.00 sec)mysql> select @tt// +--------------+ | @tt | +--------------+ | 非技術部 | +--------------+ 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 | +-----------+ | 技術部 | +-----------+ 1 row in set (0.00 sec)mysql> delimiter ;

2.循環結構

1)while循環

可能一次不執行

語法:

WHILE 循環條件 DO循環體; END WHILE [標簽];

示例:

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結束循環。此處LEAVE相當于其他語言的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跳過本次循環。此處的ITERATE相當于其他整語言的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循環

沒有條件的死循環

語法:

LOOP循環體; END LOOP [標簽]

示例:

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循環

至少循環一次

語法:

REPEAT循環體; UNTIL 循環結束條件 END REPEAT [標簽]

示例:

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模塊操作數據庫

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()

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Mysql基础运用(视图,变量,存储,流程控制)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。