SQL學習之 聯結表

2021-08-09 17:32:44 字數 2877 閱讀 9780

sql最強大的功能之一就是能在資料查詢的執行中聯結(join)表。

關係表

理解關係表,可以來看乙個例子。

有乙個包含產品目錄的資料庫表,其中每類物品佔一行。對於每一種物品,要儲存的資訊包括產品描述,,**,以及生產該產品的**商。

把它們放在一張表中必然會有重複的資訊,乙個**商的資訊將重複在他生產的產品後出現,相同的資料出現多次絕不是一件好事,這是關聯式資料庫設計的基礎。關係表的設計就是要把資訊分解成多個表,一類資料乙個表。各表通過某些共同的值互相關聯。

在這個例子中可建立兩個表:乙個儲存**商資訊(products),乙個儲存商品資訊(vendors)。vendors表的主鍵與products表關聯。

select vend_name, prod_name, prod_price

from vendors, products

where vendors.vend_id = products.vend_id;

內聯結(inner join)

內聯結也稱為等值聯結。

select vend_name, prod_name, prod_price

from vendors inner

join products

on vendors.vend_id = products.vend_id;

注意此**與上面**的不同之處。

聯結多個表

from…where版本。

select vend_name, prod_name, prod_price, quantity

from vendors, products, orderitems

where vendors.vend_id = products.vend_id

and orderitems.prod_id = products.prod_id

and order_num = 20007;

上面**塊中,where子句中,前兩個條件定義了三個表的聯結關係,後乙個用來過濾所要的資訊。

from…on版本。

select vend_name, prod_name, prod_price, quantity

from vendors inner

join (products, orderitems)

on vendors.vend_id = products.vend_id

and orderitems.prod_id = products.prod_id

and order_num = 20007;

聯結表的最大數要參照具體的dbms,mysql的限制是?沒找到

別名

在sql中可以給列名,表名和計算字段使用別名。

select vend_name, prod_name, prod_price, quantity

from vendors as v, products as p, orderitems as oi

where v.vend_id = p.vend_id

and oi.prod_id = p.prod_id

and order_num = 20007;

自聯結(self-join)
select cust_id, cust_name, cust_contant

from customers

where cust_name = (select cust_name

from customers

where cust_contact = 'jim');

等價於

select c1.cust_id, c1.cust_name, c1.cust_contant   #因為cust_xx都有了兩列,所以必須用完全限制名

from customers as c1, customers as c2

where c1.cust_name = c2.cust_name #首先要聯結兩個表

and c2.cust_contact = 'jim'; #過濾資料

一般能用自聯結的時候不用子查詢。

自然聯結(natural join)

自然聯結排除多次出現,使每一列只返回一次。通常使用對乙個表使用萬用字元,其他表的列使用明確的子集。

select c.*, v.vend_name, p.prod_name, p.prod_price, oi.quantity
外聯結(outer join)
select c.cust_id, o.order_num

from customers as c left

outer

join orders as o

on c.cust_id = o.cust_id; #聯結條件

外聯結

使用帶聚集函式的聯結

檢索所有顧客以及每個顧客下的訂單數。

select c.cust_id, count(o.order_num) as num_ord

from customers as c inner

join orders as o

on c.cust_id = o.cust_id

group

by c.cust_id;

參考

《sql必知必會》

SQL學習筆記之建立高階聯結

列別名使用方法 列的表示式 對列聚集函式 對列使用其他函式 as 列別名 表別名使用方法 在from子句中,表名 as 表別名 給表起別名有兩個優點 縮短sql語句,使得語法更簡潔 可以在select語句中多次使用相同的表 select cust name,cust contact from cus...

SQL使用子查詢 聯結表 建立高階聯結

利用子查詢進行過濾select cust name,cust contact from customers where cust id in select cust id from orders where order num in select order num from orderitems ...

sql多表聯結 三張表聯結 查詢

今天看了一道sql的題,這個查詢需要聯結三張表,具體的 內容參考 參考鏈結 很自然的想到了內聯結,但是之前做的大部分都是兩張表的內連線,這次是三張表,在網上搜也都是講兩張表的內連線,這裡總結一下 selecta.sname,b cname,c degree from student ainner j...