用Python解釋SQL語句執行過程

2021-06-18 12:00:17 字數 3992 閱讀 4464

sql 語句看上去挺酷,但在資料庫內部,它是如何被解釋執行的呢?

本文試圖用最小的篇幅,解釋這個問題.

作者水平有限,內容難免有失偏頗,望請海涵.

首先,一張學生表:

姓名,年齡,班級 = range(3)

張三 = ('張三', 18, '軟體一班')

李四 = ('李四', 19, '軟體一班')

王五 = ('王五', 19, '軟體二班')

學生 =

一張成績表:

姓名,年齡,班級 = range(3)

張三 = ('張三', 18, '軟體一班')

李四 = ('李四', 19, '軟體一班')

王五 = ('王五', 19, '軟體二班')

學生 =

來乙個簡單的sql語句:select  姓名, 年齡, 班級 from 學生 where 姓名 = '張三'

它在資料庫裡是這樣被執行的:

for x in 學生:

if(x[姓名] == '張三'):

print(x)

解釋一下,上面的**的含義是:遍歷"學生表"找到"姓名"為"張三"的人,並將它列印出來

作為乙個新潮的碼農,上面的**,也可以這樣寫:

結果 = [ s for s in 學生 if  s[姓名] == '張三']

print("簡單查詢結果:",結果)

產生的結果,將是這個樣子:

簡單查詢結果: [('張三', 18, '軟體一班')]
前奏完畢,現在進入正題

sql語句

select 學生.姓名, 成績.學科, 成績.分數 

from 學生 left join 成績 on 學生.姓名 = 成績.姓名

where 學生.姓名 = '張三'

以上的sql語句是查詢"姓名"為"張三"的同學,在成績表中的"學科"與"成績"

語意沒問題,但關鍵是how? 計算機該如何去做?

step one 來個笛卡爾積.

什麼是笛卡爾積?

在數學中,兩個集合 x 和 y 的笛卡兒積(cartesian product),又稱直積,

表示為 x × y,是其第乙個物件是 x 的成員而第二個物件是 y 的乙個成員的所有可能的有序對:

具體的說,如果集合 x 是 13 個元素的點數集合

而集合 y 是 4 個元素的花色集合 ,

則這兩個集合的笛卡兒積是 52 個元素的標準撲克牌的集合

解釋完畢,首先,我們來乙個笛卡爾積:

笛卡爾積 = 

print("笛卡爾積結果:",sorted(笛卡爾積))#為了顯示美觀,特意加了乙個排序

它的結果是醬紫的:

笛卡爾積結果:

[(('張三', 18, '軟體一班'), ('張三', 'c語言', 70)),

(('張三', 18, '軟體一班'), ('張三', '數學', 60)),

(('張三', 18, '軟體一班'), ('李四', '數學', 61)),

(('張三', 18, '軟體一班'), ('王五', 'c語言', 63)),

(('張三', 18, '軟體一班'), ('王五', '數學', 62)),

(('李四', 19, '軟體一班'), ('張三', 'c語言', 70)),

(('李四', 19, '軟體一班'), ('張三', '數學', 60)),

(('李四', 19, '軟體一班'), ('李四', '數學', 61)),

(('李四', 19, '軟體一班'), ('王五', 'c語言', 63)),

(('李四', 19, '軟體一班'), ('王五', '數學', 62)),

(('王五', 19, '軟體二班'), ('張三', 'c語言', 70)),

(('王五', 19, '軟體二班'), ('張三', '數學', 60)),

(('王五', 19, '軟體二班'), ('李四', '數學', 61)),

(('王五', 19, '軟體二班'), ('王五', 'c語言', 63)),

(('王五', 19, '軟體二班'), ('王五', '數學', 62))]

資料很多,但絕大多數沒用

接下來,戲法來了,我們在笛卡爾積上加上過濾條件

學生表,成績表 = range(2)

for x in 笛卡爾積:

if x[學生表][姓名] == x[成績表][姓名] and x[學生表][姓名] == '張三':

print(x)

新潮的寫法是:

最終結果= 

print('結果:', 最終結果)

產生的結果是:

結果: 

正如君親眼所見,資料庫軟體處理sql語句有一定的順序,首先是from語句,然後blah,blah,blah

what's more?

《inside microsoft sql server 2005:t-sql programminy》

抱歉,推薦一本sql server的書籍。只看第一章就好。

源**:

姓名,年齡,班級 = range(3)

張三 = ('張三', 18, '軟體一班')

李四 = ('李四', 19, '軟體一班')

王五 = ('王五', 19, '軟體二班')

學生 =

姓名,學科, 分數 = range(3)

成績1 = ('張三', '數學', 60)

成績2 = ('張三', 'c語言', 70)

成績3 = ('李四', '數學', 61)

成績4 = ('王五', '數學', 62)

成績5 = ('王五', 'c語言', 63)

成績 =

# select  姓名, 年齡, 班級 from 學生 where 姓名 = '張三'

for x in 學生:

if(x[姓名] == '張三'):

print(x)

結果 = [ s for s in 學生 if  s[姓名] == '張三']

print("簡單查詢結果:",結果)

#select 學生.姓名, 成績.學科, 成績.分數 from 學生 left join 成績 on 學生.姓名 = 成績.姓名 where 學生.姓名 = '張三'

#step one,對兩個表做笛卡爾積

笛卡爾積 =

print("笛卡爾積結果:",sorted(笛卡爾積))#為了顯示美觀,特意加了乙個排序

學生表,成績表 = range(2)

#step two,增加過濾條件

最終結果=

print('結果:', 最終結果)

用SQL語句運算元據

語法 insert into 表名 列名列表 values 值列表 insert into 表名 列表名1,列表名2,列表名3,列表名4 select 值列表1,值列表2,值列表3,值列表4 from 插入的表名 select 列表名1,列表名2,列表名3,列表名4 into addresslist...

經典SQL語句(case when then)用法

有一張表,裡面有3個字段 語文,數學,英語。其中有3條記錄分別表示語文70分,數學80分,英語58分,請用一條sql語句查詢出這三條記錄並按以下條件顯示出來 並寫出您的思路 大於或等於80表示優秀,大於或等於60表示及格,小於60分表示不及格。顯示格式 語文 數學 英語 及格 優秀 不及格 sql ...

用SQL語句運算元據

用sql語句運算元據 1,在 sql sever 中,sql 語句不區分大小寫 資料庫名,表名,列名,關鍵字 sql編譯器都識別 2,對錶進行操作的時候,一定要使先用 use關鍵字切換到對應的資料庫 3.自增列不可以賦值 01.如果新增全部列,那麼表名後可以不跟列名,但是要提供所有列的值,除非當前 ...