MySQL讲义第 40 讲——select 查询之函数(3):数学函数
MySQL講義第40講——select 查詢之函數(3):數學函數
文章目錄
- MySQL講義第40講——select 查詢之函數(3):數學函數
- 一、數據準備
- 二、MySQL 數學函數介紹
- 1、ABS() 函數
- 2、FORMAT() 函數
- 3、ROUND() 函數
- 4、TRUNCATE() 函數
- 5、CEILING() 和 FLOOR() 函數
- 6、RAND() 函數
- 7、SQRT() 函數
- 8、SIGN() 函數
- 9、POWER() 函數
- 10、PI() 函數
- 11、MOD() 函數
- 12、三角函數
- 13、EXP() 函數
- 14、LN() 函數和 LOG() 函數
 
 
 
使用函數可在查詢時構造更加靈活的查詢條件。MySQL 提供了處理數值型數據的函數,下面對數學函數進行詳細的介紹并舉例說明其用法。
一、數據準備
在當前數據庫中創建一個保存上市公司信息的 listed_company 表,表結構及表中的數據如下:
CREATE TABLE listed_company(company_id CHAR(6) PRIMARY KEY, company_abbreviation CHAR(20), company_fullname CHAR(200), English_name CHAR(200), registered_address CHAR(200),listing_date DATETIME,total_share_capital DECIMAL(16,2), circulating_share_capital DECIMAL(16,2),industry CHAR(100), company_website CHAR(200) ); mysql> DESC listed_company; +---------------------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------------------+---------------+------+-----+---------+-------+ | company_id | char(6) | NO | PRI | NULL | | | company_abbreviation | char(20) | YES | | NULL | | | company_fullname | char(200) | YES | | NULL | | | English_name | char(200) | YES | | NULL | | | registered_address | char(200) | YES | | NULL | | | listing_date | datetime | YES | | NULL | | | total_share_capital | decimal(16,2) | YES | | NULL | | | circulating_share_capital | decimal(16,2) | YES | | NULL | | | industry | char(100) | YES | | NULL | | | company_website | char(200) | YES | | NULL | | +---------------------------+---------------+------+-----+---------+-------+ 10 rows in set (0.00 sec)SELECT * FROM listed_company WHERE company_id = '000004'\G*************************** 1. row ***************************company_id: 000004company_abbreviation: 國農科技company_fullname: 深圳中國農大科技股份有限公司English_name: SHENZHEN CAU TECHNOLOGY CO., LTDregistered_address: 廣東省深圳市南山區中心路(深圳灣段)3333號中鐵南方總部大廈503室listing_date: 1990-12-01 00:00:00total_share_capital: 83976684.00 circulating_share_capital: 82905273.00industry: C 制造業company_website: www.sz000004.cn 1 row in set (0.00 sec)二、MySQL 數學函數介紹
1、ABS() 函數
ABS() 函數返回一個數值的絕對值。語法格式如下:
ABS(n);舉例:查詢【工商銀行】和【農業銀行】兩支股票的總股本差異
SET @count_gsyh = 0; SET @count_nyyh = 0;SELECT total_share_capital INTO @count_gsyh FROMlisted_company WHEREcompany_abbreviation = '工商銀行';SELECT total_share_capital INTO @count_nyyh FROMlisted_company WHEREcompany_abbreviation = '農業銀行';SELECT@count_gsyh,@count_nyyh,ABS(@count_gsyh - @count_nyyh) AS count_interval; +-------------+-------------+----------------------------------------+ | @count_gsyh | @count_nyyh | count_interval | +-------------+-------------+----------------------------------------+ | 26961221.25 | 29405529.39 | 2444308.140000000000000000000000000000 | +-------------+-------------+----------------------------------------+ 1 row in set (0.01 sec)2、FORMAT() 函數
FORMAT() 函數可以對一個數值進行格式化操作,返回值類型為字符串。語法格式如下:
FORMAT(X,n);--說明: (1)返回值的類型為字符串。 (2)對 X 進行四舍五入,保留 n 位小數,并以 ##,###,###.### 格式顯示。舉例:顯示股票的總股本和流通股本,并進行格式化
SELECTcompany_id,company_abbreviation,FORMAT(total_share_capital,4) AS total_share_capital,FORMAT(circulating_share_capital,4) AS circulating_share_capital FROM listed_company WHERE company_id < '000010'; +------------+----------------------+---------------------+---------------------------+ | company_id | company_abbreviation | total_share_capital | circulating_share_capital | +------------+----------------------+---------------------+---------------------------+ | 000001 | 平安銀行 | 17,170,411,366.0000 | 14,623,200,091.0000 | | 000002 | 萬 科A | 9,724,196,533.0000 | 9,705,462,185.0000 | | 000004 | 國農科技 | 83,976,684.0000 | 82,905,273.0000 | | 000005 | 世紀星源 | 1,058,536,842.0000 | 912,332,164.0000 | | 000006 | 深振業A | 1,349,995,046.0000 | 1,343,618,405.0000 | | 000007 | 全新好 | 230,965,363.0000 | 205,776,701.0000 | | 000008 | 神州高鐵 | 2,757,709,279.0000 | 1,494,764,599.0000 | | 000009 | 中國寶安 | 2,149,344,971.0000 | 2,118,885,157.0000 | +------------+----------------------+---------------------+---------------------------+ 8 rows in set (0.00 sec)3、ROUND() 函數
ROUND() 函數可以對一個數值進行四舍五入操作。語法格式如下:
ROUND(x); ROUND(x,n); --說明: (1)對 x 進行四舍五入,保留 n 位小數。 (2)如果省略 n,則保留 0 位小數。 (3)n 如果小于 0,則對整數位四舍五入。比如 n = -2,對百位數四舍五入。舉例:
(1)查詢所有銀行股的總股本并四舍五入保留到千位數。
SELECTcompany_id,company_abbreviation,FORMAT(ROUND(total_share_capital,-3),0) AS total_share_capital FROM listed_company WHERE company_abbreviation LIKE '%銀行%'; +------------+----------------------+---------------------+ | company_id | company_abbreviation | total_share_capital | +------------+----------------------+---------------------+ | 000001 | 平安銀行 | 17,170,411,000 | | 002142 | 寧波銀行 | 3,899,794,000 | | 002807 | 江陰銀行 | 1,767,354,000 | | 600000 | 浦發銀行 | 2,162,000 | | 600015 | 華夏銀行 | 1,069,000 | | 600016 | 民生銀行 | 2,955,000 | | 600036 | 招商銀行 | 2,063,000 | | 600908 | 無錫銀行 | 185,000 | | 600919 | 江蘇銀行 | 1,154,000 | | 600926 | 杭州銀行 | 262,000 | | 601009 | 南京銀行 | 606,000 | | 601128 | 常熟銀行 | 222,000 | | 601166 | 興業銀行 | 1,905,000 | | 601169 | 北京銀行 | 1,521,000 | | 601229 | 上海銀行 | 600,000 | | 601288 | 農業銀行 | 29,406,000 | | 601328 | 交通銀行 | 3,925,000 | | 601398 | 工商銀行 | 26,961,000 | | 601818 | 光大銀行 | 3,981,000 | | 601939 | 建設銀行 | 959,000 | | 601988 | 中國銀行 | 21,077,000 | | 601997 | 貴陽銀行 | 230,000 | | 601998 | 中信銀行 | 3,405,000 | | 603323 | 吳江銀行 | 111,000 | +------------+----------------------+---------------------+ 24 rows in set (0.00 sec)(2)查詢股票簡稱包含【石油】的股票的總股本并四舍五入保留1位小數
SELECTcompany_id,company_abbreviation,total_share_capital,FORMAT(ROUND(total_share_capital,1),1) AS total_share_capital_002 FROM listed_company WHERE company_abbreviation LIKE '%石油%'; +------------+----------------------+---------------------+-------------------------+ | company_id | company_abbreviation | total_share_capital | total_share_capital_002 | +------------+----------------------+---------------------+-------------------------+ | 000554 | 泰山石油 | 480793318.00 | 480,793,318.0 | | 300164 | 通源石油 | 440432159.00 | 440,432,159.0 | | 601857 | 中國石油 | 16192207.78 | 16,192,207.8 | +------------+----------------------+---------------------+-------------------------+ 3 rows in set (0.00 sec)4、TRUNCATE() 函數
TRUNCATE() 函數把一個數值截取 n 位小數,并且不進行四舍五入。語法格式如下:
TRUNCATE(x,n);--說明:把數值 x 的小數點后第 n 位之后的數據直接舍去(不四舍五入),保留 n 為小數。舉例:
SELECT TRUNCATE(12.258,2),TRUNCATE(1285.0128,-2),TRUNCATE(12.7258,2); +--------------------+------------------------+---------------------+ | TRUNCATE(12.258,2) | TRUNCATE(1285.0128,-2) | TRUNCATE(12.7258,2) | +--------------------+------------------------+---------------------+ | 12.25 | 1200 | 12.72 | +--------------------+------------------------+---------------------+ 1 row in set (0.01 sec)5、CEILING() 和 FLOOR() 函數
CEILING() 和 FLOOR() 函數可以對一個數值進行取整操作。語法格式如下:
CEILING(X); --返回大于或等于 X 的最小整數 FLOOR(X); --返回小于或等于 X 的最大整數舉例:
SELECT CEILING(4.9),CEILING(-2.8); +--------------+---------------+ | CEILING(4.9) | CEILING(-2.8) | +--------------+---------------+ | 5 | -2 | +--------------+---------------+ 1 row in set (0.01 sec)SELECT FLOOR(3.9),FLOOR(-2.7); +------------+-------------+ | FLOOR(3.9) | FLOOR(-2.7) | +------------+-------------+ | 3 | -3 | +------------+-------------+ 1 row in set (0.00 sec)6、RAND() 函數
RAND() 函數用于生成一個隨機數。語法格式如下:
RAND(n); RAND();--說明: (1)RAND() 函數可以產生一個0到1之間的隨機數。 (2)如果無參數,每次運行都會產生一個不同的隨機數。 (3)如果指定了種子 n,則每次運行時產生的隨機數相同。舉例:
(1)基本用法
SELECT RAND(22),RAND(22),RAND(22); +--------------------+--------------------+--------------------+ | RAND(22) | RAND(22) | RAND(22) | +--------------------+--------------------+--------------------+ | 0.6592488313645579 | 0.6592488313645579 | 0.6592488313645579 | +--------------------+--------------------+--------------------+ 1 row in set (0.01 sec)SELECT RAND(),RAND(),RAND(); +--------------------+------------------------+---------------------+ | RAND() | RAND() | RAND() | +--------------------+------------------------+---------------------+ | 0.1869446245831853 | 0.00047542341097763126 | 0.44154327403897725 | +--------------------+------------------------+---------------------+ 1 row in set (0.00 sec)(2)創建一張表 t1,為 num 列插入 100 到 200 之間的隨機整數
-- 1、創建表 t1 CREATE TABLE t1(id int primary key auto_increment,num int ); --2、創建存儲過程,向表中添加若干記錄 DELIMITER // CREATE PROCEDURE sp_insert(IN cnt_insert INT) BEGINDECLARE n INT;SET n = 1;WHILE (n < cnt_insert) DOINSERT INTO t1(num)VALUES(100 + RAND() * 100);SET n = n +1;END WHILE; END // DELIMITER ; --3、執行存儲過程,向 t1 表添加 20 條記錄 CALL sp_insert(20); --4、查看 t1 表中的數據 SELECT* FROMt1; mysql> select * from t1; +----+------+ | id | num | +----+------+ | 1 | 179 | | 2 | 135 | | 3 | 139 | | 4 | 189 | | 5 | 127 | | 6 | 170 | | 7 | 169 | | 8 | 136 | | 9 | 173 | | 10 | 154 | | 11 | 153 | | 12 | 104 | | 13 | 160 | | 14 | 186 | | 15 | 153 | | 16 | 105 | | 17 | 167 | | 18 | 122 | | 19 | 106 | +----+------+ 19 rows in set (0.00 sec)7、SQRT() 函數
SQRT() 函數可以求一個數的平方根。語法格式如下:
SQRT(x);舉例:
SELECTSQRT(16),SQRT(10); +----------+--------------------+ | SQRT(16) | SQRT(10) | +----------+--------------------+ | 4 | 3.1622776601683795 | +----------+--------------------+ 1 row in set (0.01 sec)8、SIGN() 函數
SIGN() 函數用于判斷一個數是大于 0、小于 0 或者等于 0。語法格式如下:
SIGN(x);--說明:如果 x>0,返回 1,如果 x<0,返回 -1,如果 x=0,返回 0。例如:
SELECT SIGN(10666.98),SIGN(-0.00988),SIGN(0); +----------------+----------------+---------+ | SIGN(10666.98) | SIGN(-0.00988) | SIGN(0) | +----------------+----------------+---------+ | 1 | -1 | 0 | +----------------+----------------+---------+ 1 row in set (0.02 sec)9、POWER() 函數
POWER() 函數用于計算一個數的若干次冪。語法格式如下:
POWER(x,y);--說明:返回x的y次方。舉例:
SELECTPOWER(2,10),POWER(16,-0.5),POWER(4,1.2); +-------------+----------------+-------------------+ | POWER(2,10) | POWER(16,-0.5) | POWER(4,1.2) | +-------------+----------------+-------------------+ | 1024 | 0.25 | 5.278031643091577 | +-------------+----------------+-------------------+ 1 row in set (0.00 sec)10、PI() 函數
PI() 函數返回圓周率。語法格式如下:
PI();舉例:
--求半徑為 5 的圓的周長和面積 SET @r = 5; SELECT PI(),@r AS radius,2 * PI() * @r AS perimeter,PI() * POWER(@r, 2) AS area; +----------+--------+-----------+-------------------+ | PI() | radius | perimeter | area | +----------+--------+-----------+-------------------+ | 3.141593 | 5 | 31.415927 | 78.53981633974483 | +----------+--------+-----------+-------------------+ 1 row in set (0.00 sec)11、MOD() 函數
MOD() 函數進行求余操作。語法格式如下:
MOD(m,n);--說明:返回 m 除以 n 的余數。舉例:
SELECTMOD(10,3),MOD(10,-3),MOD(-10,3),MOD(-10,-3); +-----------+------------+------------+-------------+ | MOD(10,3) | MOD(10,-3) | MOD(-10,3) | MOD(-10,-3) | +-----------+------------+------------+-------------+ | 1 | 1 | -1 | -1 | +-----------+------------+------------+-------------+ 1 row in set (0.01 sec)12、三角函數
角函數的語法格式如下:
SIN(X); --正弦函數 COS(X); --余弦函數 TAN(X); --正切函數 COT(X); --余切函數--說明:X表示弧度舉例:
SELECTSIN(pi()/2) as sin,COS(pi()/6) as cos,TAN(pi()/2) as tan,COT(pi()/3) as cot; +------+--------------------+----------------------+-------------------+ | sin | cos | tan | cot | +------+--------------------+----------------------+-------------------+ | 1 | 0.8660254037844387 | 1.633123935319537e16 | 0.577350269189626 | +------+--------------------+----------------------+-------------------+ 1 row in set (0.05 sec)13、EXP() 函數
EXP() 函數返回常數 e 的若干次冪。語法格式如下:
EXP(X);--說明:返回e的X次方。舉例:
SELECTEXP(1),EXP(2); +-------------------+------------------+ | EXP(1) | EXP(2) | +-------------------+------------------+ | 2.718281828459045 | 7.38905609893065 | +-------------------+------------------+ 1 row in set (0.04 sec)14、LN() 函數和 LOG() 函數
LN() 函數返回一個數的自然對數,LOG() 函數返回一個數的常用對數。語法格式如下:
LN(X); --返回X的自然對數 LOG(X); --返回X的自然對數 LOG(n,x); --返回以n為底的對數 LOG2(x); --返回以2為底的對數 LOG10(x); --返回以10為底的對數舉例:
SELECTLN(10),LOG(10); +-------------------+-------------------+ | LN(10) | LOG(10) | +-------------------+-------------------+ | 2.302585092994046 | 2.302585092994046 | +-------------------+-------------------+ 1 row in set (0.02 sec)SELECTLOG(2,1024),LOG2(1024),LOG10(1000); +-------------+------------+-------------+ | LOG(2,1024) | LOG2(1024) | LOG10(1000) | +-------------+------------+-------------+ | 10 | 10 | 3 | +-------------+------------+-------------+ 1 row in set (0.01 sec)總結
以上是生活随笔為你收集整理的MySQL讲义第 40 讲——select 查询之函数(3):数学函数的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: OpenAnolis开源社区的萌芽与发展
- 下一篇: 随机生成10个0-100的正整数
