必发88手机客户端 2

三值逻辑,MySQL学习笔记

一、MySQL case when的三种用法:


 

一.case 字段 when,
字段的具体值;

 

select a.*,
    case sex
        when '1' then '男'
        else '女'
    end as '性别'
FROM table_sex a;

 

2.case when
字段,可对字段进行取值范围设置;

SELECT a.*,
    CASE
        WHEN a.age BETWEEN 0 and 20 THEN '青年'
        WHEN a.age BETWEEN 20 and 40 THEN '中年'
        ELSE '非人类'
    END AS '描述'
FROM table_c a;

三.case when
字段一,字段贰,可对五个字段进展取值映射;

SELECT a.*,
    CASE
        WHEN a.age BETWEEN 20 and 80 THEN '青年'
        WHEN a.name ='流浪' THEN '帅气'
    END AS '描述'
FROM table_cc a

注:假若四个原则都对准二个字段的话,会来得第二个when的值。 


 

3值逻辑 (3VL,
Three-valued Logic) 

  1. case..when
    case..when语句用于依据基准再次来到查询结果,如当大家想把emp表的工钱根据多少分成多少个不相同的等级,并分别计算各类等级的职员和工人数。SQL语句如下:
    select (case
             when sal <= 1000 then
              ‘1’
             when sal > 1000 and sal <= 2000 then
              ‘2’
             when sal > 2000 and sal <= 3000 then
              ‘3’
             when sal > 3000 and sal <= 4000 then
              ‘4’
             else
              ‘5’
           end) as Levels,
           count(*)
      from emp
     group by (case
                when sal <= 1000 then
                 ‘1’
                when sal > 1000 and sal <= 2000 then
                 ‘2’
                when sal > 2000 and sal <= 3000 then
                 ‘3’
                when sal > 3000 and sal <= 4000 then
                 ‘4’
                else
                 ‘5’
              end) order by levels;
    里面,when后可径直跟明确的基准,也足以像上边同样跟表明式。当大家想要使用group..by分组时,要把case..when整个讲话放在group
    by 子句中,不可能使用如上边case..when语句的别称”Levels”。

二、具体表明:

SELECT            
    case                      -------------如果
      when sex='1' then '男' -------------sex='1',则返回值'男'
      when sex='2' then '女' -------------sex='2',则返回值'女'  
      else 0                 -------------其他的返回'其他’
    end                       -------------结束
from   sys_user               --------整体理解: 在sys_user表中如果sex='1',则返回值'男'如果sex='2',则返回值'女' 否则返回'其他’

在SQL中逻辑表明式的只怕值包蕴TRUE、FALSE、UNKNOWN。他们被称作3值逻辑。三值逻辑是SQL所特有的。大很多言语的逻辑表明式唯有TRUE或FALSE三种值。

  1. decode函数
    (1)decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)
    当规则十分值1,则赶回值2;当条件卓绝值二,则再次来到值贰…
    (2)decode(字段或字段的运算,值一,值二,值三)

 三、例子

有员工表如下:

empinfo ( 
  Fempno varchar2(10) not null pk, 
  Fempname varchar2(20) not null, 
  Fage number not null, 
  Fsalary number not null 
); 

比如数据量十分的大概一千万条;

写3个你感到最便捷的SQL,用三个SQL总计以下多种人: 

  • fsalary>9999
    and fage > 35 
  • fsalary>9999
    and fage < 35 
  • fsalary
    <9999 and fage > 35 
  • fsalary
    <9999 and fage < 35 

每一个职员和工人的数量

SELECT 
    SUM(CASE WHEN fsalary > 9999 AND fage > 35 THEN 1 ELSE 0 END) 
        AS "fsalary>9999_fage>35",
    SUM(CASE WHEN fsalary > 9999 AND fage < 35 THEN 1 ELSE 0 END) 
        AS "fsalary>9999_fage<35",
    SUM(CASE WHEN fsalary < 9999 AND fage > 35 THEN 1 ELSE 0 END) 
        AS "fsalary<9999_fage>35",
    SUM(CASE WHEN fsalary < 9999 AND fage < 35 THEN 1 ELSE 0 END) 
        AS "fsalary<9999_fage<35"
FROM empinfo;

必发88手机客户端, 


END 2018-05-16 14:30:48

 

当字段或字段的演算等于值1,则赶回值②,否则重回值3。

以下内容出自CSDN feilniu  http://topic.csdn.net/u/20100826/18/7b81012a-b5c4-48b1-b5d1-40a92f3e0388.html 
有关SQL是不是应该允许NULL,在数据库领域已经接近1个信仰式的争议。E.F.Codd以为NULL有存在的必备,但她的至交C.J.Date感觉NULL完全能够收回。最后结出是,SQL规范支持NULL。
辩解上的冲突且不论。但在施行中,一定要掌握NULL的3值逻辑会带来大多麻烦的难点。
a.

如:有表如下

不使用NULL的理由:

必发88手机客户端 1

NULL会引进复杂的3值逻辑。

NULL在询问条件、外键和CHECK约束、唯一约束、GROUP BY、O中华VDER
BY中的行为都以差异等的。
b.

咱俩想赢得如下的查询结果:

使用NULL的理由:

当须要代表1个不敢问津的、不明确的值时,用NULL更自然。比方八个现行反革命人职员和工人的离任时间、拔尖职员和工人(BOSS)的上边职员和工人,等等。


外过渡平时会引进NULL,就算全数表的字段都定义为NOT NULL。

 

率先,假若只怕,尽量让具有字段都声称为NOT
NULL。除非是更契合选取NULL的场馆(从事情出发)。

附带,在利用NULL时,一定要搞驾驭三值逻辑和数据库引擎对NULL的拍卖:
(SQLServer有一个增选SET
ANSI_DEFAULTS,默感到ON,即与SQL规范一致。设为OFF的功用详见联机丛书。)

1.
NULL与其余值实行+-*/等计算操作(包罗在多数函数中应用NULL)后,结果是NULL(标量表明式)。NULL与别的值举办=、>、<等比较操作后,结果是Unknown(断言)。
Unknown相关的逻辑运算:
[code=sql] 
NOT
Unknown –> Unknown 
Unknown
AND/OR Unknown –> Unknown 
Unknown
OR TRUE –> TRUE 
Unknown
AND TRUE –> Unknown 
Unknown
OR FALSE –> Unknown 
Unknown
AND FALSE –> FALSE 
[/code]
具体可查三值逻辑的真值表。

二.
在where/on/having和if/case
when中,唯有True才使原则创设(即Unknown当作False来管理)。比如:
where
column =
value:表中column为NULL的行永久不会回到,尽管value是NULL;
case
value when NULL then XXX when …
end:XXX永久不会实践,纵然value是NULL;
if
<Unknown> XXX else YYY end或case when <Unknown> then XXX
else YYY end:那三种状态下,YYY会试行。

3.
带有外键约束和Check约束的字段允许NULL(即约束只当条件为False时出错,Unknown是不管的)。
四.
富含唯一约束(unique
index)的字段只允许七个NULL的行,再插入或更新该字段为NULL的行会报字段重复的不当。
5.
GROUP BY时,全体NULL被视为壹组。
6.
OWranglerDE索罗德 BY时,全部NULL排在一同,但NULL排在非空值的先头(如SQL
Server)依旧背后(如Oracle),SQL标准未规定。
⑦.
成团函数(SUM/AVG/MAX/MIN/COUNT)忽略NULL的行。
八.
declare的变量,在未赋值在此以前为NULL。
9.
与NULL管理有关的运算符和函数:

  • IS
    NULL/IS NOT

    NULL:用那七个运算符来判别两个值是或不是为NULL,而不是=或<>。

    ISNULL/COALESCE:取首个非空值(注意多个函数的数据类型变换规则不相同)。

    NULLIF(a,b):等价于CASE WHEN a = b THEN NULL ELSE a END。

必发88手机客户端 2

SQL语句如下:

select
country,decode(sex,’1′,’男’,’2′,’女’) as sex,population from test;