目錄
1.第五節 簡單的SELECT查詢
1.1 知識點
SELECT查詢
SELECT column, another_column, …
FROM mytable
WHERE condition(s)
ORDER BY column ASC/DESC
LIMIT num_limit OFFSET num_offset;
1.2 練習題
#1.列出所有加拿大城市及其人口
SELECT city, population FROM north_american_cities
WHERE country = "Canada";
#2.從北到南按順序排列美國所有城市
SELECT city, latitude FROM north_american_cities
WHERE country = "United States"
ORDER BY latitude DESC;
#3.列出芝加哥以西的所有城市,從西向東排序
SELECT city, longitude FROM north_american_cities
WHERE longitude < -87.629798
ORDER BY longitude ASC;
#4.列出墨西哥兩個最大的城市(按人口計算)
SELECT city, population FROM north_american_cities
WHERE Country="Mexico"
ORDER BY Population DESC
LIMIT 2;
#5.列出美國第三和第四大城市(按人口計算)及其人口
SELECT city, population FROM north_american_cities
WHERE Country="United States"
ORDER BY Population DESC
LIMIT 2 OFFSET 2,3;
或者
SELECT city, population FROM north_american_cities
WHERE country LIKE "United States"
ORDER BY population DESC
LIMIT 2 OFFSET 2;
2. 第六節 使用jion進行多表查詢
在前幾節課中所有的練習題都是圍繞單表進行,但是在現實世界中實體數據通常被分解爲多個部分並被使用成爲規範化存儲在多個正交表中。數據庫規範化的作用在於它可以最大限度地減少任何單個表中的重複數據,並允許數據庫中的數據彼此獨立增長,故此,查詢起來有些複雜,需要學習如何編寫可以組合所有數據並準確提取所需信息的查詢。
2.1 知識點
- 使用JOIN進行多表查詢
共享有關單個實體的信息表需要具有主鍵,該主鍵在數據庫中唯一標識該實體,一種常見的主鍵類型是自動遞增整數,它可以是字符串、散列值,只要求是唯一。
使用JOIN查詢中的子句,我們可以使用此唯一鍵將行數組合在兩個單獨的表中,第一個鏈接INNER JOIN句式結構爲:
在多個表上使用INNER JOIN選擇查詢
SELECT column, another_table_column, …
FROM mytable
INNER JOIN another_table
ON mytable.id = another_table.id
WHERE condition(s)
ORDER BY column, … ASC/DESC
LIMIT num_limit OFFSET num_offset;
2.2 練習題
#1.查找每部電影的國內和國際銷售情況
錯誤的:
SELECT title FROM movies
INNER JOIN Boxoffice
ON movies.Id = another_Boxoffice.Movie_id
WHERE International_sales;
正確的:
SELECT title, domestic_sales, international_sales
FROM movies
JOIN boxoffice
ON movies.id = boxoffice.movie_id;
#2.顯示每部電影在國際而非國內取得更好成績的銷售數字
SELECT title, domestic_sales, international_sales
FROM movies
JOIN boxoffice
ON movies.id = boxoffice.movie_id
WHERE domestic_sales <international_sales ;
#3.按降序排列所有電影
SELECT title, Rating
FROM movies
JOIN boxoffice
ON movies.id = boxoffice.movie_id
ORDER BY Rating DESC ;
3. 第七課 OUTER JOIN
根據想要分析數據的格式,INNER JOIN可能不足以進行分析,因爲結果表中只包含屬於兩個表的數據。
3.1 知識點
如果兩個表具有非對稱數據,這在數據的不同階段輸入時很容易發生,那麼我們必須使用 LEFT JOIN,RIGHT JOIN,FULL JOIN確保所需的數據不會被排除在結果之外。語句結構爲:
在多個表上選擇LEFT / RIGHT / FULL JOIN查詢
SELECT column, another_column, …
FROM mytable
INNER/LEFT/RIGHT/FULL JOIN another_table
ON mytable.id = another_table.matching_id
WHERE condition(s)
ORDER BY column, … ASC/DESC
LIMIT num_limit OFFSET num_offset;
如同INNER JOIN這三個新連接必須指定要加入數據的列。
當表A連接到表B時,LEFT JOIN無論是否在B中找到匹配的行, 簡單地包括來自A的行。無論是否在A中找到匹配,RIGHT JOIN 都是相同的但是相反的,保持B中的行,最後,FULL JOIN只意味着保留兩個表中的行,而不管另一個表中是否存在匹配的行。
3.2 練習題
#1.查找擁有員工的所有建築物的列表
我寫的:
SELECT name,Building,ROLE FROM employees
LEFT JOIN Buildings
ON employees.Building = Buildings.Building_name;
正確的:
SELECT DISTINCT building FROM employees;
#2.查找所有建築物及其容量的列表
SELECT * FROM buildings;
#3.列出每棟建築物中所有建築物和不同的員工角色(包括空樓)
SELECT DISTINCT building_name, role
FROM buildings
LEFT JOIN employees
ON building_name = building;
4. 第八節 關於NULL的簡短說明
減少NULL數據庫中值得可能性總是好的,因爲在構造查詢時需要特別注意,約束(某些函數在使用空值時表現不同)以及處理結果時。
4.1 知識點
NULL數據庫中值得替代方案是使數據類型具有適當的默認值,如0表示數字數據,空字符串表示文本數據等,但是如果數據庫需要存儲不完整的數據,那麼NULL在WHERE子句中通過使用IS NULL或者IS NOT NULL測試列中的值,舊世界改變爲
Select query with constraints on NULL values
SELECT column, another_column, …
FROM mytable
WHERE column IS/IS NOT NULL
AND/OR another_condition
AND/OR …;
4.2 練習題
#1.查找尚未分配到建築物的所有員工的姓名和角色
SELECT name,role,building FROM employees
WHERE BUILDING IS NULL;
#2.找出沒有員工的建築物的名稱
SELECT DISTINCT building_name
FROM buildings
LEFT JOIN employees
ON building_name = building
WHERE role IS NULL;