暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

练习简单sql

小夏数据之路 2021-06-03
1829

网站:xuesal.cn

对于初学者来说里面的题目真的可以拿来练手,不至于从入门到失败。现在开始做题,送上我自己做的答案。



简单了解后现在开始做题:

网址:xuesql.cn

SQL Lesson 0: 让我给SQL做个自我介绍:

从简单的查询开始:

1)对单个列查询:select 列名 from 表名;

(2) 对多个列查询:select 列名1,列名2 from 表名;

3)对所有的列查询:select * from 表名;

(4)查询该列中不重复的值去重):select DISTINCT 列 from 表名;

(1)看到所有电影标题:SELECT title FROM movies;

(2)请输入如下SQL你将看到4条电影:SELECT title,director FROM movies WHERE Id < 5;

(3)输入如下SQL你将看到电影总条数:SELECT count(*) FROM movies;

(4)SQL可以直接做计算,下面的SQL计算1+1的和,请输入:SELECT 1+1;

SQL Lesson 1: SELECT 查询 101

(1)简单查询】找到所有电影的名称title
: SELECT title FROM movies;

(2)【简单查询】找到所有电影的导演:SELECT director FROM movies;

(3)【简单查询】找到所有电影的名称和导演 :SELECT title,director FROM movies;

(4)【简单查询】找到所有电影的名称和上映年份:SELECT title, Year FROM movies;

(5)【简单查询】找到所有电影的所有信息:SELECT * FROM movies;

(6)【简单查询】找到所有电影的名称,Id和播放时长:SELECT title,Id,Length_minutes FROM movies;

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

对列做排序:使用关键字【order by 

(1) 升序:select 列 from 表名 order by 列(ASC);(默认是升序所以ASC可以省)

(2)降序:select 列 from 表名 order by 列 DESC;

对行的筛选:

(1)单条件筛选:select 列 from 表名 where 列 操作符 值;(操作符:= ,<, >,<>,>=,<=,between...and...,like,is null )

(2)多条件筛选:select 列 from 表名 where 列 操作符 值 逻辑运算符 列 操作符 值;(逻辑运算符:AND OR NOT)

(3)IN命令:select 列 from 表名 where 列 IN(值1,值1,值3);

(4)LIKE命令:select 列 from 表名 where 列 LIKE 条件;((%)任意匹配的字符,'_'下划线,只能匹配单个字符)

1.【简单条件】找到id
为6的电影:SELECT * FROM movies WHERE id =6;

2.【简单条件】找到在2000-2010年间year
上映的电影:SELECT * FROM movies WHERE YEAR BETWEEN 2000 AND 2010;

3.【简单条件】找到不是在2000-2010年间year
上映的电影:SELECT * FROM movies WHERE YEAR NOT BETWEEN 2000 AND 2010;

4.【简单条件】找到头5部电影:SELECT * FROM movies LIMIT 5;

5.【简单条件】找到2010(含)年之后的电影里片长小于两个小时的片子:SELECT * FROM movies WHERE year>=2010 and Length_minutes < 120 ;

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

1.【复杂条件】找到所有Toy Story
系列电影:SELECT * FROM movies WHERE title like'Toy Story%';

2.【复杂条件】找到所有John Lasseter
导演的电影:SELECT * FROM movies WHERE director='John Lasseter';

3.【复杂条件】找到所有不是John Lasseter
导演的电影:SELECT * FROM movies WHERE director!='John Lasseter';

4.【复杂条件】找到所有电影名为 "WALL-"
 开头的电影:SELECT * FROM movies WHERE title like'WALL%';

5.【复杂条件】有一部98年电影中文名《虫虫危机》请给我找出来:SELECT * FROM movies where year=1998;

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

1.【结果排序】按导演名排重
列出所有电影(只显示导演),并按导演名正序排列:SELECT DISTINCT director FROM movies order by director;

2.【结果排序】列出按上映年份最新
上线的4部电影:SELECT * FROM movies order by Year DESC LIMIT 4;

3.【结果排序】按电影名字母序升序
排列,列出前5部电影:SELECT * FROM movies order by TITLE LIMIT 5;

4.【结果排序】按电影名字母序升序排列,列出上一题之后
的5部电影:SELECT * FROM movies order by TITLE LIMIT 5,5;

5.【结果排序】如果按片长排列,John Lasseter导演导过片长第3长的电影是哪部,列出名字即可:SELECT title FROM movies WHERE director = 'John Lasseter' order by Length_minutes DESC LIMIT 2,1

SQL Review: 复习 SELECT 查询

  1. 复习】列出所有加拿大人的Canadian
    信息(包括所有字段):SELECT * FROM north_american_cities WHERE Country='Canada';

  2. 【复习】列出所有在Chicago
    西部的城市,从西到东排序(包括所有字段):SELECT * FROM north_american_cities WHERE Longitude<-87.629798 ORDER BY Longitude DESC

  3. 【复习】用人口数population
    排序,列出墨西哥Mexico
    最大的2个城市(包括所有字段):SELECT * FROM north_american_cities WHERE Country = 'Mexico' ORDER BY population DESC LIMIT 2

  4. 【复习】列出美国United States
    人口3-4位的两个城市和他们的人口(包括所有字段):SELECT * FROM north_american_cities WHERE Country = 'United States' ORDER BY population DESC LIMIT 2,2

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

语法:【相当于交集】

SELECT column, another_table_column, … FROM mytable (主表) INNERJOIN another_table (要连接的表) ON mytable.id = another_table.id (想)WHEREcondition(s)ORDERBY column, … ASC/DESCLIMIT num_limit OFFSET num_offset;

  1. 【联表】找到所有电影的国内Domestic_sales
    和国际销售额:SELECT * FROM Movies INNER JOIN Boxoffice ON id = Boxoffice.Movie_id

  2. 【联表】找到所有国际销售额比国内销售大的电影:SELECT * FROM Movies INNER JOIN Boxoffice ON id = Boxoffice.Movie_id WHERE Domestic_sales < International_sales

  3. 【联表】找出所有电影按市场占有率rating
    倒序排列:SELECT * FROM Movies INNER JOIN Boxoffice ON id = Boxoffice.Movie_id order by rating DESC

  4. 【联表】每部电影按国际销售额比较,排名最靠前的导演是谁,国际销量多少:SELECT director,International_sales FROM Movies INNER JOIN Boxoffice ON id = Boxoffice.Movie_id order by International_sales DESC LIMIT 1

SQL Lesson 7: 外连接(OUTER JOINs)

语法:SELECT column, another_column, … FROM mytable INNER/LEFT/RIGHT/FULLJOIN another_table ON mytable.id = another_table.matching_id

  1. 复习】找到所有有雇员的办公室(buildings
    )名字:SELECT distinct Building FROM Employees WHERE Building is not null

  2. 【复习】找到所有办公室里的所有角色(包含没有雇员的),并做唯一输出(DISTINCT
    ):SELECT DISTINCT role,Building_name FROM Buildings LEFT JOIN Employees ON Building = Building_name

  3. 【难题】找到所有有雇员的办公室(buildings
    )和对应的容量:SELECT DISTINCT Building_name, Capacity FROM Buildings LEFT JOIN Employees ON Building = Building_name WHERE Building IS NOT NULL;

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

  1. 【复习】找到雇员里还没有分配办公室的(列出名字和角色就可以):SELECT role,name FROM employees WHERE building is null;

  2. 【难题】找到还没有雇员的办公室:SELECT Building_name FROM buildings left join employees on buildings.building_name = employees.building WHERE Role IS NULL;

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

  1. 【计算】列出所有的电影ID,名字和销售总额(以百万美元为单位计算): SELECT id,title,(Domestic_sales + International_sales)/1000000 as 销售总额 FROM movies INNER JOIN Boxoffice ON Movies.id - Info Teknologi Terkini = Boxoffice.movie_id

  2. 【计算】列出所有的电影ID,名字和市场指数(Rating
    的10倍为市场指数):SELECT id,title,rating*10 as 市场指数 FROM movies INNER JOIN Boxoffice ON Movies.id - Info Teknologi Terkini = Boxoffice.movie_id

  3. 【计算】列出所有偶数年份的电影,需要电影ID,名字和年份:SELECT id,title,year FROM movies INNER JOIN Boxoffice ON Movies.id - Info Teknologi Terkini = Boxoffice.movie_id WHERE year%2 =0

  4. 【难题】John Lasseter导演的每部电影每分钟值多少钱,告诉我最高的3个电影名和价值就可以: SELECT title,(Domestic_sales +International_sales)/Length_minutes as 价值FROM movies INNER JOIN Boxoffice ON Movies.id = Boxoffice.movie_id WHERE director = 'John Lasseter' ORDER BY 价值 DESC LIMIT 3

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

  1. 【统计】找出就职年份最高的雇员(列出雇员名字+年份):SELECT name,Years_employed FROM employees ORDER BY Years_employed DESC LIMIT 1

  2. 【分组】按角色(Role
    )统计一下每个角色的平均就职年份: SELECT role,AVG(Years_employed) FROM employees GROUP BY role

  3. 【分组】按办公室名字总计一下就职年份总和:SELECT building,sum(Years_employed) FROM employees GROUP BY building

  4. 【难题】每栋办公室按人数排名,不要统计无办公室的雇员:SELECT Building,count(Building)as count FROM employees group by Building order by count DESC limit 2

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

  1. 统计】统计一下Artist角色的雇员数量 :SELECT count(*)FROM employees WHERE role = 'Artist'

  2. 【分组】按角色统计一下每个角色的雇员数量:SELECT role,count(*)FROM employees GROUP BY role

  3. 【分组】算出Engineer角色的就职年份总计:SELECT sum(Years_employed) FROM employees where role='Engineer'

  4. 【难题】按角色分组算出每个角色按有办公室和没办公室的统计人数(列出角色,数量,有无办公室,注意一个角色如果部分有办公室,部分没有需分开统计):SELECT count(*) ,Role,building is not null FROM employees group by Role,building


SQL Lesson 12: 查询执行顺序

完整的SELECT查询SELECT DISTINCT column, AGG_FUNC(column_or_expression), … FROM mytable JOIN another_table ON mytable.column = another_table.column WHEREconstraint_expressionGROUPBY column HAVINGconstraint_expressionORDERBYcolumnASC/DESCLIMITcountOFFSETCOUNT;

  1. 复习】统计出每一个导演的电影数量(列出导演名字和数量):SELECT director ,count(title)as 数量 FROM movies group by director

  2. 【复习】统计一下每个导演的销售总额(列出导演名字和销售总额):SELECT director ,sum(Domestic_sales + International_sales)as 销售总额 FROM movies join Boxoffice ON Movies.id - Info Teknologi Terkini = Boxoffice.movie_id group by director

  3. 【难题】按导演分组计算销售总额,求出平均销售额冠军(统计结果过滤掉只有单部电影的导演,列出导演名,总销量,电影数量,平均销量):SELECT Director,SUM(Domestic_sales+International_sales) AS 总销量, COUNT(Title) AS 电影数,SUM(Domestic_sales+International_sales)/COUNT(Title) AS 平均销量 FROM Movies JOIN Boxoffice ON Movies.id - Info Teknologi Terkini = Movie_id GROUP BY Director HAVING 电影数 >1 ORDER BY 平均销量 DESC LIMIT 1

4.【变态难】找出每部电影和单部电影销售冠军之间的销售差,列出电影名,销售额差额:

呜呜呜呜我没有做出来

总结:学习好数据库要多去练习,学习,学习不易,需不断努力。


文章转载自小夏数据之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论