「AP データベース SQL基礎」の版間の差分

提供:yonewiki
339行目: 339行目:


=== '''DISTINCT''' ===
=== '''DISTINCT''' ===
 抽出した結果に重複があれば、省略して結果表示してくれます。
<freescript></script><div class="hljs-wrap"><pre data-label="sql" class="pre-wrap"><code class="sql">SELECT DISTINCT 所属部署 FROM 社員;</code></pre></div><script></freescript>
<freescript></script><div class="hljs-wrap"><pre data-label="sql" class="pre-wrap"><code class="sql">SELECT DISTINCT 所属部署 FROM 社員;</code></pre></div><script></freescript>



2025年4月19日 (土) 23:04時点における版

AP データベースに戻る

概要

 応用情報処理技術者試験の問題に取り上げられるようなSQLを紹介していきます。

 

CREATE TABLE

sql
CREATE TABLE 社員 (
  社員ID INT PRIMARY KEY,
  氏名 VARCHAR(20),
  所属部署 VARCHAR(20),
  給与 INT CHECK (給与 >= 0)
);
sql


 表に以下の列が定義された状態のデータベースが作成されます。

  • 社員ID 整数型 主キー
  • 氏名 文字型20桁
  • 所属部署 文字型20桁
  • 給与 整数型 0以上の整数である検査付き


社員
社員ID 氏名 所属部署 給与

 

INSERT

 INSERT句でデータを挿入できます。以下の例では4レコード挿入しています。これで表にデータがある状態になりました。ここで作った表をこの記事のベースにしたいと思います。


sql
INSERT INTO 社員(社員ID, 氏名, 所属部署, 給与)
VALUES
  (1,	'山田太郎',	'営業部',	300000),
  (2,	'佐藤花子',	'開発部',	400000),
  (3,	'鈴木一郎',	'営業部',	350000),
  (4,	'田中美咲',	'総務部',	280000);
sql

社員
社員ID 氏名 所属部署 給与
1 山田太郎 営業部 300000
2 佐藤花子 開発部 400000
3 鈴木一郎 営業部 350000
4 田中美咲 総務部 280000

 

SELECT

 SELECT句でデータの抽出ができます。抜き出したい列を指定すると、以下のようになります。列に*を指定すると、すべての列が表示されます。


sql
SELECT 氏名, 給与 FROM 社員;
sql


社員
氏名 給与
山田太郎 300000
佐藤花子 400000
鈴木一郎 350000
田中美咲 280000

 

WHERE

WHERE句でグループ化される前のフィルタリング条件指定ができます。

sql
SELECT * FROM 社員 WHERE 所属部署='営業部';
sql

社員
社員ID 氏名 所属部署 給与
1 山田太郎 営業部 300000
3 鈴木一郎 営業部 350000

 

ORDER BY

 昇順や降順に並べる列名を指定するときに使います。DESCで降順です。ASCで昇順です。ORDER BY句のASCは規定値です。なのでASCの指定は省略できます。

sql
SELECT * FROM 社員 ORDER BY 給与 DESC;
sql


社員
社員ID 氏名 所属部署 給与
2 佐藤花子 開発部 400000
3 鈴木一郎 営業部 350000
1 山田太郎 営業部 300000
4 田中美咲 総務部 280000

 

GROUP BY

sql
SELECT 所属部署, AVG(給与) AS 平均給与 FROM 社員 GROUP BY 所属部署;
sql


社員
所属部署 平均給与
営業部 325,000
開発部 400,000
総務部 280,000

 

HAVING

 HAVING句はWHERE句に似ていますが、以下のような違いがあります。

  • WHERE句はグループ化前に個々の行にフィルタリングを行います。
  • HAVING句はグループ化後に集約結果に対する条件を指定します。

 したがってGROUP BY 句のところでよく使われたりします。

sql
SELECT 所属部署, AVG(給与) AS 平均給与 FROM 社員 GROUP BY 所属部署 HAVING AVG(給与) > 300000;
sql

社員
所属部署 平均給与
営業部 325,000
開発部 400,000

 

DISTINCT

 抽出した結果に重複があれば、省略して結果表示してくれます。

sql
SELECT DISTINCT 所属部署 FROM 社員;
sql

社員
所属部署
営業部
開発部
総務部

 

LIKE

sql
SELECT * FROM 社員 WHERE 氏名 LIKE '田%';
sql


社員
社員ID 氏名 所属部署 給与
4 田中美咲 総務部 280000

 

UPDATE ~ SET ~

sql
UPDATE 社員 SET 給与=310000 WHERE 氏名='山田太郎';
sql


社員
社員ID 氏名 所属部署 給与
1 山田太郎 営業部 310000
2 佐藤花子 開発部 400000
3 鈴木一郎 営業部 350000
4 田中美咲 総務部 280000

 

DELETE

sql
DELETE FROM 社員 WHERE 所属部署='総務部';
sql


社員
社員ID 氏名 所属部署 給与
1 山田太郎 営業部 300000
3 鈴木一郎 営業部 350000

 

INNER JOIN

 以下のテーブルを追加します。

部署テーブル
部署名 拠点
営業部 東京
開発部 大阪
総務部 名古屋


sql
SELECT 氏名, 社員.所属部署, 拠点
FROM 社員 INNER JOIN 部署
ON 社員.所属部署 = 部署.部署名;
sql


社員
氏名 所属部署 拠点
山田太郎 営業部 東京
佐藤花子 開発部 大阪
鈴木一郎 営業部 東京
田中美咲 総務部 名古屋

 

LEFT JOIN、LEFT OUTER JOIN

 以下のテーブルを追加します。LEFT JOIN と LEFT OUTER JOIN は同じです。


部署テーブル
部署名 拠点
営業部 東京
開発部 大阪

sql
SELECT 氏名, 社員.所属部署, 拠点
FROM 社員 LEFT JOIN 部署
ON 社員.所属部署 = 部署.部署名;
sql


社員
氏名 所属部署 拠点
山田太郎 営業部 東京
佐藤花子 開発部 大阪
鈴木一郎 営業部 東京
田中美咲 総務部 NULL

 


 

AP データベースに戻る