Microsoft SQL SERVER 2008技术内幕 T-SQL语言基础(上)(学习笔记)

图片 38

6、表达式(开窗函数
聚合函数
等等)

2.1.7 TOP 选项

TOP选项是T-SQL特有的,用于限制查询返回的行数或百分比。

--Top选项练习
SELECT TOP(5) orderid,orderdate,custid,empid
    FROM Sales.Orders
    ORDER BY orderdate DESC;

注意:当在查询中指定了TOP以后,ORDER
BY子句就会起到双重作用。首先,作为select处理阶段一部分的top选项要依靠order
by子句先为各个行定义他们的逻辑优先顺序,在这种优先顺序的基础上再去过滤其他请求。其次,作为select处理阶段之后的order
by阶段,与为了展示数据而对行进行排序的order by子句完全一样。

2016年6月18日

5、Select (表达式)

第一章 T-SQL查询和编程基础

图片 1

 

2.6.3.7 REPLICATE函数

REPLICATE函数以指定的次数复制字符串值。
语法:

REPLICATE(string,n)

Single-relation queries 单表查询

Multi-relation queries 多表查询

Subqueries 子查询

Grouping and Aggregation 分组和聚集

8、ORDER BY 

第二章 单表查询

举例:

9、TOP/OFFSET-FETCH

3.1.2 ANSI SQL-89语法(不支持使用)

跟上面的代码相似,就是把Cross Join改成了逗号联接。结果是一样的。

图片 2

图片 3

Main SQL
增删改查

4、Having(分组  谓词筛选 )

3.3.2 不等联接

Patterns 字符串匹配问题

7、Distinct(去重复)

3.4 外联接

  外联接会应用内联接所应用的两个逻辑处理步骤(笛卡尔积和ON过滤),此外还多加一个外联接特有的第三步:添加外部行。
  外联接的第三个逻辑查询处理步骤就是要识别保留表中按照ON条件在另一个表找不到与之匹配的那些行,再把这些行添加到联接的前两个步骤生成的结果表中;对于来自联接的非保留表的那些列,追加的外部行中的这些列用NULL作为占字符。

使用谓词 IN <值表>, NOT IN <值表>

1、From (告诉程序 来自哪张表  如果是表表达式 依旧是如此顺序)

2.6.3.3 LEN和DATALENGTH函数

LEN函数返回输入字符串中的字符数。
语法:

LEN(string);

普通字符字节数与字符数是相同的;而对于Unicode字符,每个字符需要两个字节的存储空间,因此,字符串的字符数是字节数的一半。如果要得到字节数,则应该使用DATALENGTH函数;
  LEN和DATALENGTH函数的另一个区别是:前者不包含尾随空格,而后者包含尾随空格

10.ANY and
ALL Operator

3、Group by(分组)

入门心法:要练此功,先废其功。(先忘记已学的其他语言,用T-SQL来思考。)
所需代码:https://github.com/956159241/Microsoft-SQL-Server-2008-T-SQL-Fundamentals

图片 4

图片 5

图片 6

 

 数据库复习⑦摘要: DDL、DML、Views视图

style=”color: #ff0000;”>数据库复习⑦友情链接:http://www.cnblogs.com/zpfbuaa/p/5596903.html

2、Where(条件筛选 
谓词筛选 )

1.2.1 SQL Server实例

图片 7

图片 8

一个SQL
语句的执行顺序

1.1 理论背景

SQL——Structured Query
Language,它是为查询和管理关系型数据库管理系统(RDMS)中的数据而专门设计的一种标准语言。
  语言的独立性——关系模型是独立于语言的,例如C#的类模型。

带有EXISTS谓词的子查询

第三章 联接查询

6.Grouping
分组

3.3.3 多表联接

举例:

第三章 联接查询

 图片 9

图片 10

图片 11

图片 12

图片 13

图片 14

2.6.3.1 SUBSTRING函数

SUBSTRING函数用于从字符串中提取子串。
语法:

SUBSTRING(string,start,length)

图片 15

图片 16

1.1.3 谓词逻辑(Predicate Logic)

关系模型的数学基础——谓词逻辑。
  不严格的说,谓词就是用来刻画事物是否具有某种性质或满足某种表达式条件的一个词项用于维护数据的逻辑完整性和定义它的结构,谓词也可以用于对数据进行过滤以定义其子集等多种应用场合。

18:16

1.2.3 架构(Schema)和对象

单表查询相对于多表查询属于最基本的查询操作。

可以在SELECT语句中选择结果表的属性列以及使用别名甚至使用集函数、由于表只有一个因此在FROM语句中只要写上表名即可、在WHERE语句中可以使用AND关键字来进行多项判断和筛选、在GROUP
BY语句中可以选择某一个属性列进行分组、在ORDER BY语句进行排序选择。

2.6.2 排序规则(Collation)

排序规则是字符数据的一个属性,封装了几个方面的特征,包括多语言支持(和Unicode类型有关,因为它支持所有语言)、排序规则、区分大小写、区分重音,等等。

图片 17

此时,大小写并不匹配。

图片 18

--排序规则,区分大小写
SELECT empid,firstname,lastname
FROM HR.Employees
WHERE lastname COLLATE Latin1_General_CS_AS = N'davis';

当区分大小写时,没有匹配的数据,故没有数据被查出来。

数据库复习⑥

1.1.1 SQL

Set
operator: in

3.1.3 自交叉联接

对同一个表的多个实例也可以进行联接,这种功能就是所谓的自联接(self-join),所有基本联接类型(交叉联接、内联接,以及外联接)都支持自联接。

--3.1.3 自交叉联接
SELECT
    E1.empid,E1.firstname,E1.lastname,
    E2.empid,E2.firstname,E2.lastname
FROM HR.Employees AS E1
    CROSS JOIN HR.Employees AS E2;

执行结果:

图片 19

图片 20

图片 21

所有的聚合函数都会忽略NULL,只有一个例外——COUNT(*)。

如果只想处理不重复的已知值,可以在聚合函数的圆括号中指定DISTINCT关键字。
例如:

--DISTINCT的使用
SELECT
    empid,
    YEAR(orderdate) AS numcusts,
    COUNT(DISTINCT custid) AS numcusts
FROM Sales.Orders
GROUP BY empid,YEAR(orderdate)

图片 22

图片 23

图片 24

图片 25

图片 26

图片 27

图片 28

图片 29

1.2.1 SQL Server实例

SQL Server实例是指安装的一个SQL
Server数据库引擎/服务。在同一台计算机上可以安装多个实例(补充:但是需要不同的实例名)。

8.Multi-Relation Queries 多表查询

2.1.1 FROM 子句

1.如何修改架构名

图片 30

修改架构名

  首先确定该架构已经存在。
架构名更改方式:
批量修改:
EXEC sp_MSforeachtable 'exec sp_changeobjectowner ''?'',''dbo'' '
单个修改:
EXEC sp_changeobjectowner '要改的表名','dbo'
如果想修改存储过程Owner:
先把–and xtype=’p’ 反注释,再创建sp_changeobjectowner 存储过程。
然后执行:EXEC sp_changeobjectowner 'CurrentOwner','dbo'

2.创建一个简单的查询

--简单的查询
SELECT orderid,custid,empid,orderdate,freight 
    FROM Sales.Orders;

查询结果:

图片 31

  看起来似乎是以特定的顺序返回(以orderid的升序排列)的,但不能保证绝对这样。

如果名称中嵌入了空格或其他特殊字符,就必须分隔这样的标识符。

  • ANSI SQL标准:“Order Details”
  • SQL Server的特殊格式:[Order Details]

5.Aggregation
集函数

2.1.5 SELECT 子句

T-SQL允许查询返回没有名称的结果集列,但关系模型不允许这样。
注意:选择Sales.Orders表的orderid和orderdate列,结果不小心,忘记了在两个列名之间加一个逗号,如下:

select orderid orderdate
from Sales.Orders;

这一查询在语法上是有效的,意思是说你想将orderid列的别名定义为orderdate,得到输出只有一列包含订单ID的列,其别名为orderdate。要查出这样的bug可能是很难的
  SELECT子句是在FROM、WHERE、GROUP
BY以及HAVING子句后处理的。这意味着对于SELECT子句之前处理的那些子句,在SELECT子句中为表达式分配的别名并不存在。
  为了确保select语句执行的结果中行的唯一性,SQL提供的方法就是使用DISDINCT子句来删除重复的行。

4.三种逻辑值 TRUE =
1 , FALSE = 0 , UNKNOWN = 1/2

2.6.1 数据类型

SQL
Server支持两种字符数据类型——普通字符和Unicode字符。普通字符数据类型包括CHAR和VARCHAR,Unicode字符数据类型包括NCHAR和NVARCHAR。

7.HAVING
字句

1.3.1 创建表

SUM求和函数、AVG求平均值函数、COUNT计数函数、MIN最小值函数、MAX最大值函数、COUNT(*)元组个数

1.2.2 数据库

9.Subqueries
子查询

1.1.2 集合论

AND = MIN ; OR = MAX ; NOT(x) = 1-x

2.2 谓词和运算符

T-SQL 有几种不同的语言元素可以指定逻辑表达式,例如,查询过滤器(WHERE 和
HAVING)、CHECK约束,等等。在逻辑表达式中可以使用各种谓词,T-SQL支持的谓词包括IN、BETWEEN以及LIKE等。

扩展:

  • 执行where子句查找符合条件的数据;
  • 使用group by 子句对数据进行分组;对group by
    子句形成的组运行聚集函数计算每一组的值;最后having
    子句去掉不符合条件的组。
  • having
    子句中的每一个元素也必须出现在select列表中。有些数据库例外,如oracle.
  • having子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限制。
  • having子句限制的是组,而不是行。where子句中不能使用聚集函数,而having子句中可以。

IN这个谓词用于检查一个值(或标量表达式)是否与一组元素中的至少一个相等。

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

BETWEEN
这个谓词用于检查一个值是否在指定的范围内,包括两个指定的边界值。

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

LIKE这个谓词用于检查一个字符串值是否与指定的模式匹配(如上代码)
  在’%D%’前加N,代表国际化(National)用于表示字符串是Unicode数据类型(NCHAR或NVARCHAR)

运算符

图片 32

优先级

图片 33

图片 34

  由上两图很明显看出AND的优先级高于OR。

NOT BETWEEN …AND…

3.1.1 ANSI SQL-92语法

2.Queries
查询

3.3.1 组合联接

DDL(Data Definition Language)数据定义语言

Query Language 数据查询语句

DML(Data Manipulation language)数据操纵语言

DCL(DataControl language)数据控制语言

2.1.6 ORDER BY 子句

ORDER BY
子句用于展示数据时对输出结果中的行进行排序。从逻辑查询处理来看,ORDER
BY是最后处理的一个子句。

--ORDER BY 子句练习
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;

理解SQL最重要的一点就是要明白表不保证是有序的,因为表示为了代表一个集合(如果有重复项,则是多集),而集合是无序的。
  事实上,ORDER BY 是唯一能够引用SELECT
处理阶段创建的别名列的阶段,因为它是唯一一个在SELECT阶段之后被处理的阶段。

T-SQL支持在ORDER
BY子句中指定没有在SELECT子句中出现过得元素,也就是说,排序依据的列并不一定必须要在输出返回的列中选取。
  但是,当指定了DISTINCT以后,ORDER BY
子句就被限制为只能选取在SELECT列表中出现的那些元素。

图片 35

图片 36

2.6.1 数据类型

子查询返回一个结果表Subqueries that return one Tuple

通常该返回表只有一个属性列Usually, the tuple has one component

如果不止一个属性列则会产生运行时错误A run-time error occurs if there
is no tuple or more than one tuple

子查询中不可以使用ORDER BY

带有IN的子查询:循环元组,当该元组的值在返回表中时输出到结果表中

2.7处理日期和时间数据

Range
comparison:between

目录

3.Select-From-Where
Statements

2.3 CASE 表达式

CASE表达式是一个标量表达式,它基于条件逻辑来返回一个值。
CASE表达式有两种格式:简单表达式和所搜表达式。CASE简单格式将一个值(或一个标量表达式)与一组可能的取值进行比较,并返回第一个匹配的结果。
例一:

--CASE表达式
SELECT productid,productname,categoryid,
    CASE categoryid
        WHEN 1 THEN '1Bevagrages'
        WHEN 2 THEN '2COmmo'
        WHEN 3 THEN '3HHHH'
        WHEN 4 THEN '4Bagrages'
        WHEN 5 THEN '5Bevagages'
        WHEN 6 THEN '6agrages'
        WHEN 7 THEN '7grages'
        WHEN 8 THEN '8ages'
        ELSE    'unkown'
    END AS categoryname
FROM Production.Products;

图片 37

根据categoryid来定义名字

例二:

--CASE表达式2
SELECT orderid,custid,val,
   CASE NTILE(3) OVER(ORDER BY val)
   WHEN 1 THEN 'LOW'
   WHEN 2 THEN 'Medium'
   WHEN 3 THEN 'High'
   END AS titledesc 
FROM Sales.OrderValues
ORDER BY val;

NTILE()函数把记录结果集分成N部分
NTILE(3)将查询结果分成三部分。

CASE搜索表达式返回结果为TRUE的第一个WHEN逻辑表达式所关联的THEN子句中指定的值:

SELECT orderid,custid,val,
    CASE
        WHEN val < 1000.00  THEN 'Less then 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;

图片 38

2.5 同时操作(All-At-Once Operation)

SQL支持一种所谓的同时操作的概念,其含义是认为在同一逻辑查询处理阶段中出现的所有表达式都是同时进行计算的。
  从逻辑上来说,SELECT列表中各表达式的计算是没有顺序的——它们只是一组表达式。在逻辑上SELECT列表中的所有表达式都是在同一时刻进行计算的。

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

如果表达式col1<>0的结果为FALSE,SQL
Server将会按照“短路(short-circuit)求值”的原则,停止计算这个表达式。
  在ANSI SQL 中有“同时操作的这么个概念,所以SQL
Server可以按它喜欢的任意顺序来自由地处理WHERE子句的表达式。

语句格式:

SELECT [ ALL | DISTINCT ] <目标列表达式> [
,<目标列表达式> ]…

FROM <表名或视图名> [ ,<表名或视图名> ]…

[ WHERE <条件表达式> ]

[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]

[ ORDER BY <列名2> [ASC|DESC]]

解释:(1)上面中括号中的内容为选择内容,可以有也可以没有,注意前面有一个逗号”,”

             (2)WHERE语句里面不能有集函数,同时WHERE语句可以省略;

             (3)GROUP BY 语句用来进行分组,后面的HAVING
语句可以包括集函数,用来进行判断;

             (4)ORDER
BY语句用来进行排序,排序操作实际上是在查询结束之后进行的,默认为ASC
递增排序,也可以选择DESC为递减排序;

             (5)SQL查询语句对字母大小写不敏感,因此Select
和SELECT均可以被识别,不过建议使用大写;

             (6)GROUP BY语句应该在WHERE语句之后,其实GROUP
BY语句应该在查询语句的最后面,由于ORDER
BY语句不属于查询语句了,因此可以放在ORDER BY 之前;

             
(7)尽管SELECT语句放在查询语句的最前面但是其执行为最后的,也就是在GROUP
BY语句之后,因此在GROUP BY语句内不能使用SELECT 语句里面的别名;

              (8)SELECT 语句中的ALL
与DISTINCT对应的是:查询结果保留重复、查询结果不包括重复;

              (9)SELECT 语句是用来选择属性列,不过可以使用*
操作符可以选择出表中的所有属性列。

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图