龍紋身女孩和 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/