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. SystemTap - 安装

    按照SystemTap Beginners Guide的Installation and Setup部分安装了SystemTap,没想到竟然还有点曲折,在这里纪录一下. 环境 Linux发行版本:Ce ...

  2. 洛谷.4114.Qtree1(树链剖分)

    题目链接 模板题都错了这么多次.. //边权赋到点上 树剖模板 //注意LCA.链的顶端不能统计到答案! #include <cstdio> #include <cctype> ...

  3. 在deepin中安装docker

    用往常方法安装 一般在Linux中安装docker的时候都会使用这条命令 wget -qO- https://get.docker.com/ | sh 而在deepin这么做缺不行 打开网址即可发现支 ...

  4. [CC-PERMUTE]Just Some Permutations 3

    [CC-PERMUTE]Just Some Permutations 3 题目大意: \(T(T\le10^5)\)次询问,每次询问有多少长度为\(n(n\le10^6)\)的排列,满足任意相邻两个数 ...

  5. JUnit accuracy/failure/stress test区别

    accuracy test(结果准确性测试) 例如,Assert.assertEquals(expected, actual). 如果结果不符合期望则产生failure.说明程序逻辑有问题. fail ...

  6. IE6的3像素bug

    IE6的3像素bug3像素bug是IE6的一个著名的bug,当浮动元素与非浮动元素相邻时,这个3像素的Bug就会出现.看下面这个左列固定,右列液态的例子,css代码如下: body { margin: ...

  7. orm Lite的使用

    1.什么是ORM Lite orm Lite(Object Relationanl Mapping Lite)是一种用于持久化保存java对象的框架,相对于标准的ORM包来说. 2. Demo ●声明 ...

  8. Revit API创建房间

    start [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] );             ...

  9. 关于Revit API修改元素参数的问题?

    >ADN: DEVR3894  >ADN service level: Professional  >产品:Revit MEP 2012  >版本:2012  >语言:中 ...

  10. CentOS禁止packagekit离线更新服务的办法

    以CentOs7为例,以root身份登录系统,然后执行以下命令: [root@localhost ~]# systemctl disable packagekit-offline-update.ser ...