每天更新一题 让大家在休息时间可以轻松学习!
下面是关于SQL的题目,每日更新~
(PS:大家要看清题号回答哦~需要答案的同学可以在下方留言题号,第一时间回复答案)
有如下一张表Orders
查询出每个发货单号(shipid),最早付款时间(paydate)和最小付款单号(payno)
结果如下:
考点:聚合函数和关联的灵活使用
表 point 保存了一些点在 X 轴上的坐标,这些坐标都是整数。
写一个查询语句,找到这些点中最近两个点之间的距离。
最近距离显然是 '1' ,是点 '-1' 和 '0' 之间的距离。所以输出应该如下:
注意:每个点都与其他点坐标不同,表 table 不会有重复坐标出现。
考点:题目看似简单,谨防陷阱
怎么把下面的表(tab)
查成这样1个结果
考点:行列转换
有如下一组数据
求出NAME中每组累加/每组总数的比例大于0.6的ID和NAME
预期的结果应该为
解释:从题目意思可以看出A组的总数为16,从ID为1到5分别累加后的结果分别为1,3,9,13,16,只有13和16除以总数16才大于0.6,所以返回的结果ID为4和5,同样B组为7和8
有如下一张
Activity 表:
其中games_played是玩家登陆玩的游戏数量,
查询每个玩家每天累计玩的游戏数量有多少?结果如下:
解释:玩家1第一次玩了5个,所以是5,第二次是6个,所以累计就是5+6=11,
第三次是1个,累计就是5+6+1=12
玩家2类似
写一条 SQL 查询语句,从 Customer 表中查询购买了 Product 表中所有产品的客户的 id。示例:Customer 表:
Product 表:
Result 表:
购买了所有产品(5 和 6)的客户的 id 是 1 和 3 。
有如下几张表:
Student
Course
SC
查询"01 "课程比" 02 "课程成绩高的学生的信息及课程分数?
P.S. 题目较简单,希望大家能动手练习一下,锻炼自己逻辑思维能力。
有一张成绩表SC,表结构为SC(StuID,CID,Course),分部对应是学生ID,课程ID和学生成绩,有如下测试数据
查询出既学过’001’课程,也学过’003’号课程的学生ID 预期结果为
表 orders 定义如下:order_id(订单编号),customer_id(客户编号),order_date(下单日期)
有如下几条记录:
在表 orders 中找到订单数最多客户对应的 customer_id 。
预计的输出结果:
考点:聚合函数的灵活使用
用一条SQL 语句 查询出每门课都大于80 分的学生姓名,表格样式及数据如下:
结果为:
请至少使用两种方法作答
给定一个表 tree,id 是树节点的编号, p_id 是它父节点的 id 。
树中每个节点属于以下三种类型之一:叶子:如果这个节点没有任何孩子节点。根:如果这个节点是整棵树的根,即没有父节点。内部节点:如果这个节点既不是叶子节点也不是根节点。
写一个查询语句,输出所有节点的编号和节点的类型,并将结果按照节点编号排序。上面样例的结果为:
解释:
节点 '1' 是根节点,因为它的父节点是 NULL ,同时它有孩子节点 '2' 和 '3' 。节点 '2' 是内部节点,因为它有父节点 '1' ,也有孩子节点 '4' 和 '5' 。节点 '3', '4' 和 '5' 都是叶子节点,因为它们都有父节点同时没有孩子节点。注意 如果树中只有一个节点,你只需要输出它的根属性。
考点:自连接的灵活使用
有如下两张表
Project 表:
Employee 表:
查询出每个项目中经验最丰富(experience_years最大)的员工,返回的结果如下:
说明:员工1和3是project_id为1中exprerience_years最丰富的,而project_id为2的项目,员工id为1的是exprerience_years最丰富
有如下两张表
Books 表:
Orders 表:
编写一个SQL查询,要求去年销售少于10本的书籍,不包括从今天起1个月内可供使用的书籍。假设今天是2019-06-23。
结果表:
从一张考勤表TAB中找出员工每天的上班,下班打卡的具体时间?
考勤表中相关字段如下:ID,NAME,NO,TIME
其中ID是主键,NAME为员工姓名,NO为工号,TIME为打卡时间
返回的结果如下:
考点:CONVERT转换函数
编写一个 SQL 查询,获取Employee 表中第二高的薪水(Salary) 。
例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。
结果如下:
考点:LIMIT/TOP/ROW_NUMBER()的运用
有一张成绩表SC,表结构为SC(StuID,CID,Course),分部对应是学生ID,课程ID和学生成绩,有如下测试数据
查询出’001’课程分数大于’002’课程分数的学生学号
预期结果为
编写一个SQL查询,用于选择每种销售产品的第一年的产品ID、年份、数量和价格。查询结果格式如下所示:Sales table:
Product table:
返回如下结果
Result table:
Employee 表包含所有员工。Employee 表有三列:员工Id,公司名和薪水。
请编写SQL查询来查找每个公司的薪水中位数。挑战点:你是否可以在不使用任何内置的SQL函数的情况下解决此问题。
按 company 分组排序,记为 rk
计算各 company 的记录数除以2,记为 cnt
连接结果
找出符合中位数要求的记录
有 2 个要点:分组排序通过两个变量完成,注意 @com 的更新顺序要在 @rk 之后
按示例,若记录数为奇数,取一条,否则取两条,如记录数为7,则第4名是中位数,
记录数为6,则第3,4名是中位数。由于 cnt = 计数除以2,则对应序号可直接用 in (cnt+0.5,cnt+1,cnt) 来表达
给如下两个表,写一个查询语句,求出在每一个工资发放日,每个部门的平均工资与公司的平均工资的比较结果 (高 / 低 / 相同)。表:salary
employee_id 字段是表 employee 中 employee_id 字段的外键。
对于如上样例数据,结果为:
解释:
在三月,公司的平均工资是 (9000+6000+10000)/3 = 8333.33… 由于部门 '1' 里只有一个 employee_id 为 '1' 的员工,所以部门 '1' 的平均工资就是此人的工资 9000 。因为 9000 > 8333.33 ,所以比较结果是 'higher’。第二个部门的平均工资为 employee_id 为 '2' 和 '3' 两个人的平均工资,为 (6000+10000)/2=8000 。因为 8000 < 8333.33 ,所以比较结果是 'lower' 。在二月用同样的公式求平均工资并比较,比较结果为 'same' ,因为部门 '1' 和部门 '2' 的平均工资与公司的平均工资相同,都是 7000 。
有如下两张表
表: Candidate(候选人)
表: Vote(选票)
id 是自动递增的主键,
CandidateId 是 Candidate 表中的 id.
请编写 sql 语句来找到当选者的名字,即选票最多的候选者。上面的例子将返回当选者 B,因为他获得了2票,其他人获得了1票或0票。
注意:
你可以假设没有平局,换言之,最多只有一位当选者。
Numbers 表保存数字的值及其频率。
在此表中,数字为 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 3,所以中位数是 (0 + 0) / 2 = 0。
请编写一个查询来查找所有数字的中位数并将结果命名为 median 。注意:什么是中位数?当一串数字是奇数个时,例如8,3,5,1,4。我们按顺序排列后为:1,3,4,5,8。那么4就是中位数 当一串数字为偶数个时,例如8,3,5,1,4,2。我们按顺序排列后为:1,2,3,4,5,8。那么(3+4)/2=3.5就是中位数。
编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。
例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):
给定一个 Weather 表,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 Id。
例如,根据上述给定的 Weather 表格,返回如下 Id:
有如下一道面试题,表名Course,见下图
请写出具体的查询语句
有如下一张表City,
希望得到如下结果
该如何写这个查询?
有如下一张表Person,其中ID是自增长
求解,如何将相邻两条记录的Name进行位置交换?预期结果如下:
其中,最后一条记录如果是奇数则不交换。
有7个会议室,每个会议室每天都有人开会,某一天的开会时间如下:
查询出开会时间有重叠的是哪几个会议室?上面预期结果是
你能写一个 SQL 查询语句,找到只出现过一次的数字中,最大的一个数字吗?下面是测试数据
对于上面给出的样例数据,你的查询语句应该返回如下结果:
有如下一张表
ActorDirector 表:
写一条SQL查询语句获取合作过至少三次的演员和导演的 id 对 (actor_id, director_id)
结果:
唯一的 id 对是 (1, 1),他们恰好合作了 3 次。
有如下两张表
Project 表:
Employee 表:
查询出每个项目中经验最丰富(experience_years最大)的员工,返回的结果如下:
说明:员工1和3是project_id为1中exprerience_years最丰富的,
而project_id为2的项目,员工id为1的是exprerience_years最丰富
有如下ABC三列和几组数据
想得到如下结果
该如何写查询?
提示:可以使用聚合函数或者lag函数来求解
几个朋友来到电影院的售票处,准备预约连续空余座位。
你能利用表 cinema ,帮他们写一个查询语句,获取所有空余座位,并将它们按照 seat_id 排序后返回吗?
对于如上样例,你的查询语句应该返回如下结果。
注意:
seat_id 字段是一个自增的整数,free 字段是布尔类型(’1′ 表示空余, '0' 表示已被占据)。
连续空余座位的定义是大于等于 2 个连续空余的座位。
有如下一张记录表,如何查询出每隔15分钟的记录数
预期结果如下:
考点:日期函数的灵活运用
select CONCAT(DATE_FORMAT(operationdate, '%Y-%m-%d %H:'),
case FLOOR(DATE_FORMAT(operationdate, '%i') / 15)
when 0 then ’00'
when 1 then ’15'
when 2 then ’30'
when 3 then ’45' end
) AS c,
count(*)
from registerrecordinfo t
GROUP BY c
ORDER BY operationdate ASC
编写一个 SQL 查询,查找所有至少连续出现两次的数字。
例如,给定上面的 Logs 表, 1 和2是连续出现至少两次的数字。
考点:连续记录问题
SELECT
t1.num AS Num,
SUM(CASE WHEN t1.num = t2.num THEN 1 ELSE 0 END) + 1 AS Times
FROM LOGS
t1 LEFT
JOIN LOGS
t2 ON t1.id + 1 = t2.id
GROUP BY t1.num
from:https://developer.aliyun.com/ask/259491