1. 程式人生 > 實用技巧 >BUU XSS COURSE 1 & [CISCN2019 華東北賽區]Web2

BUU XSS COURSE 1 & [CISCN2019 華東北賽區]Web2

目錄

  • 笛卡爾積
  • 內連線
  • 外連線
    • 左外連線
    • 右外連線
    • 全外連線
  • 自然連線

  

1. 笛卡爾積

​返回兩表記錄“相乘”的結果。若A表有m條記錄,B表有n條記錄,笛卡爾積會產生m*n條記錄。其中,A表每一條記錄,都對應一遍B表中的n條記錄。
笛卡爾積返回的結果時常包含無意義的記錄,所以用處並不太大,但這也不能說明其完全無意義。
試想場景:A表存放著一個班的學員資訊,B表存放著學校所開設課程的資訊。兩者的笛卡爾積則具有該班學生選擇課程結果的所有可能性。

:當兩表過大時,應當儘可能避免使用笛卡爾積。

select * from A,B;

  

2. 內連線

​通過兩表相同的欄位連線,選取兩表共有的資料。
​如A表存放學員資訊,幷包含學號這一欄位;B表存放成績,並也包含學號這一欄位。通過內連線可查詢所有學生及其對應的課程成績。

mysql寫法:

寫法一:
select * from A inner join B on A.no=B.no;

寫法二:
select * from A,B where A.no=B.no;

  1. 雖然寫法一與寫法二起到相同的作用,但前者的寫法較為正規,偏向於內連線本身的意義。後者的寫法偏向於在笛卡爾積的基礎上,通過條件篩選結果。至於兩者底層的實現,有待進一步鑽研。

  2. 不加on,或不使用where的內連線退化成笛卡爾積,失去意義。

  

3. 左外連線

在內連線的基礎上,加上左邊有的資料。即,左邊的表包含其全部的記錄,右邊的表若無與之對應的記錄,則為null。

寫法如下:

select * from A left join B on A.no=B.no

  

4. 右外連線

在內連線的基礎上,加上右邊有的資料。即,右邊的表包含其全部的記錄,左邊的表若無與之對應的記錄,則為null。

寫法如下:

select * from A right join B on A.no=B.no

  

5. 全外連線

只要左表與右表其中一個表存在記錄,則返回關聯記錄。相當於綜合了左外連線與右外連線。

寫法如下:

select * from A full join B on A.no=B.no

  1. mysql不能使用全外連線,但可以用 union 模擬。

    select * from A left join B on A.no=B.no
    UNION
    select * from A right join B on A.no = B.no;
    
  2. 全外連線是有條件的連線,不會產生錯誤記錄;笛卡爾連線是無差別的連線,會產生錯誤記錄

  3. 左外連線=左表全部記錄+相關聯結果
    右外連線=右表全部記錄+相關聯結果
    全外連線=左表全部記錄+右表全部記錄+相關聯結果=左外連線+右外連線-相關聯結果(即去重複)

6. 自然連線

自然連線是一種特殊的等值連線,其要求兩個關係進行比較的分量必須是相同的屬性組,並且在結果集中將重複屬性列去掉。