【Java】Java8から追加された関数型インターフェースとラムダ式について解説


Java8で新しく登場した「関数型インターフェースってなんだろう・・・」と業務で説明を受けてもわかりませんでした。


他にも「ラムダ式ってどんな式?」と色々わからなかったのでいろいろ調べて学習した備忘録を残します。


Java8で追加された「関数型インターフェース」と「ラムダ式」はこちらのOracle公式ページに追加内容が記載されています。
docs.oracle.com

ラムダ式とは

ひとことでいうと、メソッド定義を式として扱える機能のこと


インターフェースを実装したインスタンスを返す式とも言えます。


メソッドを変数のように扱える機能、それがラムダ式です。


メソッド定義を式で扱うというのは上記で記載した関数型インターフェースの抽象メソッドの実装を式として扱う時に使ったりします。

ラムダ式の使い方について

まず、ラムダ式の構文から見ていきます。

(引数) -> {処理}

これは、()内のこの引数をもらったら、{}ブロック内の処理を行うという書き方です。


ー>という書き方が見慣れないですが、引数と処理の間に書く構文だと思い込みます。


引数の型の省略や処理内容が一行であれば{}も省略可能です。


例として、関数型インタフェースのConsumerクラス型の参照変数にラムダ式を代入してみます。
※ >Consumerとは新しく追加された関数型インタフェースで引数をとり戻り値を返さないvoid型のインタフェースです。

Consumer<String> consumerobj = (t) -> {System.out.println(t);}

これは、String型の引数tを受け取りtを出力するという命令です。


Consumer型変数に直接式を代入していますね。この処理を代入するのがラムダ式です。


ちなみに括弧の引数の型を省略していますが、これはConsumer型変数を宣言する際にString型と定義しているためjava型推論が行われます。


そのため受け取るt変数はString型であると認識するため明示しなくても問題ありません。

ラムダ式のメリット

ラムダ式のメリットは、「コード量が減りすっきりする」というところではないでしょうか。


ラムダ式によって引数の型が省略できたり、構文によっては処理ブロックも省略できます。


また、匿名クラスの時はnew構文を使用してインスタンスを生成していましたが、ラムダ式の場合それも必要ありません。


抽象メソッドが一つだけのインターフェースであれば匿名クラスに置き換わる実装式になります。

関数型インターフェースとは?

関数型インタフェースとは抽象メソッドを一つしか持たないインターフェースのことを指す
下は、Java8で追加された関数型インターフェースのPredicate

@FunctionalInterface
public interface Predicate<T> {

    /**
     * Evaluates this predicate on the given argument.
     *
     * @param t the input argument
     * @return {@code true} if the input argument matches the predicate,
     * otherwise {@code false}
     */
    boolean test(T t);
 }

また、ラムダ式を代入することで関数型インターフェースを実装したインスタンスを持つことができる。


抽象メソッドが1つのみという制約はあるがdefaultメソッドはカウントしない。


@FunctionalInterfaceアノテーションを付けることで明示的に関数型インターフェースであることを表せる
これは実装者が誤って抽象メソッドを追加してしまったりすることを事前に防ぐこともできる。


アノテーションを付けることで抽象メソッドが2つ以上になると静的エラーとなるため

他に追加された関数型インターフェース

java.util.functionには上記で紹介したPredicateの他にもいくつか関数型インターフェースが追加されています。

Function

引数Tを受け取りRを返すインターフェース
※読み方はファンクションだと思います。

public interface Function<引数,戻り値>

抽象メソッド

R apply(T t)

Rは戻り値、Tは引数

実装例
引数の文字列"hoge"を受け取り、末尾に"hoge"を結合する処理の場合...

	public static void main(String[] args){
	    String str = "hoge";
	    Function<String, String> function = (String t) -> {return t.concat("hoge");};
	    System.out.println(function.apply(str));
	}

実行結果

hogehoge

以下でStringを受け取り、Stringで返す参照変数を定義している。

 Function<String, String> function

以下のラムダ式で引数tを受け取ったらtの末尾に"hoge"を追加するような処理を代入
処理が一行だと処理ブロック{}は省略できます。この例だとreturnも省略できる。

(String t) -> {return t.concat("hoge");};
引数が2つ必要な場合のBiFunction

先ほどのFunctionに加えて引数を2つ取るものとしてBiFunctionがあります。

public interface BiFunction<T,U,R>

メソッドは同じapplyです。

引数を受け取りboolean値を返却するPredicate

ある引数を受け取り処理で判定を行ってtrueまたはfalseを返したいというときに使えるインターフェース
読み方はプレディケート?述語って意味らしい

public interface Predicate<引数の型>

抽象メソッド

boolean test(T t)

実装例
Stirngの引数を受け取り、”hoge”と一致するかを判定する。

	public static void main(String[] args){
	    String str = "hoge";
        Predicate<String> predicate = (String t) -> {return t.equals("hoge");};
        System.out.print(predicate.test(str));
	}

実行結果

true
引数が2つ必要な場合のBiPredicate

引数を2つ取りたい場合は、BiPredicateがあります。
抽象メソッドも同じtest

public interface BiPredicate<T,U>
引数を受け取り何も返却しないConsumer

ある引数を受け取って何か処理をして終わり。返却値なしで使用するインターフェース
読み方はコンシューマー 消費者という意味

public interface Consumer<T>

抽象メソッド

void accept(T t)

実装例
Stirngの引数を受け取り、そのまま標準出力

	public static void main(String[] args){
	    String str = "hoge";
        Consumer<String> consumer = (String t) -> {System.out.println(t);};
        consumer.accept(str);
	}

実行結果

hoge
引数が2つ必要な場合の BiConsumer

引数2つで抽象メソッドも同じです。

引数は受け取らずに戻り値を返すSupplier

引数は渡さないが処理結果を返すインターフェース
読み方はサプライヤ 供給者という意味です。

public interface Supplier<T>

抽象メソッド

T get()


実装例
呼び出したら1+1の結果を返してくれる例
あまり良いサンプルではないが、以下の処理はメソッドを呼び出したら1+1の結果を返してくれます。

	public static void main(String[] args){
        Supplier<Integer> supplier = () -> {return 1+1;};
        System.err.println(supplier.get());
	}

実行結果

2

さいごに

最後まで読んでいただき、ありがとうございました。


もし、記載している内容が間違えていれば遠慮なくコメントしてください!
私自身の勉強になりますし、他の人がこの記事を見た時に間違えた情報を見ることになってしまうので💦

【Java】 Jsoupとはなにか?JsoupライブラリによるHTML解析を紹介します 

とあるプロジェクトでHTMLファイルをJavaで扱うことになり方法を検討しました。


結論としては、JavaでHTMLファイルを取り扱うにはライブラリを使うのが良いそうです。


JavaでHTMLを扱うライブラリで、Jsoupというライブラリがあります。


このJsoupライブラリは英語のサイトしか情報がなく困ったので
今回は、このJsoupというライブラリについて詳しく解説していきます。





Jsoupライブラリとは

f:id:koko55120:20210518231918j:plain


JsoupはJavaで実際のHTMLファイルを操作するためのライブラリのことです。


Jsoupには、以下の特徴があります。

・URL、ファイル、または文字列からHTMLをスクレイピングし解析する
・DOMトラバーサル、CSSセレクターで、データの「検索」、「抽出」を実現する
・HTMLファイルの「要素」、「属性」、「テキスト」を操作する


JsoupはHTMLファイルの属性なども操作することもできるので、
タグやタグを指定して配下にある要素をまるっと取り出すみたいなことも可能です。

jsoupはオープンソースです。ソースコードGitHubで入手することができます。
github.com




Jsoupの使い方

使い方としてはJsoupライブラリで、該当ファイルの読み込み→Parse→Documentオブジェクトという形で扱うことができます。
※parseっていうのはタグなどを解析して扱える形に変更することです。
Parseについてはこちらの記事で詳しく書いてありますので参考にしてみてください。
https://wa3.i-3-i.info/word13628.html





Jsoupの使い方①URLで指定したWEBページ扱う

public class Main {

    public static void main(String[] args) throws IOException {
        Document document = Jsoup.connect("http://www.google.co.jp").get();
        System.out.println(document.html());
    }
}

connectでURLを指定して取ってきたページをDocument型の変数にParseして格納する。
DocumentオブジェクトでHTMLの情報を保持し操作することができる。

Jsoupの使い方②ファイルパスを指定して普通にParseして使う

public class Main {

    public static void main(String[] args) throws IOException {
        Document document = Jsoup.parse(new File("ファイルパス"),String,("文字コード"))
        System.out.println(document.html());
    }
}

Jsoupはファイルオブジェクトと文字コードを引数にHTMLファイルをParseすることができます。




Jsoupの使い方③ HTMLのタグ"<>"を指定して要素の取り出し

public class Main {

    public static void main(String[] args) throws IOException {
        Document document = Jsoup.parse(new File("ファイルパス"),("文字コード"))
        document.select("br").forEach(System.out::println);
    }
}


HTMLをParseしてHTMLファイル内のbrタグの要素を取り出して出力まで行っています。
SelectでIDやタグを指定することで、その要素と配下を取り出すことができる。



最後まで読んでいただきありがとうございました!
他にもJava系の記事も書いていますので読んでいただけると嬉しいです。

www.engineer-wataru.com


www.engineer-wataru.com


www.engineer-wataru.com





【Git】Gitのコマンドが使い慣れないので使い方をまとめてみました!

f:id:koko55120:20220215134940p:plain

Gitのコマンドでよく使うコマンドから、あんまり使わないけど使いたいとき都度調べてしまうので
ここでは、Gitのコマンドを軽くまとめようかと思います。



私は、Git歴の使用歴3カ月程度・・・そろそろGitのリポジトリやブランチの仕組みを理解し始めて
簡単なコマンドを使えるようになってきたところなのですがSVNばっか使っていたのでやっぱり難しいですね。





branch コマンド

branchコマンドは、ブランチの情報を確認するコマンドという認識で良いと思います。


Gitにはブランチという考えがあり、自分が向いているブランチを見たり、他のブランチを見たりすることが
あるんですよね。


Gitのブランチについては、こちらの記事がとても分かりやすかったので参考にしてみてください。
backlog.com

ブランチコマンドの各種オプション一覧

branchコマンドの各種オプションを紹介します。

オプションなし

現在向いている、ローカルブランチを確認をすることができます。

git branch
-a オプション

Git管理しているリモートにあるブランチ一覧を表示します。

git branch -a
-vv オプション :

ローカルブランチの詳細まで表示するコマンドの認識でよい。 
ローカルブランチの表示/追跡ブランチの表示/コミットIDの表示

git branch -vv

checkout コマンド

branchの向きを変えるコマンドというコマンドの認識で良いと思います。
SVNでのcheckoutと意味が違うので最初は理解するのが難しい。

コマンド

git chekcout ブランチ名


git branchの結果が以下の時

* x.xx-xxx
     y.yy-yyy


以下のコマンドでブランチを切り替えることができます。

git chekcout y.yy-yyy

※この時、今向いているブランチのコミットされていない修正があると、向き先のブランチにマージされてしまったり、修正が消えてしまうので必ずコミットするかstashコマンドをすること!

stash コマンド

変更をコミットせず退避するコマンドです。
今の作業を退避するには以下のコマンドを実行します。

git stash 
退避したリストを見るコマンド
git stash list
退避した作業を戻すコマンド

git stash apply stash@{0}

rebase コマンド

gitには過去のコミットを整理することができます。
例えば一番最新のコミットを一つ前のコミットと一緒にするなどです。

git rebase 

-i オプション

過去のコミットを一緒にするには-i オプションを使う

git rebase -i





関連記事・オススメ記事

www.engineer-wataru.com


wataru55120.hatenablog.jp


wataru55120.hatenablog.jp




私のポートフォリオ

こんにちは。wataruです
私はシステムエンジニアとして働いていて今年で業界3年目になります。


この記事では私のポートフォリオとして職務経歴などを公開しようと思います。

当ブログの管理者wataruの自己紹介になります

学歴


最終学歴は専門学校卒業です。
2年制の学校で情報系の学科を卒業しました。
学生時代には、C言語,C++,Java,HTML/CSS,SQL,VB.netを学びました。


職務経歴


ここではエンジニアとしてプロジェクトに携わった経歴をまとめようと思います。

2018年~2019年9月 ■基幹系システムの保守開発

これは私が社会人になり初めて参画したプロジェクトになります。

■プロジェクトの概要
・東西の拠点のシステムの統合と機能改修
 →東西にそれぞれにあるシステムを東ベースに統合させることが目的
 →既存機能の見直し

システム統合に伴う新機能の実装や、既存機能の見直しをプロジェクトでした。

■実際に私が担当した業務
私がこのプロジェクトでどんな業務をしたかについてです。

■既存の設計書の整理
→既存の設計書にあるシーケンス図は不要という方針になり、すべての設計書からシーケンス図を削除
→設計書すべてを内部の規約通りの文言に修正

■外部設計
→要求仕様書を読み込み、既存の設計書に対して機能変更や追加の内容を執筆
UML図の修正(アクティビティ図)

■詳細設計
→外部設計工程で最新化した設計書を元に内部設計書の執筆
UML図の修正(アクティビティ図)

■コーディング・テスト
Javaでコーディング フレームワークは社内独自のものでした。
単体テスト(Junit(Jmocit)を使用)
結合テスト(自動化でした。Seleniumです)

2019年10月~2019年12月 ■Android向けのニュースアプリの開発運用

ここで転職をしていて、新しい会社でプロジェクトが変わりました。

■プロジェクトの概要
プロジェクトで私の担当していたチームの業務内容です。

スマホのニュースアプリのアジャイル開発
AWS環境へのリリース作業(開発環境、本番環境へのリリース)
 →Gitのfeatureブランチ作成/developブランチにマージ/masterブランチマージ
 →コーディング、Junit試験、Mavenビルド、Jenkinsによるビルド、Chefデプロイ

■実際に私が担当した業務
私がこのプロジェクトでどんな業務をしたかについてです。

このプロジェクトでは主に運用チームとして作業をしていて、開発者のリリースを行ったり
開発者と協力してJavaでの実装も行いました。

AWSキューへの定期転送をJavaのロジックで止めたり、RSSなどのデータをXMLでパースするなどの実装を行いました。

2020年01月~2020年3月 ■帳票管理システムのシステムエンハンス

■プロジェクトの概要
・帳票管理システムのミドルウェアのバージョン変更と機能追加
 ・総合テスト工程より引継ぎ作業(試験項目書および試験データの作成、自動化テストの項目消化)
 ・試験時のバグ対応(コード修正、性能強化試験)
 ・操作手順書の作成

■実際に私が担当した業務
私がこのプロジェクトでどんな業務をしたかについてです。

・総合テストを行いバグを修正
総合テストから引き継いで作業をしたので、画面上で操作を行いエラーが出たらロジックを見直して修正する作業を行いました。
Javaを使っていて、フレームワークStrutsでした。

このプロジェクトでは、あらたにJava8で得た知識で実装をできたのが私にとって成長できたと感じました。

・操作手順書の作成
テストを終えたので後は納品用の、操作手順書の作成を行いました。

2020年05月~2020年9月 ■顧客情報システムの改修

■プロジェクトの概要
顧客企業情報管理システムの改修

■実際に私が担当した業務
私がこのプロジェクトでどんな業務をしたかについてです。

・顧客企業情報の取り込み用のバッチのPL/SQL作成
・DBサーバーの顧客情報のバックアップ作業+データ移行(データ数:2000万件)
 ※PL/SQLで実施
・顧客企業情報の項目の改修(画面修正、ロジック修正、TBL定義修正、データ移行)

2020年10月~2021年3月 ■統合人事システムの改修

■プロジェクトの概要
会社統合に伴う統合人事システムの改修

■実際に私が担当した業務
私がこのプロジェクトでどんな業務をしたかについてです。

クラウド人事管理システムCAMPANYの設定(開発)~単体テストシステムテスト~本番リリース
※人事評価の変更や手当や控除の計算のロジックを設定

保有資格

■ITパスポート
LPIC level1
Java programmer bronze
Java programmer silver
■3級ファイナンシャル・プランニング技能士

【Java】ユーティリティクラスとは何か?まとめてみました!


Javaの開発でユーティリティクラスというものを聞いたことはありますか?


開発の現場で、まずユーティリティクラスってなに?というシーンがあり職場でレクチャーを受けました。
自分は今まで聞いたことなかったんですが、かなり便利なんです。


ユーティリティクラスってどんなものなのか?というユーティリティクラスの概念について
現場で学んだことをアウトプットしていきます。

ユーティリティクラスとは?

そもそもユーティリティという言葉は

英単語で、「役に立つもの」「有用性」「効用」「公益」などの意味。 住宅建築におけるユーティリティールーム(家事室)のこと。


という、一見意味不明なんですが。


とりあえず便利って感じですかね。


その上でユーティリティクラスは、汎用的で便利なクラスということです。


具体的な例を挙げてみましょう。


「便利なメソッド群をstaticな領域にまとめて、使いたい時に簡単に呼び出すという万能なクラス」がユーティリティクラスということです。


簡単に言えば便利で汎用的なメソッド群をstaticで参照できるように定義しておくクラスっていうイメージで良いと思います。


例えばですが、いくつかのクラスでObjectがNullおよび空文字かどうかを判定してbooleanで返したい。
こんなシーンがあったとします。


そんなときに、わざわざクラスごとに「ObjectがNullおよび空文字かどうかを判定してbooleanで返す」メソッドを定義するのは少しめんどくさいですよね・・・。


抽象クラスにまとめて置いてとかでも良いんですが、「ObejectがNullおよび空文字かの判定」ってどんなクラスでも結構使いそうじゃないですか?


それだったら、staticなクラスに定義してパラメータ渡して簡単に呼び出そうよって感じなのがユーティリティクラスの役割ということです。

ユーティリティクラスの構成

ユーティリティクラスのイメージは説明したので、次は構成についてまとめてみます。


ちょこっと書くとこんな感じです。

public static class test {

 private test(){ //コンストラクタをprivateにしてインスタンス化させない
}

public static boolean method(String o){ //例えば引数に受け取ったオブジェクトのNull判定する場合とかね。
 if (o == null | o.equals("")){ 
return true;
}

public static int methodb(String o){ //例えば引数に受け取ったオブジェクトをintに変えて返すみたいな。
 { 
int a = Integr.parseInt(o);
 return  a;


}

クラスとメソッドのアクセスはstaticにします。メソッドを呼ぶ時は、インスタンス化しないで"クラス名.メソッド名"で呼ぶようなイメージです。


あと、ユーティリティクラスはクラスのインスタンスを実装者にさせないように、コンストラクタはprivateで定義しています。


ユーティリティクラスで定義するメソッドは「なんかこういうロジックのメソッドは使うなぁ」という処理を定義しておくと良いですね。


ユーティリティクラスに定義しておくと便利なメソッドは以下の通りです。

  1. 文字列変換
  2. 空白文字削除
  3. ソート
  4. 日付インスタンス取得


他にも、現場特有で使う必ず行う処理があればユーティリティクラスにメソッド定義しておくと良いでしょう。

ユーティリティクラスのメリット


ユーティリティクラスのメリットとしては、「共通の機能群みたいな位置づけでいろんなところで使いまわせる」ところではないでしょうか。


あとはメソッドを共通化することで、各クラスのソースコードの量が減ったり、インスタンス生成しないので、データのゴミも増えないところだと思います!

さいごに

最後まで読んでいただき、ありがとうございました。

もし、記載している内容が間違えていれば遠慮なくコメントしてください!


私自身の勉強になりますし、他の人がこの記事を見た時に間違えた情報を見ることになってしまうので💦


コメントも含めてコンテンツとさせていただきます。


他にもJavaに関する記事を書いていますので、もしよければ読んでみてください!
wataru55120.hatenablog.jp


wataru55120.hatenablog.jp

【Java】private static finalな定数とは何か?そもそもstaticにする意味あるんですか?と気になったのでまとめました!

Javaの中でそのクラスでのみ使う定数のアクセス修飾子で、"private static final"ってやつ見たことありませんか?


そもそも、このアクセス修飾子の本質的な意味を考えていませんでしたが、
「static」にする意味あるのか・・・とふと思ったのでいろいろ調べてみた備忘録が本記事の内容です。

private static final修飾子について


class test {

private static final String = "HOHE_HOGE_HOGE”;

}


「prvate static final」とは何か?
初めに、結論から言うとprvate static final修飾子は

"そのクラスでしかアクセスできないかつクラスに1つである定数"ということです。

このprvate static final修飾子にはこんなメリットがあります。



メリット

staticにすることでメモリを抑えるというメリットがあります。
インスタンスを複数生成することを前提とするクラスには有効的


そもそも、private修飾子は、そのクラス内でしかアクセスできません。
※サブクラスからもアクセスはできない。


次にstatic修飾子というのは、クラスに対して静的である。
簡単に言うとインスタンスをいくつ生成しようがそのクラスに1つしか存在しないことを担保する修飾子です。


アクセス修飾子については以下の記事に書いてあったので参考にしてみてください!
java-code.jp


では本題に戻りましょう。
privateでfinalというのは、そのクラスでしかアクセスできない定数であるということです。

class test {

private  final String = "HOHE_HOGE_HOGE”;

}


とすれば、宣言したクラスでしかアクセスできない"HOHE_HOGE_HOGE"という初期値に変更が無いことを
担保していますよね。


つまりこの定数にアクセスするには、このクラス自体がstaticでない限り
インスタンス化をする必要があります。


しかし、インスタンス化するということは、定数がstaticである必要がないのでは・・・
と思いますよね。

private static finalについて色々調べた結果


static変数とインスタンス変数の違いは
クラスに対して1つであるか。インスタンスに1つであるという違いです。


クラスで複数のインスタンスを生成する場合は、それぞれ使い分ける
必要がありそこに意味があります。


定数をstaticにすれば、インスタンスごとではなくクラスの大して1つしか
存在しないためメモリを抑えられます。


つまり
インスタンスを複数生成することが前提なクラスにメモリを抑えるメリットがあり
1つしかインスタンスを生成しないことが前提あればstaticにする必要はそこまでない

ということになります。

さいごに

最後まで読んでいただき、ありがとうございました。

もし、記載している内容が間違えていれば遠慮なくコメントしてください!
私自身の勉強になりますし、他の人がこの記事を見た時に間違えた情報を見ることになってしまうので💦

【データベース】SQLでテーブル結合をするやり方を解説!(外部結合と内部結合について)

f:id:koko55120:20220117170608j:plain
データベースを扱う時、SQLで二つのテーブルからデータを取り出して結合したい時ってありますよね!!
例えば、「AテーブルとBテーブルの結果を結合して出力する」みたいなイメージです。


そんなときは、SQLでは「JOIN」という関数を使うと結合することができるのですが、JOINという関数には「内部結合」と「外部結合」という概念があります。


今回は、現場業務で調べた「内部結合」と「外部結合」のそれぞれについて解説していこうと思います!

内部結合について(INNER JOIN)

f:id:koko55120:20220117151443j:plain

内部結合は、INNER JOIN句を使用します。
これは、それぞれのテーブルから「指定したカラム名の値が一致した箇所だけ」を結合する結合です。
では、構文を下記で解説していきます。

構文

SELECT カラム名1,カラム名2, .... FROM テーブル名1
INNER JOIN テーブル名2 ON 結合する条件


上記の文で行っていることは、テーブル名1からカラム名1とカラム名2を取り出す
テーブル名2から テーブル名1と指定したカラム名が一致すればテーブル名1に結合しなさい。
という処理です。


具体的に説明しましょう。
以下のテーブルがあったとします。


USER_INFO

USER_NAME USER_ID CONFIG
wata A001 プロパー
koji B001 派遣
hoge C001 契約

USER_INFO_LOG

USER_ID FIXED_DAY
A001 YYYY/MM/DD
B001 YYYY/MM/DD
D001 YYYY/MM/DD

このテーブルに対して、USER_INFOテーブルから値を取り出してUSER_INFO_LOGから同じUSER_IDがあれば結合したい・・・という時
INNER JOINを使ってSQL組んでみます。

SELECT * FROM USER_INFO As A
INNER JOIN USER_INFO_LOG As B ON A.USER_ID = B.USER_ID;</b>

このSQLを流すと・・・

USER_NAME USER_ID CONFIG USER_ID FIXED_DAY
wata A001 プロパー A001 YYYY/MM/DD
koji B001 派遣 B001 YYYY/MM/DD

と返されます。これは、USER_INFOのA001とB001がUSER_INFO_LOGのUSER_IDと一致するため結合される。

注目すべき点は、C001が無いこと。
INNER JOINではベーステーブルから条件に一致しない箇所は削除されて結果出力します。

外部結合について(OUTER JOIN)

f:id:koko55120:20220117144331j:plain

外部結合はOUTER JOIN句を使用します。
内部結合と同様にそれぞれのテーブルの指定したカラムの値が一致するものを結合するの加え
外部結合は、どちらかのテーブルにしか存在しないものも取得する。


構文は以下の通りです。

SELECT カラム名1,カラム名2, ...FROM テーブル名1
LEFT(RIGHT) OUTER JOIN テーブル名2 ON 結合の条件


LEFTとRIGHTとは何ぞやと・・・


LEFT OUTER JOIN → 左側のテーブルを軸にして外部結合
RIGHT OUTER JOIN → 右側のテーブルを軸にして外部結合


要はON句でどっちを基準にするかという話です。
具体的に書いてみます。


まずは、左から LEFT OUTER JOIN

SELECT * FROM USER_INFO AS A
LEFT OUTER JOIN USER_INFO_LOG ON A.USER_ID = B.USER_ID


以下になります。

USER_NAME USER_ID CONFIG USER_ID FIXED_DAY
wata A001 プロパー A001 YYYY/MM/DD
koji B001 派遣 B001 YYYY/MM/DD
hege C001 派遣 NULL NULL


当然左を基準とするため、USER_INFOテーブルの値はすべて出力されます。
3行目です。NULLとなっている箇所はUSER_INFO_LOGで一致していない箇所になります。

OUTER JOINはINNER JOINと違って切り捨てません。
一致しない場合は結合相手のところをNULLで埋めます。



次です。RIGTH OUTER JOIN

SELECT * FROM USER_INFO AS A
RIGHT OUTER JOIN USER_INFO_LOG ON A.USER_ID = B.USER_ID
USER_NAME USER_ID CONFIG USER_ID FIXED_DAY
wata A001 プロパー A001 YYYY/MM/DD
koji B001 派遣 B001 YYYY/MM/DD
NULL NULL D001 YYYY/MM/DD

3行目はUSER_INFO_LOGと一致しない箇所をNULLで埋めています。

さいごに

最後まで読んでいただき、ありがとうございました。

もし、記載している内容が間違えていれば遠慮なくコメントしてください!
私自身の勉強になりますし、他の人がこの記事を見た時に間違えた情報を見ることになってしまうので💦

プライバシーポリシー|エンジニアがプログラミングなどについてまとめていくブログ

Engineer wataru(以下、「当サイト」と言います。)では、お客様からお預かりする個人情報の重要性を強く認識し、個人情報の保護に関する法律、その他の関係法令を遵守すると共に、以下に定めるプライバシーポリシーに従って、個人情報を安全かつ適切に取り扱うことを宣言いたします。

個人情報の定義

本プライバシーポリシーにおいて、個人情報とは生存する個人に関する情報であって、氏名、生年月日、住所、電話番号、メールアドレス等、特定の個人を識別することができるものをいいます。

個人情報の管理

お客様からお預かりした個人情報は、不正アクセス、紛失、漏えい等が起こらないよう、慎重かつ適切に管理します。

個人情報の利用目的

当サイトでは、お客様からのお問い合わせやサービスへのお申し込み等を通じて、お客様の氏名、生年月日、住所、電話番号、メールアドレス等の個人情報をご提供いただく場合があります。その場合は、以下に示す利用目的のために、適正に利用するものと致します。

・お客様からのお問い合わせ等に対応するため。
・お客様からお申し込みいただいたサービス等の提供のため。
メールマガジン等の配信、セミナーやイベントのご案内等のため。
・当サイトが実施するアンケートへのご協力のお願いのため
・商品や景品、プレゼント等の発送のため。
・当サイトのサービス向上・改善、新サービスを検討するための分析等を行うため。
・個人を識別できない形で統計データを作成し、当サイトおよびお客様の参考資料とするため。

個人情報の第三者提供

・お客様からお預かりした個人情報を、個人情報保護法その他の法令に基づき開示が認められる場合を除き、ご本人様の同意を得ずに第三者に提供することはありません。

個人情報の開示・訂正・削除について

お客様からお預かりした個人情報の開示・訂正・削除をご希望の場合は、ご本人様よりお申し出ください。適切な本人確認を行った後、速やかに対応させていただきます。

Cookie(クッキー)について

Cookie(クッキー)とは、お客様のサイト閲覧履歴を、お客様のコンピュータにデータとして保存しておく仕組みです。

当サイトでは、第三者配信事業者である「Googleアドセンス」を利用しておりますが、Cookieを使用することにより、お客様の過去のアクセス情報に基づいて、適切な広告を配信する場合があります。

お客様はGoogle広告設定から、Cookieを使用したパーソナライズ広告を無効にすることができます。なお、Cookieに保存されている情報からお客様個人を特定することはできません。

アクセス解析ツールについて

当サイトは、Googleが提供するアクセス解析ツール「Googleアナリティクス」を利用しています。Googleアナリティクスは、Cookieを使用することでお客様のトラフィックデータを収集しています。

お客様はブラウザの設定でCookieを無効にすることで、トラフィックデータの収集を拒否することができます。なお、トラフィックデータからお客様個人を特定することはできません。詳しくはGoogleアナリティクス利用規約をご確認ください。

本ポリシーの変更

当サイトは、法令の制定、改正等により、本ポリシーを適宜見直し、予告なく変更する場合があります。本ポリシーの変更は、変更後の本ポリシーが当サイトに掲載された時点、またはその他の方法により変更後の本ポリシーが閲覧可能となった時点で有効になります。