資料函式庫+存盤程序
- 一、MySQL資料庫函式
- 1.1 數學函式
- 1.1.1 abs(x)與rand( )
- 1.1.2 mod(x,y)與power(x,y)
- 1.1.3 round(x)與round(x,y)
- 1.1.4 sqrt(x)與truncate(x,y)
- 1.1.5 ceil(x)與floor(x)
- 1.1.6 greatest(x1,x2)與least(x1,x2)
- 1.2 聚合函式
- 1.2.1 sum( )與count( )
- 1.2.2 min( )、max( )與avg( )
- 1.3 字串函式
- 1.3.1 length(x)與trim( )
- 1.3.2 concat(x,y)
- 1.3.3 upper(x) 與lower(x)
- 1.3.4 left(x,y)與right(x,y)
- 1.3.5 repeat(x,y) 與space(x)
- 1.3.6 replace(x,y,z)與strcmp(x,y)
- 1.3.7 substring(x,y,z) 與reverse(x)
- 1.4 日期時間函式
- 1.4.1 curdate( )、curtime( )與now( )
- 1.4.2 year(x)、month(x)和week(x)
- 1.4.3 hour(x)、minute(x)、second(x)
- 1.4.4 dayofweek(x)、dayofmonth(x)、dayofyear(x)
- 二、MySQL存盤程序
- 2.1 MySQL存盤程序概述
- 2.2 MySQL存盤程序優點
- 2.3 MySQL存盤程序創建
- 2.3.1 不帶引數的創建MySQL存盤程序
- 2.3.2 MySQL帶引數的存盤程序
- 四、總結
- 1. MySQL資料庫函式
- 2. MySQL存盤程序
一、MySQL資料庫函式
- MySQL資料庫函式提供了能夠實作各種功能的方法,使我們在查詢記錄時能夠更高效的輸出
- MySQL內建了很多函式,常用的包括數學函式、聚合函式、字串函式和日期時間函式
1.1 數學函式
- 資料庫記憶體儲的記錄經常要進行一系列的算術操作,所以MySQL支持很多數學函式
- 常用的數學函式如下表
| 數學函式 | 說明 |
|---|---|
| abs(x) | 回傳x的絕對值 |
| rand( ) | 回傳0到1的亂數 |
| mod(x,y) | 回傳x除y以后的余數 |
| power(x,y) | 回傳x的y次方 |
| round(x) | 回傳距離x最近的整數 |
| round(x,y) | 保留x的y位小數四舍五入后的值 |
| sqrt(x) | 回傳x的平方根 |
| truncate(x,y) | 回傳數字x截斷為y位小數的值 |
| ceil(x) | 回傳大于或等于x的最小整數 |
| floor(x) | 回傳小于或等于x的最大整數 |
| greatest(x1,x2) | 回傳集合中最大的值 |
| least(x1,x2) | 回傳集合中最小的值 |
1.1.1 abs(x)與rand( )
【回傳-5514的絕對值】
mysql> select abs(-5514);
+------------+
| abs(-5514) |
+------------+
| 5514 |
+------------+
【回傳0-1的亂數(0<=x<1)】
mysql> select rand();
+--------------------+
| rand() |
+--------------------+
| 0.8426012078696873 |
+--------------------+
【可以搭配運算子使用】
mysql> select rand()*10000000;
+-------------------+
| rand()*10000000 |
+-------------------+
| 5140734.682922005 |
+-------------------+
1.1.2 mod(x,y)與power(x,y)
【回傳7除以4的余數】
mysql> select mod(7,4);
+----------+
| mod(7,4) |
+----------+
| 3 |
+----------+
【回傳2的10次方】
mysql> select power(2,10);
+-------------+
| power(2,10) |
+-------------+
| 1024 |
+-------------+
1.1.3 round(x)與round(x,y)
【回傳距離5514.49最近的整數(四舍五入)】
mysql> select round(5514.49);
+----------------+
| round(5514.49) |
+----------------+
| 5514 |
+----------------+
mysql> select round(5514.5);
+---------------+
| round(5514.5) |
+---------------+
| 5515 |
+---------------+
mysql> select round(5514.500001);
+--------------------+
| round(5514.500001) |
+--------------------+
| 5515 |
+--------------------+
【回傳5.144保留小數點后3位的數(四舍五入)】
mysql> select round(5.144,2);
+----------------+
| round(5.144,2) |
+----------------+
| 5.14 |
+----------------+
mysql> select round(5.145,2);
+----------------+
| round(5.145,2) |
+----------------+
| 5.15 |
+----------------+
mysql> select round(5.1450000001,2);
+-----------------------+
| round(5.1450000001,2) |
+-----------------------+
| 5.15 |
+-----------------------+
1.1.4 sqrt(x)與truncate(x,y)
【回傳平方根】
mysql> select sqrt(9);
+---------+
| sqrt(9) |
+---------+
| 3 |
+---------+
mysql> select sqrt(8);
+--------------------+
| sqrt(8) |
+--------------------+
| 2.8284271247461903 |
+--------------------+
【保留小數點后4位,后面直接截斷(不會四舍五入)】
mysql> select truncate(2.332124,4);
+----------------------+
| truncate(2.332124,4) |
+----------------------+
| 2.3321 |
+----------------------+
mysql> select truncate(2.332199,4);
+----------------------+
| truncate(2.332199,4) |
+----------------------+
| 2.3321 |
+----------------------+
1.1.5 ceil(x)與floor(x)
【回傳大于或等于5.000000001的最小整數】
mysql> select ceil(5.000000001);
+-------------------+
| ceil(5.000000001) |
+-------------------+
| 6 |
+-------------------+
mysql> select ceil(5.000000);
+----------------+
| ceil(5.000000) |
+----------------+
| 5 |
+----------------+
【回傳小于或等于8.9999999的最大整數】
mysql> select floor(8.999999);
+-----------------+
| floor(8.999999) |
+-----------------+
| 8 |
+-----------------+
mysql> select floor(8.00000);
+----------------+
| floor(8.00000) |
+----------------+
| 8 |
+----------------+
1.1.6 greatest(x1,x2)與least(x1,x2)
【回傳結合中最大的值】
mysql> select greatest(5,35,44);
+-------------------+
| greatest(5,35,44) |
+-------------------+
| 44 |
+-------------------+
mysql> select greatest(0.12,-0.32,0.01);
+---------------------------+
| greatest(0.12,-0.32,0.01) |
+---------------------------+
| 0.12 |
+---------------------------+
mysql> select greatest(0.12,0.32,0.01);
+--------------------------+
| greatest(0.12,0.32,0.01) |
+--------------------------+
| 0.32 |
+--------------------------+
【回傳集合中最小的值】
mysql> select least(0.12,0.32,0.01);
+-----------------------+
| least(0.12,0.32,0.01) |
+-----------------------+
| 0.01 |
+-----------------------+
1 row in set (0.00 sec)
mysql> select least(0.12,-0.32,0.01);
+------------------------+
| least(0.12,-0.32,0.01) |
+------------------------+
| -0.32 |
+------------------------+
1 row in set (0.00 sec)
mysql> select least(5,35,44);
+----------------+
| least(5,35,44) |
+----------------+
| 5 |
+----------------+
1.2 聚合函式
- MySQL資料庫函式中專門有一組函式是特意為庫內記錄求和或者對表中的資料進行集中概括而設計的,這些函式被稱作聚合函式
- 常用的聚合函式如下表
| 函式 | 說明 |
|---|---|
| avg( ) | 回傳指定列的平均值 |
| count( ) | 回傳指定列中非NULL值的個數 |
| min( ) | 回傳指定列的最小值 |
| max( ) | 回傳指定列的最大值 |
| sum( ) | 回傳指定列的所有值之和 |
1.2.1 sum( )與count( )
mysql> select * from qz1;
+--------+--------------+---------+--------+--------+--------+
| 編號 | 姓名 | 得分 | 地址 | 特長 | addr |
+--------+--------------+---------+--------+--------+--------+
| 1 | 劉一 | 80.000 | 北京 | 2 | NULL |
| 2 | 王二 | 90.000 | 深圳 | 2 | 南京 |
| 3 | 李四 | 60.000 | 上海 | 4 | NULL |
| 4 | 田五 | 99.000 | 南京 | 5 | 南京 |
| 5 | 教授 | 100.000 | 成都 | 3 | 南京 |
| 6 | 小明 | 10.000 | 鎮江 | 3 | NULL |
| 7 | 劉二 | 60.000 | 北京 | 2 | NULL |
| 8 | 劉二蛋 | 112.000 | 北京 | 3 | 南京 |
| 9 | 劉小天田 | 112.000 | 北京 | 4 | |
+--------+--------------+---------+--------+--------+--------+
【回傳qz1表里得分列的總和】
mysql> select sum(得分) from qz1;
+-------------+
| sum(得分) |
+-------------+
| 723.000 |
+-------------+
【回傳qz1表里得分列的欄位個數】
mysql> select count(得分) from qz1;
+---------------+
| count(得分) |
+---------------+
| 9 |
+---------------+
1.2.2 min( )、max( )與avg( )
mysql> select * from qz1;
+--------+--------------+---------+--------+--------+--------+
| 編號 | 姓名 | 得分 | 地址 | 特長 | addr |
+--------+--------------+---------+--------+--------+--------+
| 1 | 劉一 | 80.000 | 北京 | 2 | NULL |
| 2 | 王二 | 90.000 | 深圳 | 2 | 南京 |
| 3 | 李四 | 60.000 | 上海 | 4 | NULL |
| 4 | 田五 | 99.000 | 南京 | 5 | 南京 |
| 5 | 教授 | 100.000 | 成都 | 3 | 南京 |
| 6 | 小明 | 10.000 | 鎮江 | 3 | NULL |
| 7 | 劉二 | 60.000 | 北京 | 2 | NULL |
| 8 | 劉二蛋 | 112.000 | 北京 | 3 | 南京 |
| 9 | 劉小天田 | 112.000 | 北京 | 4 | |
+--------+--------------+---------+--------+--------+--------+
【回傳qz1表里得分列最小值】
mysql> select min(得分) from qz1;
+-------------+
| min(得分) |
+-------------+
| 10.000 |
+-------------+
【回傳qz1表里得分列最大值】
mysql> select max(得分) from qz1;
+-------------+
| max(得分) |
+-------------+
| 112.000 |
+-------------+
【回傳qz1表里得分列平均值】
mysql> select avg(得分) from qz1;
+-------------+
| avg(得分) |
+-------------+
| 80.3333333 |
+-------------+
1.3 字串函式
- 常用的字串函式如下表
| 函式 | 說明 |
|---|---|
| length(x) | 回傳字串x的長度 |
| trim( ) | 回傳去除指定格式的值 |
| concat(x,y) | 將提供的引數x和y拼接成一個字串 |
| upper(x) | 將字串x的所有字母變成大寫字母 |
| lower(x) | 將字串x的所有字母變成小寫字母 |
| left(x,y) | 回傳字串x的前y個字符 |
| right(x,y) | 回傳字串x的后y個字符 |
| repeat(x,y) | 將字串x重復y次 |
| space(x) | 回傳x個空格 |
| replace(x,y,z) | 將字串z替代字串x中的字串y |
| strcmp(x,y) | 比較x和y 回傳的值可以為-1,0,1 |
| substring(x,y,z) | 獲取從字串x中的第y個位置開始長度為z的字串 |
| reverse(x) | 將字串x反轉 |
1.3.1 length(x)與trim( )
【回傳字串qwer的長度】
mysql> select length('qwer');
+----------------+
| length('qwer') |
+----------------+
| 4 |
+----------------+
【回傳字串qw e r的長度,空格也算一個字符】
mysql> select length('qw e r');
+------------------+
| length('qw e r') |
+------------------+
| 6 |
+------------------+
【去掉格式只輸出字串qz】
mysql> select trim(' qz');
+---------------+
| trim(' qz') |
+---------------+
| qz |
+---------------+
【對比用trim函式的顯示】
mysql> select ' qz';
+-------+
| qz |
+-------+
| qz |
+-------+
1.3.2 concat(x,y)
【將字串qwe和字串rty拼接起來】
mysql> select concat('qwe','rty');
+---------------------+
| concat('qwe','rty') |
+---------------------+
| qwerty |
+---------------------+
mysql> select concat('qwe',' rty');
+----------------------+
| concat('qwe',' rty') |
+----------------------+
| qwe rty |
+----------------------+
【也可結合其他函式一并使用】
mysql> select concat('qwe',trim(' rty'));
+----------------------------+
| concat('qwe',trim(' rty')) |
+----------------------------+
| qwerty |
+----------------------------+
1.3.3 upper(x) 與lower(x)
【將字串qwe轉換為大寫字母】
mysql> select upper('qwe');
+--------------+
| upper('qwe') |
+--------------+
| QWE |
+--------------+
【將字串QwE轉換成小寫字母】
mysql> select lower('QwE');
+--------------+
| lower('QwE') |
+--------------+
| qwe |
+--------------+
1.3.4 left(x,y)與right(x,y)
【回傳字串前5個字母】
mysql> select left('qwertyy',5);
+-------------------+
| left('qwertyy',5) |
+-------------------+
| qwert |
+-------------------+
【回傳字串最后5個字母】
mysql> select right('qwertyy',5);
+--------------------+
| right('qwertyy',5) |
+--------------------+
| ertyy |
+--------------------+
【將字串的前5個字母和最后4個字母拼接起來】
mysql> select concat(left('qwertyy',5),right('qwertyy',4));
+----------------------------------------------+
| concat(left('qwertyy',5),right('qwertyy',4)) |
+----------------------------------------------+
| qwertrtyy |
+----------------------------------------------+
1.3.5 repeat(x,y) 與space(x)
【重復字串3次】
mysql> select repeat('qwe',3);
+-----------------+
| repeat('qwe',3) |
+-----------------+
| qweqweqwe |
+-----------------+
【回傳5個空格,因為顯示無法看出具體幾個空格,所以這里用length函式顯示字串長度】
mysql> select length(space(5));
+------------------+
| length(space(5)) |
+------------------+
| 5 |
+------------------+
1.3.6 replace(x,y,z)與strcmp(x,y)
【用ea替換字符take sqsy中的sq】
mysql> select replace('take sqsy','sq','ea');
+--------------------------------+
| replace('take sqsy','sq','ea') |
+--------------------------------+
| take easy |
+--------------------------------+
【比較15和16,若小于回傳-1,等于回傳0,大于回傳1,只會回傳這3個值,比較的是第一位數字】
mysql> select strcmp(15,16);
+---------------+
| strcmp(15,16) |
+---------------+
| -1 |
+---------------+
mysql> select strcmp(16,16);
+---------------+
| strcmp(16,16) |
+---------------+
| 0 |
+---------------+
mysql> select strcmp(17,16);
+---------------+
| strcmp(17,16) |
+---------------+
| 1 |
+---------------+
mysql> select strcmp(17,7);
+--------------+
| strcmp(17,7) |
+--------------+
| -1 |
+--------------+
1.3.7 substring(x,y,z) 與reverse(x)
【回傳從字串中第2個字符開始的5個字符】
mysql> select substring('take easy',2,5);
+----------------------------+
| substring('take easy',2,5) |
+----------------------------+
| ake e |
+----------------------------+
【將字串進行反轉顯示】
mysql> select reverse('take easy');
+----------------------+
| reverse('take easy') |
+----------------------+
| ysae ekat |
+----------------------+
【回傳字串的前2個字符,然后進行反轉顯示】
mysql> select reverse(left('take easy',2));
+------------------------------+
| reverse(left('take easy',2)) |
+------------------------------+
| at |
+------------------------------+
【先將字串反轉,然后再輸出前2個字符】
mysql> select left(reverse('take easy'),2);
+------------------------------+
| left(reverse('take easy'),2) |
+------------------------------+
| ys |
+------------------------------+
1.4 日期時間函式
- 常用的日期時間函式如下表
| 函式 | 說明 |
|---|---|
| curdate( ) | 回傳當前時間的年月日 |
| curtime( ) | 回傳當前時間的時分秒 |
| now( ) | 回傳當前時間的日期和時間 |
| year(x) | 回傳日期x中的年份值 |
| month(x) | 回傳日期x中的月份值 |
| week(x) | 回傳日期x是年度第幾個星期 |
| hour(x) | 回傳x中的小時值 |
| minute(x) | 回傳x中的分鐘值 |
| second(x) | 回傳x中的秒鐘值 |
| dayofweek(x) | 計算日期x是本周的第幾天 在MySQL資料庫中回傳的1是星期日 |
| dayofmonth(x) | 計算日期x是本月的第幾天 |
| dayofyear(x) | 計算日期x是本年的第幾天 |
1.4.1 curdate( )、curtime( )與now( )
【回傳年月日】
mysql> select curdate();
+------------+
| curdate() |
+------------+
| 2021-04-24 |
+------------+
【回傳當前時間】
mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 22:18:39 |
+-----------+
【回傳當前完整時間】
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2021-04-24 22:19:30 |
+---------------------+
1.4.2 year(x)、month(x)和week(x)
【回傳日期2020-8-10中年份值】
mysql> select year('2020-8-10');
+-------------------+
| year('2020-8-10') |
+-------------------+
| 2020 |
+-------------------+
【回傳日期2020-8-10是年度第幾個月】
mysql> select month('2020-8-10');
+--------------------+
| month('2020-8-10') |
+--------------------+
| 8 |
+--------------------+
【回傳日期2020-8-10是年度第幾個星期】
mysql> select week('2020-8-10');
+-------------------+
| week('2020-8-10') |
+-------------------+
| 32 |
+-------------------+
1.4.3 hour(x)、minute(x)、second(x)
【回傳當前時間的小時】
mysql> select hour(curtime());
+-----------------+
| hour(curtime()) |
+-----------------+
| 22 |
+-----------------+
【回傳當前時間的分鐘】
mysql> select minute(curtime());
+-------------------+
| minute(curtime()) |
+-------------------+
| 26 |
+-------------------+
【回傳當前時間的秒】
mysql> select second(curtime());
+-------------------+
| second(curtime()) |
+-------------------+
| 14 |
+-------------------+
1.4.4 dayofweek(x)、dayofmonth(x)、dayofyear(x)
【計算當前日期是本年的第幾天】
mysql> select dayofyear(curtime());
+----------------------+
| dayofyear(curtime()) |
+----------------------+
| 114 |
+----------------------+
【計算當前日期是本月的第幾天】
mysql> select dayofmonth(curtime());
+-----------------------+
| dayofmonth(curtime()) |
+-----------------------+
| 24 |
+-----------------------+
【計算當前日期是本周的第幾天】
mysql> select dayofweek(curtime());
+----------------------+
| dayofweek(curtime()) |
+----------------------+
| 7 |
+----------------------+
二、MySQL存盤程序
2.1 MySQL存盤程序概述
- 因為實際的資料庫應用中,有些資料庫操作可能會非常復雜,會需要多條SQL陳述句一起去處理才能夠完成,這個時候就可以使用存盤程序去輕松而高效的完成這個需求(有點類似于shell腳本里的函式)
- MySQL資料庫存盤程序是一組為了完成特定功能的SQL陳述句集合,存盤程序這個功能時從5.0版本才開始支持,它可以加快資料庫的處理速度,從而增強資料庫在實際應用中的靈活性
- 存盤程序在使用程序中是將常用或者復雜的作業預先使用SQL陳述句寫好并用一個指定的名稱存盤起來,這個程序經過編譯和優化后存盤在資料庫服務器中,當需要使用該存盤程序時,只需要呼叫它即可
- 當操作資料庫的傳統SQL陳述句在執行時需要先編譯,然后再去執行,這樣跟存盤程序一對比,明顯存盤程序在執行上速度更快,效率更高
- 存盤程序在資料庫中創建并保存,它不僅僅是SQL陳述句的集合,還可以加入一些特殊的控制結構,也可以控制資料的訪問方式
2.2 MySQL存盤程序優點
- 1.執行一次后,會將生成的二進制代碼駐留緩沖區,從而提供執行效率
- 2.SQL陳述句加控制陳述句的集合,靈活性更高
- 3.在服務器端存盤,客戶端呼叫時,降低網路負載
- 4.可多次重復被呼叫,可隨時修改,不影響客戶端呼叫
- 5.可完成所有的資料庫操作,也可控制資料庫的資訊訪問權限
2.3 MySQL存盤程序創建
- 使用create procedure陳述句創建存盤程序(與shell函式差不多,都是代碼的復用)
- 語法:create procedure <程序名> ([程序引數…]]) <程序體>
- [程序引數…]]:格式
- <程序名>:盡量避免與內置的函式或欄位重命
- <程序體>:陳述句
- [in|out|inout]<引數名><型別>
2.3.1 不帶引數的創建MySQL存盤程序
mysql> delimiter $$ 【定義結束符】
mysql> create procedure qq() 【創建存盤程序(程序名)】
-> begin 【開啟存盤程序】
-> create table qz3(id int(8),name char(10),score int(15));
-> insert into qz3 values(1,'lisi',11);
-> select * from qz3; 【程序體】
-> end $$ 【結束存盤程序】
mysql> delimiter ; 【分號前有空格】
mysql> call qq(); 【呼叫存盤程序】
+------+------+-------+
| id | name | score |
+------+------+-------+
| 1 | lisi | 11 |
+------+------+-------+
2.3.2 MySQL帶引數的存盤程序
- 1. 存盤程序的主體部分被稱為程序體
- 2. 以begin開始,以end結束,若只有一條SQL陳述句,則可以省略begin-end
- 3. 以delimiter開始和結束
- 帶引數的存盤程序
- 輸入引數:in 表示呼叫者向程序傳入值(傳入值可以是字面量或變數)
- 輸出引數:out 表示程序向呼叫者傳出值(可以回傳多個值)(傳出值只能是變數)
- 輸入/輸出引數:inout 即表示呼叫者向程序傳入值,又表示程序向呼叫者傳出值(只能是變數)
mysql> delimiter @@
mysql> create procedure qz4(in in_name varchar(14)) 【行參】
-> begin
-> select q_id,q_name,q_level from qz1 where q_name=in_name;
-> end @@
mysql> delimiter ;
mysql> call qz4('aaa');
+------+--------+---------+
| q_id | q_name | q_level |
+------+--------+---------+
| 1 | aaa | 15 |
+------+--------+---------+
mysql> call qz4('bbb'); 【實參】
+------+--------+---------+
| q_id | q_name | q_level |
+------+--------+---------+
| 2 | bbb | 25 |
+------+--------+---------+
mysql> show procedure status\G; 【查看存盤程序】
mysql> show create procedure qq\G; 【查看qq存盤程序】
mysql> alter procedure qz4 modifies sql data sql security invoker; 【修改存盤程序】
【modifies sql data:表明子程式包含寫資料的陳述句】
【security:安全等級】
【invoker:定義為invoker時表示只要執行者有執行權限,就可以成功執行】
mysql> drop procedure if exists qz4; 【洗掉存盤程序】
Query OK, 0 rows affected (0.06 sec)
mysql> show create procedure qz4\G;
ERROR 1305 (42000): PROCEDURE qz4 does not exist
ERROR:
No query specified
四、總結
1. MySQL資料庫函式
- MySQL資料庫函式作用:提供了能夠實作各種功能的方法,使我們在查詢記錄時能夠更高效的輸出
- 常用的包括數學函式、聚合函式、字串函式和日期時間函式
- 日期時間函式中dayofweek(x)是計算日期x是本周的第幾天,但是在MySQL資料庫中星期日對應的回傳值是1
2. MySQL存盤程序
- 存盤程序這個功能時從5.0版本才開始支持
- MySQL存盤程序作業原理:將常用或者復雜的作業預先使用SQL陳述句寫好并用一個指定的名稱存盤起來,這個程序經過編譯和優化后存盤在資料庫服務器中,當需要使用該存盤程序時,只需要呼叫它即可
- MySQL存盤程序優點
- 1.執行一次后,會將生成的二進制代碼駐留緩沖區,從而提供執行效率
- 2.SQL陳述句加控制陳述句的集合,靈活性更高
- 3.在服務器端存盤,客戶端呼叫時,降低網路負載
- 4.可多次重復被呼叫,可隨時修改,不影響客戶端呼叫
- 5.可完成所有的資料庫操作,也可控制資料庫的資訊訪問權限
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/280266.html
標籤:其他
上一篇:Oracle進階(三)常用函式
下一篇:程式設計實驗
