SQL CHECK 约束&Case when 的使用方法
2014-11-14 11:11
375 查看
1.CHECK约束
SQLCHECK约束
CHECK约束用于限制列中的值的范围。如果对单个列定义CHECK约束,那么该列只允许特定的值。
如果对一个表定义CHECK约束,那么此约束会在特定的列中对值进行限制。
SQLCHECKConstraintonCREATETABLE
下面的SQL在"Persons"表创建时为"Id_P"列创建CHECK约束。CHECK约束规定"Id_P"列必须只包含大于0的整数。MySQL:
CREATETABLEPersons ( Id_PintNOTNULL, LastNamevarchar(255)NOTNULL, FirstNamevarchar(255), Addressvarchar(255), Cityvarchar(255), [code]CHECK(Id_P>0)
)
[/code]
SQLServer/Oracle/MSAccess:
CREATETABLEPersons ( Id_PintNOTNULL[code]CHECK(Id_P>0),
LastNamevarchar(255)NOTNULL,
FirstNamevarchar(255),
Addressvarchar(255),
Cityvarchar(255)
)
[/code]
如果需要命名CHECK约束,以及为多个列定义CHECK约束,请使用下面的SQL语法:
MySQL/SQLServer/Oracle/MSAccess:
CREATETABLEPersons ( Id_PintNOTNULL, LastNamevarchar(255)NOTNULL, FirstNamevarchar(255), Addressvarchar(255), Cityvarchar(255), [code]CONSTRAINTchk_PersonCHECK(Id_P>0ANDCity='Sandnes')
)
[/code]
SQLCHECKConstraintonALTERTABLE
如果在表已存在的情况下为"Id_P"列创建CHECK约束,请使用下面的SQL:MySQL/SQLServer/Oracle/MSAccess:
ALTERTABLEPersons [code]ADDCHECK(Id_P>0)
[/code]
如果需要命名CHECK约束,以及为多个列定义CHECK约束,请使用下面的SQL语法:
MySQL/SQLServer/Oracle/MSAccess:
ALTERTABLEPersons [code]ADDCONSTRAINTchk_PersonCHECK(Id_P>0ANDCity='Sandnes')
[/code]
撤销CHECK约束
如需撤销CHECK约束,请使用下面的SQL:SQLServer/Oracle/MSAccess:
ALTERTABLEPersons [code]DROPCONSTRAINTchk_Person
[/code]
MySQL:
ALTERTABLEPersons [code]DROPCHECKchk_Person
2、Casewhen(http://www.cnblogs.com/yazdao/archive/2009/12/09/1620482.html)
Case具有两种格式。简单Case函数和Case搜索函数。--简单Case函数 CASEsex WHEN'1'THEN'男' WHEN'2'THEN'女' ELSE'其他'END --Case搜索函数 CASEWHENsex='1'THEN'男' WHENsex='2'THEN'女' ELSE'其他'END
这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。
还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
--比如说,下面这段SQL,你永远无法得到“第二类”这个结果 CASEWHENcol_1IN('a','b')THEN'第一类' WHENcol_1IN('a')THEN'第二类' ELSE'其他'END
下面我们来看一下,使用Case函数都能做些什么事情。
一,已知数据按照另外一种方式进行分组,分析。
有如下数据:(为了看得更清楚,我并没有使用国家代码,而是直接用国家名作为PrimaryKey)
国家(country) | 人口(population) |
中国 | 600 |
美国 | 100 |
加拿大 | 100 |
英国 | 200 |
法国 | 300 |
日本 | 250 |
德国 | 200 |
墨西哥 | 50 |
印度 | 250 |
洲 | 人口 |
亚洲 | 1100 |
北美洲 | 250 |
其他 | 700 |
如果使用Case函数,SQL代码如下:
SELECTSUM(population), CASEcountry WHEN'中国'THEN'亚洲' WHEN'印度'THEN'亚洲' WHEN'日本'THEN'亚洲' WHEN'美国'THEN'北美洲' WHEN'加拿大'THEN'北美洲' WHEN'墨西哥'THEN'北美洲' ELSE'其他'END FROMTable_A GROUPBYCASEcountry WHEN'中国'THEN'亚洲' WHEN'印度'THEN'亚洲' WHEN'日本'THEN'亚洲' WHEN'美国'THEN'北美洲' WHEN'加拿大'THEN'北美洲' WHEN'墨西哥'THEN'北美洲' ELSE'其他'END;
同样的,我们也可以用这个方法来判断工资的等级,并统计每一等级的人数。SQL代码如下;
SELECT CASEWHENsalary<=500THEN'1' WHENsalary>500ANDsalary<=600THEN'2' WHENsalary>600ANDsalary<=800THEN'3' WHENsalary>800ANDsalary<=1000THEN'4' ELSENULLENDsalary_class, COUNT(*) FROMTable_A GROUPBY CASEWHENsalary<=500THEN'1' WHENsalary>500ANDsalary<=600THEN'2' WHENsalary>600ANDsalary<=800THEN'3' WHENsalary>800ANDsalary<=1000THEN'4' ELSENULLEND;
二,用一个SQL语句完成不同条件的分组。
有如下数据
国家(country) | 性别(sex) | 人口(population) |
中国 | 1 | 340 |
中国 | 2 | 260 |
美国 | 1 | 45 |
美国 | 2 | 55 |
加拿大 | 1 | 51 |
加拿大 | 2 | 49 |
英国 | 1 | 40 |
英国 | 2 | 60 |
国家 | 男 | 女 |
中国 | 340 | 260 |
美国 | 45 | 55 |
加拿大 | 51 | 49 |
英国 | 40 | 60 |
下面是一个是用Case函数来完成这个功能的例子
SELECTcountry, SUM(CASEWHENsex='1'THEN populationELSE0END),--男性人口 SUM(CASEWHENsex='2'THEN populationELSE0END)--女性人口 FROMTable_A GROUPBYcountry;
这样我们使用Select,完成对二维表的输出形式,充分显示了Case函数的强大。
三,在Check中使用Case函数。
在Check中使用Case函数在很多情况下都是非常不错的解决方法。可能有很多人根本就不用Check,那么我建议你在看过下面的例子之后也尝试一下在SQL中使用Check。
下面我们来举个例子
公司A,这个公司有个规定,女职员的工资必须高于1000块。如果用Check和Case来表现的话,如下所示
CONSTRAINTcheck_salaryCHECK (CASEWHENsex='2' THENCASEWHENsalary>1000 THEN1ELSE0END ELSE1END=1)
如果单纯使用Check,如下所示
CONSTRAINTcheck_salaryCHECK (sex='2'ANDsalary>1000)
女职员的条件倒是符合了,男职员就无法输入了。
me总结:check约束很简单,相信大家看一下就能明白了。case-when相当于程序中的switch-case语句,只要明白switchcase语句的原理,case-when应该不在话下了。case-when用途很广泛,不过需要注意的是用在group-by语句中case-when语句块需重复。
相关文章推荐
- oracle case when的使用方法
- SQL Case when 的使用方法
- SQL Case when 的使用方法
- SQL Case when 的使用方法
- SQL Case when 的使用方法
- SQL Case when 的使用方法
- SQL中Case When的使用方法
- SQL Case when 的使用方法
- ORACLE CASE WHEN 及 SELECT CASE WHEN的使用方法
- CASE WHEN THEN的使用方法
- oracle case when的使用方法
- SQL Case when 的使用方法
- SQL Case when 的使用方法
- SQL Case when 的使用方法
- SQL的case和when的使用方法
- oracle case when的使用方法
- sql语句判断方法case when then 还…
- oracle case when的使用方法
- SQL Case when 的使用方法
- SQL Case when 的使用方法