MySQL: SQLBOLT(XUESQL)练习题解答

MySQL学习的第二个平台: SQLBOLT (XUESQL), 同样在自己练习的同时,记录答案,以下仅包含基本的查询部分。
英文版SQLBOLT,地址:https://sqlbolt.com/
对应同样内容的中文版为自学SQL,地址: http://xuesql.cn/

0 SQL基本简介:

  1. 朋友您好,这是第一题,请你先将左侧的输入框里的内容清空,然后请输入如下SQL,您将看到这条SQL会列出所有电影标题
SELECT title FROM movies;
  1. 请输入如下SQL你将看到4条电影
SELECT title,director
FROM movies WHERE ID <5;
  1. 输入如下SQL你将看到电影总条数:
SELECT COUNT(*) FROM movies;
  1. 坚持到这一题您已打败50%左右的人,请输入:SELECT 1+1
SELECT 1+1;

SQL Lesson 1: SELECT 查询 101

http://xuesql.cn/lesson/select_queries_introduction

  1. 找到所有电影的名称title ✓
SELECT title FROM movies;
  1. 找到所有电影的导演 ✓
SELECT director FROM movies;
  1. 找到所有电影的名称和导演 ✓
SELECT title, director FROM movies;
  1. 找到所有电影的名称和上映年份 ✓
SELECT title,year FROM movies;
  1. 找到所有电影的所有信息 ✓
SELECT * FROM movies;
  1. 找到所有电影的名称,Id和播放时长 ✓
SELECT title,id,Length_minutes FROM movies;
  1. 请列出所有电影的ID,名称和出版国(即美国) ✓
SELECT ID, title, "美国" as publisher FROM movies 

SQL Lesson 2: 条件查询 (constraints) (Pt. 1)

http://xuesql.cn/lesson/select_queries_with_constraints

  1. 找到id为6的电影 ✓
SELECT * FROM movies
WHERE id=6;
  1. 找到在2000-2010年间year上映的电影 ✓
SELECT * FROM movies
WHERE year BETWEEN 2000 AND 2010;
  1. 找到不是在2000-2010年间year上映的电影 ✓
SELECT * FROM movies
WHERE year NOT BETWEEN 2000 AND 2010;
  1. 找到头5部电影 ✓
SELECT * FROM movies
WHERE ID<=5;
  1. 找到2010(含)年之后的电影里片长小于两个小时的片子 ✓
SELECT * FROM movies
WHERE year >=2010 AND length_minutes<120;
  1. 找到99年和09年的电影,只要列出年份和片长看下 ✓
SELECT year,length_minutes FROM movies
WHERE year IN (1999,2009);

SQL Lesson 3: 条件查询(constraints) (Pt. 2)

http://xuesql.cn/lesson/select_queries_with_constraints_pt_2

  1. 找到所有Toy Story系列电影 ✓
SELECT * FROM movies
WHERE title LIKE '%Toy Story%';
  1. 找到所有John Lasseter导演的电影 ✓
SELECT * FROM movies
WHERE Director = 'John Lasseter';
  1. 找到所有不是John Lasseter导演的电影 ✓
SELECT * FROM movies
WHERE Director != 'John Lasseter';
  1. 找到所有电影名为 “WALL-” 开头的电影 ✓
SELECT * FROM movies
WHERE title LIKE 'WALL-%';
  1. 有一部98年电影中文名《虫虫危机》请给我找出来 ✓
SELECT * FROM movies
WHERE year = 1998;
  1. 找出所有Pete导演的电影,只要列出电影名,导演名和年份就可以 ✓
SELECT Title, Director, Year FROM Movies
WHERE Director LIKE '%Pete%';
  1. John Lasseter导演了两个系列,一个Car系列一个Toy Story系列,请帮我列出这John Lasseter导演两个系列千禧年之后(含千禧年)的电影 ✓
SELECT * FROM Movies
WHERE Director = 'John Lasseter' AND year >= 2000;

SQL Lesson 4: 查询结果Filtering过滤 和 sorting排序

http://xuesql.cn/lesson/filtering_sorting_query_results

  1. 按导演名排重列出所有电影(只显示导演),并按导演名正序排列 ✓
SELECT DISTINCT Director FROM Movies
ORDER BY Director;
  1. 列出按上映年份最新上线的4部电影 ✓
SELECT * FROM Movies
ORDER BY year DESC
LIMIT 4;
  1. 按电影名字母序升序排列,列出前5部电影 ✓
SELECT * FROM Movies
ORDER BY Title
LIMIT 5;
  1. 按电影名字母序升序排列,列出上一题之后的5部电影 ✓
SELECT * FROM Movies
ORDER BY Title
LIMIT 5 OFFSET 5;
  1. 如果按片长排列,John Lasseter导演导过片长第3长的电影是哪部,列出名字即可 ✓
SELECT Title FROM Movies
WHERE Director = 'John Lasseter'
ORDER BY Length_minutes DESC
LIMIT 1 OFFSET 2;
  1. 按导演名字母升序,如果导演名相同按年份降序,取前10部电影给我 ✓
SELECT * FROM Movies
ORDER BY Director, Year DESC
LIMIT 10;

SQL Review 5: 复习 SELECT 查询

http://xuesql.cn/lesson/select_queries_review

  1. 列出所有加拿大人的Canadian信息(包括所有字段) ✓
SELECT * FROM north_american_cities
WHERE Country = 'Canada';
  1. 列出所有美国United States的城市按纬度从北到南排序(包括所有字段) ✓
SELECT * FROM north_american_cities
WHERE Country = 'United States'
ORDER BY Longitude DESC;
  1. 列出所有在Chicago西部的城市,从西到东排序(包括所有字段) ✓
SELECT * FROM north_american_cities
WHERE Longitude < 
	(SELECT Longitude FROM north_american_cities 
	WHERE City = 'Chicago')
ORDER BY Longitude;
  1. 用人口数population排序,列出墨西哥Mexico最大的2个城市(包括所有字段) ✓
SELECT * FROM north_american_cities
WHERE Country = 'Mexico'
ORDER BY population DESC
LIMIT 2;
  1. 列出美国United States人口3-4位的两个城市和他们的人口(包括所有字段) ✓
SELECT * FROM north_american_cities
WHERE Country = 'United States'
ORDER BY Population DESC
LIMIT 2 OFFSET 2
  1. 北美所有城市,请按国家名字母序从A-Z再按人口从多到少排列看下前10位的城市(包括所有字段) ✓
SELECT * FROM north_american_cities
ORDER BY Country, Population DESC
LIMIT 10;

SQL Lesson 6: 用JOINs进行多表联合查询

http://xuesql.cn/lesson/select_queries_with_joins

  1. 找到所有电影的国内Domestic_sales和国际销售额 ✓
SELECT *
FROM Movies m
INNER JOIN boxoffice b ON m.id = b.movie_id;
  1. 找到所有国际销售额比国内销售大的电影 ✓
SELECT *
FROM Movies m
INNER JOIN boxoffice b ON m.id = b.movie_id
WHERE Domestic_sales < International_sales;
  1. 找出所有电影按市场占有率rating倒序排列 ✓
SELECT *
FROM Movies m
INNER JOIN boxoffice b ON m.id = b.movie_id
ORDER BY Rating DESC;
  1. 每部电影按国际销售额比较,排名最靠前的导演是谁,线上销量多少 ✓
SELECT Director,International_sales
FROM Movies m
INNER JOIN Boxoffice b ON m.id = b.movie_id
ORDER BY International_sales DESC
LIMIT 1;

SQL Lesson 7: 外连接(OUTER JOINs)

http://xuesql.cn/lesson/select_queries_with_outer_joins

  1. 找到所有有雇员的办公室(buildings)名字 ✓
SELECT DISTINCT building
FROM Employees
WHERE building IS NOT NULL;
  1. 找到所有办公室和他们的最大容量 ✓
SELECT building_name,Capacity
FROM Buildings
  1. 找到所有办公室里的所有角色(包含没有雇员的),并做唯一输出(DISTINCT) ✓
SELECT DISTINCT b.building_name,Role
FROM Buildings b
LEFT JOIN Employees e ON b.building_name = e.building
  1. 找到所有有雇员的办公室(buildings)和对应的容量 ✓
SELECT DISTINCT building_name,capacity
FROM employees e
LEFT JOIN buildings b ON e.building = b.building_name
WHERE building IS NOT NULL;

SQL Lesson 8: 关于特殊关键字 NULLs

http://xuesql.cn/lesson/select_queries_with_nulls

  1. 找到雇员里还没有分配办公室的(列出名字和角色就可以) ✓
SELECT Name,Role FROM employees
WHERE Building IS NULL
  1. 找到还没有雇员的办公室 ✓
SELECT building_name
FROM Buildings b
LEFT JOIN Employees e ON b.building_name = e.building
WHERE name IS NULL

SQL Lesson 9: 在查询中使用表达式

http://xuesql.cn/lesson/select_queries_with_expressions

  1. 列出所有的电影ID,名字和销售总额(以百万美元为单位计算) ✓
SELECT Id, Title,(Domestic_sales + International_sales)/1000000 AS Total_sales
FROM Movies m 
JOIN boxoffice b ON m.id = b.movie_id
  1. 列出所有的电影ID,名字和市场指数(Rating的10倍为市场指数) ✓
SELECT Id, Title, Rating*10
FROM Movies m 
JOIN boxoffice b ON m.id = b.movie_id
  1. 列出所有偶数年份的电影,需要电影ID,名字和年份 ✓
SELECT Id, Title, Year
FROM Movies m 
JOIN boxoffice b ON m.id = b.movie_id
WHERE Year%2==0;
  1. John Lasseter导演的每部电影每分钟值多少钱,告诉我最高的3个电影名和价值就可以 ✓
SELECT Title, (Domestic_sales+International_sales)/Length_minutes AS value
FROM Movies m
JOIN Boxoffice b ON m.id = b.movie_id
WHERE Director = 'John Lasseter'
ORDER BY value DESC
LIMIT 3;
  1. 电影名最长的3部电影和他们的总销量是多少 ✓
    
SELECT length(Title) AS title_len, title, (Domestic_sales+International_sales) AS total_sales
FROM Movies m
JOIN Boxoffice b ON m.id = b.movie_id
ORDER BY title_len DESC
LIMIT 3;

SQL Lesson 10: 在查询中进行统计I (Pt. 1)

http://xuesql.cn/lesson/select_queries_with_aggregates

  1. 找出就职年份最高的雇员(列出雇员名字+年份) ✓
SELECT Name, Years_employed
FROM Employees
ORDER BY Years_employed DESC
LIMIT 1;
  1. 按角色(Role)统计一下每个角色的平均就职年份 ✓
SELECT Role, AVG(Years_employed)
FROM Employees
GROUP BY Role;
  1. 按办公室名字总计一下就职年份总和 ✓
SELECT Building, SUM(Years_employed)
FROM Employees
GROUP BY Building;
  1. 每栋办公室按人数排名,不要统计无办公室的雇员 ✓
SELECT Building, COUNT(Name)
FROM Employees
WHERE Building IS NOT NULL
GROUP BY Building;
  1. 就职1,3,5,7年的人分别占总人数的百分比率是多少(给出年份和比率"50%" 记为 50) ✓
SELECT Years_employed, 
    ROUND(COUNT(*)*1.0*100/(SELECT COUNT(*) FROM Employees),0) AS Rate
FROM Employees
WHERE Years_employed IN (1,3,5,7)
GROUP BY Years_employed

SQL Lesson 11: 在查询中进行统计II (Pt. 2)

http://xuesql.cn/lesson/select_queries_with_aggregates_pt_2

  1. 统计一下Artist角色的雇员数量 ✓
SELECT COUNT(Name)
FROM Employees
WHERE Role = 'Artist';
  1. 按角色统计一下每个角色的雇员数量 ✓
SELECT Role, COUNT(Name)
FROM Employees
GROUP BY Role;
  1. 算出Engineer角色的就职年份总计 ✓
SELECT SUM(Years_employed)
FROM Employees
WHERE Role = 'Engineer';
  1. 按角色分组算出每个角色按有办公室和没办公室的统计人数(列出角色,数量,有无办公室,注意一个角色如果部分有办公室,部分没有需分开统计) ✓
SELECT Role,COUNT(Name)
    CASE WHEN Building IS NULL THEN '无办公室'
    ELSE '有办公室' END AS '有无办公室'
FROM Employees
GROUP BY Role, Building IS NULL;
---或者:
SELECT role,count(*),building is not null
FROM employees
group by role,building is null;
--解析:
--1. group by role,building is null 按照角色和building是否为空进行分组
--2. building is not null  获取布尔值,判断building是否为空
  1. 按角色和就职年份统计人数,年份按0-3,3-6,6-9这种阶梯分组,最后按角色+阶梯分组排序 ✓
SELECT Role, COUNT(Years_employed) AS num,Years_employed /3 AS Year_3
FROM Employees
GROUP BY Role,year_3;
---使用 years_employed/3 将years_employed按3的倍数进行分组

SQL Lesson 12: 查询执行顺序

http://xuesql.cn/lesson/select_queries_order_of_execution

  1. 统计出每一个导演的电影数量(列出导演名字和数量) ✓
SELECT Director,COUNT(id)
FROM Movies
GROUP BY Director;
  1. 统计一下每个导演的销售总额(列出导演名字和销售总额) ✓
SELECT Director,sum(Domestic_sales+International_sales) AS total_sales
FROM Movies m
LEFT JOIN Boxoffice b ON b.movie_id = m.id
GROUP BY Director;
  1. 按导演分组计算销售总额,求出平均销售额冠军(统计结果过滤掉只有单部电影的导演,列出导演名,总销量,电影数量,平均销量) ✓
SELECT Director,
    sum(Domestic_sales+International_sales) AS total_sales,
    count(id) AS num,
    sum(Domestic_sales+International_sales)/count(id) AS avg_sales
FROM Movies m
LEFT JOIN Boxoffice b ON b.movie_id = m.id
GROUP BY Director
HAVING COUNT(m.id)>1
ORDER BY avg_sales DESC
LIMIT 1;
  1. 找出每部电影和单部电影销售冠军之间的销售差,列出电影名,销售额差额 ✓
SELECT title,
   (SELECT MAX(Domestic_sales+International_sales) FROM boxoffice) 	-(Domestic_sales+International_sales)  AS gap
FROM Movies m
LEFT JOIN Boxoffice b ON b.movie_id = m.id
GROUP BY title;

完整SELECT语句:
SELECT DISTINCT column, AGG_FUNC(column_or_expression), …
FROM mytable
JOIN another_table
ON mytable.column = another_table.column
WHERE constraint_expression
GROUP BY column
HAVING constraint_expression
ORDER BY column ASC/DESC
LIMIT count OFFSET COUNT;

总结执行顺序:

  1. FROM / JOINS - 数据来源
  2. WHERE - 筛选条件
  3. GROUP BY - 将筛选结果分组
  4. HAVING - 对分组结果进行筛选
  5. SELECT - 对分组并筛选之后的数据进行选择
  6. DISTINCT - 对于选择的字段进行去重
  7. ORDER BY - 对于选择的结果进行排序
  8. LIMIT / OFFSET - 截取部分数据
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值