「AP データベース SQL基礎」の版間の差分
(→HAVING) |
|||
299行目: | 299行目: | ||
=== '''HAVING''' === | === '''HAVING''' === | ||
HAVING句はWHERE句に似ていますが、以下のような違いがあります。 | |||
*WHERE句はグループ化前に個々の行にフィルタリングを行います。 | |||
*HAVING句はグループ化後に集約結果に対する条件を指定します。 | |||
したがってGROUP BY 句のところでよく使われたりします。 | |||
<freescript></script><div class="hljs-wrap"><pre data-label="sql" class="pre-wrap"><code class="sql">SELECT 所属部署, AVG(給与) AS 平均給与 FROM 社員 GROUP BY 所属部署 HAVING AVG(給与) > 300000;</code></pre></div><script></freescript> | <freescript></script><div class="hljs-wrap"><pre data-label="sql" class="pre-wrap"><code class="sql">SELECT 所属部署, AVG(給与) AS 平均給与 FROM 社員 GROUP BY 所属部署 HAVING AVG(給与) > 300000;</code></pre></div><script></freescript> | ||
2025年4月19日 (土) 22:59時点における版
AP データベースに戻る
概要
応用情報処理技術者試験の問題に取り上げられるようなSQLを紹介していきます。
CREATE TABLE
CREATE TABLE 社員 (
社員ID INT PRIMARY KEY,
氏名 VARCHAR(20),
所属部署 VARCHAR(20),
給与 INT CHECK (給与 >= 0)
);
sql
表に以下の列が定義された状態のデータベースが作成されます。
- 社員ID 整数型 主キー
- 氏名 文字型20桁
- 所属部署 文字型20桁
- 給与 整数型 0以上の整数である検査付き
社員ID | 氏名 | 所属部署 | 給与 |
---|
INSERT
INSERT句でデータを挿入できます。以下の例では4レコード挿入しています。これで表にデータがある状態になりました。ここで作った表をこの記事のベースにしたいと思います。
INSERT INTO 社員(社員ID, 氏名, 所属部署, 給与)
VALUES
(1, '山田太郎', '営業部', 300000),
(2, '佐藤花子', '開発部', 400000),
(3, '鈴木一郎', '営業部', 350000),
(4, '田中美咲', '総務部', 280000);
sql
社員ID | 氏名 | 所属部署 | 給与 |
---|---|---|---|
1 | 山田太郎 | 営業部 | 300000 |
2 | 佐藤花子 | 開発部 | 400000 |
3 | 鈴木一郎 | 営業部 | 350000 |
4 | 田中美咲 | 総務部 | 280000 |
SELECT
SELECT句でデータの抽出ができます。抜き出したい列を指定すると、以下のようになります。列に*を指定すると、すべての列が表示されます。
SELECT 氏名, 給与 FROM 社員;
sql
氏名 | 給与 |
---|---|
山田太郎 | 300000 |
佐藤花子 | 400000 |
鈴木一郎 | 350000 |
田中美咲 | 280000 |
WHERE
SELECT * FROM 社員 WHERE 所属部署='営業部';
sql
社員ID | 氏名 | 所属部署 | 給与 |
---|---|---|---|
1 | 山田太郎 | 営業部 | 300000 |
3 | 鈴木一郎 | 営業部 | 350000 |
ORDER BY
SELECT * FROM 社員 ORDER BY 給与 DESC;
sql
社員ID | 氏名 | 所属部署 | 給与 |
---|---|---|---|
2 | 佐藤花子 | 開発部 | 400000 |
3 | 鈴木一郎 | 営業部 | 350000 |
1 | 山田太郎 | 営業部 | 300000 |
4 | 田中美咲 | 総務部 | 280000 |
GROUP BY
SELECT 所属部署, AVG(給与) AS 平均給与 FROM 社員 GROUP BY 所属部署;
sql
所属部署 | 平均給与 |
---|---|
営業部 | 325,000 |
開発部 | 400,000 |
総務部 | 280,000 |
HAVING
HAVING句はWHERE句に似ていますが、以下のような違いがあります。
- WHERE句はグループ化前に個々の行にフィルタリングを行います。
- HAVING句はグループ化後に集約結果に対する条件を指定します。
したがってGROUP BY 句のところでよく使われたりします。
SELECT 所属部署, AVG(給与) AS 平均給与 FROM 社員 GROUP BY 所属部署 HAVING AVG(給与) > 300000;
sql
所属部署 | 平均給与 |
---|---|
営業部 | 325,000 |
開発部 | 400,000 |
DISTINCT
SELECT DISTINCT 所属部署 FROM 社員;
sql
所属部署 |
---|
営業部 |
開発部 |
総務部 |
LIKE
SELECT * FROM 社員 WHERE 氏名 LIKE '田%';
sql
社員ID | 氏名 | 所属部署 | 給与 |
---|---|---|---|
4 | 田中美咲 | 総務部 | 280000 |
UPDATE ~ SET ~
UPDATE 社員 SET 給与=310000 WHERE 氏名='山田太郎';
sql
社員ID | 氏名 | 所属部署 | 給与 |
---|---|---|---|
1 | 山田太郎 | 営業部 | 310000 |
2 | 佐藤花子 | 開発部 | 400000 |
3 | 鈴木一郎 | 営業部 | 350000 |
4 | 田中美咲 | 総務部 | 280000 |
DELETE
DELETE FROM 社員 WHERE 所属部署='総務部';
sql
社員ID | 氏名 | 所属部署 | 給与 |
---|---|---|---|
1 | 山田太郎 | 営業部 | 300000 |
3 | 鈴木一郎 | 営業部 | 350000 |
INNER JOIN
以下のテーブルを追加します。
部署名 | 拠点 |
---|---|
営業部 | 東京 |
開発部 | 大阪 |
総務部 | 名古屋 |
SELECT 氏名, 社員.所属部署, 拠点
FROM 社員 INNER JOIN 部署
ON 社員.所属部署 = 部署.部署名;
sql
氏名 | 所属部署 | 拠点 |
---|---|---|
山田太郎 | 営業部 | 東京 |
佐藤花子 | 開発部 | 大阪 |
鈴木一郎 | 営業部 | 東京 |
田中美咲 | 総務部 | 名古屋 |
LEFT JOIN、LEFT OUTER JOIN
以下のテーブルを追加します。LEFT JOIN と LEFT OUTER JOIN は同じです。
部署名 | 拠点 |
---|---|
営業部 | 東京 |
開発部 | 大阪 |
SELECT 氏名, 社員.所属部署, 拠点
FROM 社員 LEFT JOIN 部署
ON 社員.所属部署 = 部署.部署名;
sql
氏名 | 所属部署 | 拠点 |
---|---|---|
山田太郎 | 営業部 | 東京 |
佐藤花子 | 開発部 | 大阪 |
鈴木一郎 | 営業部 | 東京 |
田中美咲 | 総務部 | NULL |
AP データベースに戻る