目录
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;