SQLとは?データベース操作の基本・SELECTからJOINまで解説

プログラミング

「SQL(エスキューエル)」はデータベースを操作するための言語です。エンジニア・データアナリスト・マーケターなど様々な職種で必須スキルとなっています。この記事ではSQLの基本からSELECT・JOIN・GROUP BYまで初心者向けに解説します。

SQLとは?

SQL(Structured Query Language)は、リレーショナルデータベース(RDB)を操作するための標準言語です。MySQL・PostgreSQL・Oracle・SQLiteなど多くのデータベースがSQLを使います。データベースとは体系的にデータを管理するシステムで、SQLはデータを「検索・追加・更新・削除」するクエリを書く言語です。

SQLの基本コマンド(CRUD)

# SQL基本コマンド
-- データ取得(Read)
SELECT name, age FROM users WHERE age > 20 ORDER BY age;

-- データ追加(Create)
INSERT INTO users (name, age) VALUES ('山田太郎', 25);

-- データ更新(Update)
UPDATE users SET age = 26 WHERE name = '山田太郎';

-- データ削除(Delete)
DELETE FROM users WHERE id = 1;

JOINの種類

JOIN種類説明
INNER JOIN両方のテーブルに一致するデータのみ取得(最もよく使う)
LEFT JOIN左テーブルは全件・右テーブルは一致するもの(右にデータなければNULL)
RIGHT JOINRIGHT JOINはLEFT JOINの逆
FULL OUTER JOIN両方のテーブルの全データを取得

よくある質問

SQLを学ぶとどんな仕事に役立つ?

SQLはエンジニア・データアナリスト・データサイエンティスト・マーケター・事業企画など幅広い職種で必須スキルです。特にデータ分析・BIツール(BigQuery・Redshift等)での分析・アプリケーション開発でのDB操作で使われます。ITエンジニアでSQLを全く知らない人はほとんどいません。

MySQLとPostgreSQLの違いは?

どちらも人気のオープンソースRDBMSです。MySQLはWordPress等のWebアプリで広く使われ、高速・シンプルです。PostgreSQLは標準SQL準拠度が高く、複雑なクエリ・JSON・GIS機能が豊富で大規模・複雑なシステムで好まれます。基本的なSQLは同じなので、まずSQLの基本を学んでから使い分けを学べばOKです。

まとめ

SQLはデータベース操作の標準言語です。SELECT・INSERT・UPDATE・DELETE・JOINの基本を習得するだけで、データ分析から開発まで幅広く活用できます。エンジニア・データ職問わず必須スキルとして学んでおきましょう。

次の記事を読む
Linux操作の基礎「Bash/シェルスクリプト」について学ぼう
次の記事を読む

SQLのウィンドウ関数(分析関数)詳解

ウィンドウ関数(分析関数)はSQLの高度な機能で、グループ集計と行単位の詳細を同時に扱えます。ROW_NUMBER()・RANK()・DENSE_RANK()で順位付け、LAG()・LEAD()で前後の行の値を取得、SUM() OVER()・AVG() OVER()で累計・移動平均を計算できます。たとえば「各部署の中での給与ランキング」や「直近3ヶ月の移動平均売上」などはウィンドウ関数なしでは書くのが非常に難しいですが、ウィンドウ関数を使うと数行で書けます。ビッグデータ分析・データウェアハウス・BI(Business Intelligence)の現場では必須の知識です。

SQLと組み合わせるデータ分析ツール

SQLをマスターすると組み合わせられるツールが大幅に広がります。BIツールのTableau・PowerBI・Lookerは内部でSQLを生成して集計を行います。クラウドデータウェアハウスのBigQuery(Google)・Redshift(AWS)・SnowflakeはすべてSQLで操作でき、ペタバイト規模のデータ分析が可能です。dbt(data build tool)はSQLでデータ変換・モデリングを行うツールで、データエンジニアリングで広く使われています。データサイエンティストがPythonのPandasで行う集計の多くはSQLでも表現でき、規模が大きいほどSQLの方が高速で効率的です。

SQLのパフォーマンス最適化(インデックス・EXPLAIN)

大量データを扱うDBではSQLのパフォーマンス最適化が重要です。最も基本的な手法はインデックスの活用です。WHERE句・JOIN条件・ORDER BY・GROUP BYで使われるカラムにINDEXを作成することで検索が劇的に高速化されます。ただしインデックスはINSERT/UPDATE/DELETEを遅くするトレードオフがあります。EXPLAIN(MySQL・PostgreSQL)コマンドでクエリの実行計画を確認し、FullTable Scanになっているクエリを特定してインデックスを追加するのがパフォーマンス改善の基本手順です。N+1問題(ループ内でのクエリ発行)はORMを使う際に特に起きやすく、EAGERローディング(JOINやinclude)で解決します。

NoSQLデータベースとの使い分け

SQLデータベース(RDBMS)とNoSQLデータベースの使い分けを理解しましょう。RDBMSはスキーマが明確・ACIDトランザクションが必要・データの関係が複雑な場合に向いています。NoSQLは大量の非構造化データ・水平スケール・柔軟なスキーマが必要な場合に向いています。MongoDBはドキュメント型で柔軟なスキーマ・Redisはインメモリのキーバリューストア(キャッシュ・セッション管理)・DynamoDBはAWSの完全マネージドNoSQL・Cassandraは時系列データ・IoTデータの大規模書き込みに向いています。多くのシステムはRDBMS(ユーザー・トランザクション)+Redis(キャッシュ)の組み合わせが一般的です。

データベース設計の基礎(正規化・ER図)

良いデータベース設計のためには「正規化」の概念が重要です。第1正規形(繰り返しグループを除く)・第2正規形(部分関数従属を除く)・第3正規形(推移関数従属を除く)の正規化でデータの冗長性を排除し、更新異常を防ぎます。ER図(エンティティ関係図)でテーブル間の関係(1対1・1対多・多対多)を視覚化することが設計の第一歩です。多対多のリレーションは中間テーブル(ブリッジテーブル)で実装します。設計ツールとしてdbdiagram.io・draw.io・MySQL Workbenchが使いやすいです。

SQLのトランザクション(ACID特性)

データベースのトランザクションはACID特性(原子性・一貫性・分離性・耐久性)で定義されます。原子性(Atomicity):トランザクション内の処理はすべて成功かすべて失敗かのどちらかです。一貫性(Consistency):トランザクション前後でデータの整合性が保たれます。分離性(Isolation):同時に複数のトランザクションが実行されても互いに影響しません。耐久性(Durability):コミットされたデータはシステム障害があっても失われません。BEGIN/COMMIT/ROLLBACKでトランザクションを制御します。デッドロック(複数のトランザクションが互いにロック待ちになる状態)への対処もデータベース設計で重要です。

クラウドデータウェアハウス(BigQuery・Redshift・Snowflake)

クラウドデータウェアハウス(DWH)は大規模データ分析のためのSQLベースのデータベースです。Google BigQueryはサーバーレスでペタバイト規模のデータを超高速で分析でき、SQLのみで操作できます。Amazon RedshiftはAWSのフルマネージドDWHで、S3との統合が強力です。SnowflakeはマルチクラウドのDWHで、Data SharingやTime Travel機能が特徴的です。これらのDWHは行指向ではなく列指向ストレージを採用しており、集計クエリが従来のRDBMSより圧倒的に高速です。dbt(data build tool)でSQLによるデータ変換・モデリングを管理するのが現代のデータエンジニアリングの標準構成です。

SQLのセキュリティとパーミッション管理

データベースのセキュリティ管理はSQLの重要なスキルです。最小権限の原則に従い、アプリケーション用のDBユーザーにはSELECT・INSERT・UPDATE・DELETE だけを付与し、DROP・CREATE・GRANTは付与しないのが基本です。GRANT・REVOKE文でパーミッションを管理し、ロールベースのアクセス制御(RBAC)でユーザーグループごとに権限を管理します。SQLインジェクション防止はプリペアドステートメント必須で、ORMを使う場合もRAWクエリを書く場所には特に注意が必要です。PostgreSQLの行レベルセキュリティ(RLS)はテーブル行単位でアクセス制御でき、マルチテナントSaaSのデータ分離に有効です。

SQLのビューとストアドプロシージャ

ビュー(VIEW)は複雑なSELECT文を仮想テーブルとして定義する機能です。CREATE VIEW monthly_sales AS SELECT… でビューを作成し、以後はSELECT * FROM monthly_salesと書くだけで複雑な集計結果が取得できます。ビューはデータの読み取り専用の窓口としてセキュリティ面でも有用で、特定のカラムだけを見せるビューを作りユーザーに参照権限を付与することでデータアクセスを制御できます。マテリアライズドビュー(物化ビュー)はビューの結果を実際に保存して高速化する機能でPostgreSQL・Oracleがサポートしています。ストアドプロシージャはDB内に保存するプログラムで、繰り返し実行するロジックをDB側で管理できます。

PostgreSQL vs MySQL どちらを選ぶ

RDBMSの二大巨頭PostgreSQLとMySQLの選択基準を整理します。PostgreSQLは標準SQL準拠度が高く・拡張性が豊富(JSON・配列・カスタム型・全文検索・地理情報等)・複雑なクエリが得意・行レベルセキュリティ(RLS)対応・論理レプリケーションが柔軟です。MySQLは読み取り主体のWebアプリで高速・レプリケーションが成熟・クラウドのマネージドサービスが豊富(RDS MySQL・Cloud SQL・PlanetScale等)・WordPressとの組み合わせが定番です。新規プロジェクトでは機能の豊富さからPostgreSQLを推奨する声が増えています。SupabaseはPostgreSQLベースのオープンソースFirebase代替として急速に普及しています。

コメント