日期:2014-05-18 浏览次数:20618 次
基于SQL SERVER的查询和优化
一、 逻辑查询处理
逻辑查询处理的各个阶段
(5) SELECT (5-2) DISTINCT (5-3) TOP(top_specification)(5-1)(select_list)
(1) FROM(1-J)<left_table><join_type> join<right _table> on <on_predicate>
(1-A) < left_table><apply_type> apply<right_table_expression> AS<alias>
(1-P) < left_table>PIVOT(<piovt_specification>) AS <alias>
(1-U) < left_table>UNPIVOT(<unpiovt_specification>) AS <alias>
(2) WHERE <where_predicate>
(3)GROUP BY<group_by_specification>
(4)HAVING(having_predicate>
(6)ORDER BY<order_by_list>;
示例:
IF OBJECT_ID('dbo.Orders') IS NOT NULL DROP TABLE dbo.Orders;
IF OBJECT_ID('dbo.Customers') IS NOT NULL DROP TABLE dbo.Customers;
GO
CREATE TABLE dbo.Customers
(
customerid CHAR(5) NOT NULL PRIMARY KEY,
city VARCHAR(10) NOT NULL
);
CREATE TABLE dbo.Orders
(
orderid INT NOT NULL PRIMARY KEY,
customerid CHAR(5) NULL REFERENCES Customers(customerid)
);
GO
INSERT INTO dbo.Customers(customerid, city) VALUES('FISSA', 'Madrid');
INSERT INTO dbo.Customers(customerid, city) VALUES('FRNDO', 'Madrid');
INSERT INTO dbo.Customers(customerid, city) VALUES('KRLOS', 'Madrid');
INSERT INTO dbo.Customers(customerid, city) VALUES('MRPHS', 'Zion');
INSERT INTO dbo.Orders(orderid, customerid) VALUES(1, 'FRNDO');
INSERT INTO dbo.Orders(orderid, customerid) VALUES(2, 'FRNDO');
INSERT INTO dbo.Orders(orderid, customerid) VALUES(3, 'KRLOS');
INSERT INTO dbo.Orders(orderid, customerid) VALUES(4, 'KRLOS');
INSERT INTO dbo.Orders(orderid, customerid) VALUES(5, 'KRLOS');
INSERT INTO dbo.Orders(orderid, customerid) VALUES(6, 'MRPHS');
INSERT INTO dbo.Orders(orderid, customerid) VALUES(7, NULL);
--SELECT * FROM dbo.Customers;
--SELECT * FROM dbo.Orders;
SELECT
C.customerid, COUNT(O.orderid) AS numorders
FROM
dbo.Customers AS C
LEFT OUTER JOIN
dbo.Orders AS O
ON
C.customerid = O.customerid
WHERE
C.city = 'Madrid'
GROUP BY
C.customerid
HAVING
COUNT(O.orderid) < 3
ORDER BY
numorders;
这句话是什么意思?
---查询来自Madrid的并且订单少于3个的客户
? 步骤1:FROM阶段
? 步骤1-J1:执行笛卡尔积
? 步骤1-J2:应用ON筛选器(三值逻辑)
? 步骤1-J2:添加外部行
? 步骤2:where 阶段
? 步骤3:group by 阶段
? 步骤4:having 阶段
? 步骤5:select 阶段
? 步骤5-1 计算表达式
? 步骤5-2 应用distinct 子句
? 步骤5-3 应用 top选项
? 步骤6:排序用的order by 阶段
三值逻辑:
? 在SQL中逻辑表达式的取值为TRUE,FALSE,UNKNOWN.
? SQL中的UNKNOWN逻辑值通常出现在涉及NULL值的逻辑表达式中。
? UNKNOWN的反面(NOT KNOWN)是什么?
? 所有的查询筛选器(on,where,having)都把UNKOWN当做FALSE来处理。CHECK约束中的UNKNOWN值实际上被当做TRUE对待.
? 在筛选器中比较两个null 值将得到unkown,而unkown按false来处理,就好像其中这两个null不相等一样.
? 另一方面,在unique约束,集合运算,以及排序和分组操作中,认为两个null是相等的。
? 如果表中有一列定义了unique约束,将无法向表中插入该列值为null的两行.
? GROUP BY和ORDER BY 子句会将所有NULL值分到一组.
? 当比较两个集合中的行时,集合运算符认为不同的NULL 值是相等的.
? (1)表运算符
Apply
1.A1:把右表表达式应用于左表的行.
2.A2:添加外部行.
Pivot
1. P1 分组
2. P2 扩展
3. P3 聚合
Unpivot
1 U1 生成副本
2 U2 提取元素
3 U3 删除带有NULL的行
OVER子句(顺便讲讲排名函数)
? (2)集合运算符
UNION ALL
UNION
EXCEPT
INTERSERT