mysql round 0.1111_听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(库函数,存储过程)...
一 、數(shù)據(jù)庫函數(shù)
MySQL 數(shù)據(jù)庫函數(shù)提供了能夠?qū)崿F(xiàn)各種功能的方法,使我們在查詢記錄時能夠更高效的輸出。MySQL 內(nèi)建了很多函數(shù),常用的包括數(shù)學(xué)函數(shù)、聚合函數(shù)、字符串函數(shù)和日期時間函數(shù)。
1 數(shù)學(xué)函數(shù)
數(shù)據(jù)庫內(nèi)存儲的記錄,經(jīng)常要進行一系列的算術(shù)操作,所以 MySQL 支持很多數(shù)學(xué)函數(shù)。常用的數(shù)學(xué)函數(shù)如表 所示。
表 MySQL 數(shù)學(xué)函數(shù)
(2) Abs(x) 返回x 的絕對值
mysql> select abs(-3),(3.23),(0);
+---------+------+---+
| abs(-3) | 3.23 | 0 |
+---------+------+---+
| 3 | 3.23 | 0 |
+---------+------+---+
1 row in set (0.00 sec)
(2)Rand() 返回 0 到 1 的隨機數(shù)
mysql> select rand();
+--------------------+
| rand() |
+--------------------+
| 0.5349133028973949 |
+--------------------+
1 row in set (0.01 sec)
mysql> select rand();
+--------------------+
| rand() |
+--------------------+
| 0.7889129741014103 |
+--------------------+
1 row in set (0.00 sec)
(3)、取余 mod (x,y)
mysql> select mod(23,3);
+-----------+
| mod(23,3) |
+-----------+
| 2 |
+-----------+
1 row in set (0.00 sec)
mysql> select mod(24,3);
+-----------+
| mod(24,3) |
+-----------+
| 0 |
+-----------+
1 row in set (0.00 sec)
(4) 、指數(shù)冪 power(x,y)( 基數(shù),指數(shù)) 返回 x 的 y 次方
mysql> select power(3,2);
+------------+
| power(3,2) |
+------------+
| 9 |
+------------+
1 row in set (0.00 sec)
mysql> select power(3,0);
+------------+
| power(3,0) |
+------------+
| 1 |
+------------+
1 row in set (0.00 sec)
mysql> select power(3,-2);
+--------------------+
| power(3,-2) |
+--------------------+
| 0.1111111111111111 |
+--------------------+
1 row in set (0.00 sec)
(5) round (x,y) 保留x 的y 位小數(shù)四舍五入后的值
mysql> select round(4.356,2); '保留兩位 四舍五入看第三位'
+----------------+
| round(4.356,2) |
+----------------+
| 4.36 |
+----------------+
1 row in set (0.00 sec)
(6)Sqrt(x) 返回x 的平方根
mysql> select sqrt(9);
+---------+
| sqrt(9) |
+---------+
| 3 |
+---------+
1 row in set (0.00 sec)
mysql> select sqrt(3);
+--------------------+
| sqrt(3) |
+--------------------+
| 1.7320508075688772 |
+--------------------+
1 row in set (0.00 sec)
mysql> select sqrt(-3);
+----------+
| sqrt(-3) |
+----------+
| NULL |
+----------+
1 row in set (0.00 sec)
(7)Truncate(x,y)返回數(shù)字x截斷為y位小數(shù)的值
mysql> select truncate(3.1415926,3);
+-----------------------+
| truncate(3.1415926,3) |
+-----------------------+
| 3.141 |
+-----------------------+
1 row in set (0.00 sec)
mysql> select truncate(3.1415926,0);
+-----------------------+
| truncate(3.1415926,0) |
+-----------------------+
| 3 |
+-----------------------+
1 row in set (0.00 sec)
mysql> select truncate(3.1415926,-1);
+------------------------+
| truncate(3.1415926,-1) |
+------------------------+
| 0 |
+------------------------+
1 row in set (0.00 sec)
(8)取整 Ceil(x) 返回大于或等于x的最小整數(shù)
Ceil(x)返回大于或等于x的最小整數(shù)
Ceil 向上取整
mysql> select ceil(1.4);
+-----------+
| ceil(1.4) |
+-----------+
| 2 |
+-----------+
1 row in set (0.00 sec)
mysql> select ceil(-1);
+----------+
| ceil(-1) |
+----------+
| -1 |
+----------+
1 row in set (0.00 sec)
mysql> select ceil(-2.1);
+------------+
| ceil(-2.1) |
+------------+
| -2 |
+------------+
1 row in set (0.00 sec)
(9)Floor(x)返回小于或等于x的最小整數(shù)
Floor 向下取整
mysql> select floor(1.09);
+-------------+
| floor(1.09) |
+-------------+
| 1 |
+-------------+
1 row in set (0.00 sec)
mysql> select floor(-2.1);
+-------------+
| floor(-2.1) |
+-------------+
| -3 |
+-------------+
1 row in set (0.00 sec)
(10)返回集合中取最大值 greatest()
mysql> select greatest (10,20,30);
+---------------------+
| greatest (10,20,30) |
+---------------------+
| 30 |
+---------------------+
1 row in set (0.00 sec)
(11)返回集合中取最小值least()
mysql> select least(10,20,30);
+-----------------+
| least(10,20,30) |
+-----------------+
| 10 |
+-----------------+
1 row in set (0.00 sec)
2、聚合函數(shù)
MySQL 數(shù)據(jù)庫函數(shù)中專門有一組函數(shù)是特意為庫內(nèi)記錄求和或者對表中的數(shù)據(jù)進行集中概括而設(shè)計的,這些函數(shù)被稱作聚合函數(shù)。常見的聚合函數(shù)如表 5-8 所示。
表 MySQL 聚合函數(shù)
例如,MySQL 聚合函數(shù)的使用方法,具體操作如下所示。
(1) count()統(tǒng)計相同字段個數(shù)
聚合函數(shù)中最常用到的是 count()函數(shù),用于統(tǒng)計表中的總記錄數(shù)。、
統(tǒng)計年齡大于23的人數(shù)
mysql> select count(name) from zhu where age>23;
+-------------+
| count(name) |
+-------------+
| 5 |
+-------------+
1 row in set (0.00 sec)
(2) 選出age字段的最小值min
查詢表中最小年紀的
mysql> select min(age) from zhu;
+----------+
| min(age) |
+----------+
| 20 |
+----------+
1 row in set (0.00 sec)
(3)選出age字段的最大值max
mysql> select max(age) from zhu;
+----------+
| max(age) |
+----------+
| 28 |
+----------+
1 row in set (0.00 sec)
(4)求age平均值avg
mysql> select avg(age) from zhu;
+----------+
| avg(age) |
+----------+
| 24.2857 |
+----------+
1 row in set (0.00 sec)
(5)統(tǒng)計age 字段的所有記錄的和sum
mysql> select sum(age) from zhu;
±---------+
| sum(age) |
±---------+
| 170 |
±---------+
1 row in set (0.00 sec)
3、 字符串函數(shù)
常用函數(shù)不僅包括數(shù)學(xué)函數(shù)和聚合函數(shù),還包含字符串函數(shù),MySQL 為字符串的相關(guān)操作設(shè)計了豐富的字符串函數(shù)。常用的字符串函數(shù)如表 5-9 所示。
表 MySQL 字符串函數(shù)
MySQL 字符串函數(shù)的使用方法,具體操作如下所示。
length(x)返回字符串x的長度
中文占用三個字節(jié)長度
(1)統(tǒng)計字符串的長度,空格也算 lengh
mysql> select length('ab c');
+----------------+
| length('ab c') |
+----------------+
| 4 |
+----------------+
1 row in set (0.00 sec)
mysql> select length('尚');
+---------------+
| length('尚') |
+---------------+
| 3 |
+---------------+
1 row in set (0.00 sec)
(2) 過濾兩邊空格,不能過濾中間空格 trim
mysql> select trim( 'addf' );
+-------------------+
| trim( 'addf' ) |
+-------------------+
| addf |
+-------------------+
1 row in set (0.00 sec)
mysql> select trim( 'ad df' );
+------------------------+
| trim( 'ad df' ) |
+------------------------+
| ad df |
+------------------------+
1 row in set (0.00 sec)
(3) Concat (x,y)將提供參數(shù)的 x,y 拼成一個字符串
mysql> select concat('abc',' def');
+----------------------+
| concat('abc',' def') |
+----------------------+
| abc def |
+----------------------+
1 row in set (0.00 sec)
mysql> select concat('abc',trim(' bdqn'));
+-----------------------------+
| concat('abc',trim(' bdqn')) |
+-----------------------------+
| abcbdqn |
+-----------------------------+
(4)upper(x)將字符串x的所有字母變成大寫字母
mysql> select upper('abc');
+--------------+
| upper('abc') |
+--------------+
| ABC |
+--------------+
1 row in set (0.00 sec)
(5)lower(x)將字符串x的所有字母變成小寫字母
mysql> select lower('ABC');
+--------------+
| lower('ABC') |
+--------------+
| abc |
+--------------+
1 row in set (0.00 sec)
(6) right(x,y)返回字符串x的后y個字符
mysql> select right('abcdefg',3);
+--------------------+
| right('abcdefg',3) |
+--------------------+
| efg |
+--------------------+
1 row in set (0.00 sec)
(7)left(x,y)返回字符串x的前y個字符
mysql> select left('abcdefg',3);
+-------------------+
| left('abcdefg',3) |
+-------------------+
| abc |
+-------------------+
1 row in set (0.00 sec)
4、 日期時間函數(shù)
MySQL 也支持日期時間處理,提供了很多處理日期和時間的函數(shù)。一些常用的日期時間函數(shù)如表 5-10 所示。
表 日期時間函數(shù)
例如,MySQL 日期時間函數(shù)的使用方法,具體操作如下所示。
(1)日期
Database changed
mysql> select curdate();
+------------+
| curdate() |
+------------+
| 2020-08-30 |
+------------+
1 row in set (0.00 sec)
(2)分時秒
mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 08:43:21 |
+-----------+
1 row in set (0.00 sec)
)
(3) 全顯示
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2020-08-30 08:44:58 |
+---------------------+
1 row in set (0.01 sec)
(4) 顯示月份
mysql> select month('2020-08-25');
+---------------------+
| month('2020-08-25') |
+---------------------+
| 8 |
+---------------------+
1 row in set (0.00 sec)
(5)一年中第幾個星期
mysql> select week('2020-08-25') ;
+--------------------+
| week('2020-08-25') |
+--------------------+
| 34 |
+--------------------+
1 row in set (0.00 sec)
(6)返回小時值
mysql> select hour(curtime()) ;
+-----------------+
| hour(curtime()) |
+-----------------+
| 8 |
+-----------------+
1 row in set (0.00 sec)
(7)獲取里面的時間
mysql> select hour(now()) ;
+-------------+
| hour(now()) |
+-------------+
| 8 |
+-------------+
1 row in set (0.00 sec)
(8)獲取里面的分鐘
mysql> select minute(now()) ;
+---------------+
| minute(now()) |
+---------------+
| 49 |
+---------------+
1 row in set (0.00 sec)
(9) 獲取里面的返回秒值
mysql> select second(now()) ;
+---------------+
| second(now()) |
+---------------+
| 23 |
+---------------+
1 row in set (0.00 sec)
(10)一星期的第幾天 周日是第一天
mysql> select dayofweek(now());
+------------------+
| dayofweek(now()) |
+------------------+
| 1 |
+------------------+
1 row in set (0.00 sec)
(11)計算日期是一年的第幾天
mysql> select dayofyear(now());
+------------------+
| dayofyear(now()) |
+------------------+
| 243 |
+------------------+
1 row in set (0.00 sec)
(12)計算日期是本月的第幾天
mysql> select dayofmonth(now());
+-------------------+
| dayofmonth(now()) |
+-------------------+
| 30 |
+-------------------+
1 row in set (0.00 sec)
因為 MySQL 函數(shù)的數(shù)量比較多,存在很多使用頻率不是很高的函數(shù),所以本章僅列舉了一些具有代表性、比較常用的函數(shù)。在實際的工作中,需要什么類型和功能的函數(shù)可以通 過手冊去查找,了解實際功能后再使用。
二、存儲過程
1、簡介
MySQL 5.0 版本開始支持存儲過程。
存儲過程(Stored Procedure)是一種在數(shù)據(jù)庫中存儲復(fù)雜程序,以便外部程序調(diào)用的一種數(shù)據(jù)庫對象。
存儲過程是為了完成特定功能的SQL語句集,經(jīng)編譯創(chuàng)建并保存在數(shù)據(jù)庫中,用戶可通過指定存儲過程的名字并給定參數(shù)(需要時)來調(diào)用執(zhí)行。
存儲過程思想上很簡單,就是數(shù)據(jù)庫 SQL 語言層面的代碼封裝與重用。
(1)優(yōu)點
存儲過程可封裝,并隱藏復(fù)雜的商業(yè)邏輯。
存儲過程可以回傳值,并可以接受參數(shù)。
存儲過程無法使用 SELECT 指令來運行,因為它是子程序,與查看表,數(shù)據(jù)表或用戶定義函數(shù)不同。
存儲過程可以用在數(shù)據(jù)檢驗,強制實行商業(yè)邏輯等。
(2)缺點
存儲過程,往往定制化于特定的數(shù)據(jù)庫上,因為支持的編程語言不同。當(dāng)切換到其他廠商的數(shù)據(jù)庫系統(tǒng)時,需要重寫原有的存儲過程。
存儲過程的性能調(diào)校與撰寫,受限于各種數(shù)據(jù)庫系統(tǒng)。
2、具體操作
(1)具體格式如下
(2)創(chuàng)建一個存儲過程
mysql> delimiter $$
mysql> create procedure MYSQL()
-> begin
-> select name,age from zhu;
-> end $$
Query OK, 0 rows affected (0.01 sec)
mysql> delimiter ; '結(jié)束的時候加空格'
(2)查詢
通過存儲過程查詢 info 表中某一條記錄,存儲過程是帶參數(shù)的,具體操作如下所示。
mysql> show procedure status where db='dog'; '這里要指向庫的名字 而不是表的名字'
+-----+-------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+-----+-------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| dog | MYSQL | PROCEDURE | root@localhost | 2020-08-30 09:14:55 | 2020-08-30 09:14:55 | DEFINER | | utf8 | utf8_general_ci | utf8_general_ci |
+-----+-------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)
(3)使用
mysql> call MYSQL();
+----------+-----+
| name | age |
+----------+-----+
| gousehng | 24 |
| goupeng | 28 |
| ergouzi | 27 |
| gouyan | 23 |
| goushi | 24 |
| gougou | 24 |
| gouduzi | 20 |
+----------+-----+
7 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
(4) 創(chuàng)建查看指定用戶信息(傳參)
mysql> delimiter $$
mysql> create procedure mytest(in my_name varchar(10))
-> begin
-> select name,score from info where name=my_name;
-> end$$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> show procedure status where db='school';
+--------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment | character_set_client | collation_connection | DatabaseCollation |
+--------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| school | MyRole | PROCEDURE | root@localhost | 2020-08-25 05:30:12 | 2020-08-25 05:30:12 | DEFINER | | utf8 | utf8_general_ci | utf8_general_ci |
| school | mytest | PROCEDURE | root@localhost | 2020-08-25 08:00:30 | 2020-08-25 08:00:30 | DEFINER | | utf8 | utf8_general_ci | utf8_general_ci |
+--------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
2 rows in set (0.00 sec)
傳參數(shù)進去,進行查詢
mysql> call mytest('zhangsan');
Empty set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> call mytest('lisi');
+------+-------+
| name | score |
+------+-------+
| lisi | 98.00 |
+------+-------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
(5) 修改存儲過程
存儲過程在創(chuàng)建之后,隨著開發(fā)業(yè)務(wù)的不斷推進,業(yè)務(wù)需求難免有所調(diào)整,相應(yīng)的存儲 過程也會發(fā)生變動,這個時候就需要修改存儲過程。存儲過程的修改分為特征的修改和業(yè)務(wù) 內(nèi)容的修改。特征的修改可以使用 ALTER PROCEDURE 來實現(xiàn),其語法結(jié)構(gòu)如下所示。
語法格式
ALTER {PROCEDURE | FUNCTION} sp_name [characteristic……]
參數(shù)說明
Sp_name,表示存儲過程或函數(shù)的名稱
characteristic,表示要修改存儲過程的哪個部分
Characteristic的取值如下
CONTAINS SQL,表示子程序包含SQL語句,但是,不包含讀或?qū)憯?shù)據(jù)的語句
NO SQL,表示子程序中,不包含SQL語句
READS SQL DATA,表示子程序中,包含讀數(shù)據(jù)的語句
MODIFIES DATA,表示子程序中,包含寫數(shù)據(jù)的語句
SQL SECURITY {DEFINER | INVOKER},指明誰有權(quán)限來執(zhí)行
DEFINER,表示只有定義者,自己才能夠執(zhí)行
INVOKER,表示調(diào)用者可以執(zhí)行
COMMENT’string’,表示注釋信息
ALTER PROCEDURE [ …]
修改存儲過程 mytest 的定義
將讀寫權(quán)限,改為MODIFIES SQL DATA,并指明調(diào)用者可以執(zhí)行
mysql> alter procedure mytest
-> modifies sql data
-> sql security INVOKER;
Query OK, 0 rows affected (0.00 sec)
存儲過程內(nèi)容的修改方法是通過刪除原有存儲過程,之后再以相同的名稱創(chuàng)建新的存儲 過程。
(6) 刪除存儲過程
存儲過程創(chuàng)建之時是存儲到 MySQL 數(shù)據(jù)庫中的,當(dāng)程序不在調(diào)用這個存儲過程時,也就意味這個存儲過程被廢棄了,廢棄的存儲過程需要從數(shù)據(jù)庫中將其刪除。使用 DROP PROCEDURE 語句即可刪除存儲過程,其語法格式具體如下。
DROP { PROCEDURE | FUNCTION } [IF EXISTS]
從以上語法結(jié)構(gòu)可以看出,在刪除時存儲過程的名字是放到最后的,前面可以添加 IF EXISTS 這個關(guān)鍵字,其主要作用是防止因刪除不存在的存儲過程而引發(fā)的錯誤。刪除存儲過程的具體操作如下所示。
mysql> drop procedure MyRole;
Query OK, 0 rows affected (0.00 sec)
需要注意的是:存儲過程名稱后面沒有參數(shù)列表,也沒有括號。在刪除之前,必須確認 該存儲過程沒有任何依賴關(guān)系,否則會導(dǎo)致與之關(guān)聯(lián)的存儲過程無法運行。
總結(jié)
以上是生活随笔為你收集整理的mysql round 0.1111_听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(库函数,存储过程)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: msp430g2553串口接受数据_MS
- 下一篇: coreos 安装 mysql_kube