聯結是利用SQL的SELECT能執行的最重要的操做。爲了提升存儲的有效性和避免數據冗餘,每每會將有關聯的數據存儲在好幾張表中,那麼怎樣用一條SELECT語句就能檢索出這些數據呢?mysql
答案是JOIN(聯結)。在一條SELECT語句中,咱們能夠聯結多張表返回一組數據。sql
聯結的本質是主表中符合條件的每一行與附表中符合條件的每一行進行配對,假如沒有WHERE子句或聯結條件,則主表中每一行將與附表中的每一行配對,總共會返回的行數是main_table_row_num * attach_table_row_num。若是主表和附表中包含的行數很是多,那麼就有必要在WHERE子句中加入篩選條件,這樣會大大減小沒必要要的配對。spa
聯結主要有4種,分別是INNER JOIN(內聯結)、LEFT JOIN(左聯結)、RIGHT JOIN(右聯結)、CROSS JOIN(叉聯結)。3d
爲了能清楚地說明這4種聯結,我準備了以下示例數據:code
一個product表,用來保存商品的名稱、價格和供應商ID,一個vendor表,用來保存供應商ID,供應商名稱。product表和vendor表之間經過product.vendor_id = vendor.id進行關聯。blog
建立2個表:pdo
CREATE TABLE product( id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(30) NOT NULL, price INT UNSIGNED NOT NULL, vendor_id INT UNSIGNED NOT NULL, PRIMARY KEY (id) );
CREATE TABLE vendor1( id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(30) NOT NULL, PRIMARY KEY (id) );
插入數據:get
INSERT INTO product (name,price,vendor_id) VALUES('bread', 10, 1); INSERT INTO product (name,price,vendor_id) VALUES('beer', 27, 2); INSERT INTO product (name,price,vendor_id) VALUES('vegetables', 15, 0); INSERT INTO product (name,price,vendor_id) VALUES('beef', 22, 3); INSERT INTO product (name,price,vendor_id) VALUES('noodles', 30, 2); INSERT INTO product (name,price,vendor_id) VALUES('fish', 45, 0); INSERT INTO product (name,price,vendor_id) VALUES('milk', 22, 3); INSERT INTO product (name,price,vendor_id) VALUES('water', 18, 1);
INSERT INTO vendor (name) VALUES('hellen'); INSERT INTO vendor (name) VALUES('ella'); INSERT INTO vendor (name) VALUES('matt'); INSERT INTO vendor (name) VALUES('jake');
說明:product表中保存商品信息,其中,有一部分商品是由店鋪老闆本身提供,因此這類商品沒有供應商,用vendor_id = 0表示table
示例1-1:
找出product表中由ella提供的全部商品:class
SELECT product.name, product.price, vendor.name FROM product INNER JOIN vendor ON product.vendor_id = vendor.id WHERE vendor.name = 'ella';
結果:
總結:
INNER JOIN能夠檢索出符合條件(JOIN條件和WHERE條件等)的表product和表vendor的交集,以下圖所示:
示例2-1:
列出product表中全部product,並列出其供應商
SELECT product.name, product.price, vendor.name FROM product LEFT JOIN vendor ON product.vendor_id = vendor.id;
結果:
總結:
LEFT JOIN 會檢索出主表的全部記錄,而且若是附表中的記錄符合條件會附加到主表的記錄中,主表與附表之間的關係以下圖所示:
示例3-1:
列出由ella和jake所提供的全部products
SELECT vendor.name as vendor_name,product.name as product_name FROM product RIGHT JOIN vendor ON product.vendor_id = vendor.id WHERE vendor.name IN ('ella', 'jake');
結果:
總結:
RIGHT JOIN 會檢索出附表的全部記錄,而且若是主表中的記錄符合條件會附加到附表的記錄中,主表與附表之間的關係以下圖所示:
示例4-1:
列出由ella和hellen所提供的全部products
SELECT product.name as product_name, product.price, vendor.name as vendor_name FROM product, vendor WHERE product.vendor_id = vendor.id AND vendor.name IN ('ella', 'hellen');
結果:
CROSS JOIN 返回主表中符合條件的每一行與附表中符合WHERE條件的每一行的配對。
若是沒有WHERE子句,能夠更清楚看到CROSS JOIN的返回結果:
示例4-2:
SELECT * FROM product,vendor;
結果:
很明顯,返回的結果是主表中的每一行與附表中的每一行的配對。
若是您以爲閱讀本文對您有幫助,歡迎轉載本文,可是轉載文章以後必須在文章頁面明顯位置保留此段聲明,不然保留追究法律責任的權利。
做 者:blog.jpdou.top