1. 程式人生 > >(MySql資料庫使用經驗)MySql的高階查詢之內連線,外連線,交叉連線以及on,exists,order by,union關鍵字

(MySql資料庫使用經驗)MySql的高階查詢之內連線,外連線,交叉連線以及on,exists,order by,union關鍵字

連線查詢: 將兩張表或者兩張以上的表進行記錄的連線(按照某個指定的條件進行資料拼接)。

連線查詢的使用: 在使用者檢視資料的時候,需要顯示的資料來自多張表.

連線查詢語法: 需要使用join 關鍵字。

使用方式為: 左表 join 右表,左表: 在join關鍵字左邊的表,右表: 在join關鍵字右邊的表。

連線查詢:

SQL中將連線查詢分成四類: 分別為,1內連線,2外連線,4交叉連線

交叉連線:   關鍵字為cross join, 從一張表中迴圈取出每一條記錄,並且把每一條記錄都去另外一張表進行匹配。發生的結果我們一般稱之為: 笛卡爾積。當我們實際開發中,比如日誌查詢頁面,我們需要查詢多張表中的資訊,這個時候查詢的資料用這個關鍵字,速度會相對來說慢一點,但是很少會有人選擇來使用這個關鍵字,實用性不高。

語法: 左表 cross join 右表 或 from 左表,右表;

內連線: 關鍵字為join, 中括號中的inner可以省略不寫,從左表中取出每一條記錄,去右表中與所有的記錄進行匹配,匹配必須是某個條件在左表中與右表中相同最終才會保留結果,否則不保留,比如,要查每日的出勤,需要員工表,和出勤資訊表,當使用內連結查詢時,員工缺勤的資訊是查不出來的。

語法:左表  join 右表 on [on相當於where,表示連線條件] 左表.欄位 = 右表.欄位;

欄位別名以及表別名的使用: 在查詢資料的時候,不同表有同名欄位,這個時候需要加上表名才能區分, 而表名太長, 通常可以使用別名.

內連線可以沒有連線條件: 沒有on之後的內容,這個時候系統會保留所有結果,

內連線還可以使用where代替on關鍵字,但效率差很多。

外連線: 以某張表為主,取出裡面的所有記錄, 然後每條與另外一張表進行連線: 不管能不能匹配上條件,最終都會保留: 能匹配,正確保留; 不能匹配,其他表的欄位都置空NULL.

外連線分為兩種: 是以某張表為主: 有主表

left join: 左連線(左外連線), 以左表為主表

right join: 右連線(右外連線), 以右表為主表

基本語法: 左表 left/right join 右表 on 左表.欄位 = 右表.欄位;

聯合查詢:將多次查詢(多條select語句), 在記錄上進行拼接(欄位不會增加),但是sql語句會變得冗長。

基本語法:多條select語句構成: 每一條select語句獲取的欄位數必須嚴格一致(但是欄位型別無關)

Select 語句1

Union [sql拼接的關鍵字]

Select語句2... ...

Union

[All: 保留所有(不管重複還是不重複),

Distinct: 去重(整個重複):去重複的關鍵字只能用在第一個查詢的欄位上,否則查詢無效果。]

聯合查詢的意義:

1. 查詢同一張表,但是需求不同: 好比查詢員工資訊,按薪資降序,或者按日期升序。

2. 多表查詢: 多張表的結構是完全一樣的,儲存的資料(結構)也是一樣的,但是需要表與表之間有對應的關係,比如查我的個人資訊,需要薪資表,與個人資產表,他們之間的關係在身份證號這一點來連線,資料查詢出來的才是正確的。

order by

在聯合查詢中: order by不能直接使用,需要對某一列進行排序才行;我覺得可以先將兩個表關聯查詢出來,然後再排好序,如果想分頁查詢,在使用limit M/N  來取對應分頁的資料,即可

子查詢: 查詢是在某個查詢結果之上進行的.(一條select語句內部包含了另外一條select語句當作查詢的條件,比如你去相親女方查你自己的個人資訊,的時候想查你的薪資,就可以在查詢個人資訊時再以薪資當作查詢的列,以身份證號當作查詢的條件,查出你的個人資訊。來看決定願不願意和你交往).

子查詢分類

子查詢有兩種分類方式: 按位置分類;和按結果分類

  • 按位置分類: 子查詢(select語句)在外部查詢(select語句)中出現的位置

  1. From子查詢: 子查詢跟在from之後

  2. Where子查詢: 子查詢出現where條件中

  3. Exists子查詢: 子查詢出現在exists裡面

  • 按結果分類: 根據子查詢得到的資料進行分類(理論上講任何一個查詢得到的結果都可以理解為二維表)

  1. 標量子查詢: 子查詢得到的結果是一行一列

  2. 列子查詢: 子查詢得到的結果是一列多行

  3. 行子查詢: 子查詢得到的結果是多列一行(多行多列) (1,2,3出現的位置都是在where之後)

  4. 表子查詢: 子查詢得到的結果是多行多列(出現的位置是在from之後)

exists

exists: 是否存在的意思, exists子查詢就是用來判斷某些條件是否滿足(跨表), exists是接在where之後: exists返回的結果只有0和1.

其實在我們執行sql時,如果全部執行,第二次執行就會報錯,我們也可以用exists關鍵字在表的前面,查詢資料庫中是否存在該表,如果不存在,就建立一個新的表,如果存在該表,就將該表刪除,重新建立及插入資料。我感覺與java中的if()else{}差不多的意思。