はじめに
はじめまして!
RUNTEQ Advent Calendar 2024の7日目を担当しますKoheiと申します!
今回は、SQL文について、まとめておきたいと思います。
特に、
- SQLを初めて触る
- あまり触っていない人
などをターゲットに、よく使うようなSQL文を中心にまとめました!
載っていないコマンドは、記事下部に公式DBMSマニュアルのリンクをまとめましたので、
そちらから検索してみてください。
少しでも参考になれば幸いです。
注意事項
- お使いのDBMS製品によって、使用できるSQL文などが違います。詳細は、使用している製品の公式マニュアルを御覧ください。(分かる範囲で、代表的な製品は記事下部にまとめました!)
- 間違いなど有りましたら、コメント等でご指摘ください。
おすすめの使い方
Ctrl
+ F
やCommand
+ F
で、ページ内検索をかけるのがオススメです。
また、目次も作ったのでご参考にお使いください。
SELECT(テーブルを取得したい)
SELECT 列名①, 列名②,・・・・・(全部の列を取得したいなら「*(アスタリスク)」を記載)
FROM テーブル名;
例)売上テーブルから、顧客番号が「1」の「顧客番号」「商品名」「単価」「数量」を取得したい
SELECT 顧客番号, 商品名, 単価, 数量
FROM 売上
WHERE 顧客番号 = 1; /* 「行」を絞る */
★ SELECTだけで使える加工方法
SELECTでの命令時のみで使える加工方法があるので、いくつか紹介します。
DISTINCT (重複を除外する)
SELECT DISTINCT 列名 /* SELECT文で列を選択する前に書く必要がある */
FROM テーブル名;
例)下記、売上テーブルで何の商品名が買われたのか明らかにしたい(重複を取り除きたい)
商品名 | 単価 |
---|---|
商品D | ¥4000 |
商品C | ¥3000 |
商品A | ¥1000 |
商品B | ¥2000 |
商品A | ¥1000 |
商品C | ¥3000 |
商品D | ¥4000 |
SELECT DISTINCT 商品名
FROM 売上;
↓下記のようになる
商品名 | 単価 |
---|---|
商品D | ¥4000 |
商品C | ¥3000 |
商品A | ¥1000 |
商品B | ¥2000 |
ORDER BY (順序を並べ替える)
SELECT 列名
FROM テーブル名
ORDER BY 列名① 並べ方, 列名② 並べ方,・・・・・ ;
/* 並べ方・・・「何も書かない」か「ASC」が昇順、「DESC」が降順 */
例)下記表の単価を降順(大きい方から順に)に並び替える
商品名 | 単価 |
---|---|
商品D | ¥4000 |
商品C | ¥3000 |
商品A | ¥1000 |
商品B | ¥2000 |
SELECT *
FROM 売上
ORDER BY 単価 DESC;
↓下記のようになる
商品名 | 単価 |
---|---|
商品D | ¥4000 |
商品C | ¥3000 |
商品B | ¥2000 |
商品A | ¥1000 |
OFFSET - FETCH (●件だけ取得する)
SELECT 列名
FROM テーブル名
ORDER BY 列名 並べ方 /* ORDER BYといっしょに使われることが多い*/
OFFSET 冒頭から除外する行数 ROWS /* この行は省略可能 */
FETCH NEXT 取得したい行数 ROWS ONLY; /* 「LIMIT 取得したい行数」で書くことも可能*/
※DBMS製品によってはサポートされていない場合があります
例)下記表の3番目に高い単価だけを取得する
商品名 | 単価 |
---|---|
商品D | ¥4000 |
商品C | ¥3000 |
商品A | ¥1000 |
商品B | ¥2000 |
SELECT *
FROM 売上
ORDER BY 単価 DESC
OFFSET 2 ROWS
FETCH NEXT 1 ROWS ONLY;
↓下記のようになる
商品名 | 単価 |
---|---|
商品B | ¥2000 |
UNION・EXCEPT・INTERSECT(2テーブル以上を、和集合・差集合・積集合させる)
SELECT 列名①, 列名②, 列名③・・・・
FROM テーブル名①
UNION /* 和集合の場合 */
/* 差集合:EXCEPT, 積集合:INTERSECT */
SELECT 列名①, 列名②, 列名③・・・・ /* NULLなどを入れて、列数はテーブル①と合わせること */
FROM テーブル名②;
UPDATE(データを更新したい)
UPDATE テーブル名
SET 列名① = 値①, 列名② = 値②, ・・・・・
WHERE 行名 = 条件;
※全件データを更新するのは稀なので、基本的にはWHEREをつける
例)売上テーブルにある、「商品名」が「A」の「単価」を「500円」にしたい
UPDATE 売上
SET 単価 = 500
WHERE 商品名 = 'A'
DELETE(データを削除したい)
DELETE
FROM テーブル名
WHERE 行名 = 条件;
※WHEREを設定しないと、全件削除になるので注意!(ロールバックは可能)
※跡形もなくテーブルを消したい場合は、DROP TABLE テーブル名
を使う
例)売上テーブルから、「商品名」が「A」の行だけ削除したい
DELETE
FROM 売上
WHERE 商品名 = 'A';
INSERT INTO〜(データを追加したい)
INSERT INTO テーブル名 (列名①, 列名②,・・・・・)
VALUES (値①, 値②, ・・・・・);
例)下記の売上テーブルに、「2000円の商品B」の行を追加したい
商品名 | 単価 |
---|---|
商品A | ¥1000 |
INSERT INTO 売上(商品名, 単価)
VALUES (商品B, 2000);
↓下記のようになる
商品名 | 単価 |
---|---|
商品A | ¥1000 |
商品B | ¥2000 |
CREATE(テーブルを作りたい)
CREATE TABLE テーブル名 (
列名① 列①のデータ型 /* データ型については下記表を参考 */
列名② 列②のデータ型
列名③ 列③のデータ型・・・・・
);
種別 | 例 |
---|---|
数値(整数) | INTEGER, INT |
数値(少数) | DECIMAL, NUMERIC, FLOAT, DOUBLE, REAL |
文字列(固定長) | CHAR() ※()内にはバイト数を書く |
文字列(可変長) | VARCHAR() ※()内にはバイト数を書く |
日付や時刻 | TIMESTAMP, DATETIME, DATE, TIME |
その他コマンド
基本的には、4大命令(SELECT・UPDATE・DELETE・INSERT INTO)といっしょに使うことが多いコマンドを集めました。
AS (別名を付けられる)
SELECT 商品名 AS ITEM, 単価 AS PRICE
FROM 売上 AS Sales;
商品名 | 単価 |
---|---|
商品A | ¥1000 |
↓
ITEM | PRICE |
---|---|
商品A | ¥1000 |
IS NULL・NOT IS NULL (NULL、もしくは、NULLでないことを見つける)
例)下記表から「単価」に「NULL」が含まれる行だけを取得する
商品名 | 単価 |
---|---|
商品A | ¥1000 |
商品B | ¥2000 |
商品C | NULL |
商品D | ¥4000 |
SELECT *
FROM 売上
WHERE 単価 IS NULL; /* 「= NULL」とは書かないこと! */
↓下記のようになる
商品名 | 単価 |
---|---|
商品C | NULL |
BETWEEN 値① AND 値② (範囲を絞る)
例)売上テーブルから、2000円〜4000円の単価がついている行を取得したい
SELECT *
FROM 売上
WHERE 単価 BETWEEN 2000 AND 4000;
IN・NOT IN(値①, 値②,・・・) (値のいずれかに一致、いずれもに一致しない)
例)売上テーブルから、2000円、もしくは、3000円の単価がついている行を取得したい
SELECT *
FROM 売上
WHERE 単価 IN (2000, 3000):
比較演算子 + ANY・ALL(値①, 値②,・・・)(いずれか一致なら真、全て一致なら真)
例)売上テーブルから、単価が2000円以上の行を取得したい
SELECT *
FROM 売上
WHERE 単価 <= 2000;
Tips
「行(レコード)」と「列(カラム)」の見分け方
漢字の見た目で覚えています。
また、「行」の別名である「レコード」は「ー(横棒)」があるので、これも見た目で覚えやすいですね。
「行」は WHEREで絞るイメージ
SQLを学び始めたとき、どうやって目的のテーブルに近づけていくのかわかりませんでした。
初めのうちは基本的に、WHEREのコマンドで「行」を絞っていくというイメージで良いと思いました。
SELECT 列名
FROM テーブル名
WHERE 行名 /* ←「行」はココで絞る! */
代表的なDBMSのマニュアル (※2024/12/07時点)
- MySQL
- MariaDB
- PostgreSQL
- SQLite
- H2 Database
- Oracle Database
- Db2
- SQL Server
参考