SQLという言語の特徴や基本についてまとめています。
SQLとは何?
SQLとはデータベースを操作する専門用語です。
システム開発では、PHPやJavaと言ったプログラミング言語でビジネスロジックを組み立て、データベースへのデータの格納や抽出にSQLを使います。SQL単体で使うのではなく、他のプログラミング言語と組み合わせるのが一般的です。
【関連記事】
▶【初心者向け】SQLって何?プログラミング言語との違いとは?
SQLは第四世代言語と呼ばれています。
第一世代言語は機械語(CPUの命令コードそのもの)、第二世代言語は命令コードを人間が読みやすくしたアセンブリ言語、第三世代言語は、命令コードやニモニックを意識せずにプログラミングが組めるJavaやC++、PHPなどの手続き型言語です。
第四世代のSQLは、手続きを意識せずに、解決したい問題のみを意識してプログラミングが組める言語です。プログラマーだけではなく、エンドユーザでも簡単なパラメータを指定するだけで業務処理やプログラムの作成ができる点が特徴です。
【関連記事】
▶SQLが第4世代言語と言われる理由とその特徴について
SQL言語の基本
SQLは大きく分けてDDL、DML、DCLという3種類の操作に分類されます。
DDL(Data Definition Language)は、データベース自体の作成、テーブルなどのデータベースオブジェクトの作成、削除、変更を行います。
- CREATE: データベース・テーブルの作成
- DROP: データベース・テーブルの削除
- ALTER: データベース・テーブルの変更
DML(Data Manipulation Language)は、テーブルからデータを検索したり、データを追加、変更、削除します。
- SELECT: テーブルからデータを検索
- INSERT: テーブルにデータを追加
- DELETE: テーブルからデータを削除
- UPDATE: テーブルのデータを更新
DCL(Data Control Language)は、データベースのトランザクション制御やユーザへの権限付与を行います。
- COMMIT: データベースへの変更を確定
- ROLLBACK: データベースへの変更を取り消し
- GRANT: ユーザーへの権限付与
- REVOKE: ユーザーから権限削除
【関連記事】
▶【SQL入門】データベース言語の基本を抑えよう!
以下は、DDLのひとつ、テーブルを作成するCREATE TABLEの例(MySQL)です。テーブル名employees_copyに構成するカラム名とデータ型、NULL許可とプライマリキー指定をおこなっています。descはMySQLでデータベースオブジェクトの詳細を表示するコマンドです。テーブルを構成するカラムの情報一覧を表示しています。
CREATE TABLE `employees_copy` ( `emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL, `gender` enum('M','F') NOT NULL, `hire_date` date NOT NULL, PRIMARY KEY (emp_no) ); Query OK, 0 rows affected, 1 warning (0.03 sec) mysql> desc employees_copy; +------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------+------+-----+---------+-------+ | emp_no | int | NO | PRI | NULL | | | birth_date | date | NO | | NULL | | | first_name | varchar(14) | NO | | NULL | | | last_name | varchar(16) | NO | | NULL | | | gender | enum('M','F') | NO | | NULL | | | hire_date | date | NO | | NULL | | +------------+---------------+------+-----+---------+-------+ 6 rows in set (0.01 sec)
以下はDMLのひとつ、select文の例です。テーブルemployeesからbirth_date(誕生日)が1960年1月1日移行のデータを10件抽出しています。
mysql> select * from employees where birth_date > '1960-01-01' limit 10; +--------+------------+------------+-------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-------------+--------+------------+ | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 | | 10012 | 1960-10-04 | Patricio | Bridgland | M | 1992-12-18 | | 10013 | 1963-06-07 | Eberhardt | Terkki | M | 1985-10-20 | | 10016 | 1961-05-02 | Kazuhito | Cappelletti | M | 1995-01-27 | | 10021 | 1960-02-20 | Ramzi | Erde | M | 1988-02-10 | | 10027 | 1962-07-10 | Divier | Reistad | F | 1989-07-07 | | 10028 | 1963-11-26 | Domenick | Tempesti | M | 1991-10-22 | | 10032 | 1960-08-09 | Jeong | Reistad | F | 1990-06-20 | | 10034 | 1962-12-29 | Bader | Swan | M | 1988-09-21 | +--------+------------+------------+-------------+--------+------------+ 10 rows in set (0.01 sec)
【関連記事】
▶SQLの基礎 DDL、DMLのサンプルコード紹介
select文ひとつを例にしても、多彩なオプション指定が可能です。以下は、MySQLのselect文で使用できる構文です。
SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] select_expr [, select_expr ...] [FROM table_references [PARTITION partition_list] [WHERE where_condition] [GROUP BY {col_name | expr | position} [ASC | DESC], ... [WITH ROLLUP]] [HAVING where_condition] [ORDER BY {col_name | expr | position} [ASC | DESC], ...] [LIMIT {[offset,] row_count | row_count OFFSET offset}] [PROCEDURE procedure_name(argument_list)] [INTO OUTFILE 'file_name' [CHARACTER SET charset_name] export_options | INTO DUMPFILE 'file_name' | INTO var_name [, var_name]] [FOR UPDATE | LOCK IN SHARE MODE]]
【関連記事】
▶SQLのselectの構文 limitやoffsetなど主要データベースでの差異あり
グルーピングをおこなうGROUP BY、ソートをおこなうORDER BY、抽出数を制限するLIMITに加えて、条件指定を行なうWHERE句で使用するLIKEやIN、Exists、他のテーブルを参照しながらデータ抽出する「結合」や別のSQLの結果を利用してデータを抽出する「サブクエリ」など多彩な使い方があります。
また、データベースによってSQLの仕様は差異があるんですね。SQLには共通規格があるのですが、主要データベースだけでもそれぞれ使いやすいように独自拡張がされていて、例えばOracleのSQLコードはMySQLのSQLコードでそのままでは動作できないのが現実です。
【関連記事】
▶SQLとはどういうもの? 独自拡張と標準SQLの大きな違いって、何?
まとめ
- SQLはデータベースを操作する第四世代の専門言語
- SQLの基本は大きく分けて、DDL、DML、DCLがある
- SQLには共通規格が定められているが、データベースごとに仕様の独自拡張がされている