基本情報技術者試験
情報技術者試験まとめへ

データベース

データベース言語(SQL)

データベース言語の種類


SQL:国際標準のリレーショナルデータベース言語

名称説明
DDL表やビューなどデータベースの構造(スキーマ)を定義するための命令。データ定義言語
DML表に格納されたデータを検索したり、更新したりする命令
データベースを操作するために利用する。データ操作言語

SQL

SQLの記述方法

独立言語方式

SQLを直接的に記述する方法のこと。SQLを記述して実行結果が返ってくる会話的な形式であることから「会話型SQL」ともいう

親言語方式

汎用高水準言語からなるデータベース言語を利用する方式
COBOLなどの高水準言語を親言語と呼び、データベースへのアクセス以外の処理は親言語で記述する
データベース言語SQLやNDLは、COBOL、Fortran、PL/1、PASCALを親言語とすることができる
コンパイルした後に実行する
次のような種類がある

モジュール言語

親言語とデータベースのインタフェースとして、親言語からモジュールを呼び出す

埋込型言語

親言語のプログラムの中にデータ操作言語の文を直接記述する

データベースの定義


スキーマ、表、ビューなどデータベースの構造を定義したり、アクセス権を設定したりするにはDDLを使用する

スキーマの定義

データベースを作成するには、スキーマを定義しておく必要がある

CREATE DATABASE データベース名
スキーマ

データベースの枠組み

表の定義

データベースにデータを格納するには、データベースの構造である表を定義する必要がある

CREATE TABLE 表名
(列名1 データ型 1[列定義 1],
(列名2 データ型 2[列定義 2],
(列名3 データ型 3[列定義 3],
...)

例1
項目のデータ型

表の項目に定義するデータの種類

名称設定例説明
文字列型
(固定長)
CHAR(バイト数)
TEXT
文字列として格納するデータ。データの値に関係なく文字列のデータ長を固定して格納する
文字列型
(可変長)
VARCHAR(最大文字数)文字列として格納するデータ。データの値によって文字列のデータ長を変えて格納する
数値型NUMBER
DECIMAL
数値として格納するデータ型
日付型DATE
DATETIME
日付を識別して格納するデータ型
列制約

一つの項目に設定できる制約のこと

名称設定例説明
一意性制約
(UNIQUE制約)
PRIMAREY KEY主キーを設定する。項目内の値が重複せず、必ず一意になるように制約。NULLの入力は不可
UNIQUE主キー以外の項目を設定する。項目内の値が重複せず、必ず一意になるようにする制約
※1件だけNULLの入力も可
参照制約REFERENCES参照する表外部キーを設定する。外部キーの項目の値が、参照される主キー側の項目の値に必ず存在するように、複数の表で整合性を保つために設定する制約
非NULL制約NOT NULL表の項目の値がNULLにならないようにする制約
検査制約CHECK(チェック条件)表の項目の値が、設定した条件になるようにする制約
既定値DEFAULTデフォルト値既定(デフォルト)の値を設定する
表制約

表自体に設定できる制約のこと。複数項目を組み合わせて一意制約を設定するときに、列制約として設定できない場合に利用。表制約は、CREATE TABLE文の最後に記述する

名称設定例説明
一意性制約
(UNIQUE制約)
PRIMAREY KEY(主キーに設定する項目名1,…)
※複数キーの設定は、項目名「,」で区切って並べる
主キーを設定する。表の中で項目の値が重複せず、必ず一意になるように制約。NULLの入力は不可
UNIQUE(項目名,…)
※複数キーの設定は、項目名「,」で区切って並べる
主キー以外の項目を設定する。表の中で項目の値が重複せず、必ず一意になるようにする制約
※1件だけNULLの入力も可
参照制約FOREIGEN KEY(外部キーに該当する項目名)
REFERENCES参照する表
外部キーを設定する。外部キーの項目の値が、参照される主キー側の項目の値に必ず存在するように、複数の表で整合性を保つために設定する制約

ビューの定義

ある実表をもとにして必要な項目だけを抽出して集め、仮想的に作成する表のこと

CREATE VIEW ビュー名[(ビューの項目名,…)]
AS SELECT 項目名,…FROM 表名
 ※[ ]内は、必要に応じて記述。省略した場合、実表と同じ項目名となる

例2

アクセス権の設定

表やビューなどのデータベースを利用するための権限のこと。データベース管理システムの利用者に対して設定する

GRANT アクセス権 ON 表名 TO 利用者名
 ※"利用者名"にはデータベース管理システムの利用者名を指定
 ※すべての利用者にアクセス権を設定するには、利用者名に"PUBLIC"を指定
項目説明
SELECT表を検索(参照)する権限
INSERT表にレコードを挿入する権限
UPDATE表の項目を更新する権限
DELETE表のレコードを削除する権限
ALL表に対するすべての権限

例3

【参考】

スキーマの削除

DROP DATABASE データベース名

表の削除

DROP TABLE 表名

インデックスの定義と削除

CREATE INDEX インデックス名
DROP INDEX インデックス名

ビューの削除

DROP VIEW ビュー名

アクセス権の取り消し

REVOKE アクセス権 ON 表名 FROM 利用者名

検索系のデータ操作


表のデータを検索する場合はDMLの「SELECT文」を使用

項目の検索

SELECT 項目名 FROM 表名
全ての項目の検索

項目名に「*(アスタリスク)」を指定する

SELECT FROM 表名
特定の項目の検索

項目名をラ並べて指定する。各項目名は「,(カンマ,半角)」で連結する

SELECT 項目名1,項目名2,… FROM 表名
計算結果の表示

表から検索した項目名に算術演算子を使った計算式を指定

SELECT 項目名,項目名を使った演算子 FROM 表名
ひとつ(複数)の項目で重複するデータを除いた検索

項目名の前に「DISTINCT」を指定

SELECT DISTINCT 項目名1(,項目名2,…) FROM 表名

【参考】

項目名の変更

SELECT 項目名,項目名を使った演算式 AS 変更後の項目名 FROM 表名

条件を指定したデータの検索

表の後に「WHERE」を指定

SELECT 項目名,… FROM 表名 WHERE 絞り込む条件
演算子の記述

絞り込む条件の記述は以下の演算子、術語を使用する

比較演算子
項目説明使用例項目説明使用例
左辺と右辺が等しい数量=1<>左辺と右辺が等しくない数量<>1
左辺が右辺より大きい数量>10左辺が右辺より小さい数量<10
>=左辺が右辺以上数量>=10<=左辺が右辺以下数量<=10

例4
論理演算子

複数の条件を記述する場合に使用

項目説明使用例
AND条件Aと条件Bを満たすレコードを検索条件A AND 条件B
OR条件Aと条件Bのいずれかを満たすレコードを検索条件A OR 条件B
NOT条件Aでないレコードを検索NOT 条件A

例5
述語

SQLで予約されているキーワードのこと

項目説明使用例
IS NULL項目のデータがNULLのレコードを検索電話番号 IS NULL
IS NOT NULL項目のデータがNULLでないレコードを検索電話番号 IS NOT NULL
BETWEEN 値1 AND 値2項目のデータが値1以上、値2以下のレコードを検索数量 BETWEEN 1 AND 9
IN(値1,値2)項目のデータが値1または値2のレコードを検索数量 IN(10,20)
LIKE'条件文字列'項目のデータが'条件文字列'に一致するレコードを検索 ※条件文字列にはワイルドカード使用可能商品名 LIKE'テレビ%'
商品番号 LIKE'A_ _'

例6

表の結合

関連のある表同士を結合する場合は「WHERE」に結合条件を指定

SELECT 項目名1,項目名2,… FROM 表名1,表名2
WHERE
表名1.項目名=表明2.項目名

例7

INNER JOIN

結合条件の記述はINNER JOINで指定することも可能

SELECT 項目名1,項目名2,… FROM 表名1
INNER JOIN 表名2 ON 表名1.項目名=表名2.項目名

例8

相関名

表名が長い時やWHEREやGROUPの中で何度でも同じ表明を使用する場合などに、表に付ける別名のこと。表名を表明を短い相関名に置き換え、相関名の定義はFROMの中で表名のあとに「AS」と相関名を連結する。「AS」は省略可能

SELECT 受注番号, X.顧客番号,顧客名
FROM 受注AS X,顧客 AS Y
WHERE X.顧客番号=Y.顧客番号

データの集計

項目のデータの個数や平均などを計算する場合は、「集合関数(集約関数)」を使用

SELECT 集合関数(項目名) FROM 表名
名称説明設定例
COUNT検索結果の行数を数えるCOUNT(*)
※すべてのレコード数を数える
COUNT(受注合計)
※項目の合計がNULLの行は数えない
SUM(項目名)項目の値の合計値を求めるSUM(受注合計)
AVG(項目名)項目の値の平均値を求めるAVG(受注合計)
MAX(項目名)項目の値の最大値を求めるMAX(受注合計)
MIN(項目名)項目の値の最小値を求めるMIN(受注合計)

例9

データのグループ化

項目ごとの合計などを求める場合は、集合関数と「GROUP BY」を組み合わせて指定。さらに集合関数で求めた値を絞り込む場合は「HAVING」を指定

SELECT 項目名,… FROM 表名
[WHERE … ]

GROUP BY 項目名,…
HAVING グループ化したデータの検索条件
  ※SELECT文で指定する項目名には集合関数利用可能
  ※[ ]内は、必要に応じて記述する

例10

データの並べ替え

検索した結果を並べ替える(ソートする)場合は、「ORDER BY」を指定

SELECT 項目名,… FROM 表名
[WHERE… GROUP BY… HAVING…]
ORDER BY並べ替えの基準となる項目名 [ASCまたはDESC]
  ※ASCを指定すると昇順、DESCを指定すると降順に並べ替える
  ※[ ]内は、必要に応じて記述する

例11

副問い合わせ

ある表を検索した結果を条件に指定する場合に使用

単一行副問い合せ

WHEREで指定する項目名と、かっこで囲んだSELECT文を「=」で連結する
※副問い合せの結果が1件と予想される場合に使用

SELECT 項目名,… FROM 表名1
WHERE検索する項目名

(SELECT 検索する項目名 FROM 表名2 WHERE 検索条件)
複数行副問い合せ

WHEREで指定する項目名と、かっこで囲んだSELECT文を「IN」で連結する

SELECT 項目名,… FROM 表名1
WHERE検索する項目名
IN
(SELECT 検索する項目名 FROM 表名2 WHERE 検索条件)

例12

相関副い問合せ

副問い合せを行うことによって、複数の表を比較して一致する(一致しない)レコードを検索すること
WHEREと副問い合せのSELECT文を「EXISTS」(「NOT EXISTS」)で連結する

SELECT 項目名1,項目名2,… FROM 表名1
WHERE
EXISTS (NOT EXISTS)
(SELECT * FROM 表名2 WHERE 表名1.項目名=表名2.項目名)

  ※EXISTS:一致する場合、NOT EXISTS:一致しない場合

例13

更新系のデータ操作


表のデータを挿入、更新、削除する場合、DMLの次のような構文を使用する

挿入(INSERT文)

表にレコードを挿入する場合は、DMLの「INSERT文」を使用する

INSERT INTO 表名(項目名1,…)
VALUES(データ1,…)
  ※表の「項目名1」に挿入する項目の「データ1」を対応させる
  ※表内のすべての項目にデータを挿入する場合、「(項目名1,…)」は省略可

例14

更新(UPDATE文)

表のレコードを更新する場合はDMLの「UPDATE文」を使用

UPDATE 表名 SET 項目名1=更新するデータ1,…
[WHERE 更新する条件]
  ※[ ]内は、必要に応じて記述する

例15

※条件に合った項目だけ更新する場合は、WHEREで更新するレコードを指定し、SETのあとに更新する更新する更新する項目名と更新するデータを「=」で連結する。WHEREを省略すると、表のすべてのレコードが更新される

削除(DELETE文)

表のレコードを削除する場合は、DMLの「DELETE文」を使用する

DALETE FROM 表名
[WHERE 削除する条件]
  ※[ ]内は、必要に応じて記述する

例16

※条件に合った項目だけ削除する場合は、DELETE FROM 表名のあとにWHEREで削除するレコードを指定する。WHEREを省略すると、表のすべてのレコードが削除される

カーソル操作


カーソルを使用するとSELECTの結果に対して1行ごとに繰り返し処理を行えるようになる

カーソル操作

※カーソルの定義の場合は、先頭に@を付けない

ホスト変数

カーソル宣言で記述したSELECT文の実行によって取り出されたレコードのデータを格納するための変数。ホスト変数は、プログラム言語で宣言する

 

ページトップへ 次へ