《SQLSERVER2012之T-SQL教程》T-SQL单表查询(二)「建议收藏」

《SQLSERVER2012之T-SQL教程》T-SQL单表查询(二)

大家好,又见面了,我是全栈君。

表结构与数据:https://github.com/XuePeng87/TSQLV4

谓词和运算符

1) 谓词

    T-SQL支持的谓词例子包括IN、BETWEEN和LIKE。

    IN可以检查一个值或是一个标量表达式是否至少等于集合中的一个元素。例如下面查询,将返回10248、10249或10250的订单:

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

    BETWEEN谓词可以检查一个值是否在制定范围内,其包括两个指定的边界值。例如下面查询,将返回包括在10300~10310范围内的订单:

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

    LIKE谓词可以检查一个字符串值是否满足指定的模式。例如,下面的查询返回姓氏以字母D开始的雇员:

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

    注意字符串”D%”前缀字母N的使用,他代表National(国家),用来表示字符串是一个Unicode数据类型数据类型(NCHAR或NVARCHAR),而不是一个常规字符数据类型(CHAR或VARCHAR)。由于lastname属性的数据类型为NVARCHAR(40),所以字母N作为字符串前缀。

2) 运算符

    T-SQL支持的比较运算符包括:=、>、<、>=、<=、<>、!=、!>和!<。后三个不是标准的。

    如果需要连接逻辑表达式,可以使用逻辑运算符:OR和AND。

    T-SQL支持4个明显的算数运算符:+、-、*、/,以及%运算符。

    注意,在T-SQL中,涉及两个操作数的标量表达式的数据类型,是按两个数据类型优先级中的较高优先级确定的。如果两个操作数的数据类型相同,表达式结果是相同的数据类型。例如:两个INT相除将生成一个整数,5/2=2,而不是2.5了。如果希望计算正数的结果是一个浮点类型,则需要强制转换操作数为适当的类型:

SELECT CAST(5 AS NUMERIC(12, 2)) / CAST (2 AS NUMERIC(12, 2));

    下面描述了运算符的优先级(从高到低):

  1. “()”,圆括号,小括号;
  2. *、/、%;
  3. +(正号)、-(符号)、+(加号)、+(串联)、-(减号);
  4. =、>、<、>=、<=、<>、!=、!>、!<(比较运算符);
  5. NOT;
  6. AND;
  7. BETWEEN、IN、LIKE、OR;
  8. =(赋值);

CASE表达式

    CASE表达式是一个标量表达式,返回一个基于条件逻辑的值。需要注意的是,CASE是表达式而不是语句,它不允许你控制活动流或是做一些基于条件逻辑的操作。不过,它的返回值是基于条件逻辑的。由于CASE是一个标量表达式,因此可以在任何允许使用标量表达式的地方使用它。例如,在SELECT、WEHERE、HAVING、ORDER BY中,以及在CHECK约束中。

    CASE表达式具有“简单”和“搜索”两种格式。首先看一个简单格式的例子:

SELECT productid, productname, categoryid, 
	CASE categoryid 
		WHEN 1 THEN 'Beverages'
		WHEN 2 THEN 'Condiments'
		WHEN 3 THEN 'Confections'
		WHEN 4 THEN 'Dairy Products'
		WHEN 5 THEN 'Grains/Cereals'
		WHEN 6 THEN 'Meat/Poultry'
		WHEN 7 THEN 'Produce'
		WHEN 8 THEN 'Seafood'
		ELSE 'Unkonwn Categroy'
	END AS categoryname 
FROM Production.Products;

    简单格式在CASE关键字后具有单个测试值或表达式,与WHEN子句中的可能值列表进行比较。

    在看一个搜索格式的例子:

SELECT orderid, custid, val, 
	CASE 
		WHEN val < 1000.00					 THEN 'Less than 1000' 
		WHEN val BETWEEN 1000.00 AND 3000.00 THEN 'Between 1000 and 3000' 
		WHEN val > 3000.00					 THEN 'More than 3000' 
		ELSE 'Unknown' 
	END AS valuecategory 
FROM Sales.OrderValues;

    搜索格式更加灵活,允许在WHEN中制定谓词或逻辑表达式,而不是限制与进行相等比较。
    T-SQL支持的某些函数,可以看作是CASE表达式的缩写形式,如ISNULL、COALESCE、IIF和CHOOSE。这4和函数中只有COALESCE是标准的。此外,IIF和CHOOSE仅在SQL Server2012中可以使用。

    ISNULL函数可以接收两个参数作为输入,并返回第一个非NULL的参数值,如果两个参数值均为NULL,则返回NULL。例如,ISNULL(col1,”),如果col1值不是NULL的话,那么返回col1,如果col1是NULL的话,则返回空字符串。

    COALESCE函数与其类似,只是它支持两个或更多参数,并返回第一个非NULL值,如果所有参数均为NULL的话,则返回NULL。

    IIF和CHOOSE函数,是为了支持更容易从Microsoft Access迁移。函数IIF(<logical_exp>,<exp1>,<exp2>),如果Logical_exp为TRUE,则返回exp1,否则返回exp2。

    函数CHOOSE(<index>,<exp1>,<exp2>,…,<expn>),返回列表中指定索引的表达式。

NULL标记

    T-SQL支持用于表示缺失值的NULL标记,并使用三值逻辑。TRUE、FALSE和UNKNOWN,T-SQL遵循这方面的标准。

    逻辑表达式仅涉及已有或是现值,其计算结果为TRUE或FALSE,但当逻辑表达式涉及NULL时,其计算结果为UNKNOWN。例如salary>0,当salary等于1000时,结果为TRUE。当salary等于-1000时,结果为FALSE。当salary是NULL时,结果为UNKNOWN。

    先来看看,SQL是怎么处理计算结果为TRUE和FALSE的表达式。例如salary>0出现在查询筛选中(WHERE或HAVING),将返回表达式计算为TRUE的行或组,那些结果为FALSE的会被筛选掉。同样,如果谓词salary>0出现在表的CHECK约束中,所有行的表达式计算为TRUE的INSERT或UPDATE语句会被接收,而那些计算结果为FALSE的会被拒绝。

    接下来看看表达式计算结果为UNKNOWN的处理方式。对于查询筛选而言,SQL的正确处理定义是接收TRUE,意味着FALSE和UNKNOWN会被筛选掉。相反,对于CHECK约束而言,SQL的正确处理定义是“拒绝FALSE”,所以TRUE和UNKNOWN会被接受。

    UNKNOWN一个棘手的问题是,当否定它时,仍然会得到UNKNOWN值。例如,给出的谓语NOT(salary>0),当salary(工资)为NULL时,salary>0的结果为UNKNOWN,并且NOT UNKNOWN仍是UNKNOWN。比较两个NULL标记(NULL=NULL)结果也是UNKNOWN。因此SQL提供了IS NULL和IS NOT NULL来比较NULL。看几个例子:

SELECT custid, country, region, city 
FROM Sales.Customers 
WHERE region = N'WA';

    执行上面的SQL既不会返回region不是WA的行,也不会返回region为NULL的行。

SELECT custid, country, region, city 
FROM Sales.Customers 
WHERE region <> N'WA';

    执行上面的SQL既不会返回region属性等于WA的行,也不会返回region为NULL的行。

SELECT custid, country, region, city 
FROM Sales.Customers 
WHERE region = NULL;

    执行上面的SQL什么都不会返回,因为region为NULL的行与NULL比较会得到UNKNOWN,而查询筛选只支持TRUE。

SELECT custid, country, region, city 
FROM Sales.Customers 
WHERE region IS NULL;

    执行上面的SQL会返回region为NULL的行。

SELECT custid, country, region, city 
FROM Sales.Customers 
WHERE region <> N'WA' OR region IS NULL;

    执行上面的SQL会返回region不是WA的和region是NULL的行。

    注意,对于分组和排序,两个NULL表示被视为相等。即GROUP BY将所有NULL分成一组,ORDER BY也将所有NULL排序在一起,标准SQL将NULL标记在现值之前排序,还是之后排序留给了产品实施,T-SQL是在现值之前对NULL标记排序。

    为了强制执行UNIQUE约束,标准SQL将NULL标记视为彼此不同。相反地,T-SQL在UNIQUE约束中认为NULL标记是相等的。

同时操作

    SQL支持一个称作同时操作的概念,意思是出现在同意逻辑处理阶段的所有表达式在同一时间点进行逻辑计算,例如:

SELECT col1, col2 
FROM dbo.T1 
WHERE col1 <> 0 AND col2/col1 > 2

    这是关于同时操作的一个例子,希望返回col2/col1>2的所有行。因此有可能表中行col1是等于0的,不可以将0做除数,所以在col2/col1 > 2之前判断col1<>0,如果col1为0那么表达式会短路。

    遗憾的是,SQL Server不支持短路,它基于标准SQL的同事操作概念,SQL Server可以按任意顺序自由处理WHERE子句中的表达式。所以如果先执行了col2/col1>2这个表达式,而col1为0,那么就会导致执行失败。

    有几种方法可以避免同时操作导致执行失败。例如,CASE表达式中的WHEN子句的计算顺序是有保证的,可以按如下方式修改:

SELECT col1, col2 
FROM dbo.T1 
WHERE 
	CASE
		WHEN col1 = 0 THEN 'no'
		WHEN col2/col1 > 2 THEN 'yes'
		ELSE 'no'
	END = 'yes'

    或者使用数据方法来避免除以零的错误:

SELECT col1, col2 
FROM dbo.T1 
WHERE (col1 > 0 AND col2 > 2 * col1) OR (col1 < 0 AND col2 < 2 * col1);

 

转载于:https://my.oschina.net/u/2450666/blog/784990

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108793.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • bzero 函数_readdir函数

    bzero 函数_readdir函数文章属属于转载:转载地址不详bzero  原型:    externvoid bzero(void*s,intn);头文件:    #include功能:置字节字符串s的前n个字节为零。    说明:bzero无返回值。

    2022年10月11日
    3
  • 进程调度算法c语言实现_进程调度算法有哪些

    进程调度算法c语言实现_进程调度算法有哪些对一个非抢占式多道批处理系统采用以下算法的任意两种,实现进程调度,并计算进程的开始执行时间,周转时间,带权周转时间,平均周转时间,平均带权周转时间1.先来先服务算法2.短进程优先算法*3.高响应比优先算法三、设计思想每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。进程的优先数及需要的运行时间…

    2022年9月29日
    1
  • 微信模拟地理位置_微信伪装地理位置是什么个原理「建议收藏」

    微信模拟地理位置_微信伪装地理位置是什么个原理「建议收藏」展开全部微信的定位数据来源主要有,基站定位、GPS定位。原理主体为:通过劫持代码关闭636f70793231313335323631343130323136353331333366306537从基站获取位置程序运行,伪造CELLID伪造WIFIMAC地址通过Xposed模块进行模拟地理位置、基站信息并上传伪装信息到微信客户端进行系统欺骗进而达到伪装地理位置的目的。扩展资料:微信定位功能实践上…

    2022年6月13日
    34
  • MATLAB画折线图时自定义颜色

    MATLAB画折线图时自定义颜色有很多种数据的时候,MATLAB提供的颜色不够用,这里有一个可以自定义线条颜色并配置不同图例的MATLAB示例clear;clc;closeall;x=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21];y1=rand(1,21);y2=rand(1,21);y3=rand(1,21);y4=rand(1,21);y5=rand(1,21);y6=rand(1,21);y7=

    2022年6月8日
    157
  • 我的相册新增元旦照片二十余张(共享万岁)

    我的相册新增元旦照片二十余张(共享万岁)Chinaphotoshop.Net 2006年年历样张(以前用C#写的) 世界之窗1

    2022年7月17日
    23
  • 相贯线的绘制_cad怎么画相贯线

    相贯线的绘制_cad怎么画相贯线一、概述两立体表面的交线称为相贯线,见图5-14a和b所示的三通管和盖。三通管是由水平横放的圆筒与垂直竖放的带孔圆锥台组合而成。盖是由水平横放的圆筒与垂直竖放的带孔圆锥台、圆筒组合而成。它们的表面(外表面或内表面)相交,均出现了箭头所指的相贯线,在画该类零件的投影图时,必然涉及绘制相贯线的投影问题。讨论两立体相交的问题,主要是讨论如何求相贯线。工程图上画出两立体相贯线的意义,在于用它来完善、清晰地…

    2022年9月16日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号