leetcode部分Mysqlテーマ解法


1:Weatherテーブルを指定し、SQLクエリーを作成して、前(昨日)の日付よりも温度の高いすべての日付のIdを検索します.
+---------+------------------+------------------+
| Id(INT) | RecordDate(DATE) | Temperature(INT) |
+---------+------------------+------------------+
|       1 |       2015-01-01 |               10 |
|       2 |       2015-01-02 |               25 |
|       3 |       2015-01-03 |               20 |
|       4 |       2015-01-04 |               30 |
+---------+------------------+------------------+

例えば、上記で与えられたWeatherテーブルに従って、以下のIdを返す.
+----+
| Id |
+----+
|  2 |
|  4 |
+----+

考え方:1つのテーブルをコピーし、2つのテーブルの日付とデータを制約し、datediff()関数を使用して日付の差を比較し、答えをマッピングします.
select a.Id from Weather a,Weather b where datediff(a.RecordDate,b.RecordDate)=1 and b.Temperature < a.Temperature ;

2:SQLクエリーを作成し、Personテーブルの重複するすべての電子メールボックスを検索します.
+----+---------+
| Id | Email   |
+----+---------+
| 1  | a@b.com |
| 2  | c@d.com |
| 3  | a@b.com |
+----+---------+

以上の入力に基づいて、クエリーは次の結果を返します.
+---------+
| Email   |
+---------+
| a@b.com |
+---------+

考え方:1枚の表をコピーして、答えの表を重くして、それから制約を行って、まず2枚の表のidが異なっているが電子メールボックスの同じ記録を取ります
select distinct 
p1.Email as Email 
from Person p1,Person p2
where
p1.id<>p2.id and p1.Email=p2.Email;

3:サイトには2つのテーブル、Customersテーブル、Ordersテーブルがあります.SQLクエリーを作成し、何も注文していないすべてのお客様を見つけます.Customersテーブル:
+----+-------+
| Id | Name  |
+----+-------+
| 1  | Joe   |
| 2  | Henry |
| 3  | Sam   |
| 4  | Max   |
+----+-------+

Ordersテーブル:
+----+------------+
| Id | CustomerId |
+----+------------+
| 1  | 3          |
| 2  | 1          |
+----+------------+

たとえば、上記の表を指定すると、クエリーは次のように返されます.
+-----------+
| Customers |
+-----------+
| Henry     |
| Max       |
+-----------+

考え方:Ordersテーブルの集合idを取り、CustomtersテーブルのidがOrdersテーブルのidにないことを制約する
select Name as Customers from Customers where id not in (select CustomerId from Orders);

4: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:学生は授業ごとに計算を繰り返すべきではありません.
考え方:グループのデリバリー+コンストレイント
select class from courses  group by class having count(distinct student)>=5;

5:ある町に新しい映画館ができて、多くの人が映画を見に来ました.同映画館はユーザー体験に特に注意し、映画の推薦を行うLEDディスプレイパネルがあり、映画評論や関連映画の説明が発表されている.
この映画館の情報部の責任者として、SQLクエリーを作成し、すべての映画がboringではなく(退屈ではありません)、idが奇数である映画を見つける必要があります.結果は等級ratingで並べてください.
たとえば、次の表cinemaを示します.
+---------+-----------+--------------+-----------+
|   id    | movie     |  description |  rating   |
+---------+-----------+--------------+-----------+
|   1     | War       |   great 3D   |   8.9     |
|   2     | Science   |   fiction    |   8.5     |
|   3     | irish     |   boring     |   6.2     |
|   4     | Ice song  |   Fantacy    |   8.6     |
|   5     | House card|   Interesting|   9.1     |
+---------+-----------+--------------+-----------+

上記の例では、正しい出力は次のとおりです.
+---------+-----------+--------------+-----------+
|   id    | movie     |  description |  rating   |
+---------+-----------+--------------+-----------+
|   5     | House card|   Interesting|   9.1     |
|   1     | War       |   great 3D   |   8.9     |
+---------+-----------+--------------+-----------+

考え方:型取り演算+判断+並べ替え
select * from cinema where id mod 2 =1 and description<>'boring' order by rating desc;

6:SQLクエリーを作成して、Personテーブルのすべての重複した電子メールボックスを削除します.重複したメールボックスにはIdの最小のものしか残っていません.
+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
| 3  | john@example.com |
+----+------------------+

Idはこのテーブルのプライマリ・キーです.たとえば、クエリー文を実行した後、上のPersonテーブルには次の行が返されます.
+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
+----+------------------+

構想:1枚の表をコピーして、デカルト積の接続方式を通じて、2枚の表の中で繰り返してidの小さい記録を見つけて、表1の中で削除して、そしてマッピングします
delete p1.* from person p1,person p2 where
p1.id>p2.id and p1.email=p2.email;

7:ここにWorld時計があります
+-----------------+------------+------------+--------------+---------------+
| name            | continent  | area       | population   | gdp           |
+-----------------+------------+------------+--------------+---------------+
| Afghanistan     | Asia       | 652230     | 25500100     | 20343000      |
| Albania         | Europe     | 28748      | 2831741      | 12960000      |
| Algeria         | Africa     | 2381741    | 37100000     | 188681000     |
| Andorra         | Europe     | 468        | 78115        | 3712000       |
| Angola          | Africa     | 1246700    | 20609294     | 100990000     |
+-----------------+------------+------------+--------------+---------------+

一つの国の面積が300万平方キロを超えたり、人口が2500万人を超えたりすれば、この国は大きな国です.
SQLクエリーを作成し、テーブル内のすべての国の名前、人口、面積を出力します.
たとえば、上記の表に基づいて、次のように出力します.
+--------------+-------------+--------------+
| name         | population  | area         |
+--------------+-------------+--------------+
| Afghanistan  | 25500100    | 652230       |
| Algeria      | 37100000    | 2381741      |
+--------------+-------------+--------------+

考え方:単位換算+判断
select name, population, area from world 
where area>3000000 or population >25000000;

8:美ちゃんは中学校の情報科学技術の先生で、彼女はseat席表を持っていて、普段は学生の名前と彼らに対応する席idを保存するために使われています.
縦列のidは連続的に増加する
美ちゃんは隣の二人の学生の席を変えようとした.
彼女にSQL queryを書いて美ちゃんが望んでいる結果を出力してもらえませんか?
例:
+---------+---------+
|    id   | student |
+---------+---------+
|    1    | Abbot   |
|    2    | Doris   |
|    3    | Emerson |
|    4    | Green   |
|    5    | Jeames  |
+---------+---------+

データ入力が上表の場合、出力結果は次のようになります.
+---------+---------+
|    id   | student |
+---------+---------+
|    1    | Doris   |
|    2    | Abbot   |
|    3    | Green   |
|    4    | Emerson |
|    5    | Jeames  |
+---------+---------+

注意:学生数が奇数であれば、最後の同級生の席を変える必要はありません.構想:パリティidを交換すればいい、特判最大値、if(' ',' ', ' ')と両目表現式の差は多くなく、1つの空は特判条件が真であるかどうかを表し、真のために2に入り、逆に3に入る.
select if(id % 2=0,id-1,if(id=(select max(id) from seat),id,id+1)) as id,student from seat order by id;