6函数谓词CASE表达式

Posted 起航追梦人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

 

以上是关于6函数谓词CASE表达式的主要内容,如果未能解决你的问题,请参考以下文章

6函数谓词CASE表达式

SQL基础教程(第2版)第6章 函数谓词CASE表达式:6-3 CASE表达式

SQL基础教程(第2版)第6章 函数谓词CASE表达式:练习题

[SQL] SQL 基础知识梳理- 函数谓词CASE 表达式

谓词中的 CASE 中为 NULL

4.复杂一点的查询