龍紋身女孩和 SQL
我喜歡大衛·芬奇(David Fincher)拍的電影《龍紋身女孩》,他成功的把小說《龍紋身女孩》搬上了熒幕,超出了我的預期。我本以為這又是一部膚淺的、憤世嫉俗的用來斂錢的好萊塢電影,事實情況卻是,這是一部情節緊張,能引起共鳴的電影,只是里面的淫殺犯罪讓人毛骨悚然。我最喜歡的一個情節是龍紋身女孩用SQL來查找40年前的兇殺案的過程。

我們從電影里可以看到她使用筆記本電腦,輕而易舉的進入瑞典警察局數據庫,當她敲入像‘unsolved(未破案)’和‘decapitation(斬首)’等關鍵詞時,屏幕上翻滾著綠色的檢索出的信息,雖然我們看不清她使用的完整的查詢語句:


處于一種天生的好奇,我忍不住截取了這些鏡頭畫面,用Photoshop拼接了一下,下面是我得到的結果:

你馬上能發現,這不是Oracle SQL——很顯然 AS 關鍵字在Oracle里不能用在表假名上。事實上,如果我們回去看看她那個令人興奮的查詢結果輸出時,你會看到 mysql 的提示符,而且還有 use [dbname] 連接數據庫的語法,下面是一個更詳細的畫面:

我們實際上可以把她用的left join關鍵詞表的SQL語句整理出來。
最終我們獲得了一個全屏的輸出結果信息:

下面就是我們Oracle“WTF研究會”部門重新構造出的她使用的SQL:
SELECT DISTINCT v.fname, v.lname, i.year, i.location, i.report_file
FROM Incident AS i
LEFT JOIN V(ictim?)... -- presumably v.incident_id = i.id
LEFT JOIN Keyword AS k ON k.incident_id = i.id
WHERE i.year BETWEEN 1947 AND 1966
AND i.type = 'HOMICIDE'
AND v.sex = 'F'
AND i.status = 'UNSOLVED'
AND ...
OR v.fname IN ('Mari', 'Magda')
OR SUBSTR ...
AND (k.keyword IN ('rape', 'decapitation', 'dismemberment', 'fire', 'altar', 'priest', 'prostitute')
...
AND SUBSTR(v.fname, 1, 1) = 'R' AND SUBSTR(v.lname, 1, 1) = 'L');
+--------+---------+------+-----------+----------------------------------+
| fname | name | year | location | report_file |
+--------+---------+------+-----------+----------------------------------+
| Anna | Wedin | 1956 | Mark | FULL POLICE REPORT NOT DIGITIZED |
| Linda | Janson | 1955 | Mariestad | FULL POLICE REPORT NOT DIGITIZED |
| Simone | Grau | 1958 | Goteborg | FULL POLICE REPORT NOT DIGITIZED |
| Lea | Persson | 1962 | Uddevalla | FULL POLICE REPORT NOT DIGITIZED |
| Kajsa | Severin | 1962 | Dals-Ed | FULL POLICE REPORT NOT DIGITIZED |
+--------+---------+------+-----------+----------------------------------+
你也許會很驚訝,很奇怪,這樣一個頂級的黑客為什么要outer-join的方式連接Victims(被害人)表和Keywords(關鍵詞)表呢,還使用這樣的文字過濾方式,豈不知MySQL里是有 like 語法的,更奇怪的是輸出結果里根本沒有姓和名分別以’R L’打頭的受害人。
[本文英文原文鏈接:The Girl With The ANSI Tattoo ]
本文轉載自: 外刊IT評論 http://www.aqee.net/