mysql round 0.1111_听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(库函数,存储过程)...
一 、數據庫函數
MySQL 數據庫函數提供了能夠實現各種功能的方法,使我們在查詢記錄時能夠更高效的輸出。MySQL 內建了很多函數,常用的包括數學函數、聚合函數、字符串函數和日期時間函數。
1 數學函數
數據庫內存儲的記錄,經常要進行一系列的算術操作,所以 MySQL 支持很多數學函數。常用的數學函數如表 所示。
表 MySQL 數學函數
(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 的隨機數
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) 、指數冪 power(x,y)( 基數,指數) 返回 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 位小數四舍五入后的值
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)返回數字x截斷為y位小數的值
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的最小整數
Ceil(x)返回大于或等于x的最小整數
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的最小整數
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、聚合函數
MySQL 數據庫函數中專門有一組函數是特意為庫內記錄求和或者對表中的數據進行集中概括而設計的,這些函數被稱作聚合函數。常見的聚合函數如表 5-8 所示。
表 MySQL 聚合函數
例如,MySQL 聚合函數的使用方法,具體操作如下所示。
(1) count()統計相同字段個數
聚合函數中最常用到的是 count()函數,用于統計表中的總記錄數。、
統計年齡大于23的人數
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)統計age 字段的所有記錄的和sum
mysql> select sum(age) from zhu;
±---------+
| sum(age) |
±---------+
| 170 |
±---------+
1 row in set (0.00 sec)
3、 字符串函數
常用函數不僅包括數學函數和聚合函數,還包含字符串函數,MySQL 為字符串的相關操作設計了豐富的字符串函數。常用的字符串函數如表 5-9 所示。
表 MySQL 字符串函數
MySQL 字符串函數的使用方法,具體操作如下所示。
length(x)返回字符串x的長度
中文占用三個字節長度
(1)統計字符串的長度,空格也算 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)將提供參數的 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、 日期時間函數
MySQL 也支持日期時間處理,提供了很多處理日期和時間的函數。一些常用的日期時間函數如表 5-10 所示。
表 日期時間函數
例如,MySQL 日期時間函數的使用方法,具體操作如下所示。
(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 函數的數量比較多,存在很多使用頻率不是很高的函數,所以本章僅列舉了一些具有代表性、比較常用的函數。在實際的工作中,需要什么類型和功能的函數可以通 過手冊去查找,了解實際功能后再使用。
二、存儲過程
1、簡介
MySQL 5.0 版本開始支持存儲過程。
存儲過程(Stored Procedure)是一種在數據庫中存儲復雜程序,以便外部程序調用的一種數據庫對象。
存儲過程是為了完成特定功能的SQL語句集,經編譯創建并保存在數據庫中,用戶可通過指定存儲過程的名字并給定參數(需要時)來調用執行。
存儲過程思想上很簡單,就是數據庫 SQL 語言層面的代碼封裝與重用。
(1)優點
存儲過程可封裝,并隱藏復雜的商業邏輯。
存儲過程可以回傳值,并可以接受參數。
存儲過程無法使用 SELECT 指令來運行,因為它是子程序,與查看表,數據表或用戶定義函數不同。
存儲過程可以用在數據檢驗,強制實行商業邏輯等。
(2)缺點
存儲過程,往往定制化于特定的數據庫上,因為支持的編程語言不同。當切換到其他廠商的數據庫系統時,需要重寫原有的存儲過程。
存儲過程的性能調校與撰寫,受限于各種數據庫系統。
2、具體操作
(1)具體格式如下
(2)創建一個存儲過程
mysql> delimiter $$
mysql> create procedure MYSQL()
-> begin
-> select name,age from zhu;
-> end $$
Query OK, 0 rows affected (0.01 sec)
mysql> delimiter ; '結束的時候加空格'
(2)查詢
通過存儲過程查詢 info 表中某一條記錄,存儲過程是帶參數的,具體操作如下所示。
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) 創建查看指定用戶信息(傳參)
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)
傳參數進去,進行查詢
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) 修改存儲過程
存儲過程在創建之后,隨著開發業務的不斷推進,業務需求難免有所調整,相應的存儲 過程也會發生變動,這個時候就需要修改存儲過程。存儲過程的修改分為特征的修改和業務 內容的修改。特征的修改可以使用 ALTER PROCEDURE 來實現,其語法結構如下所示。
語法格式
ALTER {PROCEDURE | FUNCTION} sp_name [characteristic……]
參數說明
Sp_name,表示存儲過程或函數的名稱
characteristic,表示要修改存儲過程的哪個部分
Characteristic的取值如下
CONTAINS SQL,表示子程序包含SQL語句,但是,不包含讀或寫數據的語句
NO SQL,表示子程序中,不包含SQL語句
READS SQL DATA,表示子程序中,包含讀數據的語句
MODIFIES DATA,表示子程序中,包含寫數據的語句
SQL SECURITY {DEFINER | INVOKER},指明誰有權限來執行
DEFINER,表示只有定義者,自己才能夠執行
INVOKER,表示調用者可以執行
COMMENT’string’,表示注釋信息
ALTER PROCEDURE [ …]
修改存儲過程 mytest 的定義
將讀寫權限,改為MODIFIES SQL DATA,并指明調用者可以執行
mysql> alter procedure mytest
-> modifies sql data
-> sql security INVOKER;
Query OK, 0 rows affected (0.00 sec)
存儲過程內容的修改方法是通過刪除原有存儲過程,之后再以相同的名稱創建新的存儲 過程。
(6) 刪除存儲過程
存儲過程創建之時是存儲到 MySQL 數據庫中的,當程序不在調用這個存儲過程時,也就意味這個存儲過程被廢棄了,廢棄的存儲過程需要從數據庫中將其刪除。使用 DROP PROCEDURE 語句即可刪除存儲過程,其語法格式具體如下。
DROP { PROCEDURE | FUNCTION } [IF EXISTS]
從以上語法結構可以看出,在刪除時存儲過程的名字是放到最后的,前面可以添加 IF EXISTS 這個關鍵字,其主要作用是防止因刪除不存在的存儲過程而引發的錯誤。刪除存儲過程的具體操作如下所示。
mysql> drop procedure MyRole;
Query OK, 0 rows affected (0.00 sec)
需要注意的是:存儲過程名稱后面沒有參數列表,也沒有括號。在刪除之前,必須確認 該存儲過程沒有任何依賴關系,否則會導致與之關聯的存儲過程無法運行。
總結
以上是生活随笔為你收集整理的mysql round 0.1111_听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(库函数,存储过程)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: msp430g2553串口接受数据_MS
- 下一篇: 11年潜心研究产品 全屋智能品牌Aqar