前面我們說的都是在乙個表中的查詢操作。而就算在子查詢,也並沒有把多個表關聯起來,也實際上是對乙個表的單獨操作。而聯結(在很多地方稱為連線,其實是一樣的)。聯結是利用sql的select能執行的最重要的操作。簡單地說,聯結是一種機制,用來在一條select語句中關聯表,因此稱之為聯結。使用特殊的語法,可以聯結多個表返回一組輸出,聯結在執行時關聯表中正確的行。聯結的功能是關係型資料庫的乙個巨大的優勢。
一、外來鍵
外來鍵為某個表中的一列,它包含另乙個表的主鍵值,定義了兩個表之間的關係。以另乙個表的外來鍵作主鍵的表被稱為主表,具有此外鍵的表被稱為主表的從表。
二、關係型資料庫和非關係型資料庫
這裡,我們了解一下關係型資料庫和非關係型資料庫。
1、關係型資料庫
關係型資料庫是支援關係模型的資料庫系統。而關係模型是由二維表來表示實體和實體間聯絡的模型。關係型資料庫通過外來鍵關聯來建立表與表之間的關係。
2、非關係型資料庫
關係型資料庫是不支援關係模型的資料庫系統,也就nosql資料庫。非關係型資料庫通常將資料以物件的形式儲存在資料庫中,而物件之間的關係通過每個物件自身的屬性來決定。
3、關係型資料庫和非關係型資料庫的比較
資料庫型別
特性優點
缺點關係型資料庫
sqlite、oracle、mysql
1、關係型資料庫,是指採用了關係模型來組織
資料的資料庫;
2、關係型資料庫的最大特點就是事務的一致性;
3、簡單來說,關係模型指的就是二維**模型,
而乙個關係型資料庫就是由二維表及其之間的聯絡所組成的乙個資料組織。
1、容易理解:二維表結構是非常貼近邏輯世界乙個概念,關係模型相對網狀、層次等其他模型來說更容易理解;
2、使用方便:通用的sql語言使得操作關係型資料庫非常方便;
3、易於維護:豐富的完整性(實體完整性、參照完整性和使用者定義的完整性)大大減低了資料冗餘和資料不一致的概率;
4、具有很好的可伸縮性(指
能夠適應不斷增加的工作量而不失敗
);5、支援sql,可用於複雜的查詢。
1、為了維護一致性所付出的巨大代價就是其讀寫效能比較差;
2、固定的表結構;
3、高併發讀寫需求;
4、海量資料的高效率讀寫。
非關係型資料庫
mongodb、redis、hbase
1、使用鍵值對儲存資料;
2、分布式;
3、一般不支援acid特性;
4、非關係型資料庫嚴格上不是一種資料庫,應該是一種資料結構化儲存方法的集合。
1、無需經過sql層的解析,讀寫效能很高;
2、基於鍵值對,資料沒有耦合性,容易擴充套件;
3、儲存資料的格式:nosql的儲存格式是key,value形式、文件形式、形式等等,文件形式、形式等等,而關係型資料庫則只支援基礎型別;
4、可伸縮性差。
1、不提供sql支援,學習和使用成本較高;
2、無事務處理,附加功能bi和報表等支援也不好。
三、聯結
聯結的建立非常簡單,規定要聯結的所有表以及它們如何關聯即可。也就是from多個表以及用where給出關聯條件。注意,由於聯結涉及到多個表的操作,因此在引用的列可能出現二義性時,必須使用完全限定列名(用乙個點分隔的表名和列名)。如果引用乙個沒有用表名限制的具有二義性的列名, mysql將返回錯誤。
1、建立聯結
select vend_name, prod_name, prod_price, from vendors, products where vendors.vend_id = products.vend_id order by vend_name, prod_name;
2、聯結型別
聯結分為外聯結,內聯結和交叉聯結。而是什麼聯結型別,取決於where條件的設定。為了便於理解,可以把聯結視為集合a和集合b的相交來進行協助理解。
(1)交叉聯結(a×b)
也就是沒有聯結條件,這樣就會返回笛卡爾積。笛卡爾積指的是兩個或幾個表每一行的所有匹配情況。沒有聯結條件的時候檢索出的行的數目將是第乙個表中的行數乘以第二個表中的行數。這種情況的聯結一般沒什麼用處。
(2)內聯結(a∩b)
內聯結其實就是一般情況下取出符合條件的聯結。有時候,為了表明是內聯結,可以使用不同的語法。因為儘管使用where子句定義聯結的確比較簡單,但是使用明確的聯結語法能夠確保不會忘記聯結條件,有時候這樣做也能影響效能:
select vend_name, prod_name, prod_price, from vendors, products where vendors.vend_id = products.vend_id order by vend_name, prod_name;
select vend_name, prod_name, prod_price, from vendors inner join products on vendors.vend_id = products.vend_id order by vend_name, prod_name;
這兩個語句其實意思是一樣的。內聯結其實分為以下幾種:
1)等值聯結(也稱為簡單聯結)
就是上面的例子那樣的,用一些值的比較作為條件的聯結。
2)自聯結
自聯結,顧名思義就是自己和自己進行聯結。自聯結通常作為外部語句用來替代從相同表中檢索資料時使用的子查詢語句。雖然最終的結果是相同的,但有時候處理聯結遠比處理子查詢快得多。自聯結通常需要使用別名,因為作為乙個表跟自己聯結,如果不用別名,mysql分不清用的是哪個。下面是乙個例子:
select prod_id, prod_name from products where vend_id = (select vend_id from products where prod_id = 'dtntr');
select prod_id, prod_name from products as p1, products as p2 where p1.vend_id = p2.vend_id and p2.prod_id = 'dtntr';
上面這兩個語句表達的意思是一樣的,都是想知道生產id為dtntr的物品的**商生產的其他物品。products的第一次出現為別名p1,第二次出現為別名p2。
3)自然聯結
無論何時對錶進行聯結,應該至少有乙個列出現在不止乙個表中(被聯結的列)。自然連線是一種特殊的等值連線,它要求兩個關係進行比較的分量必須是相同的屬性組,並且在結果集中將重複屬性列去掉。標準的聯結(前面介紹的所有內部聯結)返回所有資料,甚至相同的列多次出現。 自然聯結排除多次出現,使每個列只返回一次。這一般是通過對錶使用萬用字元( select *),對所有其他表的列使用明確的子集來完成的。例子如下:
select c.*, o.order_num, o.order_date, oi.prod_id, oi.quantity, oi.item_price from customers as c, orders as o, orderitems as oi where c.cust_id = o.cust_id and oi.order_num = o.order_num and prod_id = 'fb';
在這個例子中,萬用字元只對第乙個表使用。所有其他列明確列出,所以沒有重複的列被檢索出來。
(3)外聯結(a∩b+a或b)
外連線分為三種:左外連線,右外連線,全外連線。對應sql:left/right/full outer join。通常我們省略outer這個關鍵字。寫成:left/right/full join。在左外連線和右外連線時都會以一張表為基表,該錶的內容會全部顯示,然後加上兩張表匹配的內容。左外聯結是以左表的記錄為基礎左表的記錄將會全部表示出來,而右表只會顯示符合搜尋條件的記錄,右外聯結則相反。全外聯結則是兩個表都顯示出來,並且顯示符合聯結條件的部分。外聯結和內聯結的語法類似:
select customers.cust_id, orders.order_num from customers left outer join orders on customers.cust_id = orders.cust_id;
要注意的是,左外聯結和右外聯結之間的唯一差別是所關聯的表的順序不同。換句話說,左外部聯結可通過顛倒from或where子句中表的順序轉換為右外部聯結。
3、聯結多個表
sql對一條select語句中可以聯結的表的數目沒有限制。建立聯結的基本規則也相同。首先列出所有表,然後定義表之間的關係即可。不過要注意的是效能方面的問題,mysql在執行時關聯指定的每個表以處理聯結。這種處理可能是非常耗費資源的,因此應該仔細,不要聯結不必要的表。聯結的表越多,效能下降越厲害。
select prod_name, vend_name, prod_price, quantity from orderitems, products, vendors where products.vend_id = vendors.vend_id and orderitems.prod_id = products.prod_id and order_num = 20005;
資料庫的多表聯結
資料庫的聯結分為三種 1.內聯結 內連線查詢操作列出與連線條件匹配的資料行,它使用比較運算子比較被連線列的 列值。內連線分三種 1 等值連線 在連線條件中使用等於號 運算子比較被連線列的列值,其查詢結 果中列出被連線表中的所有列,包括其中的重複列。2 不等連線 在連線條件使用除等於運算子以外的其它比...
MySQL資料庫 建立高階聯結
part 1 使用表別名 select code id,state from coder as c,git as d where c.id d.id 需要注意的是,只有where時候,才可以使用表別名。如上所示,我們的別名,除了用在列名和計算欄位外,我們還可以用在表的身上。我們這樣做有兩個理由 1....
資料庫9 聯結表 高階聯結 組合查詢 全文本搜尋
sql最強大的功能之一就是能在資料檢索查詢的執行中聯結 join 表。聯結是利用sql的select能執行的最重要的操作,能很好的理解聯結及其語法是學習sql的乙個極為重要的組成部分。1 注意所使用的聯結型別,一般我們使用內部聯結,但使用外部聯結也是有效的。2 保證使用正確的聯結條件,否則將返回不正...