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;
結果如下: