MySQL聯表的一點記錄

2021-08-28 06:44:10 字數 2304 閱讀 3667

好久沒寫文章了。今天整理一下sql聯表的情況。回頭整理一下ocr識別近期的工作成果。

mysql連表,就是多個表連線起來查詢。

舉個例子:

a 表裡面有id, name 字段, b表裡面有id, phone欄位。

我們可以通過join 來進行連線,查詢id 相同的。

example:

select * from a, b where a.id=b.id;
這個是很簡單的一種方式,稱之為隱式內連線。這也是聯表,但是沒有用到join.這個會返回a, b 表裡面公有的id.

那你可能會問,什麼是內連線?

內連線就是聯表的時候,兩個表都共有的部分。

介紹了隱式內連線, 這裡要說一下顯式內連線。顯式顯式,顧名思義,要有join才算。這裡再舉乙個例子:

select * from a inner join b on a.id = b.id;
inner join就是顯式內連線。上面兩種情況是一樣的,用哪個都可以。

顯式內連線,我覺得還比較常用。下面說一下左連線和右連線。

左連線,顧名思義,left join. 它實現的就是左表裡面的資料,不管右表有沒有,它都有,就是以左表為主。因為要連表連成乙個大表,左表有,右表沒有的部分,就是null.

select * from a left join b on a.id = b.id;
寫法也很簡單,這裡就會把左表當做主表。

右連線, 顧名思義, right join .它實現的是右表的資料, 不管左表有沒有,它都得有, 以右表為主。 因為連表會連成乙個大表, 右表有, 左表沒有的部分, 就是null.

select * from a right join b on b.id = a.id;
這裡就會把b表作為主表。

上面這些知識點,很簡單。知道表連線的應該都會。這裡講點較難的用法。

select * from a inner join b on a.id = b.id;
上面這條sql語句只是針對兩個表的同乙個字段進行聯表。這個很好寫,那如果這裡要求兩個欄位呢?

a 表裡面有id, name, class_name 字段, b表裡面有id, phone, class_name欄位。我現在在兩個表裡面又新增了class_name. 我要求根據id, class_name進行聯表查詢,查詢兩個表這兩個欄位都相同的資料。

怎麼寫?

其實也很簡單

select * from a inner join b on a.id = b.id and a.class_name = b.class_name;
如果寫出來的,恭喜你。沒寫出來,也不要緊。我這裡解釋一下為什麼是and. 不是where

and,or. 在程式設計裡面是很常見的。

1 and 0 結果就是0.

1 and 2 結果就是1

sql裡面也是這樣子,and的作用也是要求a.id=b.id和 a.class_name=b.class_name 同時成立的。

但是如果這條sql 語句這麼寫呢?

select * from a left join b on a.id = b.id and a.class_name = b.class_name;
把inner join 變成 left join 呢?

很明顯這樣就不對了。因為a表裡面不滿足條件的那些也會被查詢出來。

這個時候就用到where 了。

select * from a left join b on a.id = b.id and a.class_name = b.class_name where b.class_name != null;
這個語句為什麼這麼寫?請思考一下。

因為如果左表沒有, b.id 就可能是null, 如果b.id有的情況下, b.class_name 沒有,b.class_name 就為null. 所以沒有找到的時候, b.class_name 是一定為null的。

這個時候就必須弄清楚on的用法了。

不管錶用什麼連線, on 都是表與表之間的連線操作,它不涉及篩選,它只是連線表。

所以你只需要把兩個表需要連線的部分找好,然後用where 做進一步的過濾。

在一條sql語句裡面, where 一定是放在on 之後的。 如果你想兩個表先連線一下, 然後where 過濾,然後再連線第三個表,這樣是會報錯的。 你只需要把連線寫好,然後再一次性的做過濾。這樣即使表再多,相信你也能信手拈來。

Oracle橫表 縱表一點記錄

橫表就是普通的建表方式,如乙個表結構為 主鍵 欄位1 欄位2 欄位3。如果變成縱表後,則表結構為 主鍵 字段 字段值。而字段 則為字段1 欄位2 欄位3。縱表對從 資料庫到記憶體的對映效率是有影響的,但細一點說也要一分為二 縱表的初始對映要慢一些 縱表的變更的對映可能要快一些,如果只是改變了單個欄位...

hook api的一點記錄

hook api方法不外乎有修改匯入表和修改目標函式 讓其調整到hook函式處執行。這裡僅僅說下後者。後者主要實現為 通過鉤子將 注入到目標程序 簡單點就通過鉤子載入dll的方式來hook 複雜點的話就 使用建立遠端執行緒的方式來進行 然後通過修改要注入的目標函式其實幾個位元組 一般來說是5個位元組...

kvo 的一點記錄

observevalueforkeypath ofobject change context 呼叫方法是裡 object 被觀察物件 observer 觀察物件 forkeypath裡面帶上property的name,如uiview的frame center等等 options 有4個值,分別是 n...