SlideShare une entreprise Scribd logo
1  sur  115
Télécharger pour lire hors ligne
実践SQL
1
概要
• SQLの基礎構文と現場で使用できるテクニックを学習します。
• SQLの書き方と速度について学習します。
2
目次
• SQLの基本
• SQLとは
• SQLの分類
• 基本構文
• SQL
• 集約(GROUP BY )
• 重複の削除(DISTINCT)
• 並び替え(ORDER BY)
• 取得行数の制限(LIMIT、OFFSET)
• 結合(クロス結合、内部結合、外部結合)
• 集合演算(UNION, EXCEPT, INTERSECT)
• 関数、サブクエリ
• CASE式、Window関数
• SQLの書き方
• SQLの速度
3
環境
• VM(仮想マシン)の中にPostgreSQL(バージョン11)の環境が構築
されています。
• 環境構築の資料を参考に「axizdb_sql」のDBに接続してください。
• ユーザー名:axiz
• DB名:axizdb_sql
• パスワード:axiz
4
# psql –U axiz –d axizdb_sql
SQLの基本
5
SQLの基本
• SQLとは
• SQLとは、データベース(特にRDBMS)を操作するための言語です。
• Structure Query Language の略(と言われている)で、Query(問い合わせ)を
DBMSに投げることで、実行結果を取得することができます。
• 通常のプログラミング言語(C言語、Java、PHPなど)を手続き型言語(HOW
型)と呼ぶのに対し、SQLは非手続き型言語(WHAT型)と呼ばれます。
6
SQLの基本
• SQLとは
• SQLは、データベース製品に実装されている言語です。そのため、製品に
よって仕様が異なることがあります。
• 講義では、PostgreSQLを使用します。内容によっては他のDBでは使用できな
いものもあるので、注意してください。
• 主なDB製品
• Oracle DB
• SQL Server
• MySQL
• PostgreSQL
• DB2
• SQLite
• etc...
7
SQLの基本
• SQLの分類
• DDL(Data Definition Language)
• CREATE
• DROP
• ALTER
• DML(Data Manipulation Language)
• SELECT
• INSERT
• UPDATE
• DELETE
• DCL(Data Control Language)
• COMMIT
• ROLLBACK
8
基本構文
• INSERT文の基本構文
9
-- 一般的なインサート文
INSERT INTO テーブル名(カラム1, …) VALUES (値1, …);
-- 全カラムに値をセットするときはカラムのリストは省略可
INSERT INTO テーブル名 VALUES (値1, …);
-- SELECTの実行結果をそのままインサートもできる
INSERT INTO テーブル名 (カラム1, …) SELECT句;
基本構文
• DELETE文の基本構文
10
-- 一般的なデリート文
-- 条件を絞り込まないと全件削除されるので注意
DELETE FROM テーブル名
WHERE 絞り込み条件
基本構文
• UPDATE文の基本構文
11
-- 一般的なアップデート文
-- 値の部分ではサブクエリも使用可能
UPDATE テーブル名
SET カラム1 = 値1
, カラム2 = 値2
…
WHERE 絞り込み条件;
-- 複数のカラムを一気に指定する
-- Oracleで使用可能
UPDATE テーブル名
SET (カラム1, カラム2, …) = (値1, 値2, …)
…
WHERE 絞り込み条件;
基本構文
• SELECT文の基本構文
12
-- テーブルの全カラム・全レコードを取得
SELECT *
FROM テーブル名;
-- カラムを指定してレコードを取得
SELECT カラム1, カラム2, ....
FROM テーブル名;
-- レコードを絞り込む
SELECT *
FROM テーブル名;
WHERE 絞り込み条件
基本構文
• SELECTの基本構文
13
-- レコードの並び替え
SELECT *
FROM テーブル名
ORDER BY カラム名1, ... (ASC|DESC) ;
-- 集約
SELECT ...
FROM テーブル名
GROUP BY カラム名1, ...
HAVING 絞り込み条件;
-- レコード件数の制限
SELECT *
FROM テーブル名
LIMIT 件数;
基本構文
• SELECTの基本構文
• よく使用されるSQLの構文の組み合わせです。
14
-- 基本構文
SELECT カラム1, ... -- 取得したいカラムリスト
FROM テーブル名 -- レコードの取得対象のテーブル
JOIN句 結合対象テーブル -- 結合対象のテーブル
ON 結合条件 -- 結合条件
WHERE 絞込条件1 ... -- レコードの絞り込み
GROUP BY カラム1, ... -- 集約
HAVING 絞り込み条件 -- 集約後の絞り込み
ORDER BY カラム1, ... -- 並び替え
;
基本構文
• SQLのコメント
• SQL文におけるコメントは2つあります。
• 1行コメント:「-- コメント」
• 複数行コメント:「/* コメント */」
15
-- カラム2と3はコメント
SELECT
column1
/*
, column2
, column3
*/
FROM table1
基本構文
• SQLで使用できる演算子
• 算術演算子
• + : 加算
• - : 減算
• * : 乗算
• / : 除算
• % : 剰余(DB製品によってはmod関数を使用)
• 文字列結合
• || (DB製品によっては + 演算子を使用)
16
-- 演算と文字列結合
SELECT 1 + 2 加算, 10 – 5 減算, 5 * 5 乗算
, 10 / 3 除算, 10 % 3 剰余
, 'abc' || 'def' 文字列結合
;
基本構文
• SQLで使用できる演算子
• 比較演算子
• = : 等しい
• <> : 等しくない(!=でも可)
• >=、<=、>、< : 以上、以下、大なり、小なり
• IS : NULL判定で使用
• 論理演算子
• NOT:否定
• AND:論理積
• OR : 論理和
17
-- 比較演算子と論理演算子
SELECT ...
FROM table1
WHERE column1 >= 10 AND column2 = 'a'
AND column3 IS NOT NULL;
基本構文
• WHERE句でよく使用する演算子
• IN:ORによる複数の条件指定を一つにまとめます。
• LIKE:あいまい検索での絞り込みをします。
• BETWEEN:カラムに対して範囲指定で絞り込みをします。
18
-- WHERE句で使用する演算子
SELECT ...
FROM table1
WHERE colmn1 IN ('AAA', 'BBB', 'CCC')
AND column2 LIKE '%ABC%'
AND column3 BETWEEN 100 AND 200
;
基本構文
• エイリアス
• SQLでは、カラムやテーブルに対して別名を付けることができます。
• 別名のことをエイリアスといいます。
• エイリアスを使用する際は、「AS」を付ける場合とつけない場合があります。
19
-- 基本構文
SELECT カラム1 エイリアス名, カラム2 AS エイリアス名
FROM テーブル名;
実践SQL
20
集約
GROUP BY
21
GROUP BY
• GROUP BY
• GROUP BY は複数のレコードを1行にまとめる場合に使用します。
• 集約関数(COUNT, SUM, MAX, MIN, AVGなど)と組み合わせて使用する場合が
多いです。
• 集約関数の結果に対して絞り込み条件を指定する場合は、HAVING句を使用し
ます。
22
-- 例
SELECT column1, SUM(column2), COUNT(*)
FROM table1
GROUP BY column1
HAVING SUM(column2) > 10000;
GROUP BY
• GROUP BY
• 集約関数を適用しないカラムで絞り込みを行う場合、WHERE句で絞り込む方
法とHAVING句で絞り込む方法があります。
• 結果は同じになりますが、パフォーマンスに差が出る場合があります。
23
-- 例①
SELECT column1, SUM(column2)
FROM table1
WHERE column1 = 200
GROUP BY column1 ;
-- 例②
SELECT column1, SUM(column2)
FROM table1
GROUP BY column1
HAVING column1 = 200;
GROUP BY
• COUNT関数(実習)
• COUNTは集約したレコードの件数を取得する際に使用します。
24
どのようなSQL文で実現できるか。
SQL文を作成してみましょう。
ex_sales_group
sales_date item_name price quantity
2018/9/1 商品A 300 10
2018/9/2 商品A 300 5
2018/9/3 商品A 300 20
2018/9/4 商品B 400 8
2018/9/5 商品B 400 5
2018/9/6 商品C 500 5
2018/9/7 商品C 500 10
2018/9/8 商品C 500 8
2018/9/9 商品C 500 7
2018/9/10 商品C 500 10
item_name count
商品A 3
商品B 2
商品C 5
GROUP BY
• COUNT関数(実習)
• COUNTは集約したレコードの件数を取得する際に使用します。
25
-- 商品ごとのレコード件数を取得
SELECT item_name
, COUNT(*) count
FROM ex_sales_group
GROUP BY item_name
ORDER BY item_name;
ex_sales_group
sales_date item_name price quantity
2018/9/1 商品A 300 10
2018/9/2 商品A 300 5
2018/9/3 商品A 300 20
2018/9/4 商品B 400 8
2018/9/5 商品B 400 5
2018/9/6 商品C 500 5
2018/9/7 商品C 500 10
2018/9/8 商品C 500 8
2018/9/9 商品C 500 7
2018/9/10 商品C 500 10
item_name count
商品A 3
商品B 2
商品C 5
GROUP BY
• SUM関数
• SUMは数値の合計を求めるときに使用します。
26
-- 商品ごとの数量と金額の合計を取得
SELECT item_name
, SUM(quantity) sum_quantity
, SUM(price * quantity) total
FROM ex_sales_group
GROUP BY item_name
ORDER BY item_name;
ex_sales_group
sales_date item_name price quantity
2018/9/1 商品A 300 10
2018/9/2 商品A 300 5
2018/9/3 商品A 300 20
2018/9/4 商品B 400 8
2018/9/5 商品B 400 5
2018/9/6 商品C 500 5
2018/9/7 商品C 500 10
2018/9/8 商品C 500 8
2018/9/9 商品C 500 7
2018/9/10 商品C 500 10
item_name sum_quantity total
商品A 35 10500
商品B 13 5200
商品C 40 20000
GROUP BY
• MAX関数, MIN関数
• MAXは最大値を、MINは最小値を求めます。
27
-- 商品ごとの数量と金額の合計を取得
SELECT item_name
, MAX(quantity) max_quantity
, MIN(quantity) min_quantity
, MAX(sales_date) new_sales_date
FROM ex_sales_group
GROUP BY item_name
ORDER BY item_name;
ex_sales_group
sales_date item_name price quantity
2018/9/1 商品A 300 10
2018/9/2 商品A 300 5
2018/9/3 商品A 300 20
2018/9/4 商品B 400 8
2018/9/5 商品B 400 5
2018/9/6 商品C 500 5
2018/9/7 商品C 500 10
2018/9/8 商品C 500 8
2018/9/9 商品C 500 7
2018/9/10 商品C 500 10
item_name max_auantity min_quantity new_sales_date
商品A 20 5 2018/9/3
商品B 8 5 2018/9/5
商品C 10 5 2018/9/9
GROUP BY
• MAX関数は超便利
• MAX関数は、最大値を求める場合にしか使用しないものと思われがちですが、
実はかなり使い勝手のいい関数です。
• 以下の様に、item_codeをキーに集約するが、item_nameも一緒に結果を表示
したいという場合にMAXが有効です。
28
sales_date item_code item_name price quantity
2018/9/3 002 商品B 300 20
2018/9/2 001 商品A 300 5
2018/9/1 001 商品A 300 10
-- 商品ごとの数量と金額の合計を取得
SELECT item_code, max(item_name) item_name
, sum(price * quantity) total
FROM ex_sales
GROUP BY item_code
ORDER BY item_code;
item_code item_name total
001 商品A 4500
002 商品B 6000
重複の削除
DISTINCT
29
DISTINCT
• DISTINCT
• SELECT句に記述したカラムの組み合わせを重複を排除した形で取得すること
ができます。
30
-- 書き方
SELECT DISTINCT column1, column2, …
FROM table1
DISTINCT
• DISTINCT(実習)
31
どのようなSQL文で実現できるか。
SQL文を作成してみましょう。
ex_sales_distinct
sales_date customer_name item_name quantity amoount
2018/9/1 顧客A 商品① 10 1000
2018/9/1 顧客B 商品① 20 4000
2018/9/2 顧客A 商品③ 10 3000
2018/9/2 顧客B 商品① 5 500
2018/9/2 顧客C 商品③ 5 1500
2018/9/3 顧客C 商品③ 2 600
2018/9/4 顧客A 商品① 5 500
2018/9/4 顧客B 商品② 10 2000
2018/9/5 顧客A 商品② 3 600
customer_name item_name
顧客A 商品①
顧客A 商品②
顧客A 商品③
顧客B 商品①
顧客B 商品②
顧客C 商品③
DISTINCT
• DISTINCT(解答)
32
-- 顧客と商品の組み合わせを取得
SELECT DISTINCT customer_name, item_name
FROM ex_sales_distinct;
ex_sales_distinct
sales_date customer_name item_name quantity amoount
2018/9/1 顧客A 商品① 10 1000
2018/9/1 顧客B 商品① 20 4000
2018/9/2 顧客A 商品③ 10 3000
2018/9/2 顧客B 商品① 5 500
2018/9/2 顧客C 商品③ 5 1500
2018/9/3 顧客C 商品③ 2 600
2018/9/4 顧客A 商品① 5 500
2018/9/4 顧客B 商品② 10 2000
2018/9/5 顧客A 商品② 3 600
customer_name item_name
顧客A 商品①
顧客A 商品②
顧客A 商品③
顧客B 商品①
顧客B 商品②
顧客C 商品③
並び替え
ORDER BY
33
ORDER BY
• ORDER BY
• SELECT文を実行した際の結果の並び順を指定したい場合にはORDER BY
句を指定します。
• 並び替えの基準となるカラムを指定し、昇順の場合はASC, 降順の場合
はDESCを指定します。省略した場合は昇順となります。
• カラムは複数指定することも可能です。その場合、優先順位の高いも
のから順に記述していきます。
34
-- 書き方
SELECT句
FROM句
WHERE句
ORDER BY column1 (ASC|DESC), column2 (ASC|DESC),…
ORDER BY
• ORDER BY(例題)
35
どのようなSQL文で実現できるか。
SQL文を作成してみましょう。
ex_sales_order
sales_date item_name price quantity
2018/9/1 商品A 100 15
2018/9/3 商品C 300 7
2018/9/2 商品A 100 20
2018/9/2 商品B 200 12
2018/9/4 商品B 200 5
sales_date item_name price quantity amount
2018/9/2 商品B 200 12 2400
2018/9/3 商品C 300 7 2100
2018/9/2 商品A 100 20 2000
2018/9/1 商品A 100 15 1500
2018/9/4 商品B 200 5 1000
ORDER BY
• ORDER BY(解答)
36
-- 金額の降順で並べる
SELECT * , price * quantity AS amount
FROM ex_sales_order
ORDER BY price * quantity DESC;
ex_sales_order
sales_date item_name price quantity
2018/9/1 商品A 100 15
2018/9/3 商品C 300 7
2018/9/2 商品A 100 20
2018/9/2 商品B 200 12
2018/9/4 商品B 200 5
sales_date item_name price quantity amount
2018/9/2 商品B 200 12 2400
2018/9/3 商品C 300 7 2100
2018/9/2 商品A 100 20 2000
2018/9/1 商品A 100 15 1500
2018/9/4 商品B 200 5 1000
取得行数の制限
LIMIT
OFFSET
37
LIMIT・OFFSET
• LIMIT・OFFSET
• 取得するレコード件数を制限したい場合はLIMITを使用します。
• 一般的にはORDER BYの後に書きます。
• また、OFFSETを使用すると、読み飛ばす件数も同時に指定することが
できます。
38
-- 書き方
SELECT句
FROM句
WHERE句
ORDER BY句
LIMIT 取得件数
OFFSET 読み飛ばす件数
LIMIT
• LIMIT(例)
39
-- 日付の昇順で並べ、上位3件を取得する
SELECT * FROM ex_sales_order
ORDER BY sales_date
LIMIT 3
ex_sales_order
sales_date item_name price quantity
2018/9/1 商品A 100 15
2018/9/3 商品C 300 7
2018/9/2 商品A 100 20
2018/9/2 商品B 200 12
2018/9/4 商品B 200 5
sales_date item_name price quantity
2018/9/1 商品A 100 15
2018/9/2 商品A 100 20
2018/9/2 商品B 200 12
OFFSET
• OFFSET(例)
40
-- 日付の昇順で並べ、上位3件を取得する
SELECT * FROM ex_sales_order
ORDER BY sales_date
LIMIT 2
OFFSET 3
ex_sales_order
sales_date item_name price quantity
2018/9/1 商品A 100 15
2018/9/3 商品C 300 7
2018/9/2 商品A 100 20
2018/9/2 商品B 200 12
2018/9/4 商品B 200 5
sales_date item_name price quantity
2018/9/3 商品C 300 7
2018/9/4 商品B 200 5
結合
JOIN
41
結合
• 結合の種類
結合にはいくつかの種類があります。
具体的には
• クロス結合
• 内部結合
• 外部結合
• 自己結合
• 自然結合
などがあります。
42
クロス結合
• クロス結合
• 結合対象となるテーブルのレコードの全ての組み合わせを取得する結
合方法です。
• 2通りの書き方があります。
• 取得するレコード数は Aのレコード数 × Bのレコード数
• ②の書き方の場合、内部結合をしようとして、結合条件を記述し忘れ
た際に意図せずクロス結合になってしまうことがあるので注意が必要
です。
43
-- 書き方①
SELECT * FROM table1
CROSS JOIN table2
-- 書き方②
SELECT * FROM table1, table2
クロス結合
• クロス結合(例)
44
クロス結合
SELECT *
FROM ex_pg_language
CROSS JOIN ex_dbms;
結合結果のレコード数は
3×3 = 9レコード となります。
ex_pg_language
pg_language
PHP
Java
Ruby
ex_dbms
dbms_name
Oracle
MySQL
PostgreSQL
pg_language dbms_name
PHP Oracle
PHP MySQL
PHP PostgreSQL
Java Oracle
Java MySQL
Java PostgreSQL
Ruby Oracle
Ruby MySQL
Ruby PostgreSQL
クロス結合
• クロス結合は通常は使用しない
• クロス結合は、対象となるレコード同士のすべての組み合わせを取得
するため、パフォーマンスが低下します。
• これを使用しなければ実現できない、という場合以外は基本的に使用
しない。(滅多にないですが。。)
45
内部結合
• 内部結合
• 結合条件を指定し、合致するレコードのみを取得する結合方法です。
• 2通りの書き方があります。
• お勧めは①の書き方。
• ②の書き方の場合、絞り込み条件なのか結合条件なのかが分かりにくくなり
ます。また、結合条件を書き忘れてもエラーにならず、意図せずクロス結合
が行われてしまいます。
46
-- 書き方①
SELECT * FROM table1 t1
INNER JOIN table2 t2
ON t1.column = t2.column
-- 書き方②
SELECT * FROM table1 t1, table2 t2
WHERE t1.column = t2.column
内部結合
• 内部結合(例題)
47
内部結合
どのようなSQL文で実現できるか。
SQL文を作成してみましょう。
ex_items
id item_name
1 りんご
2 バナナ
3 オレンジ
4 ぶどう
5 いちご
6 メロン
ex_item_price
id price
1 100
2 160
3 80
7 300
8 200
9 600
id item_name price
1 りんご 100
2 バナナ 160
3 オレンジ 80
内部結合
• 内部結合(解答)
48
内部結合
ex_items
id item_name
1 りんご
2 バナナ
3 オレンジ
4 ぶどう
5 いちご
6 メロン
ex_item_price
id price
1 100
2 160
3 80
7 300
8 200
9 600
id item_name price
1 りんご 100
2 バナナ 160
3 オレンジ 80
SELECT item.id, item_name, price
FROM ex_items item
INNER JOIN ex_item_price ex_price
ON item.id = ex_price.id
ORDER BY item.id;
idをキーとした内部結合
idが一致するレコードのみが
抽出されます。
外部結合
• 外部結合
• 外部結合は3つの種類があります。
• 左外部結合、右外部結合、全外部結合、の3つです。
• 左外部結合と右外部結合は、実質的に同じです。
• 全外部結合はDBMSによってはサポートされていないので注意が必要で
す。
49
-- 書き方(左外部結合)
SELECT * FROM table1 t1
LEFT OUTER JOIN table2 t2
ON t1.column = t2.column
-- 書き方(右外部結合)
SELECT * FROM table1 t1
RIGHT OUTER JOIN table2 t2
ON t1.column = t2.column
-- 書き方(全外部結合)
SELECT * FROM table1 t1
FULL OUTER JOIN table2 t2
ON t1.column = t2.column
外部結合
• 左外部結合(例)
50
SELECT i.id, item_name, price
FROM ex_items i
LEFT OUTER JOIN ex_item_price p
ON i.id = p.id
ORDER BY i.id;
左外部結合
ex_items
id item_name
1 りんご
2 バナナ
3 オレンジ
4 ぶどう
5 いちご
6 メロン
ex_item_price
id price
1 100
2 160
3 80
7 300
8 200
9 600
id item_name price
1 りんご 100
2 バナナ 160
3 オレンジ 80
4 ぶどう (NULL)
5 いちご (NULL)
6 メロン (NULL)
外部結合
• 左外部結合(注意点)
• 違いが分かりますか?
51
-- 結合条件での絞り込み
SELECT i.id, item_name, price
FROM ex_items i
LEFT OUTER JOIN ex_item_price p
ON i.id = p.id
AND p.price >= 100
ORDER BY i.id;
-- 結合後の条件での絞り込み
SELECT i.id, item_name, price
FROM ex_items i
LEFT OUTER JOIN ex_item_price p
ON i.id = p.id
WHERE p.price >= 100
ORDER BY i.id;
外部結合
• 左外部結合(注意点)
• 結果はこうなります。
52
-- 結合条件での絞り込み
SELECT i.id, item_name, price
FROM ex_items i
LEFT OUTER JOIN ex_item_price p
ON i.id = p.id
AND p.price >= 100
ORDER BY i.id;
-- 結合後の条件での絞り込み
SELECT i.id, item_name, price
FROM ex_items i
LEFT OUTER JOIN ex_item_price p
ON i.id = p.id
WHERE p.price >= 100
ORDER BY i.id;
id item_name price
1 りんご 100
2 バナナ 160
3 オレンジ (NULL)
4 ぶどう (NULL)
5 いちご (NULL)
6 メロン (NULL)
id item_name price
1 りんご 100
2 バナナ 160
外部結合
• 左外部結合(注意点)
• 結合条件で絞り込むのか、それとも結合後にWHEREで絞り込むのかに
よって結果が変わってきます。
• 違いを理解して適切な使い方をしましょう。
53
外部結合
• 右外部結合(例)
54
SELECT p.id, item_name, price
FROM ex_items i
RIGHT OUTER JOIN ex_item_price p
ON i.id = p.id
ORDER BY p.id;
右外部結合
ex_items
id item_name
1 りんご
2 バナナ
3 オレンジ
4 ぶどう
5 いちご
6 メロン
ex_item_price
id price
1 100
2 160
3 80
7 300
8 200
9 600
id item_name price
1 りんご 100
2 バナナ 160
3 オレンジ 80
7 (NULL) 300
8 (NULL) 200
9 (NULL) 600
外部結合
• 全外部結合(例)
55
SELECT i.id id1, p.id id2, item_name, price
FROM ex_items i
FULL OUTER JOIN ex_item_price p
ON i.id = p.id
ORDER BY i.id, p.id;
全外部結合
ex_items
id item_name
1 りんご
2 バナナ
3 オレンジ
4 ぶどう
5 いちご
6 メロン
ex_item_price
id price
1 100
2 160
3 80
7 300
8 200
9 600
id1 id2 item_name price
1 1 りんご 100
2 2 バナナ 160
3 3 オレンジ 80
4 (NULL) ぶどう (NULL)
5 (NULL) いちご (NULL)
6 (NULL) メロン (NULL)
(NULL) 7 (NULL) 300
(NULL) 8 (NULL) 200
(NULL) 9 (NULL) 600
内部結合と外部結合
• 内部結合と外部結合の比較
56
内部結合
結合対象
左外部結合
ex_items
id item_name
1 りんご
2 バナナ
3 オレンジ
4 ぶどう
5 いちご
6 メロン
ex_item_price
id price
1 100
2 160
3 80
7 300
8 200
9 600
id item_name price
1 りんご 100
2 バナナ 160
3 オレンジ 80
id item_name price
1 りんご 100
2 バナナ 160
3 オレンジ 80
4 ぶどう (NULL)
5 いちご (NULL)
6 メロン (NULL)
内部結合と外部結合
• 内部結合と外部結合の名前の由来
57
クロス結合
内部結合
外部結合
集合で考えた時、
内部結合で抽出されたレコードはク
ロス結合の集合に含まれます。
外部結合では、クロス結合の集合に
含まれないレコードが抽出されるこ
とがあります(NULLを含む場合)。
クロス結合の集合の内部か外部かで、
内部結合と外部結合という名前に
なっています。
外部結合
• 外部結合のまとめ
• 外部結合をする場合は左外部結合を使用する。(一般的に左の方が見
やすいため)
• 外部結合をする際に結合元となるテーブルはマスタのテーブルを選択
するようにしましょう。
58
結合の種類
• 自己結合
• 自分自身のテーブルと結合する結合。
• 結合対象のテーブルが自分自身のテーブルになっただけで、結合の方
法は内部結合と同じです。
59
-- 自己結合
SELECT * FROM table1 t1
INNER JOIN table1 t1
ON t1.column = t1.column
結合の種類
• 自然結合
• 結合条件を記述せず、テーブルの同じ名前の列名同士で統合が結ばれ
る結合
• 内部結合よりも記述が短くなりますが、どのカラムで結合しているか
はテーブル定義を理解している必要があるため、あえて自然結合で記
述するメリットはほとんどないでしょう。
60
-- 書き方
SELECT * FROM table1
NATURAL JOIN table2
-- 内部結合での表現
SELECT * FROM table1
INNER JOIN table2
ON table1.id = table2.id
結合
• 結合全体のまとめ
• 通常の業務で多く使用するのは内部結合と左外部結合。
• 読みやすい書き方で記述する。
• DBMSによってはここで紹介した結合のSQLでサポートされていない
DBMSもある。また、SQLの実装が異なる場合もあるので注意する。
61
集合演算
UNION, EXCEPT, INTERSECT
62
集合演算
• SQLの集合演算
• SQLの集合演算とは、SELECT文の結果(表)に対しての表同士の足し算、
引き算、掛け算のことです。
• 集合演算の演算子
• 和集合(UNION)
• 差集合(EXCEPT)
• 積集合(INTERSECT)
63
UNION
• UNIONとUNION ALL
• 3つのSELECT文の和集合の結果を得るための演算子。
• それぞれの演算子で何が違うが分かりますか?
64
-- 書き方
SELECT文①
UNION
SELECT文②
-- 書き方
SELECT文①
UNION ALL
SELECT文②
UNION
• UNIONとUNION ALL
• 3つのSELECT文の和集合の結果を得るための演算子。
• UNION と UNION ALL の違いは、SELECT文①とSELECT文②に重複があっ
た場合に現れます。
• UNION単独の場合、重複は削除して1行のみ表示します。UNION ALL は、
重複もそのまま表示します。
• パフォーマンス面ではUNION ALLの方が高速になります。UNIONは、重
複排除のために内部でソートの処理を行いますが、UNION ALLではソー
トの処理は行われません。そのため速度に違いがでます。
65
-- 書き方
SELECT文①
UNION
SELECT文②
-- 書き方
SELECT文①
UNION ALL
SELECT文②
UNION
• UNION(例)
66
同じレコードが除外されて表示されます。
SELECT * FROM Astore_items
UNION
SELECT * FROM Bstore_items;
Astore_items
id item_name price
1 りんご 100
2 バナナ 160
3 オレンジ 80
4 ぶどう 300
5 いちご 200
Bstre_items
id item_name price
1 りんご 100
2 バナナ 160
3 オレンジ 90
6 メロン 600
id item_name price
1 りんご 100
2 バナナ 160
3 オレンジ 80
3 オレンジ 90
4 ぶどう 300
5 いちご 200
6 メロン 600
UNION
• UNION ALL(例)
67
同じレコードも表示されます。
SELECT * FROM Astore_items
UNION ALL
SELECT * FROM Bstore_items;
Astore_items
id item_name price
1 りんご 100
2 バナナ 160
3 オレンジ 80
4 ぶどう 300
5 いちご 200
Bstre_items
id item_name price
1 りんご 100
2 バナナ 160
3 オレンジ 90
6 メロン 600
id item_name price
1 りんご 100
2 バナナ 160
3 オレンジ 80
4 ぶどう 300
5 いちご 200
1 りんご 100
2 バナナ 160
3 オレンジ 90
6 メロン 600
EXCEPT
• EXCEPT
• UNIONの逆で、差集合を求めるための演算子。
• SELECT文①の結果から下のSELECT文②の結果を除いた結果が取得でき
る。
• Oracleの場合はMINUS演算子がEXCEPTの役割を果たします。
68
-- 書き方
SELECT文①
EXCEPT
SELECT文②
EXCEPT
• EXCEPT(例)
69
SELECT * FROM Astore_items
EXCEPT
SELECT * FROM Bstore_items;
Astore_items
id item_name price
1 りんご 100
2 バナナ 160
3 オレンジ 80
4 ぶどう 300
5 いちご 200
Bstre_items
id item_name price
1 りんご 100
2 バナナ 160
3 オレンジ 90
6 メロン 600
id item_name price
3 オレンジ 80
4 ぶどう 300
5 いちご 200
INTERSECT
• INTERSECT
• 2つのSELECT文の積(共通部分)を求めるための演算子。
• SELECT文①とSELECT文②に共通するレコードが取得できる。
70
-- 書き方
SELECT文①
INTERSECT
SELECT文②
INTERSECT
• INTERSECT (例)
71
2つの表の共通している行が
表示されます。
SELECT * FROM Astore_items
INTERSECT
SELECT * FROM Bstore_items;
Astore_items
id item_name price
1 りんご 100
2 バナナ 160
3 オレンジ 80
4 ぶどう 300
5 いちご 200
Bstre_items
id item_name price
1 りんご 100
2 バナナ 160
3 オレンジ 90
6 メロン 600
id item_name price
1 りんご 100
2 バナナ 160
関数
72
関数
• 関数
• 関数とは、引数で値を受け取り、引数によって処理した結果を返すも
ののことです。
• ほとんどのプログラミング言語でも関数(メソッド、ファンクション
など、言語によって呼び方は様々)がありますが、それと同じです。
73
関数
• 文字列関数
• ||:左辺と右辺の文字列を結合する。
• trim:前後の余白を取り除く。
• substr:部分文字列を作成する。
• char_length:文字列の長さを取得する。
• lower:小文字に変換する。
• upper:大文字に変換する。
74
SELECT
trim(' abc ') f1
, substr('abcdef', 2, 3) f2
, char_length('abcde') f3
, lower('HELLO') f4
, upper('world') f5;
f1 f2 f3 f4 f5
abc bcd 5 hello WORLD
関数
• 数値関数(一部)
• floor:引数の数値よりも小さい整数の中で最も大きい整数を返す。
• ceil:引数の数値よりも大きい整数の中で最も小さい整数を返す。
• random:0~1の範囲でランダムな値を返す。
• round:引数の数値を四捨五入した値を返す。
• trunc:引数の数値の小数点を切り捨てた値を返す。
75
SELECT
floor(10.8) f1
, ceil(10.8) f2
, random() f3
, round(10.5) f4
, trunc(10.9) f5;
f1 f2 f3 f4 f5
10 11 0.917… 11 10
関数
• 関数まとめ
• 関数は他にも様々な種類があります。詳しくは業務で使用しているDB
製品のマニュアルなどを参照してください。
• また、関数はselect句以外でも、where句、group by句、order by句など、
どの部分でも使用可能ですので、柔軟に使いこなせるようにしておき
ましょう。
• ただし、where句やorder by句で使用する場合、使い方によっては速度
に影響がでる可能性がありますので、注意してください。
• 関数は自分で作成することも可能です。(後の講義で扱う予定で
す。)
76
サブクエリ
(副問い合わせ)
77
サブクエリ
• サブクエリ
• 副問い合わせとも呼ばれます。
• SELECT文の結果を別のクエリ(SQL文)に使用する書き方。
• FROM句として使用したり、結合対象としてサブクエリを使用するこ
とも多いです。
• 更新系のSQLでも使用することができます。
78
-- 例(SELECT文の結果をJOINの対象にする)
SELECT table1.* , total
FROM table1
INNER JOIN (SELECT id, SUM(num) total
FROM table2 GROUP BY id) t2
ON table1.id = t2.id
サブクエリ
• サブクエリ(例)
79
-- 例(販売数を商品で集約した結果を、結合に使用する)
SELECT i.*, sum
FROM ex_item_sub i
LEFT OUTER JOIN (SELECT item_id, SUM(quantity) sum
FROM ex_sales_sub
GROUP BY item_id) s
ON i.item_id = s.item_id
ORDER BY i.item_id;
ex_item_sub
item_id item_name price
001 商品A 200
002 商品B 350
003 商品C 170
004 商品D 200
005 商品E 300
ex_sales_sub
sales_date item_id quantity
2018/9/1 001 20
2018/9/2 001 15
2018/9/3 002 40
2018/9/4 002 30
2018/9/5 003 50
item_id item_name price sum
001 商品A 200 35
002 商品B 350 70
003 商品C 170 50
004 商品D 200 (NULL)
005 商品E 300 (NULL)
サブクエリ
• 相関サブクエリ
• 外側のクエリの値を内側のクエリ内で使用するサブクエリ
• よく使用されるのはEXISTSを使用したSQL文
80
-- 例(table2に、idが一致するレコードが存在するtable1のレコードを表示)
SELECT * FROM table1 t1
WHERE EXISTS (SELECT * FROM table2 t2
WHERE t1.id = t2.id)
-- INを使用したEXISTSの代用
SELECT * FROM table1 t1
WHERE id IN (SELECT id FROM table2 t2)
サブクエリ
• 相関サブクエリ(例)
81
-- 9/1~9/3の期間に一度でも販売された商品を取得するSQL文
SELECT * FROM ex_item_sub i
WHERE EXISTS (SELECT * FROM ex_sales_sub
WHERE item_id = i.item_id
AND sales_date BETWEEN '2018/9/1' AND '2018/9/3');
ex_item_sub
item_id item_name price
001 商品A 200
002 商品B 350
003 商品C 170
004 商品D 200
005 商品E 300
ex_sales_sub
sales_date item_id quantity
2018/9/1 001 20
2018/9/2 001 15
2018/9/3 002 40
2018/9/4 002 30
2018/9/5 003 50
item_id item_name price
001 商品A 200
002 商品B 350
サブクエリ
• スカラ・サブクエリ
• SELECT句の中にサブクエリを記述する方法。
• 結果がイメージしやすいが、多用するとパフォーマンスが悪くなる。
82
-- SELECT句の中で、別のテーブルのレコードを取得する
SELECT id
, (SELECT name
FROM table2
WHERE id = table1.id) エイリアス名
FROM table1
サブクエリ
• スカラ・サブクエリ(例)
83
-- 売上のレコードを取得して、商品名も表示する
SELECT
sales_date
, item_id
, (SELECT item_name FROM ex_item_sub i
WHERE item_id = s.item_id) item_name
, quantity
FROM ex_sales_sub s;
ex_item_sub
item_id item_name price
001 商品A 200
002 商品B 350
003 商品C 170
004 商品D 200
005 商品E 300
ex_sales_sub
sales_date item_id quantity
2018/9/1 001 20
2018/9/2 001 15
2018/9/3 002 40
2018/9/4 002 30
2018/9/5 003 50
sales_date item_id item_name quantity
2018/9/4 002 商品B 30
2018/9/1 001 商品A 20
2018/9/3 002 商品B 40
2018/9/2 001 商品A 15
2018/9/5 003 商品C 50
条件分岐
CASE式
84
CASE式
• CASE式
• SQLで条件分岐をするための構文です。
• SELECT句、WHERE句、GROUP BY句のなど、どこでも使用可能です。
• 一般的にはWHERE句では使用せずにSELECT句の中で使用することが多
い。
• maxや、sumなどの集約関数の中に入れ込むこともある。
85
-- 書き方
SELECT
CASE
WHEN 条件式1 THEN 値1
WHEN 条件式2 THEN 値2
ELSE 値3
END エイリアス名
FROM table2
CASE式
• CASE式(例題)
86
商品_CASE用
商品id 商品名 単価
001 商品A 1000
002 商品B 5000
003 商品C 10000
商品id 商品名 単価 ランク
001 商品A 1000 安物
002 商品B 5000 普通
003 商品C 10000 高級品
どのようなSQL文で実現できるか。
SQL文を作成してみましょう。
CASE式
• CASE式(解答)
87
-- 単価によってランクを決める
SELECT *
, CASE
WHEN price >= 10000 THEN '高級品'
WHEN price BETWEEN 5000 AND 9999 THEN '普通'
ELSE '安物'
END rank
FROM ex_item_case;
ex_item_case
item_id item_name price
001 商品A 1000
002 商品B 5000
003 商品C 10000
item_id item_name price rank
001 商品A 1000 安物
002 商品B 5000 普通
003 商品C 10000 高級品
CASE式
• CASE式(SELECT句以外での使用)
• CASE式はGROUP BY句でORDER BY句でも使用可能です。
88
-- 単価のランクでグループ化するし、ランクごとに集計する
SELECT sum(price)
, CASE
WHEN price >= 10000 THEN 'A'
WHEN price BETWEEN 5000 AND 9999 THEN 'B'
ELSE 'C'
END rank
FROM ex_item_case
GROUP BY CASE
WHEN price >= 10000 THEN 'A'
WHEN price BETWEEN 5000 AND 9999 THEN 'B'
ELSE 'C'
END rank;
CASE式
• CASE式(集約関数と組み合わせ)
• CASE式は集約関数(sum関数やmax関数)と組み合わせることで便利な
使い方ができます。
• 例えば、以下のようなテーブルで、取引ごとに金額を集計し、横に表
示したいとします。
89
取引 金額
仕入 100
売上 200
仕入 300
売上 400
仕入金額 売上金額
400 600
CASE式
• CASE式(集約関数と組み合わせ)
• この場合、以下のようなSQL文で実現可能です。
90
-- 単価のランクでグループ化するし、ランクごとに集計する
SELECT
sum(CASE
WHEN 取引 = '仕入' THEN 金額
ELSE 0
END) 仕入金額
, sum(CASE
WHEN 取引 = '売上' THEN 金額
ELSE 0
END) 売上金額
FROM 取引テーブル;
CASE式
• まとめ
• CASE式を使用すると柔軟なデータの取得が可能です。
• ただし、関数と同様SELECT句以外で使用すると速度に影響が出る可能
性もあるので注意が必要です。
91
ウィンドウ関数
92
ウィンドウ関数
• ウィンドウ関数
• GROUP BY を使わずとも集約関数の結果を取得できる関数。
• row_number, count, sum, max, rank, dense_rank などがあります。
• 使いこなせると非常に便利ですが、DBMSやバージョンによっては実装
されていないものもあるので注意が必要です。
• 関数名() over(…) のように使用します。overの中にはpartition by句と
order by句が記述できます。
93
-- 書き方
関数名() over(partition by カラムリスト order by カラムリスト)
ウィンドウ関数
• 主なウィンドウ関数
• count, sum, max, min:集約関数を同じ
• row_number():連番の取得
• rank():ランクを取得
• dense_rank():ランクを取得
94
-- 例
SELECT
row_number() over(partition by column1 order by column2)
, count() over(partition by column3 order by column4 desc)
FROM table1
ウィンドウ関数
• ウィンドウ関数(例)
95
--例(売上の分析)
SELECT
row_number() over(ORDER BY sales_date, customer, item_name) 連番
, rank() over(ORDER BY price * quantity DESC) lank
, sum(price * quantity) over(PARTITION BY sales_date ORDER BY item_name) 累計
, sum(price * quantity) over(PARTITION BY sales_date) 日付合計
FROM ex_sales_window;
連番 売上ランク 累計 日付合計
1 3 20000 40000
2 4 35000 40000
3 6 40000 40000
4 5 8000 53000
5 1 53000 53000
6 2 40000 40000
ex_sales_window
sales_date customer item_name price quantity
2018/9/1 X商店 商品A 200 100
2018/9/1 X商店 商品B 300 50
2018/9/1 X商店 商品C 500 10
2018/9/2 Y商店 商品A 200 40
2018/9/2 Y商店 商品B 300 150
2018/9/3 Z商店 商品C 500 80
ウィンドウ関数
• ウィンドウ関数の使い道
• 多くの業務系のシステムでは、過去のデータを集計して分析資料をア
ウトプットする機能がついています。
• ウィンドウ関数をうまく活用すると、プログラムを作成せずとも一発
のSELECT文で分析資料に必要なデータを全て取得できる場合もありま
す。
• 多用しすぎると可読性が下がり、メンテナンス性が下がるので注意が
必要ですが、有効に使うことで、プログラムのソースを減らし、かつ
速度の改善も見込めるため、使えるようにしておくと良いでしょう。
96
WITH句
97
WITH句
• WITH句
• WITH句は、SELECT文の結果に名前を付けることができる構文です。
• 一つのSQL文が長くなってしまう場合に、SELECT文の途中経過に名前を
付けることで、全体のSQL文の可読性を上げることができます。
98
-- 書き方
WITH 名前 AS (SELECT文)
WITH句
• WITH句(例)
• WITH句の中でのSELECT文の結果に対して、「all_items」という名前を
付けることで、WITH句の後に続くSQLで、all_itemsという名前をテーブ
ルのように使用することができます。
99
-- 例
WITH all_items AS (
SELECT * FROM AStore_items
UNION
SELECT * FROM BStore_items
)
SELECT * FROM all_items;
SQLまとめ
• SQLまとめ
• 結合、集合演算、サブクエリの使い方に慣れておきましょう。
• CASE式は非常に便利です。有効に使っていきましょう。
• Windows関数を使えるようになるとデータの分析が非常に楽になりま
す。
• SQLの知識を身に付けるとかなり複雑なデータの取得も1発のSELECT文
だけでできるようになります。
• 1発のSELECT文で取得しようとすると、一般に速度は上がりますが、可
読性は下がります。
• メリット・デメリットを踏まえたうえでどのようなSQL文を作成した
ほうが良いかを常に考えるようにしましょう。
100
SQL文の書き方
101
SQL文の書き方
• SQLを書く順番
1. FROM句(メインテーブル)
2. JOIN句(結合対象のテーブル)
3. WHERE句
4. GROUP BY句
5. HAVING句
6. ORDER BY句
7. SELECT句
102
SQL文の書き方
• 大文字と小文字
• SQL文は大文字と小文字を区別しません。
• どちらで書いても構いませんが、プロジェクトのコーディング規約で
決まりがある場合はその規約に従いましょう。
• 決まりがない場合、SQL文のキーワード(select, from, whereなど)と、
そうでない文字(テーブル名、カラム名など)で大文字小文字は分け
るようにしましょう。
103
-- キーワードを大文字にする
SELECT col1, col2, col3
FROM table1
WHERE col1 = 100;
-- キーワードを小文字にする
select COL1, COL2, COL3
from TABLE1
where COL1 = 100;
SQL文の書き方
• 改行
• select句でのカラムが増えてくると、カラムごとに改行したほうがSQL
文が読みやすくなります。その場合カンマを改行前に書く場合と改行
後に書く場合があります。改行前に書いた方が読みやすいと感じる人
が多いようですが、改行後に書いた方が、後でカラムを追加する際に
は楽になります。
104
-- 改行前にカンマを入れる
SELECT
col1,
col2,
col3,
col4
FROM table1
-- 改行前にカンマを入れる
SELECT
col1
, col2
, col3
, col4
FROM table1
SQLの速度
105
SQLの速度
• SQLの速度
• SQLは同一の結果を得るにも複数の書き方ができる場合があります。
• 複数の書き方が存在する場合にどちらの方がパフォーマンスが優れて
いるかを学習していきます。
106
SQLの速度
• INとEXISTS
• サブクエリで条件指定してレコードを取得する場合、INによる書き方
とEXISTSによる書き方があります。
• 下の2つの書き方は同じ結果になります。どちらがパフォーマンス的
にすぐれているでしょうか。
107
-- EXISTSの場合
SELECT *
FROM products p
WHERE EXISTS (SELECT * FROM sales
WHERE products_id = p.products_id);
-- INの場合
SELECT *
FROM products p
WHERE products_id IN (SELECT products_id FROM sales);
SQLの速度
• INよりもEXISTS
• 状況によって変わってくる。
• 「テーブルのレコード件数」「インデックスの有無」「サブクエリで
レコードがどれだけ絞り込まれるか」などの要因で結果が変わってく
る。
• 先ほどの例の場合、salesのproduct_idにインデックスが張られていれば、
existsの方が速い可能性が高いが、実際には実行計画を確認しなければ
わからない。
108
SQLの速度
• 結合+DISTINCTとEXISTS
• INやEXISTSと同じ結果を得るために、結合を用いることもできます。
• ただし結合を使用する場合は、結果を一意にするためにDISTINCTが必
要な場面もあります。
109
-- EXISTSの場合
SELECT *
FROM products p
WHERE EXISTS (SELECT * FROM sales
WHERE products_id = p.products_id)
-- 結合の場合
SELECT DISTINCT p.*
FROM products p
INNER JOIN sales s
ON p.products_id = s.products_id
SQLの速度
• 結合+DISTINCTよりもEXISTS
• このような場合、EXISTSの方が高速になります。
• 理由はDISTINCTは重複排除のためにソートをするため、その分のコス
トがかかります。
• DISTINCTを使用しない場合は、結合とEXISTSでどちらの方が速いかは
ケースバイケースです。
110
SQLの速度
• UNIONとUNION ALL
• UNIONとUNION ALL では、UNION ALLの方が高速です。
• 理由は、UNIONは重複削除のためにソートの処理を行うためです。
• そのため、重複がないことが分かっている場合や、ソートの必要がな
い場合はUNION ALLを使用することにしましょう。
111
SQLの速度
• HAVINGとWHERE
• GROUP BY句を使用する場合、HAVING句とWHERE句による絞り込みが可
能です。例えば以下の2つのSQL文は同じ結果になります。
112
-- HAVINGの場合
SELECT category_id, COUNT(*), MAX(products_id), MIN(products_id)
FROM products_2
GROUP BY category_id
HAVING category_id = 3
-- WHEREの場合
SELECT category_id, COUNT(*), MAX(products_id), MIN(products_id)
FROM products_2
WHERE category_id = 3
GROUP BY category_id
SQLの速度
• HAVINGよりもWHERE
• この場合はWHERE句で絞り込みをした方が高速になります。
• 理由は、WHERE句であらかじめ絞り込んでおけば、GROUP BYで集約す
る際のコストを抑えることができるためです。
• SUMやCOUNTの結果に対しての条件指定はHAVINGでしかできませんが、
WHEREでも絞り込める場合はWHEREで絞り込むようにしましょう。
113
参考文献
114
参考文献
• SQL実践入門
• 著:ミック
• 出版社:技術評論社
115
 達人に学ぶSQL徹底指南書
 著:ミック
 出版社:翔泳社

Contenu connexe

Tendances

Προετοιμασία εργαλείων για αποστείρωση & Κανόνες χρήσης αποστειρωμένου υλικού
Προετοιμασία εργαλείων για αποστείρωση & Κανόνες χρήσης αποστειρωμένου υλικού Προετοιμασία εργαλείων για αποστείρωση & Κανόνες χρήσης αποστειρωμένου υλικού
Προετοιμασία εργαλείων για αποστείρωση & Κανόνες χρήσης αποστειρωμένου υλικού CostasPanayotidis
 
ΑΤΥΧΗΜΑΤΑ ΠΡΩΤΕΣ ΒΟΗΘΕΙΕΣ
ΑΤΥΧΗΜΑΤΑ ΠΡΩΤΕΣ ΒΟΗΘΕΙΕΣΑΤΥΧΗΜΑΤΑ ΠΡΩΤΕΣ ΒΟΗΘΕΙΕΣ
ΑΤΥΧΗΜΑΤΑ ΠΡΩΤΕΣ ΒΟΗΘΕΙΕΣkogxylak
 
Презентація до теми 9
Презентація до теми 9Презентація до теми 9
Презентація до теми 9cit-cit
 
ТПЛМ 1131 Інформаційні потоки в логістиці. О.М.Горяїнов (2009)
ТПЛМ 1131 Інформаційні потоки в логістиці. О.М.Горяїнов (2009)ТПЛМ 1131 Інформаційні потоки в логістиці. О.М.Горяїнов (2009)
ТПЛМ 1131 Інформаційні потоки в логістиці. О.М.Горяїнов (2009)Oleksiy Goryayinov
 
Attacking IPv6 Implementation Using Fragmentation
Attacking IPv6 Implementation Using FragmentationAttacking IPv6 Implementation Using Fragmentation
Attacking IPv6 Implementation Using Fragmentationmichelemanzotti
 
Ζεϊμπέκικο Βασικό Α
Ζεϊμπέκικο Βασικό ΑΖεϊμπέκικο Βασικό Α
Ζεϊμπέκικο Βασικό ΑApollon Dance Studio
 
Ενδομυϊκή χορήγηση φαρμάκων
Ενδομυϊκή χορήγηση φαρμάκωνΕνδομυϊκή χορήγηση φαρμάκων
Ενδομυϊκή χορήγηση φαρμάκωνCostasPanayotidis
 
Πρώτες βοήθειες / 2ο τεύχος
Πρώτες βοήθειες / 2ο τεύχοςΠρώτες βοήθειες / 2ο τεύχος
Πρώτες βοήθειες / 2ο τεύχοςteacher88
 
Υποδόρια χορήγηση φαρμάκων
Υποδόρια χορήγηση φαρμάκωνΥποδόρια χορήγηση φαρμάκων
Υποδόρια χορήγηση φαρμάκωνCostasPanayotidis
 
Βασικά ενδοκρινικά νοσήματα σε βρέφη, παιδιά κι εφήβους
Βασικά ενδοκρινικά νοσήματα σε βρέφη, παιδιά κι εφήβουςΒασικά ενδοκρινικά νοσήματα σε βρέφη, παιδιά κι εφήβους
Βασικά ενδοκρινικά νοσήματα σε βρέφη, παιδιά κι εφήβουςTasos Serbis MD, PhD
 
Ο ασθενής στο νοσηλευτικό τμήμα
Ο ασθενής στο νοσηλευτικό τμήμαΟ ασθενής στο νοσηλευτικό τμήμα
Ο ασθενής στο νοσηλευτικό τμήμαCostasPanayotidis
 
Περιγραφή σύριγγας
Περιγραφή σύριγγαςΠεριγραφή σύριγγας
Περιγραφή σύριγγαςCostasPanayotidis
 
ΠΡΩΤΕΣ ΒΟΗΘΕΙΕΣ ΠΑΡΟΥΣΙΑΣΗ ΔΗΜΟΤΙΚΟ
ΠΡΩΤΕΣ ΒΟΗΘΕΙΕΣ ΠΑΡΟΥΣΙΑΣΗ ΔΗΜΟΤΙΚΟΠΡΩΤΕΣ ΒΟΗΘΕΙΕΣ ΠΑΡΟΥΣΙΑΣΗ ΔΗΜΟΤΙΚΟ
ΠΡΩΤΕΣ ΒΟΗΘΕΙΕΣ ΠΑΡΟΥΣΙΑΣΗ ΔΗΜΟΤΙΚΟΠαναγιώτης Μίτσης
 
Πρώτες Βοήθειες - Πρόγραμμα Αγωγής Υγείας 2016
Πρώτες Βοήθειες - Πρόγραμμα Αγωγής Υγείας 2016   Πρώτες Βοήθειες - Πρόγραμμα Αγωγής Υγείας 2016
Πρώτες Βοήθειες - Πρόγραμμα Αγωγής Υγείας 2016 4ogymnasio
 

Tendances (20)

Προετοιμασία εργαλείων για αποστείρωση & Κανόνες χρήσης αποστειρωμένου υλικού
Προετοιμασία εργαλείων για αποστείρωση & Κανόνες χρήσης αποστειρωμένου υλικού Προετοιμασία εργαλείων για αποστείρωση & Κανόνες χρήσης αποστειρωμένου υλικού
Προετοιμασία εργαλείων για αποστείρωση & Κανόνες χρήσης αποστειρωμένου υλικού
 
ΔΙΑΣΤΡΕΜΜΑ
ΔΙΑΣΤΡΕΜΜΑΔΙΑΣΤΡΕΜΜΑ
ΔΙΑΣΤΡΕΜΜΑ
 
Skripta 1oblast
Skripta 1oblastSkripta 1oblast
Skripta 1oblast
 
ΑΤΥΧΗΜΑΤΑ ΠΡΩΤΕΣ ΒΟΗΘΕΙΕΣ
ΑΤΥΧΗΜΑΤΑ ΠΡΩΤΕΣ ΒΟΗΘΕΙΕΣΑΤΥΧΗΜΑΤΑ ΠΡΩΤΕΣ ΒΟΗΘΕΙΕΣ
ΑΤΥΧΗΜΑΤΑ ΠΡΩΤΕΣ ΒΟΗΘΕΙΕΣ
 
Презентація до теми 9
Презентація до теми 9Презентація до теми 9
Презентація до теми 9
 
Govor tela
Govor tela Govor tela
Govor tela
 
ТПЛМ 1131 Інформаційні потоки в логістиці. О.М.Горяїнов (2009)
ТПЛМ 1131 Інформаційні потоки в логістиці. О.М.Горяїнов (2009)ТПЛМ 1131 Інформаційні потоки в логістиці. О.М.Горяїнов (2009)
ТПЛМ 1131 Інформаційні потоки в логістиці. О.М.Горяїнов (2009)
 
Attacking IPv6 Implementation Using Fragmentation
Attacking IPv6 Implementation Using FragmentationAttacking IPv6 Implementation Using Fragmentation
Attacking IPv6 Implementation Using Fragmentation
 
Ζεϊμπέκικο Βασικό Α
Ζεϊμπέκικο Βασικό ΑΖεϊμπέκικο Βασικό Α
Ζεϊμπέκικο Βασικό Α
 
Вантажопідйомні крани
Вантажопідйомні краниВантажопідйомні крани
Вантажопідйомні крани
 
Ενδομυϊκή χορήγηση φαρμάκων
Ενδομυϊκή χορήγηση φαρμάκωνΕνδομυϊκή χορήγηση φαρμάκων
Ενδομυϊκή χορήγηση φαρμάκων
 
Πρώτες βοήθειες / 2ο τεύχος
Πρώτες βοήθειες / 2ο τεύχοςΠρώτες βοήθειες / 2ο τεύχος
Πρώτες βοήθειες / 2ο τεύχος
 
Υποδόρια χορήγηση φαρμάκων
Υποδόρια χορήγηση φαρμάκωνΥποδόρια χορήγηση φαρμάκων
Υποδόρια χορήγηση φαρμάκων
 
Βασικά ενδοκρινικά νοσήματα σε βρέφη, παιδιά κι εφήβους
Βασικά ενδοκρινικά νοσήματα σε βρέφη, παιδιά κι εφήβουςΒασικά ενδοκρινικά νοσήματα σε βρέφη, παιδιά κι εφήβους
Βασικά ενδοκρινικά νοσήματα σε βρέφη, παιδιά κι εφήβους
 
Ο ασθενής στο νοσηλευτικό τμήμα
Ο ασθενής στο νοσηλευτικό τμήμαΟ ασθενής στο νοσηλευτικό τμήμα
Ο ασθενής στο νοσηλευτικό τμήμα
 
бракування звп
бракування звпбракування звп
бракування звп
 
Περιγραφή σύριγγας
Περιγραφή σύριγγαςΠεριγραφή σύριγγας
Περιγραφή σύριγγας
 
ΠΡΩΤΕΣ ΒΟΗΘΕΙΕΣ ΠΑΡΟΥΣΙΑΣΗ ΔΗΜΟΤΙΚΟ
ΠΡΩΤΕΣ ΒΟΗΘΕΙΕΣ ΠΑΡΟΥΣΙΑΣΗ ΔΗΜΟΤΙΚΟΠΡΩΤΕΣ ΒΟΗΘΕΙΕΣ ΠΑΡΟΥΣΙΑΣΗ ΔΗΜΟΤΙΚΟ
ΠΡΩΤΕΣ ΒΟΗΘΕΙΕΣ ΠΑΡΟΥΣΙΑΣΗ ΔΗΜΟΤΙΚΟ
 
Stres
StresStres
Stres
 
Πρώτες Βοήθειες - Πρόγραμμα Αγωγής Υγείας 2016
Πρώτες Βοήθειες - Πρόγραμμα Αγωγής Υγείας 2016   Πρώτες Βοήθειες - Πρόγραμμα Αγωγής Υγείας 2016
Πρώτες Βοήθειες - Πρόγραμμα Αγωγής Υγείας 2016
 

Similaire à 2019年度若手技術者向け講座 実践SQL

2019年度 若手技術者向け講座 実行計画
2019年度 若手技術者向け講座 実行計画2019年度 若手技術者向け講座 実行計画
2019年度 若手技術者向け講座 実行計画keki3
 
2018年度 若手技術者向け講座 SQL概要
2018年度 若手技術者向け講座 SQL概要2018年度 若手技術者向け講座 SQL概要
2018年度 若手技術者向け講座 SQL概要keki3
 
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理keki3
 
2019年度 若手技術者向け講座 SQL演習
2019年度 若手技術者向け講座 SQL演習2019年度 若手技術者向け講座 SQL演習
2019年度 若手技術者向け講座 SQL演習keki3
 
SQL Server 2022で追加された「WINDOW句」を紹介
SQL Server 2022で追加された「WINDOW句」を紹介SQL Server 2022で追加された「WINDOW句」を紹介
SQL Server 2022で追加された「WINDOW句」を紹介Koji Yamada
 
自己結合Sqlクエリ検出ツールによるチューニングの提案
自己結合Sqlクエリ検出ツールによるチューニングの提案自己結合Sqlクエリ検出ツールによるチューニングの提案
自己結合Sqlクエリ検出ツールによるチューニングの提案拓也 岸本
 
2019年度若手技術者向け講座 インデックス
2019年度若手技術者向け講座 インデックス2019年度若手技術者向け講座 インデックス
2019年度若手技術者向け講座 インデックスkeki3
 
[D36] Michael Stonebrakerが生み出した列指向データベースは何が凄いのか? ~Verticaを例に列指向データベースのアーキテクチャ...
[D36] Michael Stonebrakerが生み出した列指向データベースは何が凄いのか? ~Verticaを例に列指向データベースのアーキテクチャ...[D36] Michael Stonebrakerが生み出した列指向データベースは何が凄いのか? ~Verticaを例に列指向データベースのアーキテクチャ...
[D36] Michael Stonebrakerが生み出した列指向データベースは何が凄いのか? ~Verticaを例に列指向データベースのアーキテクチャ...Insight Technology, Inc.
 
Sql server data store data access internals
Sql server data store data access internalsSql server data store data access internals
Sql server data store data access internalsMasayuki Ozawa
 
Introduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureIntroduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureRyota Watabe
 
KOF2015 PostgreSQL 9.5
KOF2015 PostgreSQL 9.5KOF2015 PostgreSQL 9.5
KOF2015 PostgreSQL 9.5Toshi Harada
 
RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会Nao Minami
 
SQL勉強会 初級編
SQL勉強会 初級編SQL勉強会 初級編
SQL勉強会 初級編Kazuma Hidaka
 
2018年度 若手技術者向け講座 インデックス
2018年度 若手技術者向け講座 インデックス2018年度 若手技術者向け講座 インデックス
2018年度 若手技術者向け講座 インデックスkeki3
 
Lt 関数の変動性分類についておさらいしてみる。
Lt 関数の変動性分類についておさらいしてみる。Lt 関数の変動性分類についておさらいしてみる。
Lt 関数の変動性分類についておさらいしてみる。Toshi Harada
 
Active record query interface
Active record query interfaceActive record query interface
Active record query interfaceTomoya Kawanishi
 
Ruby on Rails on MySQL チューニング入門
Ruby on Rails on MySQL チューニング入門Ruby on Rails on MySQL チューニング入門
Ruby on Rails on MySQL チューニング入門だいすけ さとう
 
実務者のためのかんたんScalaz
実務者のためのかんたんScalaz実務者のためのかんたんScalaz
実務者のためのかんたんScalazTomoharu ASAMI
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編Miki Shimogai
 
Webで役立つRDBの使い方
Webで役立つRDBの使い方Webで役立つRDBの使い方
Webで役立つRDBの使い方Soudai Sone
 

Similaire à 2019年度若手技術者向け講座 実践SQL (20)

2019年度 若手技術者向け講座 実行計画
2019年度 若手技術者向け講座 実行計画2019年度 若手技術者向け講座 実行計画
2019年度 若手技術者向け講座 実行計画
 
2018年度 若手技術者向け講座 SQL概要
2018年度 若手技術者向け講座 SQL概要2018年度 若手技術者向け講座 SQL概要
2018年度 若手技術者向け講座 SQL概要
 
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
 
2019年度 若手技術者向け講座 SQL演習
2019年度 若手技術者向け講座 SQL演習2019年度 若手技術者向け講座 SQL演習
2019年度 若手技術者向け講座 SQL演習
 
SQL Server 2022で追加された「WINDOW句」を紹介
SQL Server 2022で追加された「WINDOW句」を紹介SQL Server 2022で追加された「WINDOW句」を紹介
SQL Server 2022で追加された「WINDOW句」を紹介
 
自己結合Sqlクエリ検出ツールによるチューニングの提案
自己結合Sqlクエリ検出ツールによるチューニングの提案自己結合Sqlクエリ検出ツールによるチューニングの提案
自己結合Sqlクエリ検出ツールによるチューニングの提案
 
2019年度若手技術者向け講座 インデックス
2019年度若手技術者向け講座 インデックス2019年度若手技術者向け講座 インデックス
2019年度若手技術者向け講座 インデックス
 
[D36] Michael Stonebrakerが生み出した列指向データベースは何が凄いのか? ~Verticaを例に列指向データベースのアーキテクチャ...
[D36] Michael Stonebrakerが生み出した列指向データベースは何が凄いのか? ~Verticaを例に列指向データベースのアーキテクチャ...[D36] Michael Stonebrakerが生み出した列指向データベースは何が凄いのか? ~Verticaを例に列指向データベースのアーキテクチャ...
[D36] Michael Stonebrakerが生み出した列指向データベースは何が凄いのか? ~Verticaを例に列指向データベースのアーキテクチャ...
 
Sql server data store data access internals
Sql server data store data access internalsSql server data store data access internals
Sql server data store data access internals
 
Introduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureIntroduction of Oracle Database Architecture
Introduction of Oracle Database Architecture
 
KOF2015 PostgreSQL 9.5
KOF2015 PostgreSQL 9.5KOF2015 PostgreSQL 9.5
KOF2015 PostgreSQL 9.5
 
RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会
 
SQL勉強会 初級編
SQL勉強会 初級編SQL勉強会 初級編
SQL勉強会 初級編
 
2018年度 若手技術者向け講座 インデックス
2018年度 若手技術者向け講座 インデックス2018年度 若手技術者向け講座 インデックス
2018年度 若手技術者向け講座 インデックス
 
Lt 関数の変動性分類についておさらいしてみる。
Lt 関数の変動性分類についておさらいしてみる。Lt 関数の変動性分類についておさらいしてみる。
Lt 関数の変動性分類についておさらいしてみる。
 
Active record query interface
Active record query interfaceActive record query interface
Active record query interface
 
Ruby on Rails on MySQL チューニング入門
Ruby on Rails on MySQL チューニング入門Ruby on Rails on MySQL チューニング入門
Ruby on Rails on MySQL チューニング入門
 
実務者のためのかんたんScalaz
実務者のためのかんたんScalaz実務者のためのかんたんScalaz
実務者のためのかんたんScalaz
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編
 
Webで役立つRDBの使い方
Webで役立つRDBの使い方Webで役立つRDBの使い方
Webで役立つRDBの使い方
 

Plus de keki3

Computer terminology
Computer terminologyComputer terminology
Computer terminologykeki3
 
Introduction to programming
Introduction to programmingIntroduction to programming
Introduction to programmingkeki3
 
2019年度 若手技術者向け講座 デザインパターン 演習問題
2019年度 若手技術者向け講座 デザインパターン 演習問題2019年度 若手技術者向け講座 デザインパターン 演習問題
2019年度 若手技術者向け講座 デザインパターン 演習問題keki3
 
2019年度 若手技術者向け講座 デザインパターン
2019年度 若手技術者向け講座 デザインパターン2019年度 若手技術者向け講座 デザインパターン
2019年度 若手技術者向け講座 デザインパターンkeki3
 
2019年度 若手技術者向け講座 リファクタリング
2019年度 若手技術者向け講座 リファクタリング2019年度 若手技術者向け講座 リファクタリング
2019年度 若手技術者向け講座 リファクタリングkeki3
 
2019年度 若手技術者向け講座 UML
2019年度 若手技術者向け講座 UML2019年度 若手技術者向け講座 UML
2019年度 若手技術者向け講座 UMLkeki3
 
2019年度 若手技術者向け講座 オブジェクト指向
2019年度 若手技術者向け講座 オブジェクト指向2019年度 若手技術者向け講座 オブジェクト指向
2019年度 若手技術者向け講座 オブジェクト指向keki3
 
Wakatemukekouza2019 web
Wakatemukekouza2019 webWakatemukekouza2019 web
Wakatemukekouza2019 webkeki3
 
2019 若手技術者向け講座 DB設計
2019 若手技術者向け講座 DB設計2019 若手技術者向け講座 DB設計
2019 若手技術者向け講座 DB設計keki3
 
2019年度 若手技術者向け講座 NoSQL
2019年度 若手技術者向け講座 NoSQL2019年度 若手技術者向け講座 NoSQL
2019年度 若手技術者向け講座 NoSQLkeki3
 
2019 若手技術者向け講座 DBMSの機能 演習問題
2019 若手技術者向け講座 DBMSの機能 演習問題2019 若手技術者向け講座 DBMSの機能 演習問題
2019 若手技術者向け講座 DBMSの機能 演習問題keki3
 
2019年度 若手技術者向け講座 DBMSの機能
2019年度 若手技術者向け講座 DBMSの機能2019年度 若手技術者向け講座 DBMSの機能
2019年度 若手技術者向け講座 DBMSの機能keki3
 
2018年度 若手技術者向け講座 デザインパターン
2018年度 若手技術者向け講座 デザインパターン2018年度 若手技術者向け講座 デザインパターン
2018年度 若手技術者向け講座 デザインパターンkeki3
 
2018年度 若手技術者向け講座 UML
2018年度 若手技術者向け講座 UML2018年度 若手技術者向け講座 UML
2018年度 若手技術者向け講座 UMLkeki3
 
2018年度 若手技術者向け講座 オブジェクト指向01
2018年度 若手技術者向け講座 オブジェクト指向012018年度 若手技術者向け講座 オブジェクト指向01
2018年度 若手技術者向け講座 オブジェクト指向01keki3
 
2018年度 若手技術者向け講座 リファクタリング
2018年度 若手技術者向け講座 リファクタリング2018年度 若手技術者向け講座 リファクタリング
2018年度 若手技術者向け講座 リファクタリングkeki3
 
2018年度 若手技術者向け講座 DB設計・正規化
2018年度 若手技術者向け講座 DB設計・正規化2018年度 若手技術者向け講座 DB設計・正規化
2018年度 若手技術者向け講座 DB設計・正規化keki3
 
2018年度 若手技術者向け講座 実行計画
2018年度 若手技術者向け講座 実行計画2018年度 若手技術者向け講座 実行計画
2018年度 若手技術者向け講座 実行計画keki3
 
Work efficiency
Work efficiencyWork efficiency
Work efficiencykeki3
 
Excel vba
Excel vbaExcel vba
Excel vbakeki3
 

Plus de keki3 (20)

Computer terminology
Computer terminologyComputer terminology
Computer terminology
 
Introduction to programming
Introduction to programmingIntroduction to programming
Introduction to programming
 
2019年度 若手技術者向け講座 デザインパターン 演習問題
2019年度 若手技術者向け講座 デザインパターン 演習問題2019年度 若手技術者向け講座 デザインパターン 演習問題
2019年度 若手技術者向け講座 デザインパターン 演習問題
 
2019年度 若手技術者向け講座 デザインパターン
2019年度 若手技術者向け講座 デザインパターン2019年度 若手技術者向け講座 デザインパターン
2019年度 若手技術者向け講座 デザインパターン
 
2019年度 若手技術者向け講座 リファクタリング
2019年度 若手技術者向け講座 リファクタリング2019年度 若手技術者向け講座 リファクタリング
2019年度 若手技術者向け講座 リファクタリング
 
2019年度 若手技術者向け講座 UML
2019年度 若手技術者向け講座 UML2019年度 若手技術者向け講座 UML
2019年度 若手技術者向け講座 UML
 
2019年度 若手技術者向け講座 オブジェクト指向
2019年度 若手技術者向け講座 オブジェクト指向2019年度 若手技術者向け講座 オブジェクト指向
2019年度 若手技術者向け講座 オブジェクト指向
 
Wakatemukekouza2019 web
Wakatemukekouza2019 webWakatemukekouza2019 web
Wakatemukekouza2019 web
 
2019 若手技術者向け講座 DB設計
2019 若手技術者向け講座 DB設計2019 若手技術者向け講座 DB設計
2019 若手技術者向け講座 DB設計
 
2019年度 若手技術者向け講座 NoSQL
2019年度 若手技術者向け講座 NoSQL2019年度 若手技術者向け講座 NoSQL
2019年度 若手技術者向け講座 NoSQL
 
2019 若手技術者向け講座 DBMSの機能 演習問題
2019 若手技術者向け講座 DBMSの機能 演習問題2019 若手技術者向け講座 DBMSの機能 演習問題
2019 若手技術者向け講座 DBMSの機能 演習問題
 
2019年度 若手技術者向け講座 DBMSの機能
2019年度 若手技術者向け講座 DBMSの機能2019年度 若手技術者向け講座 DBMSの機能
2019年度 若手技術者向け講座 DBMSの機能
 
2018年度 若手技術者向け講座 デザインパターン
2018年度 若手技術者向け講座 デザインパターン2018年度 若手技術者向け講座 デザインパターン
2018年度 若手技術者向け講座 デザインパターン
 
2018年度 若手技術者向け講座 UML
2018年度 若手技術者向け講座 UML2018年度 若手技術者向け講座 UML
2018年度 若手技術者向け講座 UML
 
2018年度 若手技術者向け講座 オブジェクト指向01
2018年度 若手技術者向け講座 オブジェクト指向012018年度 若手技術者向け講座 オブジェクト指向01
2018年度 若手技術者向け講座 オブジェクト指向01
 
2018年度 若手技術者向け講座 リファクタリング
2018年度 若手技術者向け講座 リファクタリング2018年度 若手技術者向け講座 リファクタリング
2018年度 若手技術者向け講座 リファクタリング
 
2018年度 若手技術者向け講座 DB設計・正規化
2018年度 若手技術者向け講座 DB設計・正規化2018年度 若手技術者向け講座 DB設計・正規化
2018年度 若手技術者向け講座 DB設計・正規化
 
2018年度 若手技術者向け講座 実行計画
2018年度 若手技術者向け講座 実行計画2018年度 若手技術者向け講座 実行計画
2018年度 若手技術者向け講座 実行計画
 
Work efficiency
Work efficiencyWork efficiency
Work efficiency
 
Excel vba
Excel vbaExcel vba
Excel vba
 

2019年度若手技術者向け講座 実践SQL