本篇博文,作為SQL查詢性能優化的基礎,只針對查詢流程深入剖析其來龍去脈。 ...
註意:筆者經過實驗和查閱資料,已在原作基礎上做了部分更改。更改不代表原作觀點,查看原作請點擊下方鏈接。
原文出處:
作者:張龍豪
鏈接:http://www.cnblogs.com/knowledgesea/p/4177830.html
前言
資料庫的查詢執行,毋庸置疑是程式員必備技能之一,然而資料庫查詢執行的過程絢爛多彩,卻是很少被人瞭解,今天哥哥要帶你裝逼帶你飛,深入一下這sql查詢的來龍去脈,為查詢的性能優化處理打個基礎,或許面試你也會遇到,預防不跪還是看看吧。
這篇博客,摒棄查詢優化性能,作為其基礎,只針對查詢流程講解剖析。
本片博客闡述的過程為
1、上一個標識過的sql語句,展示查詢執行的流程
2、上一個流程圖
3、做一個例子逐步深入分析,幫助理解
4、做一個裝逼的總結
sql查詢語句的處理步驟,代碼清單
--查詢組合欄位
select (6)distinct (8)top(<top_specification>)(5)<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 (<pivot_specification>) as <alias>
(1-U)<left_table> unpivot (<unpivot_specification>) as <alias>
--查詢條件
(2)where <where_pridicate>
--分組
(3)group by <group_by_specification>
--分組條件
(4)having<having_predicate>
--排序
(7)order by<order_by_list>
說明:
1、順序為有1-8,8個大步驟,1-J,1-A,1-P,1-U,為並行次序。如果不夠明白,接下來我在來個流程圖看看。
2、執行過程中也會相應的產生多個虛擬表(下麵會有提到),以配合最終的正確查詢。
sql查詢語句的處理步驟,流程圖
註:上述流程圖保留原作。經過實驗和查閱資料,做如下修改:計算表達式為第5步,distinct為第6步,order by為第7步,top為第8步,應在order by之後。
實例準備,創建表,插入數據,寫要分析的實例查詢語句
1、首先創建兩個表
2、創建兩個表,並插入表數據,腳本如下
USE [test]
GO
/****** Object: Table [dbo].[Member] Script Date: 2014/12/22 14:05:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Member](
[id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](30) NULL,
[phone] [varchar](15) NULL,
CONSTRAINT [PK_MEMBER] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[Order] Script Date: 2014/12/22 14:05:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Order](
[id] [int] IDENTITY(1,1) NOT NULL,
[member_id] [int] NULL,
[status] [int] NULL,
[createTime] [datetime] NULL,
CONSTRAINT [PK_ORDER] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Member] ON
GO
INSERT [dbo].[Member] ([id], [Name], [phone]) VALUES (1, N'張龍豪', N'18501733702')
GO
INSERT [dbo].[Member] ([id], [Name], [phone]) VALUES (2, N'Jim', N'15039512688')
GO
INSERT [dbo].[