【讀書札記】SQL笛卡爾積的運用

       學習SQL,我們需要把SQL語句靈活的運用起來,去解決編程過程中的一些實際的問題。有時候我們能夠運用靈活的SQL語句替換掉很多業務的代碼。

       笛卡爾積相當於我們學習數學中集合的概念,數據庫中運用此思想,產生了很多滿足我們實際需要的SQL語句。

        一個表tb_face,有如下的結構:

        

     用一條SQL語句,要得出下圖所示的結果:

        

    這裏我剛纔開始不知道怎麼下手,以爲要怎麼怎麼的。 其實這裏有一個概念,就是笛卡爾積。笛卡爾積就相當於我們高中說學的集合一樣。{(a,0),(a,1),(a,2),(b,1),(b,2),(b,3)},然後我們可以運用這個思想寫出相應的SQL語句:    

  select a.name||b.name name from tb_face a,tb_face b where a.no < b.no  

     效果如下:

     

      

      第二個例子是我們經常做查詢時候喜歡用到的,我們希望用一個表的結果去查另一個表得到的結果再去查第三個表,我們一般使用下面的SQL語句來做。

      比如有這麼一個數據庫,僱員有職位,職位有排名,排名對應着薪水:僱員表(job),排名表(ranks),薪水錶(salary)。

      jobs:

      


      ranks:

      


    salary:

    

      我們要查到結果是向Andrew Cumming支付多少工資?     一般我們會通過子查詢的方式,一個個符合條件的來查詢。如下:

   select payment from salary where  rank  = (select rank from ranks where title = (select title from jobs where employee = 'Andrew Cumming'));
     

      上面的SQL看起來就是要優化的樣子,效率很差,子查詢語句速度較慢,當子查詢語句中不包含聚合函數(比如max()),此時不需要子查詢,而是需要一條join,如果你已經有一條子查詢語句,可以按照下面的步驟將它改造成join語句:

     1.使用表名標記它們出處的所有列

     2.如果在兩個不同的FROM字句中使用同一個表,那麼使用別名(上面那個例子就是別名的使用法,這個例子不需要)

     3.將所有FROM語句放在一起,形成一條FROM語句

     4.刪除選擇事件

     5.將第一次出現之後的WHERE替換爲AND

     select payment from salary,ranks,jobs where  salary.rank = (select ranks.rank from ranks and ranks.title =(selectjobs.titlefrom jobs and jobs.employee = 'Andrew Cumming';  

     運用上面的規則進行改寫如下:

     select payment from salary,ranks,jobs where  salary.rank = ranks.rank and ranks.title = jobs.title and jobs.employee = 'Andrew Cumming';  


       好了,笛卡爾積的一些簡單的運用就通過上面的兩個例子體現了出來,笛卡爾積的結果是根據兩個表之間的關係篩選出來的。最近在閱讀《SQL HACKs》感覺對我的數據庫知識的鞏固和提高有了較大的幫助。也寫一點最近的體會,新公司裏面採用了很多新鮮的技術,這令我的思維不斷開闊,我也能不斷的學習和成長。但是在系統開發的過程中還是有一些細小的問題需要注意:

    1.區分清楚項目啓動的環境,比如使用的tomcat的版本,jdk的版本,比如啓動項目用到的內外網環境等,這些一有問題的話,很可能導致項目啓動不了,在編譯器下報錯。

    2.在做開發的時候,先功能到位再樣式,比如我們現在在做一個財務的報表折線圖,類似股票這種,但是很多樣式問題和功能上的需求變化,這裏我們就要先滿足功能的實現再去做樣式的修改,這樣效率要高很多。


   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章