【SQL ZOO 解答集】(3 SELECT from Nobel)

##本投稿の目的
- sql学習サイト[**sqlzoo**](https://sqlzoo.net/wiki/SQL_Tutorial)を用いたsqlの学習と理解
- 学習のアウトプット
- 学習メモとして、かつ公式の解答ページがなかったので作成した。

[0 SELECT basics](https://sqlzoo.net/wiki/SELECT_basics)
[1 SELECT name](https://sqlzoo.net/wiki/SELECT_names)
[2 SELECT from World](https://sqlzoo.net/wiki/SELECT_from_WORLD_Tutorial)
[3 SELECT from Nobel（このページ）](https://sqlzoo.net/wiki/SELECT_from_Nobel_Tutorial)
[4 SELECT within SELECT](https://sqlzoo.net/wiki/SELECT_within_SELECT_Tutorial)
[5 SUM and COUNT](https://sqlzoo.net/wiki/SUM_and_COUNT)
[6 JOIN](https://sqlzoo.net/wiki/The_JOIN_operation)
[7 More JOIN operations](https://sqlzoo.net/wiki/More_JOIN_operations)
[8 Using Null](https://sqlzoo.net/wiki/Using_Null)
[8+ Numeric Examples](https://sqlzoo.net/wiki/NSS_Tutorial)
[9 Self join](https://sqlzoo.net/wiki/Self_join)

####[3 SELECT from Nobel](https://sqlzoo.net/wiki/SELECT_from_Nobel_Tutorial)

| yr   | subject   | winner                     |
|:-----|:----------|:---------------------------|
| 1960 | Chemistry | Willard F. Libby           |
| 1960 | Literature| Saint-John Perse           |
| 1960 | Medicine  | Sir Frank Macfarlane Burnet|
| 1960 | Medicine  | Peter Madawar              |

####問題1
#####1950年度のノーベル賞受賞者を表示するようにクエリーを修正する。
```sql
SELECT yr, subject, winner
FROM nobel
WHERE yr = 1950
```

####問題2
#####ノーベル文学賞（Literature）を1962年に受賞した人を表示

```sql
SELECT winner
FROM nobel
WHERE yr = 1962
AND subject = 'Literature'
```

####問題3
#####アルバート・アインシュタイン(Albert Einstein)がノーベル賞を受賞した年と分野を表示

```sql
SELECT yr, subject
FROM nobel
WHERE winner = 'Albert Einstein' 
```

####問題4
#####

```sql
SELECT winner
FROM nobel
WHERE yr >= 2000 AND subject = 'Peace'
```
####問題5
#####1980年から1989年までの文学賞受賞者の詳細（年、主題、受賞者）をすべて表示。
```sql
SELECT *
FROM nobel
WHERE yr between 1980 AND 1989 AND subject = 'Literature'
```

####問題6
#####大統領の勝者の詳細をすべて表示します。 
- セオドア・ルーズベルト
- ウッドロー・ウィルソン
- ジミー・カーター
- バラック・オバマ

```sql
SELECT * 
FROM nobel
WHERE winner IN ('Theodore Roosevelt',
                 'Woodrow Wilson',
                 'Jimmy Carter',
                 'Barack Obama')
```

####問題7
#####名がジョンの受賞者を表示する

```sql
SELECT winner
FROM nobel
WHERE winner like 'John%'
```
####問題8
######1980年の物理学の受賞者の年、主題、および名前を、1984年の化学の受賞者とともに表示します。

```sql
SELECT *
FROM nobel
WHERE (subject = 'Physics' AND yr = 1980) 
   OR (subject = 'Chemistry' AND yr = 1984)
```

####問題9
#####化学と医学を除く1980年の受賞者の年、主題、名前を表示する
> **NOT IN**を使って対象のデータを除外。

```sql
SELECT *
FROM nobel
WHERE yr = 1980
AND subject NOT IN ('Chemistry', 'Medicine')
```

####問題10
#####はじめに（1910年以前、1910年を除く）「医学」賞を受賞した人々の年、主題、および名前を表示、<br>後に（2004年、2004年を含む）に「文学」賞の受賞者とともに表示する。
> <,>,>=の使い分け、and,orの使い方を学びましょう！

```sql
SELECT *
FROM nobel
WHERE (yr < 1910 and subject = 'Medicine')
   OR (yr >= 2004 and subject =  'Literature')
```

####問題11
######
> 非ASCII文字のÜ（ウムラウト）を使いましょう。SQL自体は簡単です。
https://en.wikipedia.org/wiki/%C3%9C#Keyboarding

```sql
SELECT *
FROM nobel 
WHERE winner = 'PETER GRÜNBERG'
```

####問題12
#####ユージーンオニールが受賞した賞の詳細をすべて見る
> 検索対象に「'」（シングルクオート）が入っていた場合どうするか？という問題。
A.「''」シングルクオートの後に加えて付ければいい。

```sql
SELECT *
FROM nobel 
WHERE winner = 'EUGENE O''NEILL'
```
####問題13
#####受賞者、年、および受賞者がSirで始まるようにリスト化する。<br>最新(年)のものを最初に、次に名前の順に表示します。

```sql
SELECT winner, yr, subject
FROM nobel 
WHERE winner LIKE 'Sir%'
```
サイトではこれでも正解になってしまう。厳密に書くと

```sql
SELECT winner , yr, subject
FROM nobel
WHERE winner LIKE 'Sir%'
ORDER BY yr DESC, winner
```
> ORDER BYは明示的に行の順序を指定する。
例：ORDER BY <並べ替えの基準となる列1>, <並べ替えの基準となる列2>,...

####問題14
#####SUBJECT IN（ 'Chemistry'、 'Physics'）は値として使用できる。(0または1)<br>
1984年の受賞者と件名を、件名と受賞者名で並べて表示。<br>最後に化学と物理を並べる。
> 突然ハイレベルになりました。汗
つまり**「INに含まれるものに”1”を、それ以外には”0”を付与される」**ことを利用し、
その順番に並べなさいという意味です。

```sql
--デフォルトで書いてあるSQl
SELECT winner, subject
FROM nobel
WHERE yr=1984
ORDER BY subject IN subject, winner
```
**解説**
> ※ subject IN ('Chemistry','Physics')
の IN は比較演算子で、
この一文は subjectの値が‘Chemistry’ もしくは ‘Physics’ に一致するかどうかを比較・判定する式になってます。
一致する場合はtrue、そうでない場合はfalseを返ってきます。
そして、多くのプログラム言語でtrueは1、falseは0としても扱われます。

> まだ説明足りない気もしますが、
↓のSQL実行してみるとイメージしやすいかもしれません

**解答**

```sql
-- （答えのSQLのSELECT句に subject IN (‘Chemistry’,‘Physics’)  を足す。）

SELECT winner, subject
FROM nobel 
WHERE yr=1984 
ORDER BY subject IN ('Chemistry','Physics'), subject, winner
```


前回
[2 SELECT from World](https://qiita.com/m_masashi/items/140b130eef5c62f0e46f)
次回
[4 SELECT within SELECT]