こんにちはフロントエンドエンジニアのまさにょんです!
今回はSQLの基本を SQL問題集サイト『SQLab』の「初級編」で実践しながら理解する方法について解説します。
目次
- 1 『SQLab』とは?
- 2 【初級編】SELECT文の基本理解&実践
- 3 SQLab初級編を解いていく!
- 3.1 指定テーブルのレコードをすべて取得する
- 3.2 指定テーブルから、指定したカラム名のみを取得する
- 3.3 指定テーブルから、指定したカラム名のみを取得する Ver. 複数
- 3.4 取得したデータの重複を削除する「DISTINCT」
- 3.5 カラム名に別名をつけて、取得する「AS」句
- 3.6 検索条件を指定して、絞り込む・制限するWhere句
- 3.7 SQLのシングルクォーテーションとダブルクォーテーションの意味
- 3.8 LIKEで「曖昧検索」する
- 3.9 LIMIT句で、取得数を絞り込む・制限する
- 3.10 Nullを除外する条件文「 is not Null 」
- 3.11 BETWEEN演算で、ある範囲内に値が収まっているかの判定をする
- 3.12 IN演算子で、指定のカラムの値が指定の値と一致するものだけ抽出する
- 3.13 取得する時に計算処理をする
- 3.14 比較演算子を使って、条件を設定する
- 4 Twitterやってます!Follow Me!
- 5 DB・SQL関連書籍
- 6 参考・引用
- 7 最近の投稿
『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 カラム指定 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関連書籍
参考・引用
- 【初心者向け】データベースとは何か?5分で概要を理解しよう!
- SELECT文とは – 意味をわかりやすく – IT用語辞典 e-Words
- SQLの練習ができる学習サービス「SQLab」を作ってみた
- SQLab
- SQLab: SQL初級編
- 【これだけ覚えてたらOK!】SQL構文まとめ