oracle中有decode函数,如下:

  select sum(decode(sex,'男',0,1)) 男生数 from school;

统计男生数目,含义为:decode()中sex字段为男时,用1代替,然后计算总和

而mysql中没有该函数,替代的有case与if函数。

case函数

同样统计男女生人数,语句如下:

SELECT school,COUNT(school) 人数,
  SUM(CASE
    WHEN sex='男'THEN 1
    ELSE 0
    END)
  男生数,
  SUM(CASE
    WHEN sex='女'THEN 1
    ELSE 0
    END)
  女生数
FROM sch
GROUP BY sex,school

CASE 可能是 SQL 中被误用最多的关键字之一。虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法。例如,你可以在 WHERE 子句中使用CASE

首先让我们看一下 CASE 的语法。在一般的 SELECT 中,其语法如下: 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
SELECT <myColumnSpec> = 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
CASE 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
WHEN <A> THEN <somethingA> 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
WHEN <B> THEN <somethingB> 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
ELSE <somethingE> 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
END 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁在上面的代码中需要用具体的参数代替尖括号中的内容。下面是一个简单的例子: 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
USE pubs 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GO 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
SELECT 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁     Title, 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
'Price Range' = 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
CASE 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price IS NULL THEN 'Unpriced' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price < 10 THEN 'Bargain' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price BETWEEN 10 and 20 THEN 'Average' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
ELSE 'Gift to impress relatives' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
END 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
FROM titles 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
ORDER BY price 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GO 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁这是 
CASE 的典型用法,但是使用 CASE 其实可以做更多的事情。比方说下面的 GROUP BY 子句中的 CASE: 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
SELECT 'Number of Titles'Count(*
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
FROM titles 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GROUP BY 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
CASE 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price IS NULL THEN 'Unpriced' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price < 10 THEN 'Bargain' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price BETWEEN 10 and 20 THEN 'Average' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
ELSE 'Gift to impress relatives' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
END 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GO 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁你甚至还可以组合这些选项,添加一个 
ORDER BY 子句,如下所示: 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
USE pubs 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GO 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
SELECT 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
CASE 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price IS NULL THEN 'Unpriced' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price < 10 THEN 'Bargain' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price BETWEEN 10 and 20 THEN 'Average' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
ELSE 'Gift to impress relatives' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
END AS Range, 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁     Title 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
FROM titles 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GROUP BY 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
CASE 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price IS NULL THEN 'Unpriced' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price < 10 THEN 'Bargain' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price BETWEEN 10 and 20 THEN 'Average' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
ELSE 'Gift to impress relatives' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
END
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁     Title 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
ORDER BY 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
CASE 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price IS NULL THEN 'Unpriced' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price < 10 THEN 'Bargain' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price BETWEEN 10 and 20 THEN 'Average' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
ELSE 'Gift to impress relatives' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
END
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁     Title 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GO 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁注意,为了在 
GROUP BY 块中使用 CASE,查询语句需要在 GROUP BY 块中重复 SELECT 块中的 CASE 块。

 

if语句

同样统计男女生人数,语句如下:

SELECT school,COUNT(school) 人数,SUM(IF(sex='男',1,0)) 男生数,SUM(IF(sex='女',1,0)) 女生数,
  SUM(IF(pass=1,1,0)) pass1,SUM(IF(pass=0,1,0)) pass0,
  SUM(IF(state=1,1,0)) state1,SUM(IF(state=0,1,0)) state0
FROM sch
  GROUP BY sex,school

 

语法和decode类似。

 参见曹欢欢的博客http://home.ustc.edu.cn/~chh1990/chero/blog/blog.html

posted on 2012-12-06 14:31  前端小屁孩  阅读(20066)  评论(1编辑  收藏  举报