【SQL初級編】SELECT文の基本を SQL問題集サイト『SQLab』の初級編で実践しながら理解する

SQL-Select

こんにちはフロントエンドエンジニアのまさにょんです!

今回はSQLの基本を SQL問題集サイト『SQLab』の「初級編」で実践しながら理解する方法について解説します。

『SQLab』とは?

Qiitaの『SQLの練習ができる学習サービス「SQLab」を作ってみた』と言う記事を拝見して『SQLab』の存在を知りました。

簡単に言うと、SQLの問題集ですね。

何がいいって、手軽に実行ができて、無料でSQLを訓練できるところですね。

先述のQiitaにも次のように記載されています。

・無料でバリエーション豊かな多くの練習問題に取り組める

・環境構築不要でブラウザ上ですぐに実践できる

・シンプルで使いやすいUI

・ER図やデータベース値を参考にしながら自力でクエリを組み立てる必要がある

上記の条件を揃えた学習サービスがなかったので作ることにしました。

引用元: SQLの練習ができる学習サービス「SQLab」を作ってみた

ちなみに、まさにょんのSQLスキルは、プロゲートのSQL講座や実務でSQLを使って、初歩的な理解はできている程度の実力です。

【初級編】SELECT文の基本理解&実践

DBをある程度、さわるようになってくるとSELECTの速さが重要である(Slow Query問題)ことに気づきます。

それもあってか、SQLab初級編の問題内容は、すべてSELECT文でした。

そこで、まずSELECT文の基本を確認してから問題集である『SQLab』に移行していきましょう。

SELECT文は、DatabaseのDataを操作するSQLの中でも取得系・GET系の役割を持ったSQL文です。

詳細の説明は、引用文を記載しておきます。

SELECT文とは、リレーショナルデータベース(RDB)を操作する言語である

SQL(Structured Query Language)に用意された構文の一つで、

テーブルから条件に従って行(レコード)を抽出するもの

基本的な構文は「SELECT 列名 FROM 表名 WHERE 条件」で、

表名で指定したテーブルの中から指定した条件に一致する行を探し出し、

列名で指定したフィールドを列挙したデータを返す。

列名に「*」を指定すると行全体を返し、WHERE句を省略するとすべての行を返す。

オプションで「ORDER BY 列名 ASC」を追加すると

指定された列の値が小さい順(昇順)に行を整列(ソート)したものを返し、

ASCの代わりに「DESC」を指定すると列の値が大きい順(降順)に整列したものを返す。

FROM句は「FROM(SELECT ~)」のようにSQL文を入れ子に指定することもでき、

内部のSQL文(サブクエリ、副問い合わせ)が返すテーブルを対象に抽出を行う。

DBMSによってはSELECT文で計算式や組み込み関数の実行を行うこともでき、

FROM句の省略が可能な場合もある。

引用元: SELECT文とは – 意味をわかりやすく – IT用語辞典 e-Words

上記にあるように、さまざまな条件を指定して、DBからデータを取得できるのがSELECT文です。

SELECTの基本的な構文をまとめると次のようになります。

SELECTの基本的な構文
# 基本の形
SELECT カラム指定 FROM テーブル指定 WHERE 条件指定

SQLab初級編を解いていく!

実際に、SQLabの問題を解きながら、SQLに対する理解を深めていきます。

また、SQLabで問題を解きながらわからない箇所は、その都度調べることをお勧めします。

時にQiitaの【これだけ覚えてたらOK!】SQL構文まとめ が特に役立ちました!

指定テーブルのレコードをすべて取得する

-- [問題文] 書籍一覧を取得してください。

-- 指定テーブルのレコードをすべて取得する
select * from books;

指定テーブルから、指定したカラム名のみを取得する

-- [問題文] 書籍名一覧を取得してください。出力項目はname(書籍名)です。

-- 指定テーブルから、指定したカラム名のみを取得する
select name from books;

指定テーブルから、指定したカラム名のみを取得する Ver. 複数

-- [問題文] 書籍名と発行年一覧を取得してください。
-- 出力項目はname(書籍名)とrelease_year(発行年)です。

-- 指定テーブルから、指定したカラム名のみを取得する Ver. 複数
select name, release_year from books;

取得したデータの重複を削除する「DISTINCT」

「DISTINCT」とは、SQLで使用されるコマンドの一つで、

SELECT文を実行した際の出力結果の重複レコード(データ行)を1つにまとめるための構文です。

-- [問題文] 書籍の発行年一覧を重複行を削除して取得してください。
-- 出力項目はrelease_year(発行年)です。

-- 取得したデータの重複を削除する
select distinct release_year from books;

カラム名に別名をつけて、取得する「AS」句

「AS」句とは、カラムやテーブルに別名をつけられる句です。

-- [問題文] 書籍名と総ページ数の一覧を取得してください。
-- 出力項目は書籍名(name)と総ページ数(total_page)です。

-- カラム名に別名をつけて、取得する
select name as "書籍名", total_page as "総ページ数" from books;

検索条件を指定して、絞り込む・制限するWhere句

WHERE句とは、テーブルデータの検索条件を指定するためのSQL構文です。

WHERE句を使う目的は、データの検索対象をしぼりこむためにSELECT文と組み合わせたり、

データの更新対象・削除対象を指定するためにUPDATE文・DELETEと組み合わせて使います。

データを操作する命令と一緒に使用することで、操作の対象を限定することができることが特徴です。

-- [問題文] 発行年が2020年の書籍一覧を取得してください。

-- whereで、検索条件を指定して、絞り込む・制限する
select * from books where release_year = 2020;

SQLのシングルクォーテーションとダブルクォーテーションの意味

SQLでは、文字列をシングルクォーテーションで囲んだ場合とダブルクォーテーションで囲んだ場合とでは、

その意味が違います。

SQLの文字列は、シングルクォーテーションで囲むのが基本です。

SQLで使われるデータベース名や列名の識別子は、大文字と小文字を区別しません。

DB側で勝手に大文字に変換されます。

データベース名を大文字で書いても、小文字で書いても同じデータベースが参照されます。

小文字として認識してもらいたい場合は、ダブルクォーテーションを使用する必要があります。

-- [問題文] 発行年が2020年の書籍一覧を取得してください。

select * from books where name = '宇宙の歴史';

LIKEで「曖昧検索」する

「LIKE」「曖昧検索」を行うための仕組みです。

ワイルドカード文字を使用して、指定したキーワードを含んだ文字列を探すといった操作ができます。

パターン文字意味
%任意の0文字以上の文字列
_(アンダースコア)任意の1文字
-- [問題文]「マンガ」というキーワードを含む書籍一覧を取得してください。

-- Like句で曖昧検索 => 柔軟な検索
select * from books where name LIKE '%マンガ%';

LIMIT句で、取得数を絞り込む・制限する

LIMITは、問い合せ結果の行数を制限します。

LIMIT句は、問い合せ結果で取得する行数を制限するときに使用します。

このとき、取得する開始位置を OFFSET(オフセット)といい、

問い合せ結果の先頭から(0 からカウント)の位置付けを指定します。

-- [問題文] 男性の著者を先頭から3名取得してください。

-- LIMIT句で、取得数を絞り込む・制限する
select * from authors where gender = '男性' limit 3;

Nullを除外する条件文「 is not Null 」

Nullを除外する条件文は「 is not Null 」と記述します。

is not null 」は「Null ではない」でそのままの意味です。

-- [問題文] 発行年が明記されている書籍一覧を取得してください。

-- is not null => Null ではない
select * from books where release_year is not null;

BETWEEN演算で、ある範囲内に値が収まっているかの判定をする

BETWEEN演算で、ある範囲内に値が収まっているかの判定をすることができます。

[ between 100 and 200 ] とすれば、100から200の範囲内という意味の条件文になります。

-- [問題文] 総ページ数が300~400ページの書籍一覧を取得してください。

select * from books where total_page between 300 and 400;

IN演算子で、指定のカラムの値が指定の値と一致するものだけ抽出する

IN演算子で、指定のカラムの値が、指定の値と一致するものだけ抽出することができます。

-- [問題文] 発行年が2004, 2008, 2018年の書籍一覧を取得してください。

-- in演算子: 指定のカラムの値が、指定の値と一致するものだけ抽出する
select * from books where release_year in (2004, 2008, 2018);

取得する時に計算処理をする

-- [問題文] 書籍の税込価格一覧を取得してください。消費税率は10%です。
-- 出力項目はbook_id(書籍ID)とtax_included_price(税込価格)


-- 取得するときに簡単な計算をさせている & 新しいカラム名で表示している。
select book_id, price * 1.1  as tax_included_price from book_sales;

比較演算子を使って、条件を設定する

SQLでは、比較演算子を使って、条件を設定することもできます。

比較演算子の一覧は、次のとおりです。

比較演算子意味
=左右の値が等しい
<左辺は右辺より小さい
>左辺は右辺より大きい
<=左辺は右辺の値以下
>=左辺は右辺の値以上
<>左右の値が等しくない
(ノットイコール)
-- [問題文] 総ページ数が100ページ未満の書籍一覧を取得してください。

select * from books where total_page < 100;
-- [問題文] 定休日が月曜日ではない店舗一覧を取得してください。

select * from stores where holiday <> '月曜日';
-- [問題文] 発行年が2000年以上で総ページ数が200ページ以下の書籍一覧を取得してください。

select * from books where release_year >= 2000 and total_page <= 200;

Twitterやってます!Follow Me!

神聖グンマー帝国の逆襲🔥

神聖グンマー帝国の科学は、世界一ぃぃぃぃぃぃ!!!!!

DB・SQL関連書籍

参考・引用

  1. 【初心者向け】データベースとは何か?5分で概要を理解しよう!
  2. SELECT文とは – 意味をわかりやすく – IT用語辞典 e-Words
  3. SQLの練習ができる学習サービス「SQLab」を作ってみた
  4. SQLab
  5. SQLab: SQL初級編
  6. 【これだけ覚えてたらOK!】SQL構文まとめ

最近の投稿