谓词和运算符

  T-SQL有几种不同的语言元素可以指定逻辑表达式,例如,查询过滤器(WHERE和HAVING)、CHECK约束,等等。在逻辑表达式中可以使用各种谓词(取值为TRUE、FALSE或UNKNOWN的表达式)和运算符。

  T-SQL支持的谓词包括IN、BETWEEN,以及LIKE等。IN这个谓词用于检查一个值(或标量表达式)是否与一组元素中的至少一个相等。例如,以下查询返回订单ID等于10248、或10249、或10250的订单:

1 SELECT orderid,empid,orderdate
2 FROM Sales.Orders
3 WHERE orderid IN(10248,10249,10250);

  BETWEEN这个谓词用于检查一个值是否在指定的范围内,包括两个指定的边界值。例如,以下查询返回订单ID在10300到10310之间的所有订单:

1 SELECT orderid,empid,orderdate
2 FROM Sales.Orders
3 WHERE orderid BETWEEN 10300 AND 10310;

  LIKE这个谓词用于检查一个字符串值是否与指定的模式匹配。例如,以下查询返回姓氏(last name)以字符“D”开头的所有雇员:

1 SELECT empid,firstname,lastname
2 FROM HR.Employees
3 WHERE lastname LIKE N'D%';

  你可能会对字符串'D%'前面加的那个字母N而感到好奇,它代表National(国际化),用于表示字符串是Unicode数据类型(NCHAR或NVARCHAR),与之相对应的是常规的字符数据类型(CHAR或VARCHAR)。因为lastname字段的数据类型是NVARCHAR(40),所以就要在字符串前面加个字母N。

  T-SQL支持下列比较运算符:=、>、<、>=、<=、<>、!=、!>、!<,其中最后三个运算符不是标准运算符。因为非标准运算符都可以用相应的标准运算符来替代(例如,用<>,而不是!=),所以建议还是尽可能避免使用这些非标准运算符。例如,以下查询返回2008年1月1日之后生成的所有订单:

1 SELECT orderid,empid,orderdate
2 FROM Sales.Orders
3 WHERE orderdate >= '20080101';

  如果要把多个逻辑表达式组合起来,可以使用逻辑运算符OR和AND。如果想对布尔型表达式取反,可以使用NOT运算符。例如,以下查询返回2008年1月1日之后,由ID为1、3、5的雇员处理过的所有订单:

1 SELECT orderid,empid,orderdate
2 FROM Sales.Orders
3 WHERE orderdate >= '20080101' AND empid IN(1,3,5);

  T-SQL支持以下四种简单的算术运算符:+、-、*、/,以及%(取模)运算符,它返回一个整数除法运算的余数。例如,以下查询对订单的数量、单价、折扣进行算术处理,计算出订单最终应该支付的金额:

1 SELECT orderid,productid,qty,unitprice,discount,
2 qty * unitprice * (1 - discount) AS val
3 FROM Sales.OrderDetails;

  注意,在T-SQL中,涉及两个运算对象的标量表达式的数据类型取决于数据类型的优先级,由优先级较高的运算对象决定。如果两个运算对象具有相同的数据类型,表达式的结果也为相同的数据类型。例如,两个整数(INT)相除,得到的还是一个整数。表达式5/2,结果返回的是整数2,而不是实数2.5.当处理常量时,这不算什么问题,因为总可以在整数常量后面加一个小数点(.),将其转换为实数。但如果正在处理的是两个整数列(例如,col1/col2),而且想让计算结果为实数的话,就需要将运算对象转换为适当的类型:CAST(col1 AS NUMERIC(12,2))/CAST(col2 AS NUMERIC(12,2))。NUMERIC(12,2)这个数据类型的精度为12,带有2位小数,也就是说,它总共有12位数字,其中包括小数点后面的2位数字。

  如果两个运算对象具有不同的类型,则具有较低类型优先级的运算对象就自动转换成更高级的类型。例如,在表达式5/2.0中,第一个运算对象是整数(INT),第二个是实数(NUMERIC)。因为SQL Server认为NUMERIC比INT更高级,所以在开始算术运算之前,就隐式地把INT类型的运算对象5转换成NUMERIC类型的5.0,这样就得到了结果2.5。

  当在同一表达式中出现多个运算符时,SQL Server根据运算符的优先级规则依次对它们进行计算。以下列表从高到低列出了各运算符的优先级:

  1. ()(Parentheses)
  2. *(Multiply),/(Division),%(Modulo)
  3. +(Positive),-(Negative),+(Add),(+Concatenate),-(Subtract)
  4. =,>,<,>=,<=,<>,!=,!>,!<(Comparison operators)
  5. NOT
  6. AND
  7. BETWEEN,IN,LIKE,OR
  8. =(Assignment)

  圆括号的优先级最高,所以它拥有最高的控制权。出于以后让其他人审查或维护代码的需要,为了提高其可读性,尽可能使用圆括号和代码缩进是一种良好的代码编写习惯,即使在某些情况下不是一定得加上它们。

posted @ 2010-12-18 16:57  宁静月光  Views(490)  Comments(0Edit  收藏  举报