leetcode部分Mysqlテーマ解法
28288 ワード
1:Weatherテーブルを指定し、SQLクエリーを作成して、前(昨日)の日付よりも温度の高いすべての日付のIdを検索します.
例えば、上記で与えられたWeatherテーブルに従って、以下のIdを返す.
考え方:1つのテーブルをコピーし、2つのテーブルの日付とデータを制約し、datediff()関数を使用して日付の差を比較し、答えをマッピングします.
2:SQLクエリーを作成し、Personテーブルの重複するすべての電子メールボックスを検索します.
以上の入力に基づいて、クエリーは次の結果を返します.
考え方:1枚の表をコピーして、答えの表を重くして、それから制約を行って、まず2枚の表のidが異なっているが電子メールボックスの同じ記録を取ります
3:サイトには2つのテーブル、Customersテーブル、Ordersテーブルがあります.SQLクエリーを作成し、何も注文していないすべてのお客様を見つけます.Customersテーブル:
Ordersテーブル:
たとえば、上記の表を指定すると、クエリーは次のように返されます.
考え方:Ordersテーブルの集合idを取り、CustomtersテーブルのidがOrdersテーブルのidにないことを制約する
4:coursesテーブルがあります.student(学生)とclass(カリキュラム)があります.
5人以上の学生の授業をすべてリストしてください.
たとえば、テーブル:
出力するべき:
Note:学生は授業ごとに計算を繰り返すべきではありません.
考え方:グループのデリバリー+コンストレイント
5:ある町に新しい映画館ができて、多くの人が映画を見に来ました.同映画館はユーザー体験に特に注意し、映画の推薦を行うLEDディスプレイパネルがあり、映画評論や関連映画の説明が発表されている.
この映画館の情報部の責任者として、SQLクエリーを作成し、すべての映画がboringではなく(退屈ではありません)、idが奇数である映画を見つける必要があります.結果は等級ratingで並べてください.
たとえば、次の表cinemaを示します.
上記の例では、正しい出力は次のとおりです.
考え方:型取り演算+判断+並べ替え
6:SQLクエリーを作成して、Personテーブルのすべての重複した電子メールボックスを削除します.重複したメールボックスにはIdの最小のものしか残っていません.
Idはこのテーブルのプライマリ・キーです.たとえば、クエリー文を実行した後、上のPersonテーブルには次の行が返されます.
構想:1枚の表をコピーして、デカルト積の接続方式を通じて、2枚の表の中で繰り返してidの小さい記録を見つけて、表1の中で削除して、そしてマッピングします
7:ここにWorld時計があります
一つの国の面積が300万平方キロを超えたり、人口が2500万人を超えたりすれば、この国は大きな国です.
SQLクエリーを作成し、テーブル内のすべての国の名前、人口、面積を出力します.
たとえば、上記の表に基づいて、次のように出力します.
考え方:単位換算+判断
8:美ちゃんは中学校の情報科学技術の先生で、彼女はseat席表を持っていて、普段は学生の名前と彼らに対応する席idを保存するために使われています.
縦列のidは連続的に増加する
美ちゃんは隣の二人の学生の席を変えようとした.
彼女にSQL queryを書いて美ちゃんが望んでいる結果を出力してもらえませんか?
例:
データ入力が上表の場合、出力結果は次のようになります.
注意:学生数が奇数であれば、最後の同級生の席を変える必要はありません.構想:パリティ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;