leetcode sql练习

数据库太菜,怕笔试面试考sql语句,练几天


给定表 customer ,里面保存了所有客户信息和他们的推荐人。

+------+------+-----------+
| id | name | referee_id|
+------+------+-----------+
| 1 | Will | NULL |
| 2 | Jane | NULL |
| 3 | Alex | 2 |
| 4 | Bill | NULL |
| 5 | Zack | 1 |
| 6 | Mark | 2 |
+------+------+-----------+
写一个查询语句,返回一个编号列表,列表中编号的推荐人的编号都 不是 2。

对于上面的示例数据,结果为:

+------+
| name |
+------+
| Will |
| Jane |
| Bill |
| Zack |
+------+

# Write your MySQL query statement below
select name from customer where referee_id is null or referee_id<>2;

在表 orders 中找到订单数最多客户对应的 customer_number 。

数据保证订单数最多的顾客恰好只有一位。

表 orders 定义如下:

| Column | Type |
|-------------------|-----------|
| order_number (PK) | int |
| customer_number | int |
| order_date | date |
| required_date | date |
| shipped_date | date |
| status | char(15) |
| comment | char(200) |
样例输入

| order_number | customer_number | order_date | required_date | shipped_date | status | comment |
|--------------|-----------------|------------|---------------|--------------|--------|---------|
| 1 | 1 | 2017-04-09 | 2017-04-13 | 2017-04-12 | Closed | |
| 2 | 2 | 2017-04-15 | 2017-04-20 | 2017-04-18 | Closed | |
| 3 | 3 | 2017-04-16 | 2017-04-25 | 2017-04-20 | Closed | |
| 4 | 3 | 2017-04-18 | 2017-04-28 | 2017-04-25 | Closed | |
样例输出

| customer_number |
|-----------------|
| 3 |
解释

customer_number 为 '3' 的顾客有两个订单,比顾客 '1' 或者 '2' 都要多,因为他们只有一个订单
所以结果是该顾客的 customer_number ,也就是 3 。
进阶: 如果有多位顾客订单数并列最多,你能找到他们所有的 customer_number 吗?

# Write your MySQL query statement below
select customer_number from orders group by customer_number order by count(*) desc limit 1;
# Write your MySQL query statement below
select customer_number from orders group by customer_number having count(*)=(select max(a) from (select count(*) as a from orders group by customer_number) as fuckyou);

有一个courses 表 ,有: student (学生) 和 class (课程)。

请列出所有超过或等于5名学生的课。

例如,表:

+---------+------------+
| student | class      |
+---------+------------+
| A       | Math       |
| B       | English    |
| C       | Math       |
| D       | Biology    |
| E       | Math       |
| F       | Computer   |
| G       | Math       |
| H       | Math       |
| I       | Math       |
+---------+------------+

应该输出:

+---------+
| class   |
+---------+
| Math    |
+---------+

Note:
学生在每个课中不应被重复计算。

# Write your MySQL query statement below
select class from courses group by class having count(distinct student)>=5;
# Write your MySQL query statement below
select class 
from 
    (select class,count(distinct student) as x 
    from courses  
    group by class
    ) as fuck
where x>=5;

在 Facebook 或者 Twitter 这样的社交应用中,人们经常会发好友申请也会收到其他人的好友申请。现在给如下两个表:

表: friend_request

| sender_id | send_to_id |request_date|
|-----------|------------|------------|
| 1 | 2 | 2016_06-01 |
| 1 | 3 | 2016_06-01 |
| 1 | 4 | 2016_06-01 |
| 2 | 3 | 2016_06-02 |
| 3 | 4 | 2016-06-09 |
 

表: request_accepted

| requester_id | accepter_id |accept_date |
|--------------|-------------|------------|
| 1 | 2 | 2016_06-03 |
| 1 | 3 | 2016-06-08 |
| 2 | 3 | 2016-06-08 |
| 3 | 4 | 2016-06-09 |
| 3 | 4 | 2016-06-10 |
 

写一个查询语句,求出好友申请的通过率,用 2 位小数表示。通过率由接受好友申请的数目除以申请总数。

对于上面的样例数据,你的查询语句应该返回如下结果。

|accept_rate|
|-----------|
| 0.80|
 

注意:

通过的好友申请不一定都在表 friend_request 中。在这种情况下,你只需要统计总的被通过的申请数(不管它们在不在原来的申请中),并将它除以申请总数,得到通过率
一个好友申请发送者有可能会给接受者发几条好友申请,也有可能一个好友申请会被通过好几次。这种情况下,重复的好友申请只统计一次。
如果一个好友申请都没有,通过率为 0.00 。
 

解释: 总共有 5 个申请,其中 4 个是不重复且被通过的好友申请,所以成功率是 0.80 。

进阶:

你能写一个查询语句得到每个月的通过率吗?
你能求出每一天的累计通过率吗?

select round(ifnull((select count(distinct requester_id ,accepter_id ) from request_accepted)/(select count(distinct sender_id ,send_to_id) from friend_request),0),2) as accept_rate

学习了两个新函数:ifnull(x,y),如果x不为null/0则x,否则为y。round(x,2),对x保留2位小数,round(x,3),对x保留3位小数。


几个朋友来到电影院的售票处,准备预约连续空余座位。

你能利用表 cinema ,帮他们写一个查询语句,获取所有空余座位,并将它们按照 seat_id 排序后返回吗?

| seat_id | free |
|---------|------|
| 1 | 1 |
| 2 | 0 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
 

对于如上样例,你的查询语句应该返回如下结果。

| seat_id |
|---------|
| 3 |
| 4 |
| 5 |
注意:

seat_id 字段是一个自增的整数,free 字段是布尔类型('1' 表示空余, '0' 表示已被占据)。
连续空余座位的定义是大于等于 2 个连续空余的座位。

# Write your MySQL query statement below
select distinct a.seat_id from cinema a join cinema b
on abs(a.seat_id-b.seat_id)=1 and a.free=1 and b.free=1 order by a.seat_id; 

一个小学生 Tim 的作业是判断三条线段是否能形成一个三角形。

然而,这个作业非常繁重,因为有几百组线段需要判断。

假设表 triangle 保存了所有三条线段的三元组 x, y, z ,你能帮 Tim 写一个查询语句,来判断每个三元组是否可以组成一个三角形吗?

| x | y | z |
|----|----|----|
| 13 | 15 | 30 |
| 10 | 20 | 15 |
对于如上样例数据,你的查询语句应该返回如下结果:

| x | y | z | triangle |
|----|----|----|----------|
| 13 | 15 | 30 | No |
| 10 | 20 | 15 | Yes |

select *,
if((x + y <= z or x + z <= y or y + z <= x), "No", "Yes") as triangle
from triangle;

select的属性里可以用if语句 if(condition,x,y),表示如果condition成立则为x,否则为y。

# Write your MySQL query statement below
select x,y,z,(case when x+y>z and x+z>y and y+z>x then  'Yes' else 'No' end) as triangle from triangle;

还可以在select的属性里用case when then else end语句。

用法:

CASE column
    WHEN  value1 THEN  result1 
    WHEN  value2 THEN  result2
    ......
    ELSE resultN

表 point 保存了一些点在 x 轴上的坐标,这些坐标都是整数。

写一个查询语句,找到这些点中最近两个点之间的距离。

| x |
|-----|
| -1 |
| 0 |
| 2 |
 

最近距离显然是 '1' ,是点 '-1' 和 '0' 之间的距离。所以输出应该如下:

| shortest|
|---------|
| 1 |
 

注意:每个点都与其他点坐标不同,表 table 不会有重复坐标出现。

# Write your MySQL query statement below
select min(qqq) as shortest from (select abs(a.x-b.x) as qqq from point a join point b on a.x<b.x ) as fuckyou;

表 my_numbers 的 num 字段包含很多数字,其中包括很多重复的数字。

你能写一个 SQL 查询语句,找到只出现过一次的数字中,最大的一个数字吗?

+---+
|num|
+---+
| 8 |
| 8 |
| 3 |
| 3 |
| 1 |
| 4 |
| 5 |
| 6 |
对于上面给出的样例数据,你的查询语句应该返回如下结果:

+---+
|num|
+---+
| 6 |
注意:

如果没有只出现一次的数字,输出 null 。

# Write your MySQL query statement below
select ifnull((select num from my_numbers group by num having count(*)=1 order by num desc limit 1),null) as num;

注意ifnull用法,用在select的属性项上。

评论区又看到一个方法:在外层再次select一次,就可以查找出null值并输出。

# Write your MySQL query statement below
select (select num from my_numbers group by num having count(*)=1 order by num desc limit 1) as num;

猜你喜欢

转载自www.cnblogs.com/FdWzy/p/12585484.html
今日推荐