1. 程式人生 > >資料庫學習紀要(二十七):MySQL-7-外聯接、自聯接與聯合

資料庫學習紀要(二十七):MySQL-7-外聯接、自聯接與聯合

九、外聯接、自聯接與聯合
外聯接:可以在表中沒有匹配記錄的情況下返回記錄
自聯接:可以聯接表本身
聯合:可以合併查詢結果

1、外聯接
//LEFT OUTER JOIN(左外聯接)接收左表的所有行,並用這些行與右表的行匹配。當左表與右表具有一對多關係時,左外聯接特別有用。
//LEFT OUTER JOIN會匹配左表中的每一行及右表中符合條件的行。
//理解外聯接的最大祕密在於知道表在左邊還是在右邊,在LEFT OUTER JOIN中,出現在FROM後、聯接前的表稱為左表,而出現在聯接後的表就是右表。

SELECT g.gril, t.toy FROM girls g
LEFT OUTER JOIN toys t
ON g.toy_id = t.toy_id;
//LEFT OUTER JOIN會取得左表(girls)的所有行,並把這些行與右表(toys)的行進行匹配
//本例中左外聯接的查詢結果與使用內聯接時一樣,區別是:外聯接一定會提供資料行,無論該行能否在另一個表中找出相匹配的行
//左外聯接的結果中出現NULL表示右表中沒有找到與左表相符的記錄

2、自聯結
在規範的資料庫中,相同的表不會出現兩次。因此可以用自聯接(self-join)以模擬聯接兩張表的效果
注:自聯接能把單一表當成兩張具有完全相同的資訊的表進行查詢

SELECT c1.name, c2.name AS boss FROM clown_info c1
INNER JOIN clown_info c2
ON c1.boss_id = c2.id;
//本例中使用了clown_info表兩次,第一次設定它的別名為c1,第二次則設定別名為c2。然後利用內聯接來連線boss_id(來自c1)與頭領的姓名(name,來自c2)

3、UNION
UNION根據我們在SELECT中指定的列,把兩張表或更多張表的查詢結果合併至一個表中。可以把UNION的查詢結果想成“重疊了”每個SELECT的查詢結果

SELECT title FORM job_current
UNION
SELECT title FROM job_desired
UNION
SELECT title FROM job_listings
ORDER BY title;

4、INTERSECT(交集)與EXCEPT(差集)

SELECT title FROM job_current
INTERSECT/EXCEPT
SELECT title FROM job_desired;

5、關鍵字ANY、ALL
案例:
SELECT name, rating FROM restaurant_ratings
WHERE rating IN
(SELECT rating FROM restaurant_ratings WHERE rating > 3 AND rating < 9);

使用ALL:
SELECT name, rating FROM restaurant_ratings
WHERE rating >/</>=/<= ALL
(SELECT rating FROM restaurant_ratings WHERE rating > 3 AND rating < 9);
//大於加上ALL可以找出任何大於集合中最大值的值
//小於加上ALL可以找出任何小於集合中最小值的值

使用ANY:
SELECT name, rating FROM restaurant_ratings
WHERE rating >/< ANY
(SELECT rating FROM restaurant_ratings WHERE rating > 3 AND rating < 9);
//大於加上ANY可以找出任何大於集合中最小值的值
//小於加上ANY可以找出任何小於集合中最大值的值

6、DATE與TIME型別
DATE YYYY-MM-DD
DATETIME  YYYY-MM-DD HH:MM:SS
TIMESTAMP YYYYMMDDHHMMSS
TIME HH:MM:SS

7、建立臨時表
CREATE TEMPORARY TABLE my_temp_table
(
some_id INT,
some_data VARCHAR(50)
);

查詢建立臨時表:
CREATE TEMPORARY TABLE my_temp_table AS 
SELECT * FROM my_permanent_table;

8、轉換資料型別
CAST(your_column, TYPE)
TYPE可以是:
CHAR()
DATE
DATETIME
DECIMAL
SIGNED[INTEGER]
TIME
UNSIGNED[INTEGER]
舉例:
SELECT CAST('2005-01-01' AS DATE);
SELECT CAST(2 AS DECIMAL);