📝
【初心者向け】SQLデータベース操作の基礎
はじめに
「SQLゼロから始めるデータベース操作」を元にSQLを勉強したので備忘録として記事を作成します。
基礎的なSQLデータベース操作・注意事項
初心者が忘れやすい、注意すべき以下の内容について記載しています。実際にSQLを書きながら振り替えられるようにしています。
- データ型の指定
- DDL(Data Definition Language(データ定義言語))
- DML (Data Manipulation Language (データ操作言語))
- DCL(Data Control Language(データ制御言語))
- SQL理解に伴う注意事項
この記事の対象者
SQLのデータベース操作の初心者向け
動作環境・使用するツールや言語
例や参考コードは、SQL(Postgres)
データ型
テーブル作成時定義
INTEGER型
- 整数を入れる列にしていするデータ型(数値型)
- 小数は入れられない
CHAR型
- character(文字)の略
- 文字列を入れる列に指定するデータ型
-
CHAR(10)のように列の中に入れることで文字列の長さ(最大長)を指定できる固定文字列。 - 最大長に満たない場合、文字数が最大になるまで半角スペースで埋める(
abc)
VARCHAR型
- CHAR型と同じく文字列を入れる列に指定するデータ型
-
VARCHAR(10)のように列の中に入れることで文字列の長さ(最大長)を指定できる可変長文字列。 - 最大長に満たなくても、文字数が最大になるまで半角スペースで埋めない(
abc)
DATE型
- 日付を入れる列
記載例(商品テーブル)
CREATE TABLE Shohin
(shohin_id CHAR(4) NOT NULL,
shohin_mei VARCHAR(100) NOT NULL,
shohin_bunrui VARCHAR(32) NOT NULL,
hanbai_tanka INTEGER ,
shiire_tanka INTEGER ,
torokubi DATE ,
PRIMARY KEY (shohin_id));
DDL(Data Definition Language(データ定義言語))
テーブル自体に対する命令でよく使うもの
CREATE
データベースやテーブルなどを作成する
CREATE TABLE Shohin
DROP
データベースやテーブルなどを削除する
DROP TABLE Shohin
ALTER
データベースやテーブルなどの構成を変更する
ALTER TABLE Shohin ADD COLUMN yubinbango CHAR(8);
DML (Data Manipulation Language (データ操作言語))
テーブルの行に対する命令でよく使うもの
SELECT
テーブルから行を検索する
<!-- 例:shohin_id順にテーブルの全列を表示 -->
SELECT * FROM Shohin ORDER BY shohin_id;
INSERT
テーブルに新規行を追加する
INSERT INTO Shohin VALUES ('0001', 'Tシャツ' ,'衣服', 1000, 500, '2009-09-20');
UPDATE
テーブルの行を更新する
UPDATE Shohin
SET hanbai_tanka = hanbai_tanka * 10,
shiire_tanka = shiire_tanka / 2
WHERE shohin_bunrui = 'キッチン用品';
DELETE
テーブルの行を削除する
DELETE FROM Shohin
WHERE hanbai_tanka >= 4000;
DCL(Data Control Language(データ制御言語))
テーブルなどの操作を確定したり取り消すもの
COMMIT
データベースに対しておこなった変更を確定する
ROLLBACK
データベースに対しておこなった変更を取り消す
GRANT
ユーザに操作の権限を与える
REVOKE
ユーザから操作の権限を奪う
SQL理解に伴う注意事項
SQLでは指示内容によってできる操作が異なる。一つ一つを理解するのは難しい。SQLの実行順について知ることで覚える量を減らせます。
SELECT文の実行順序
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
SELECT文の中では上記の順番で実行されているため、以下のような内容は実行できない。
WHERE句で列の別名(AS)を使用できない
-- ❌ エラー
SELECT shohin_bunrui
FROM shohin
WHERE COUNT(*) > 2
GROUP BY shohin_bunrui;
-- ✅ 正しい
SELECT shohin_bunrui
FROM shohin
GROUP BY shohin_bunrui
HAVING COUNT(*) > 2;
理由:WHERE句はSELECT句より先に実行されるため、まだ別名kakaku_waribikiが定義されていない。WHERE句実行時点では別名は存在しない。
WHERE句で集約関数を使用できない
-- ❌ エラー
SELECT shohin_bunrui
FROM shohin
WHERE COUNT(*) > 2
GROUP BY shohin_bunrui;
-- ✅ 正しい
SELECT shohin_bunrui
FROM shohin
GROUP BY shohin_bunrui
HAVING COUNT(*) > 2;
理由: WHERE句はGROUP BY句より先に実行されるため、まだグループ化されておらず集約関数COUNT(*)が計算できない。集約関数はグループ化後でないと意味を持たない。
おわりに・まとめ
たびたび書き方を思い出せずにいたので記事にまとめました。今後は集約関数についても記載したいです。
Discussion