本投稿の目的
- sql学習サイトsqlzooを用いたsqlの学習と理解
- 学習のアウトプット
- 学習メモとして、かつ公式の解答ページがなかったので作成した。
0 SELECT basics
1 SELECT name
2 SELECT from World
3 SELECT from Nobel(このページ)
4 SELECT within SELECT
5 SUM and COUNT
6 JOIN
7 More JOIN operations
8 Using Null
8+ Numeric Examples
9 Self join
3 SELECT from Nobel
| 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年度のノーベル賞受賞者を表示するようにクエリーを修正する。
SELECT yr, subject, winner
FROM nobel
WHERE yr = 1950
問題2
ノーベル文学賞(Literature)を1962年に受賞した人を表示
SELECT winner
FROM nobel
WHERE yr = 1962
AND subject = 'Literature'
問題3
アルバート・アインシュタイン(Albert Einstein)がノーベル賞を受賞した年と分野を表示
SELECT yr, subject
FROM nobel
WHERE winner = 'Albert Einstein'
問題4
SELECT winner
FROM nobel
WHERE yr >= 2000 AND subject = 'Peace'
問題5
1980年から1989年までの文学賞受賞者の詳細(年、主題、受賞者)をすべて表示。
SELECT *
FROM nobel
WHERE yr between 1980 AND 1989 AND subject = 'Literature'
問題6
大統領の勝者の詳細をすべて表示します。
- セオドア・ルーズベルト
- ウッドロー・ウィルソン
- ジミー・カーター
- バラック・オバマ
SELECT *
FROM nobel
WHERE winner IN ('Theodore Roosevelt',
'Woodrow Wilson',
'Jimmy Carter',
'Barack Obama')
問題7
名がジョンの受賞者を表示する
SELECT winner
FROM nobel
WHERE winner like 'John%'
問題8
1980年の物理学の受賞者の年、主題、および名前を、1984年の化学の受賞者とともに表示します。
SELECT *
FROM nobel
WHERE (subject = 'Physics' AND yr = 1980)
OR (subject = 'Chemistry' AND yr = 1984)
問題9
化学と医学を除く1980年の受賞者の年、主題、名前を表示する
NOT INを使って対象のデータを除外。
SELECT *
FROM nobel
WHERE yr = 1980
AND subject NOT IN ('Chemistry', 'Medicine')
問題10
はじめに(1910年以前、1910年を除く)「医学」賞を受賞した人々の年、主題、および名前を表示、
後に(2004年、2004年を含む)に「文学」賞の受賞者とともに表示する。
<,>,>=の使い分け、and,orの使い方を学びましょう!
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
SELECT *
FROM nobel
WHERE winner = 'PETER GRÜNBERG'
問題12
ユージーンオニールが受賞した賞の詳細をすべて見る
検索対象に「'」(シングルクオート)が入っていた場合どうするか?という問題。
A.「''」シングルクオートの後に加えて付ければいい。
SELECT *
FROM nobel
WHERE winner = 'EUGENE O''NEILL'
問題13
受賞者、年、および受賞者がSirで始まるようにリスト化する。
最新(年)のものを最初に、次に名前の順に表示します。
SELECT winner, yr, subject
FROM nobel
WHERE winner LIKE 'Sir%'
サイトではこれでも正解になってしまう。厳密に書くと
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)
1984年の受賞者と件名を、件名と受賞者名で並べて表示。
最後に化学と物理を並べる。
突然ハイレベルになりました。汗
つまり**「INに含まれるものに”1”を、それ以外には”0”を付与される」**ことを利用し、
その順番に並べなさいという意味です。
--デフォルトで書いてある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の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
次回
[4 SELECT within SELECT]