leetcodeのSQLの練習

データベースあまりにも多くの食べ物は、テスト用のSQL文筆記試験と面接を恐れて、数日練習します


 

すべての顧客情報とその参照を保持するテーブルの顧客を、与えられました。

------ + ------ + ----------- + +
|上記のid上記の|名前| referee_id |
+ ------ + ------ + - + ----------
| 1つの|ウィル| NULL |
| 2 |ジェーン| NULL |
| 3 |アレックス| 2 |
| 4 |ビル| NULL |
| 5 |ザック| 1 |
|。6 |マーク| 2 |
+ ------ + ------ + ----------- +
番号付きリストを返すクエリを作成し、人々の推奨数のリストは、数字ではありません2。

上記のサンプルデータのために、結果は次のとおりです。

+ ------ +
| 名前|
+ ------ +
| ウィル|
| ジェーン|
| ビル|
| ザック|
+ ------ +

#以下のMySQLのクエリステートメント書く
 選択名前をから顧客referee_idがあるヌルまたは referee_id <> 2  

 


 

 

テーブルにCUSTOMER_NUMBERで注文を対応する顧客の注文の最大数を検索します。

顧客の注文の最大数を確保するために、データはただ一つだけです。

次のように受注テーブルが定義されています。

| コラム| タイプ|
| ------------------- | ----------- |
| ORDER_NUMBER(PK)| int型|
| CUSTOMER_NUMBER | int型|
| ORDER_DATE | 日付|
| required_date | 日付|
| shipped_date | 日付|
| 状態| CHAR(15)|
| コメント| CHAR(200)|
样例输入

| ORDER_NUMBER | CUSTOMER_NUMBER | ORDER_DATE | required_date | shipped_date | 状態| コメント|
| -------------- | ----------------- | ------------ | --- ------------ | -------------- | -------- | --------- |
| 1 | 1 | 2017年4月9日| 2017年4月13日| 2017年4月12日| クローズ| |
| 2 | 2 | 2017年4月15日| 2017年4月20日| 2017年4月18日| クローズ| |
| 3 | 3 | 2017年4月16日| 2017年4月25日| 2017年4月20日| クローズ| |
| 4 | 3 | 2017年4月18日| 2017年4月28日| 2017年4月25日| クローズ| |
样例输出

| CUSTOMER_NUMBER |
| ----------------- |
| 3 |
説明

CUSTOMER_NUMBER「3」の顧客は、彼らが唯一の順序を持っているので、より多くの顧客よりもするには、2件の受注、「1」または「2」を持つ
結果は3である顧客CUSTOMER_NUMBER、ということであるように。
高度:以上の顧客の注文のほとんどの数のためにそこに結ばれている場合、あなたはそれらをすべてCUSTOMER_NUMBERそれを見つけることができますか?

#以下のMySQLのクエリステートメント書く
 選択 CUSTOMER_NUMBER からの受注のグループを  CUSTOMER_NUMBERの順序 によって *DESCの限界1
#以下のMySQLのクエリステートメント書く
 選択 CUSTOMER_NUMBERをからの受注のグループ によって CUSTOMER_NUMBER  *=選択 最大()から選択 *などからの受注グループ によって CUSTOMER_NUMBER)など 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