1,查询的顺序

SELECT empid, YEAR(orderdate) AS orderyear, COUNT(*) AS numorders
FROM Sales.Orders
WHERE custid = 71
GROUP BY empid, YEAR(orderdate)
HAVING COUNT(*) > 1
ORDER BY empid, orderyear;

上面的语句执行的逻辑顺序如下:

1. FROM
2. WHERE
3. GROUP BY
4. HAVING
5. SELECT
6. ORDER BY

解释如下:

1. Queries the rows from the Sales.Orders table
2. Filters only orders where the customer ID is equal to 71
3. Groups the orders by employee ID and order year
4. Filters only groups (employee ID and order year) having more than one order
5. Selects (returns) for each group the employee ID, order year, and number of orders
6. Orders (sorts) the rows in the output by employee ID and order year

2,列名的别名

有三种定义别名的方法,推荐AS的写法。

1)<expression> AS <alias>

2) <alias> = <expression> (“alias equals expression”)

3)and <expression> <alias> (“ex-pression space alias”)

由于SELECT语句执行顺序靠后,列的别名不能用于Where语句,下面的语句错误

SELECT orderid, YEAR(orderdate) AS orderyear
FROM Sales.Orders
WHERE orderyear > 2006;

列的别名同样不能用于SELECT语句之间作为前后引用,下面的语句错误

SELECT orderid,
YEAR(orderdate) AS orderyear,
orderyear + 1 AS nextyear
FROM Sales.Orders;

3,ORDER BY 语句

1)ORDER BY的字段可以不出现在SELECT语句中

2)SELECT语句中有DISTINCT的话,ORDER BY的字段必须在SELECT中,下面的语句错误

SELECT DISTINCT country
FROM HR.Employees
ORDER BY empid;

4,TOP 语句

1)TOP可以指定PERCENT,返回所有记录的百分比

SELECT TOP (1) PERCENT orderid, orderdate, custid, empid
FROM Sales.Orders
ORDER BY orderdate DESC;

2)TOP后加入WITH TIES选项的话,会返回具有相同ORDER顺序的所有记录,而不仅限于top数。

SELECT TOP (5) WITH TIES orderid, orderdate, custid, empid
FROM Sales.Orders
ORDER BY orderdate DESC;
This query returns the following output.
orderid orderdate custid empid
----------- ---------------------------- ----------- -----------
11077 2008-05-06 00:00:00.000 65 1
11076 2008-05-06 00:00:00.000 9 4
11075 2008-05-06 00:00:00.000 68 8
11074 2008-05-06 00:00:00.000 73 7
11073 2008-05-05 00:00:00.000 58 2
11072 2008-05-05 00:00:00.000 20 4
11071 2008-05-05 00:00:00.000 46 1
11070 2008-05-05 00:00:00.000 44 2

5,OFFSET FETCH 语句

这个语句在SQLSERVER2012中新添加,可以跳过某些行取需要的数据,并且这是标准SQL的一部分,这对于分页来说是极大的福音。

SELECT orderid, orderdate, custid, empid
FROM Sales.Orders
ORDER BY orderdate, orderid
OFFSET 50 ROWS FETCH NEXT 25 ROWS ONLY;

6,运算符的优先级

1. ( ) (Parentheses)
2. * (Multiplication), / (Division), % (Modulo)
3. + (Positive), – (Negative), + (Addition), + (Concatenation), – (Subtraction)
4. =, >, <, >=, <=, <>, !=, !>, !< (Comparison operators)
5. NOT
6. AND
7. BETWEEN, IN, LIKE, OR
8. = (Assignment)

7,Case When语句

1)简单的Case表达式(simple CASE expression)

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 'Unknown Category'
END AS categoryname
FROM Production.Products;

2)检索的CASE表达式(searched CASE expression)

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;

简单的Case表达式可以用第二种Case表达式替换,反过来就不行。

另外,Case表达式可以用下面的函数替代。

ISNULL:SQL SERVER 特有的函数

select isnull(id, null) from test

COALESCE:COALESCE是标准SQL的一部分,可以计算多个值,返回第一个不为Null的值,功能比ISNULL强大,推荐使用。

select coalesce(id, name,null) from test

8,Null标记

1)SQL中采用3值逻辑,TRUE, FALSE, or UNKNOWN。

条件表达式会被计算成这3个值的一种,而Null会被计算成UNKNOWN。UNKNOWN的值再参与计算结果依然是UNKNOWN。对于Where语句,只会返回值为True的记录,False和UNKNOWN都不会返回,也就是NULL数据默认不返回。

2)如果要处理NULL的数据,条件中要用 IS NULL,IS NOT NULL来判断,这样计算的结果才是TRUE或FALSE。

9,同时操作(all-at-once operations)

同一语句块的字段,条件是同时计算的,没有先后顺序。

试图在同一语句块,进行前后引用,或是有顺序依赖的,都将失败。

下面的例子会失败,select字段间不能依赖,where中的col2/col1依然会被计算,col1为0会出异常,sql中没有短路运算。

SELECT
orderid,
YEAR(orderdate) AS orderyear,
orderyear + 1 AS nextyear
FROM Sales.Orders;
SELECT col1, col2
FROM dbo.T1
WHERE col1 <> 0 AND col2/col1 > 2;

case可以顺序执行,可以通过case来改写上面的第二个例子

SELECT col1, col2
FROM dbo.T1
WHERE
CASE
WHEN col1 = 0 THEN 'no' -- or 'yes' if row should be returned
WHEN col2/col1 > 2 THEN 'yes'
ELSE 'no'
END = 'yes';

或者是,改写除法为乘法,避免0除错误

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

备注:内容主要来自《SqlServer2012基础查询》(英文版)的学习笔记,部分内容保留英文摘要。

T-SQL基础查询——单表查询的更多相关文章

  1. mysql 基础入门 单表查询

    单表查询 select 表头,表头 as 别名 ,表头(+-*/的运算) from table_a 1.条件查询 where + 条件 <> , != 不等于 = 等于,也可以表示字符串值 ...

  2. 2.1 Oracle之DML的SQL语句之单表查询以及函数

    1.SQL简介 对于不同的数据库来说,SQL语句是相通的,关系型数据库都以SQL语句为操作的标准,只是相应的数据库对应的函数不相同. SQL(Structured Query Language,结构化 ...

  3. SQL Merge 语法 单表查询

    --项目中需要用到Merg语法,于是去网上查了资料,发现竟然都是多表查询,问题是我只有一张表,于是我纳闷了,后来我灵机一动,就搞定了!--表名:t_login(登录表)--字段:f_userName( ...

  4. T-SQL基础(2) - 单表查询

    开窗函数over select orderid, custid, val, SUM(val) over() as totalvalue, SUM(val) over(partition by cust ...

  5. 65、django之模型层(model)--添加、单表查询、修改基础

    上篇带大家简单做了一下图书表的创建.简单的查看和删除,今天会先简单介绍添加和修改,因为添加和修改与删除一样都很简单,本篇会相对多介绍一点单表查询,大家都知道数据库中查询是最重要的一部分,毕竟无论是修改 ...

  6. django之模型层(model)--添加、单表查询、修改基础

    上篇带大家简单做了一下图书表的创建.简单的查看和删除,今天会先简单介绍添加和修改,因为添加和修改与删除一样都很简单,本篇会相对多介绍一点单表查询,大家都知道数据库中查询是最重要的一部分,毕竟无论是修改 ...

  7. sql多表查询(单表查询略过)

    表library: 表borrow: 表reader: 1.等值连接:(常用) 原理:将多张表组合成一个逻辑大表,即字段相加记录相乘(笛卡尔积). 语法:select * from 表A,表B whe ...

  8. python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

    12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...

  9. SQL语句基础之 单表查找

    Sql语句之 单表查询 一.一般查询 1.查看表中的所有记录 以及 所有字段(属性) 语句 : select * from student; 2.只查看某些字段 语句:select sname,sex ...

随机推荐

  1. 在网站中使用Bing Translator插件翻译文章。

    前一阵子给项目增加了翻译的功能,用的是Bing Translator Widget,今天看见有个兄弟写自定义自己的博客,我就尝试着把这个插件加到了自己的博客中.还真的好用.大家先看下效果,觉得好的请继 ...

  2. babel和postcss引起的一点儿思考

    写es6,一般都会用到babel,它能把es6转为更好的es5,而es5可以直接在浏览器上运行.postcss是css界的babel,它可以把css转为更好的css,比如autoprefixer,让不 ...

  3. AGC 027C.ABland Yard(拓扑/二分图)

    题目链接 \(Description\) 给定一张图(可能存在自环),每个点上有A或B.求是否存在一条路径,使得在上面不断走,能够得到所有AB串组合(可以重复经过点). \(n\leq2\times1 ...

  4. [Astar2008]Black-Whilte-Tree

    Description: 你拥有一棵有 N 个结点白色的树--所有节点都是白色的. 接下来,你需要处理 C 条指令: 1.修改指令:改变一个给定结点的颜色(白变黑,黑变白); 2.查询指令:询问从结点 ...

  5. 一些公司的面试题目 U3D

    #include <iostream> using namespace std; int main() { int N; while (cin>>N&&N> ...

  6. JDBC(5)—DatabaseMetaData

    1.简介: 使用元数据已实现通用的查询方法.元数据介绍:使用jdbc获得连接之后,得到一个Connection对象,可以通过这个对象获得DataBaseMetaData对象,该对象可以获得有关数据库管 ...

  7. __Linux__文件和目录

    Linux 目录 /:根目录,一般根目录下只存放目录,在Linux下有且只有一个根目录.所有的东西都是从这里开始.当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录)开始,再进入到ho ...

  8. dhtmlxTreeGrid

    最终效果(只添加了一级子树,可以根据需求增加级数,方法在后面). HTML和js代码 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Tran ...

  9. 在C#中对枚举进行位运算--枚举组合

    由于枚举的基础类型类型为基本的数值类型,支持位运算,因此可以使用一个值表示多个枚举的组合,在定义枚举时需要指定枚举数为2的幂指数方便进行位运算,即枚举数为1,2,4,8…,或1,1<<1, ...

  10. VS2013中Python学习笔记[环境搭建]

    前言 Python是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色 ...