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.如果新增全部列,那麼表名後可以不跟列名,但是要提供所有列的值,除非當前 ...