SQLとは何か?特徴と代表的なSQL文をご紹介
SQLは、大きく3つの種類に分かれます。ここではSQLが持つ特徴やSQLの種類を述べたのち、代表的なSQL文を紹介します。この記事を読み、SQLに関する知識を深めてください。
SQLは、大きく3つの種類に分かれます。ここではSQLが持つ特徴やSQLの種類を述べたのち、代表的なSQL文を紹介します。この記事を読み、SQLに関する知識を深めてください。
知識・情報
2022/11/15 UP
- システムエンジニア
- インフラエンジニア
- 技術
SQLは、リレーショナルデータベースに関するさまざまな操作を行なえる言語です。システム開発ではデータベースとのやり取りに、しばしばSQLが使われます。このためデータベースエンジニアやインフラエンジニアだけでなく、開発エンジニアにとってもSQLの知識は必要です。
SQLは、大きく3つの種類に分かれます。ここではSQLが持つ特徴やSQLの種類を述べたのち、代表的なSQL文を紹介します。この記事を読み、SQLに関する知識を深めてください。
なお、リレーショナルデータベースについては、こちらの記事もご覧ください。
リレーショナルデータベースとはなにか?特徴とメリット・デメリットを解説
SQLが持つ5つの特徴
SQLはデータベースに特化した、特徴のある言語です。多くのシステムで必須となるデータを扱ううえで、ぜひ学んでおきたい言語といえるでしょう。ここでは、SQLならではの特徴を5つ取り上げ、SQLを学ぶ必要性とともに解説します。
リレーショナルデータベースの操作や問い合わせに使う言語
SQLは、リレーショナルデータベースの操作や問い合わせに欠かせない言語です。以下のとおり、幅広い操作に用いられます。
・テーブルやデータベース、インデックス、ビューなどの作成、変更、削除
・データの検索、追加、更新、削除
・主キーの設定
・トランザクションの開始や終了、ロールバック
・権限の付与
目的に応じた構文は、あらかじめ用意されています。ルールにしたがって構文を作り、指示を出して結果を確認しましょう。
標準SQLはISO/IEC 9075 「Database Language SQL」という国際規格に準拠しており、最新版はSQL:2016です。それぞれのリレーショナルデータベース管理システム(RDBMS)は標準SQLをもとに独自機能を付け加え、リリースしています。RDBMSにより構文は異なる部分がありますが、基本的な考え方は共通しているため応用が利くことは強みです。
SQLは3種類に分けられる
SQLは、以下の3種類に分けられます。
名称 | 略称 | 用途 |
---|---|---|
データ操作言語 | DML | データに関する操作を行なうSQL文 |
データ定義言語 | DDL | オブジェクトの構造や関係を定義するSQL文 |
データ制御言語 | DCL | アクセス権やトランザクションなどを定義するSQL文 |
データベースやテーブル、インデックスは、代表的なオブジェクトです。それぞれの詳細や代表的な命令は、本記事で詳しく解説します。
SQLが使われる代表的なデータベース
SQLは、RDBMSで使われる言語です。代表的なデータベースを、以下に挙げました。
費用負担の有無 | 代表的なデータベース |
---|---|
基本的に有償 | Oracle Database、SQL Server |
無償で利用可能 | MySQL、PostgreSQL |
なかでもMySQLは、Web開発などで多くつかわれる「LAMP」の一つに含まれています。SQLは多くのプロジェクトにおいて、欠かせない存在となっていることは特筆すべきポイントです。
リレーショナルデータベースを扱うなら、習得は必須
もしあなたが何らかの形でリレーショナルデータベースを扱うならば、SQLの習得は必須です。なぜなら以下のとおり、アプリケーションからデータを操作するケースが日常的にあるためです。
・データを取得し、並べ替える
・データを更新する
・データの追加や削除を行なう
SQLを知らなければ、適切なコーディングができません。SQLはシステム管理者やインフラエンジニア、データベースエンジニアはもちろん、多くのITエンジニアにとって欠かせないスキルです。
単独でアプリケーションを組むことはできない
SQLはデータベースの操作に特化した言語であり、アプリケーションの開発には使えません。このためシステム開発では、他の言語と組み合わせて使われます。システム自体のさまざまな動作は他の言語を使い、データベースとのやり取りが必要な部分だけSQLを呼び出すといった手続きは、よく使われる手法です。
データ操作言語の使い方
ここからはMySQL 8.0を用いて、SQLがどう使われているかSQL文を交えて解説します。以下の「社員」表を使い、操作してみましょう。
社員番号 | 氏名 |
---|---|
4040224 | 田中重郎 |
4090784 | 山田和美 |
5020193 | 鈴木剛規 |
社員番号は全社で一意となっているため、複数の社員が同じ社員番号を持つことはありません。一方で同姓同名の社員は存在し得ることには注意が必要です。
SELECT(データの検索)
SELECT文はデータを検索し、表示します。全件表示することもできますが、実務では条件を指定し、合致したデータのみを表示する方法がよく用いられます。一例として、社員番号が500万以上の方を表示してみましょう。
SELECT * FROM 社員 WHERE 社員番号 >= 5000000;
結果には、該当する1名だけが表示されます。
社員番号 | 氏名 |
---|---|
5020193 | 鈴木剛規 |
INSERT(データの追加)
データの追加は、INSERT文を使って行ないます。挿入先のテーブル名と挿入するデータを指定する方法は、基本的な使い方の一つです。社員を1人追加してみましょう。
INSERT INTO 社員 (社員番号, 氏名) VALUES (5100629, '木村和香');
結果はSELECT文で確認できます。
SELECT * FROM 社員;
社員番号 | 氏名 |
---|---|
4040224 | 田中重郎 |
4090784 | 山田和美 |
5020193 | 鈴木剛規 |
5100629 | 木村和香 |
UPDATE(データの更新)
登録されているデータは、しばしばメンテナンスが必要です。更新はUPDATE文を使って行ないます。さきほど登録した社員の氏名が変わったことを、UPDATE文で反映してみましょう。
UPDATE 社員 SET 氏名='鳥海和香' WHERE 社員番号='5100629';
条件を「氏名='木村和香'」としない理由は、社内に木村和香さんが複数いる場合に備えるためです。社員番号を指定することで、目的とする1名だけを更新できます。「SELECT * FROM 社員;」文を実行した結果は、以下のとおりです。
社員番号 | 氏名 |
---|---|
4040224 | 田中重郎 |
4090784 | 山田和美 |
5020193 | 鈴木剛規 |
5100629 | 鳥海和香 |
DELETE(データの削除)
データを削除したい場合は、DELETE文を使います。さきほど追加した、社員番号5100629の方を削除してみましょう。
DELETE FROM 社員 WHERE 社員番号='5100629';
条件には社員番号を指定してください。同姓同名の方がいる場合でも特定の方だけを削除でき、他の方を誤って削除せずに済みます。結果を確認してみましょう。
社員番号 | 氏名 |
---|---|
4040224 | 田中重郎 |
4090784 | 山田和美 |
5020193 | 鈴木剛規 |
INSERT文で追加した社員が削除され、当初作成した表の状態に戻りました。
データ定義言語の使い方
次にオブジェクトの作成や削除などに関わる、データ定義言語を5つ確認していきましょう。前章で使った「社員」表に新たな表も加え、SQL文と結果を交えて解説します。
CREATE(オブジェクトの作成)
このあとの説明をしやすくするため、新たに「人事評価」表を作成します。内容は以下のとおりです。
社員番号 | 年度 | 評価 |
---|---|---|
4040224 | 2022 | C |
4090784 | 2022 | B |
5020193 | 2022 | A |
5100629 | 2022 | D |
上の表は、以下のCREATE TABLE文で作成できます。
CREATE TABLE 人事評価 ( 社員番号 INT NOT NULL, 年度 YEAR NOT NULL, 評価 VARCHAR(2) NULL ) DEFAULT CHARSET=utf8;
表が作成できたら、データを挿入します。
INSERT INTO 人事評価 (社員番号, 年度, 評価) VALUES (4040224, 2022, 'C'), (4090784, 2022, 'B'), (5020193, 2022, 'A'), (5100629, 2022, 'D');
JOIN(テーブルの結合)
SQLでは複数のテーブルを結合し、必要な情報を一覧で示せるメリットがあります。JOINを使い、「社員」表と「人事評価」表を結合してみましょう。ここでは社員番号が両方の表に含まれるデータを表示するため、INNER JOINを使ったSQL文を実行します。
SELECT * FROM 社員 INNER JOIN 人事評価 ON 社員.社員番号 = 人事評価.社員番号;
結果は以下のとおりです。
社員番号 | 氏名 | 社員番号 | 年度 | 評価 |
---|---|---|---|---|
4040224 | 田中重郎 | 4040224 | 2022 | C |
4090784 | 山田和美 | 4090784 | 2022 | B |
5020193 | 鈴木剛規 | 5020193 | 2022 | A |
社員番号「5100629」に該当する方は「社員」表にないため、INNER JOINを使った結果には表示されないことに注意してください。
ALTER(オブジェクトの変更)
作成した表に要素を追加・削除、および変更したい場合は、ALTER文で行なえます。一例としてALTER TABLE文では、以下の操作が可能です。
・列の追加や削除
・インデックスの追加や削除
・列の型を変更
・列や表の名称を変更
ここでは「人事評価」表に、以下のSQL文を使ってコメント列を追加します。
ALTER TABLE 人事評価 ADD COLUMN コメント VARCHAR(128) NULL;
実行後は、4列の表となります。
社員番号 | 年度 | 評価 | コメント |
---|---|---|---|
4040224 | 2022 | C | null |
4090784 | 2022 | B | null |
5020193 | 2022 | A | null |
5100629 | 2022 | D | null |
コメント列を追加した段階では、初期値は入りません。データがないことを明示する意味で、画面には「null」と表示される場合があります。
TRUNCATE(オブジェクトの内容を空にする)
表のデータをすべて削除したい場合はDELETE文のほかに、TRUNCATE文も使えます。DELETE文と異なり、トランザクション実行中でもROLLBACK文を使ってもとに戻すことはできません。
以下のSQL文を使い、「人事評価」表の内容を空にしてみましょう。
TRUNCATE TABLE 人事評価;
SELECT文で確認すると、表の中身が空になったことがわかります。
SELECT * FROM 人事評価;
社員番号 | 年度 | 評価 | コメント |
なおツールによっては、「表示される結果がありません」という表記となる場合もあります。
DROP(オブジェクトの削除)
DROP文は、表やインデックスなどのオブジェクトを削除します。ここでは「人事評価」表を削除してみましょう。
DROP TABLE 人事評価;
表そのものが削除されたため、SELECT文で「人事評価」表を検索しても表示されないことに留意してください。
データ制御言語の使い方
SQLには、アクセス権やトランザクションの制御に関わる構文も用意されています。これらはデータ制御言語(DCL)と呼ばれます。
ここからはおもな5つの構文について、機能や使い方を解説していきましょう。表は「データ操作言語の使い方」で作成した「社員」表を使います。
GRANT(権限の付与)
GRANTはユーザーに対して、検索や追加、削除など、多種多様な権限を付与するSQL文です。ここでは新たに作った「soumu01@localhost」ユーザーに対して、すべてのデータベースに以下の権限を付与するSQL文を作成します。
・SELECT
・INSERT
・UPDATE
・DELETE
SQL文は以下のとおりとなります。
GRANT SELECT, INSERT, UPDATE, DELETE on *.* to 'soumu01'@'localhost';
付与した権限は、SHOW GRANT文で確認できます。
SHOW GRANTS for 'soumu01'@'localhost';
Grants for soumu01@localhost
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO `soumu01`@`localhost`
REVOKE(権限の削除)
付与した権限は、REVOKE文で削除できます。soumu01@localhostユーザーに対して付与した4つの権限を、削除してみましょう。
REVOKE SELECT, INSERT, UPDATE, DELETE ON *.* FROM 'soumu01'@'localhost';
SHOW GRANT文を実行し、結果を確認してください。
SHOW GRANTS for 'soumu01'@'localhost';
Grants for soumu01@localhost
GRANT USAGE ON *.* TO `soumu01`@`localhost`
残っている「USAGE」という権限は、「権限なし」を示します。ユーザーを作成した際に付与されるデフォルトの権限ですが、実際には何もできません。
BEGIN(トランザクションの開始)
BEGIN文は処理の一連の流れがどこから始まるかを示すうえで重要です。もし処理全体を切り戻すことになった場合は、BEGINを宣言した箇所と状態に戻ることが理由です。このためBEGIN文を記述する箇所は、慎重に検討しなければなりません。
一方で、BEGIN文の実行そのものは簡単です。トランザクションを開始する箇所で、以下のSQL文を実行してください。
BEGIN;
なおMySQLなど一部のデータベースでは、BEGINの代わりに「START TRANSACTION」が基本となっている場合もあります。
ROLLBACK(変更の取り消し)
トランザクションで変更した内容は、ROLLBACK文を使って取り消せます。使用例を以下に示しました。
BEGIN; INSERT INTO 社員 (社員番号, 氏名) VALUES (5100629, '木村和香'); SELECT * FROM 社員;
データを挿入した端末で内容を確認すると以下の結果となり、一見変更が反映されたように見えます。
社員番号 | 氏名 |
---|---|
4040224 | 田中重郎 |
4090784 | 山田和美 |
5020193 | 鈴木剛規 |
5100629 | 木村和香 |
しかし以下のSQL文を実行することで変更内容は取り消され、BEGIN文を実行する前の状態に戻せます。
ROLLBACK;
「SELECT * FROM 社員;」文を実行し、トランザクション開始前の状況に戻っていることを確認してください。
社員番号 | 氏名 |
---|---|
4040224 | 田中重郎 |
4090784 | 山田和美 |
5020193 | 鈴木剛規 |
COMMIT(変更の確定)
トランザクション内で加えた変更を確定する場合は、COMMIT文を使います。使用例を見ていきましょう。
BEGIN; INSERT INTO 社員 (社員番号, 氏名) VALUES (5100629, '木村和香'); SELECT * FROM 社員;
この段階では以下の結果となり、変更が反映されているように見えます。
社員番号 | 氏名 |
---|---|
4040224 | 田中重郎 |
4090784 | 山田和美 |
5020193 | 鈴木剛規 |
5100629 | 木村和香 |
しかしこの状態でシステムに何らかの異常が起こると、変更は取り消されてしまいます。以下のSQL文を実行することで変更が確定されます。
COMMIT;
「SELECT * FROM 社員;」文を実行し、上の表と同じ結果になっていることを確認してください。
SQLを学び、スキルの幅を広げよう
SQL文を使えば、リレーショナルデータベースに関するさまざまな操作が可能です。多種多様なSQL文が存在することに驚いた方や、奥深さに魅了された方もいるのではないでしょうか。
データベースを操作するSQL文は、この記事で紹介した項目以外にも多数あります。SQLを学んでスキルの幅を広げ、一歩先を行くエンジニアを目指しましょう。