6、函数、谓词、CASE表达式

6-1:各种各样的函数,根据用途函数可能分为算术函数、字符串函数、日期函数、转换函数和聚合函数。

6-1-1:函数和种类

  1、算术函数:用来进行数值计算的函数

  2、字符串函数:用来进行字符串操作的函数

  3、日期函数:用来进行日期操作的函数

  4、转换函数:用来转换数据类型和值的函数

  5、聚合函数:用来进行数据聚合的函数·

6-1-2:算术函数 

  1、四则运算:+(加法)、-(减法)、*(乘法)、/(除法)

-- 创建SampleMath表
CREATE TABLE SampleMath(
 m NUMERIC(10,3),  -- NUMERIC:全体位数据类型,小数位数
 n INTEGER,
 p INTEGER  
);
-- 插入数据
BEGIN TRANSACTION;
INSERT INTO SampleMath(m,n,p) VALUES(500,0,NULL);
INSERT INTO SampleMath(m,n,p) VALUES(-180,0,NULL);
INSERT INTO SampleMath(m,n,p) VALUES(NULL,NULL,NULL);
INSERT INTO SampleMath(m,n,p) VALUES(NULL,7,3);
INSERT INTO SampleMath(m,n,p) VALUES(NULL,5,2);
INSERT INTO SampleMath(m,n,p) VALUES(NULL,4,NULL);
INSERT INTO SampleMath(m,n,p) VALUES(8,NULL,3);
INSERT INTO SampleMath(m,n,p) VALUES(2.27,1,NULL);
INSERT INTO SampleMath(m,n,p) VALUES(5.555,2,NULL);
INSERT INTO SampleMath(m,n,p) VALUES(NULL,1,NULL);
INSERT INTO SampleMath(m,n,p) VALUES(8.76,NULL,NULL);
COMMIT;

 2、ABS绝对值函数

  语法:ABS(数据)

SELECT m,ABS(m) AS abs_col
FROM SampleMath;

   ABS(NULL)的值也为NULL。

3、MOD求余函数

    语法:MOD(被除数,除数)

SELECT n,p,MOD(n,p) AS mod_col
FROM SampleMath;

4、ROUND四舍五入函数

  语法:ROUND(对象数值,保留小数的位数)

SELECT m,n,ROUND(m,n) AS round_col
FROM SampleMath;

5、字符串函数

-- 创建SampleStr表
CREATE TABLE SampleStr(
 str1 VARCHAR(40),
 str2 VARCHAR(40),
 str3 VARCHAR(40)
); 
-- 插入数据
BEGIN TRANSACTION;
INSERT INTO SampleStr(str1,str2,str3) VALUES('opx','rt',NULL);
INSERT INTO SampleStr(str1,str2,str3) VALUES('abc','def',NULL);
INSERT INTO SampleStr(str1,str2,str3) VALUES('山田','太郎','是你');
INSERT INTO SampleStr(str1,str2,str3) VALUES('aaa',NULL,NULL);
INSERT INTO SampleStr(str1,str2,str3) VALUES(NULL,'xyz',NULL);
INSERT INTO SampleStr(str1,str2,str3) VALUES('@!#$%',NULL,NULL);
INSERT INTO SampleStr(str1,str2,str3) VALUES('aBC',NULL,NULL);
INSERT INTO SampleStr(str1,str2,str3) VALUES('abc太郎','abc','ABC');
INSERT INTO SampleStr(str1,str2,str3) VALUES('abdcefabc','abc','ABC');
INSERT INTO SampleStr(str1,str2,str3) VALUES('micmic','i','I');
COMMIT;

  1、||拼接函数

  语法:字符串1||字符串2(NULL与任务拼接都为NULL),MySQL使用CONCAT函数

SELECT str1,str2,str1||str2 AS str_concat --CONCAT(str1,str2)
FROM SampleStr;

  2、LENGTH函数

  语法:LENGTH(字符串)

SELECT str1,LENGTH(str1) as len_str
FROM SampleStr;

  3、LOWER小写转换函数与UPPER大写转换函数

  语法:LOWER(字符串) UPPER(字符串)

SELECT str1,LOWER(str1) AS low_str
FROM SampleStr
WHERE str1 IN ('ABC','aBC','abc','山田');

SELECT str1,UPPER(str1) AS up_str
FROM SampleStr
WHERE str1 IN ('ABC','aBC','abc','山田');

  4、REPLACE字符串的替换  

  语法:REPLACE(对象字符串,替换前的字符串,替换后的字符串)

SELECT str1,str2,str3,REPLACE(str1,str2,str3) AS rep_str
FROM SampleStr;

  5、SUBSTRING字符串截取

   语法:SUBSTRING(对象字符串, FROM 截取的起始位置 FOR 截取的字符数)

SELECT str1,SUBSTRING(str1 FROM 3 FOR 2) AS sub_str
FROM SampleStr;

6、日期函数

  1)CURRENT_DATE当前日期函数

    语法:CURRENT_DATE

SELECT CURRENT_DATE;--Mysql\Postgresql

  2)CURRENT_TIME当前时间函数

    语法:CURRENT_TIME

SELECT CURRENT_TIME;--Mysql\Postgresql

 3)CURRENT_TIMESTAMP当前日期和时间函数

    语法:CURRENT_TIMESTAMP

SELECT CURRENT_TIMESTAMP;--Mysql\Postgresql

 4)EXTRACT截取日期元素(返回为数值型)

    语法:EXTRACT(日期元素 FROM 日期)

-- mysql\postgresql
SELECT CURRENT_TIMESTAMP,
EXTRACT(YEAR FROM CURRENT_TIMESTAMP) AS year,
EXTRACT(MONTH FROM CURRENT_TIMESTAMP) AS month,
EXTRACT(DAY FROM CURRENT_TIMESTAMP) AS day,
EXTRACT(HOUR FROM CURRENT_TIMESTAMP) AS hour,
EXTRACT(MINUTE FROM CURRENT_TIMESTAMP) AS minute,
EXTRACT(SECOND FROM CURRENT_TIMESTAMP) AS second;

6、转换函数

  1)CAST-类型转换

    语法:CAST(转换前的值 AS  想要转换的数据类型)

--字符串转为数值类型
--
sql server\postgresql SELECT CAST('0001' AS INTEGER) AS int_col; -- mysql SELECT CAST('0001' AS SIGNED INTEGER) AS int_col;

-- 字符串转为日期类型
-- SQL Server\Mysql
SELECT CAST('2009-12-14' AS DATE) AS date_col;

  2)COALESCE-把NULL转换为其他值

    语法:COALESCE(数据1,数据2,数据3...)

SELECT COALESCE(NULL,1) AS col_1,
             COALESCE(NULL,'test',NULL) AS col_2,
             COALESCE(NULL,NULL,'2009-11-01');

SELECT COALESCE(str2,'NULL')
FROM SampleStr;

6-2:谓词(返回值是真值)

  1、谓词就是返回值为真值的函数

  2、LIKE的三种方法(前方一致、中间一致、后方一致)

  3、需要注意BETWEEN包含三个参数

  4、想要取得NULL数据时间必须使用IS NULL

  5、可以把子查询作为IN和EXISTS的参数

6-2-1:LIKE谓词-字符串的部分一致查询

-- 创建SampleLike表
CREATE TABLE SampleLike
(
  strcol VARCHAR(6) NOT NULL,
  PRIMARY KEY(strcol)
);

-- 插入数据
BEGIN TRANSACTION;-- START TRACSACTION
INSERT INTO SampleLike(strcol) VALUES('abcddd'); INSERT INTO SampleLike(strcol) VALUES('dddabc'); INSERT INTO SampleLike(strcol) VALUES('abdddc'); INSERT INTO SampleLike(strcol) VALUES('abcdd'); INSERT INTO SampleLike(strcol) VALUES('ddabc'); INSERT INTO SampleLike(strcol) VALUES('abddc'); COMMIT;

  1、前方一致查询(%:代表0字符以上的任意字符串, _(下划线)代表1个字符)

SELECT *
FROM SampleLike
WHERE strcol LIKE 'ddd%';

  2、中间一致查询

SELECT *
FROM SampleLike
WHERE strcol LIKE '%ddd%';

  2、后方一致查询

SELECT *
FROM SampleLike
WHERE strcol LIKE '%ddd';

-- abc后任意2个字符
SELECT *
FROM SampleLike
WHERE strcol LIKE 'abc__';

6-2-2:BETWEEN谓词-范围查询(3个参数)

-- 从shohin表中读出销售单价(hanbai_tanka)在100和1000之间的商品(包含100和1000两个值,如果不包含用<>)
SELECT shohin_mei,hanbai_tanka
FROM Shohin
WHERE hanbai_tanka BETWEEN 100 AND 1000;

6-2-3:IS NULL\IS NOT NULL-判断是否为NULL

-- 选取出进货单价(shiire_tanka)为NULL的商品
SELECT shohin_mei,shiire_tanka
FROM Shohin
WHERE shiire_tanka IS NULL;

6-2-4:IN谓词-OR的简便用法(IN和NOT IN无法选取出NULL数据)

SELECT shohin_mei,shiire_tanka
FROM Shohin
-- WHERE shiire_tanka = 320
-- OR shiire_tanka = 500
-- OR shiire_tanka = 5000;
WHERE shiire_tanka IN(320,500,5000);

6-2-5:使用子查询作为IN谓词的参数

6-2-6:EXIST谓词

 

6-2:CASE表达式

  1、CASE表达式分为简碟CASE表达式和搜索CASE表达式两种。搜索CASE包含简碟CASE表达式全部功能

  2、CASE表达式的ELSE子句可以省略,但最好不要

  3、CASE表达式的END不参省略

  4、使用CASE表达式能把SELECT语据的结果进行组合

6-2-1:搜索CASE表达式

  语法:CASE WHEN <判断表达式> THEN<表达式>

               WHEN <判断表达式> THEN<表达式>

             .....

         ELSE<表达式>

      END

SELECT shohin_mei,
CASE WHEN shohin_bunrui = '衣服'  THEN 'A:'||shohin_bunrui
         WHEN shohin_bunrui = '办公用品'  THEN 'B:'||shohin_bunrui      
         WHEN shohin_bunrui = '厨房用具'  THEN 'C:'||shohin_bunrui
         ELSE NULL
END AS abc_shohin_bunrui
FROM Shohin;       

CASE表达式实现行列转换

SELECT shohin_bunrui,SUM(hanbai_tanka) AS sum_tanka
FROM Shohin
GROUP BY shohin_bunrui;

-- 对照商品种类计算出的销售单价合计值行行列换行
SELECT 
SUM(CASE WHEN shohin_bunrui = '衣服' THEN hanbai_tanka ELSE 0 END) AS sum_tanka_ihuku,
SUM(CASE WHEN shohin_bunrui = '厨房用具' THEN hanbai_tanka ELSE 0 END) AS sum_tanka_kitchen,
SUM(CASE WHEN shohin_bunrui = '办公用品' THEN hanbai_tanka ELSE 0 END) AS sum_tanka_jimu
FROM Shohin;

 

posted @ 2017-03-26 18:07  起航追梦人  阅读(532)  评论(0编辑  收藏  举报