【MySQL】4.表聯結

1.MySQL別名

1.1列別名

別名是一個字段或值的替換名。別名用AS關鍵字賦予。比如:

SELECT PTRIM(vend_name)+'("PTRIM(vend_country)+')'
       AS vend_title
FROM Vendors
ORDER BY vend_name;

1.2表別名

SQL除了可以對列名和計算字段使用別名,還允許給表名起別名。這樣做主要有兩個理由:

(1)縮短SQL語句

(2)允許在一條SELECT語句中多次使用相同的表

比如:

SELECT cust_name,cust_contact
FROM Customers AS C,Orders AS 0,OrderItems AS OI
WHERE C.cust_id=0.cust_id
 AND OI.order_num=0.order_num
 AND prod_id='RGAN01';

上面句子中FROM子句中的三個表全都有別名。

注意表別名只在查詢執行中使用,與列別名不一樣,表別名不返回到客戶端。

 

2.內聯結 INNER JOIN

內聯結也稱爲等值聯結,它基於兩個表之間的相等測試,我們可以明確指定聯結的類型。比如:

SELECT vend_name,prod_nmae,prod_price
FROM Vendors INNER JOIN Products
ON Venders.vend_id=Products.vend_id

這裏,兩個表之間的關係是以INNER JOIN指定的部分FROM子句。在使用這種語法時,聯結條件用特定的ON子句而不是WHERE子句給出。

 

3.OUTER JOIN

OUTER JOIN 也叫外聯結,許多聯結將一個表中的行與另一個表中的行相關聯,但有時候需要包含沒有關聯行的那些行。

比如:計算平均銷售規模,包括那些至今尚未下訂單的顧客。這個例子中,聯結包含了在相關表中沒有關聯行的行。

下面的SELECT語句給出了一個簡單的內聯結,它檢索所有顧客及其訂單:

SELECT Customers.cust_id,Orders.order_num
FROM Customers INNER JOIN Orders
ON Customers.cust_id=Oders.cust_id

外聯結語法類似。要檢索包括沒有訂單顧客在內的所有顧客,可如下進行:

SELECT Customers.cust_id,Order.cust_num
FROM Customers LEFT OUTER JOIN Orders
ON Customers.cust_id=Orders.cust_id;

在使用OUTER JOIN語法時,必須使用RIGHT或LEFT關鍵字指定包括其所有行的表,RIGHT指出的是OUTER JOIN右邊的表,LEFT指出的是OUTER JOIN右邊的表,我們一般用LEFT,上面例子從Customer表中選擇所有行。

 

4.CROSS JOIN

CROSS JOIN又稱爲笛卡爾乘積,實際上是把兩個表乘起來。

語法:

SELECT * FROM [TABLE 1] CROSS JOIN [TABLE 2]

或者:SELECT * FROM [TABLE 1], [TABLE 2]

乘法細節參考:https://blog.csdn.net/qq_26320085/article/details/78644523

 

5.自聯結

自聯結通常作爲外部語句,用來替代從相同表中檢索數據的使用子查詢語句,雖然最終結果相同,但其速度快得多。

比如我們要給首先找出與Jim同一公司的所有顧客,從子查詢語句:

SELECT cust_id,cust_name,cust_contact
FROM Customers
WHERE cust_name=(SELECT cust_name
                 FROM Customers
                 WHERE cust_contact='Jim');

我們用自聯結語句時需要用表別名,如下:

SELECT c1.cust_id,c1.cust_name,c1.cust_contact
FROM Customers AS c1,Customers AS c2
WHERE c1.cust_name=c2.cust_name
AND c2.cust_contact='Jim';

 

6.UNION

6.1組合查詢

多數SQL查詢只包含從一個或多個表中返回數據的單條SELECT語句。但是SQL也允許執行多個查詢(多個SELECT語句),並將結果作爲一個查詢結果集返回。這些組合查詢通常稱爲並(UNION)或複合查詢。

主要有兩種情況需要使用組合查詢:

(1)在一個查詢中從不同的表返回結構數據;

(2)對一個表執行多個查詢,按一個查詢返回數據。

6.2使用UNION

使用UNION比較簡單,所要做的只是給出每條SELECT語句,在各條語句之間放上關鍵字UNION。

比如我們要把下面兩條查詢組合:

SELECT cust_name,cust
FROM Customers
WHERE cust_state IN('IL','IN','MI');
SELECT cust_name,cust_contact,cust_email
FROM Customers
WHERE cust_name='Fun4All';

我們可以如下組合:

SELECT cust_name,cust
FROM Customers
WHERE cust_state IN('IL','IN','MI')
UNION
SELECT cust_name,cust_contact,cust_email
FROM Customers
WHERE cust_name='Fun4All';

UNION指示執行這兩條SELECT語句,並把輸出組合成一個查詢結果集。

這裏有與上面相同的查詢語句:

SELECT cust_name,cust_contact,cust_email
FROM Customers
WHERE cust_state IN('IL','IN','MI')
OR cust_name='Fun4ALL';

 

7.項目實戰

7.1項目五 組合兩張表

任務要求:

在數據庫中創建表1和表2,並各插入三行數據(自己造)。

 

編寫一個 SQL 查詢,滿足條件:無論 person 是否有地址信息,都需要基於上述兩表提供 person 的以下信息:FirstName, LastName, City, State

(1)新建表:

CREATE TABLE Person(
PersonID INT PRIMARY KEY,
FirstName VARCHAR(10),
LastName VARCHAR(10)
);
CREATE TABLE Address(
AddressId INT PRIMARY KEY,
PersonId INT,
City VARCHAR(10),
State VARCHAR(10)
);

(2)插入數據

INSERT INTO Person VALUE('1','wang','xiaoming');
INSERT INTO Person VALUE('2','wangm','xiaomingm');
INSERT INTO Person VALUE('3','wangl','xiaomingq');
INSERT INTO Address VALUE('10','1','chengdu','china');
INSERT INTO Address VALUE('11','2','chengduC','china');
INSERT INTO Address VALUE('12','4','chengduB','china');

(3)查詢

SELECT Person.FirstName,Person.LastName,Address.City,Address.State
FROM Person LEFT OUTER JOIN Address
ON Person.PersonId=Address.PersonId;

 

結果:

 

7.2項目六:刪除重複的郵箱

任務要求:

編寫一個 SQL 查詢,來刪除 email 表中所有重複的電子郵箱,重複的郵箱裏只保留 Id 最小 的那個。

例如,在運行你的查詢語句之後,上面的 Email表應返回以下幾行:

(1)創建表:

CREATE TABLE email(
Id INT PRIMARY KEY,
Email VARCHAR(10)
);

(2)插入行:

INSERT INTO email VALUE('1','[email protected]');
INSERT INTO email VALUE('2','[email protected]');
INSERT INTO email VALUE('3','[email protected]');

(3)刪除和查詢

DELETE a.*
FROM email AS a,email AS  b
WHERE a.Email=b.Email
AND a.ID>b.ID;

SELECT *
FROM email;

結果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章