亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

T-sql語句查詢執行順序

2024-07-21 02:48:14
字體:
來源:轉載
供稿:網友
T-sql語句查詢執行順序前言

數據庫的查詢執行,毋庸置疑是程序員必備技能之一,然而數據庫查詢執行的過程絢爛多彩,卻是很少被人了解,今天哥哥要帶你裝逼帶你飛,深入一下這sql查詢的來龍去脈,為查詢的性能優化處理打個基礎,或許面試你也會遇到,預防不跪還是看看吧。

這篇博客,摒棄查詢優化性能,作為其基礎,只針對查詢流程講解剖析。

本片博客闡述的過程為

1、上一個標識過的sql語句,展示查詢執行的流程

2、上一個流程圖

3、做一個例子逐步深入分析,幫助理解

4、做一個裝逼的總結

sql查詢語句的處理步驟,代碼清單
--查詢組合字段(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 (<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>--排序(6)order by<order_by_list>

說明:

1、順序為有1-6,6個大步驟,然后細分,5-1,5-2,5-3,由小變大順序,1-J,1-A,1-P,1-U,為并行次序。如果不夠明白,接下來我在來個流程圖看看。

2、執行過程中也會相應的產生多個虛擬表(下面會有提到),以配合最終的正確查詢。

sql查詢語句的處理步驟,流程圖

實例準備,創建表,插入數據,寫要分析的實例查詢語句

1、首先創建2各表

2、創建兩個表,并插入表數據,腳本如下

USE [test]GO/****** Object:  Table [dbo].[Member]    Script Date: 2014/12/22 14:05:17 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE 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]GOSET ANSI_PADDING OFFGO/****** Object:  Table [dbo].[Order]    Script Date: 2014/12/22 14:05:17 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE 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]GOSET IDENTITY_INSERT [dbo].[Member] ON GOINSERT [dbo].[Member] ([id], [Name], [phone]) VALUES (1, N'張龍豪', N'18501733702')GOINSERT [dbo].[Member] ([id], [Name], [phone]) VALUES (2, N'Jim', N'15039512688')GOINSERT [dbo].[Member] ([id], [Name], [phone]) VALUES (3, N'Tom', N'15139512854')GOINSERT [dbo].[Member] ([id], [Name], [phone]) VALUES (4, N'Lulu', N'15687425583')GOINSERT [dbo].[Member] ([id], [Name], [phone]) VALUES (5, N'Jick', N'13528567445')GOSET IDENTITY_INSERT [dbo].[Member] OFFGOSET IDENTITY_INSERT [dbo].[Order] ON GOINSERT [dbo].[Order] ([id], [member_id], [status], [createTime]) VALUES (1, 1, 3, CAST(0x0000A40900B3BBFB AS DateTime))GOINSERT [dbo].[Order] ([id], [member_id], [status], [createTime]) VALUES (2, 2, 1, CAST(0x0000A40900B3CEF2 AS DateTime))GOINSERT [dbo].[Order] ([id], [member_id], [status], [createTime]) VALUES (3, 3, 4, CAST(0x0000A40900B3D2D0 AS DateTime))GOINSERT [dbo].[Order] ([id], [member_id], [status], [createTime]) VALUES (4, 4, 0, CAST(0x0000A40900B3D660 AS DateTime))GOINSERT [dbo].[Order] ([id], [member_id], [status], [createTime]) VALUES (5, 5, 1, CAST(0x0000A40900B3D9B9 AS DateTime))GOINSERT [dbo].[Order] ([id], [member_id], [status], [createTime]) VALUES (6, 6, 2, CAST(0x0000A40900B3DFEA AS DateTime))GOINSERT [dbo].[Order] ([id], [member_id], [status], [createTime]) VALUES (7, NULL, 0, CAST(0x0000A40900E34971 AS DateTime))GOSET IDENTITY_INSERT [dbo].[Order] OFFGOALTER TABLE [dbo].[Order] ADD  DEFAULT (getdate()) FOR [createTime]GOEXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'編號' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Member', @level2type=N'COLUMN',@level2name=N'id'GOEXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'姓名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Member', @level2type=N'COLUMN',@level2name=N'Name'GOEXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'電話' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Member', @level2type=N'COLUMN',@level2name=N'phone'GOEXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'會員表' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Member'GOEXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'編號' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Order', @level2type=N'COLUMN',@level2name=N'id'GOEXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'會員編號' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Order', @level2type=N'COLUMN',@level2name=N'member_id'GOEXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'訂單狀態' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Order', @level2type=N'COLUMN',@level2name=N'status'GOEXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'下單日期' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Order', @level2type=N'COLUMN',@level2name=N'createTime'GOEXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'訂單表' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Order'GO
View Code

3、編寫咱們要解析的查詢語句,即本篇要查詢的實例語句。

select top(4)  status , max(m.id) as maxMemberIDfrom [dbo].[Member] as m right outer join [dbo].[Order] as o on m.id=o.member_id where m.id>0group by status having status>=0order by maxMemberID asc
實例語句分步驟分析

第一步,從from開始。

1.1、加載左表

from [dbo].[Member] as m 

查詢結果:member表中的所有數據

1.2、這里應該是 right outer join ,但是這里在sql中被定義分解為2個步驟,即join ,right outer join 。表達式關鍵字從左到右,依次執行。

join [dbo].[Order] as o 

查詢結果:存入虛擬表vt1,為兩個表的笛卡爾集合。這里你或許不明白什么叫笛卡爾集合,我打個比方給說說,還望不要嫌棄,就是小朋友握手問題,A班里有3個學生(看作一個表的三條數據),B班里有2個學生(看作另外一個表的2條數據).B班小朋友跟A班小朋友搞聯歡晚會,首先要每個人都要確保跟另外一個班的同學我一下手,那么交叉出來的集合就是(2*3=6)有6條不同的軌跡。這個軌跡的集合就是笛卡爾集合。如果你還不明白,我再說下,就是m(5條數據)表中的第一條數據跟o(7條數據)表中的所有數據握下手,有7條,然后依次類推共有35條不同的數據。這里的null值也是要加進來的。

1.3、on 篩選器

on m.id=o.member_id 

查詢結果:從上一步的笛卡爾集合35條數據中刪除掉不匹配的行,就得到啦5條數據,存入虛擬表Vt2

1.4、添加外部行(outer row)

right outer join [dbo].[Order] as o 

查詢結果為:右表(order)作為保留表,把剩余的數據重新添加到上一步的虛擬表中vt2,生成虛擬表vt3.

第二部,進入where階段

where m.id>0

查詢結果:存入虛擬表vt4,為篩選的條件為true的結果集,這里加入一個記憶點,就是,where的篩選刪除為永久的,而on的篩選刪除為暫時的,因為on篩選過后,有可能會經過outer添加外部行,重新把數據加載回來,而where則不能。

第三部,group by分組

group by status

查詢結果:存入vt5,以status列的數值開始分組,即status列,值一樣的分為一組,這里的兩個null在三值邏輯中被視為true。三值邏輯:true,false,null。此三值,null為未知,是數據的邏輯特色,有的地方兩個null相等為ture,在有些地方則為false。這個你百度下看看有很多講解。

第四步,having篩選器

having status>=0

查詢結果:篩選分好組的組數據,把不滿足條件的刪除掉

第五步,select查詢挑揀計算列

5.1、計算表達式

select status , max(m.id)

查詢結果:從分過組的數據中計算各個組中的最大m.id,列出要篩選顯示的列。

5.2、distinct過濾重復

5.3、top 結合order by 篩選 多少行,但這里的數據沒有排序只是把多少行數據列出來而已。

第六部,order by 排序顯示。

蛋疼的總結,裝逼是有依據的

本篇博客參考:《Microsoft SQL Server 2008技術內幕:T-SQL查詢》,感謝閱讀,(C#).NET技術分享QQ群: 232458226,歡迎加入。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲片在线资源| 欧美日韩亚洲一区二区| 欧美大片在线看| 17婷婷久久www| 国产中文字幕日韩| 欧美日韩在线视频一区二区| 久久久久久亚洲精品中文字幕| 亚洲欧美另类自拍| 亚洲护士老师的毛茸茸最新章节| 欧美日韩激情视频8区| 亚洲黄色在线观看| 日韩精品中文字幕视频在线| 国产精品流白浆视频| 精品欧美一区二区三区| 中文字幕亚洲第一| 日产日韩在线亚洲欧美| 亚洲精选一区二区| 国产精品96久久久久久| 亚洲精品电影久久久| 亚洲成av人乱码色午夜| 91精品国产成人www| 91九色单男在线观看| 欧美亚洲国产日韩2020| 中文字幕精品av| 日本91av在线播放| 播播国产欧美激情| 成人激情视频免费在线| 欧美精品免费播放| 国产69久久精品成人看| xx视频.9999.com| 精品中文字幕在线2019| 在线不卡国产精品| 国产精品99久久久久久久久久久久| 精品福利樱桃av导航| 69精品小视频| 一个色综合导航| 国产日韩在线看片| 亚洲性视频网站| 欧美一区三区三区高中清蜜桃| 亚洲欧美在线看| 最近更新的2019中文字幕| 久久免费视频这里只有精品| 日韩视频免费中文字幕| 欧美性猛交xxxx黑人猛交| 国产91久久婷婷一区二区| 欧美成人性生活| 国产精品久久婷婷六月丁香| 国产精品久久久av久久久| 国产精品1区2区在线观看| 久久久人成影片一区二区三区观看| 亚洲国产精品久久久| 国产精品欧美一区二区| 国产日韩av在线播放| 中文字幕欧美视频在线| 97在线免费观看| 91在线精品播放| 国产精品久久久久久久久粉嫩av| 俺去亚洲欧洲欧美日韩| 欧美xxxx18国产| 在线免费看av不卡| 亚洲一区二区三区四区在线播放| 国产女人精品视频| 欧美激情一区二区三区在线视频观看| 久热精品视频在线免费观看| 久久99精品视频一区97| 91人人爽人人爽人人精88v| 国产精品日韩在线播放| 成人亚洲综合色就1024| 亚洲国产欧美一区二区三区久久| 日韩美女福利视频| 亚洲国产天堂久久国产91| 亚洲乱亚洲乱妇无码| 国产精品视频最多的网站| 中文字幕日本精品| 精品亚洲永久免费精品| 久久在精品线影院精品国产| 精品久久久中文| 欧美日韩在线视频首页| 国产精品扒开腿做爽爽爽的视频| 日韩av片永久免费网站| 国产精品视频99| 中文字幕在线亚洲| 尤物九九久久国产精品的分类| 国产91色在线免费| 亚洲第一区中文99精品| 91在线观看免费高清| 欧洲成人午夜免费大片| 日韩av大片免费看| 国产成一区二区| 日韩电影免费观看在线| 久久国产精品网站| 538国产精品视频一区二区| 国产精品免费一区二区三区都可以| 国产91久久婷婷一区二区| 亚洲va国产va天堂va久久| 97久久精品人搡人人玩| 日韩av资源在线播放| 亚洲精品网址在线观看| 久久中文字幕一区| 国产精品视频一区二区高潮| 国产成人久久精品| 精品视频久久久久久久| 操91在线视频| 国产精品视频在线播放| 亚洲精品国产精品乱码不99按摩| 亚洲高清免费观看高清完整版| 日韩电影中文字幕在线| 国产成人午夜视频网址| 欧美激情免费观看| 91亚洲精品视频| 欧美视频第一页| 九九久久综合网站| 亚洲国产女人aaa毛片在线| 免费av在线一区| 伊人久久男人天堂| 黄色成人在线播放| 亚洲精品91美女久久久久久久| 91国产中文字幕| 91精品视频在线| 国产精品美女www| 欧美寡妇偷汉性猛交| 亚洲黄色免费三级| 亚洲美女av电影| 亚洲国产精品小视频| 中文字幕一精品亚洲无线一区| 国内精品久久久久久中文字幕| 日韩欧美成人免费视频| 国产欧洲精品视频| 精品久久久久久久久久ntr影视| 91免费视频网站| 91丨九色丨国产在线| 久久九九全国免费精品观看| 国产精品一区二区三区久久| 神马久久久久久| 日韩中文字幕网址| 国产精品视频资源| 久久精品亚洲精品| 中文字幕不卡av| 亚洲女人天堂色在线7777| 97精品久久久中文字幕免费| 日本最新高清不卡中文字幕| 国产一区二区三区免费视频| www.亚洲一二| 日韩欧美亚洲成人| 国产99在线|中文| 国产一区二区久久精品| 一区二区三区亚洲| 欧美激情一级二级| 亚洲精品不卡在线| 色综合天天狠天天透天天伊人| 欧美国产中文字幕| 91精品国产九九九久久久亚洲| 欧美日韩色婷婷| 久久69精品久久久久久久电影好| 亚洲新声在线观看| 国产狼人综合免费视频| 日韩动漫免费观看电视剧高清| 久久精品国产欧美亚洲人人爽| 国产日韩欧美中文在线播放| 欧美国产日韩一区二区| 最近中文字幕mv在线一区二区三区四区| 国产亚洲精品久久久久久牛牛| 91影视免费在线观看| 日韩不卡中文字幕|