JPQL part2

JPQL ์กฐ์ธ

๋‚ด๋ถ€์กฐ์ธ

๋‚ด๋ถ€ ์กฐ์ธ์€ INNER JOIN์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ INNER๋Š” ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ ์˜ˆ์‹œ๋กœ๋Š”

SELECT m
FROM Member m INNER JOIN m.team t
where t.name = :teamName

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค FROM Member m ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํ…Œ์ด๋ธ”์„ ์„ ํƒํ•˜๊ณ  ํšŒ์›์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” team์œผ๋กœ ํŒ€๊ณผ ํ•จ๊ป˜ ์กฐ์ธ์„ ๊ฑธ๊ณ  ์กฐ์ธ์„ ๊ฑด ํŒ€์—๋Š” t๋ผ๋Š” ๋ณ„์นญ์„ ์ฃผ์–ด์คŒ

์™ธ๋ถ€์กฐ์ธ

์‚ฌ์šฉ ์˜ˆ์‹œ๋กœ๋Š”

SELECT m
FROM Member m LEFT OUTER JOIN m.team t

์™ธ๋ถ€ ์กฐ์ธ์€ ๊ธฐ๋Šฅ์ƒ SQL์˜ ์™ธ๋ถ€ ์กฐ์ธ๊ณผ ๊ฐ™๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค ์ถ”๊ฐ€์ ์œผ๋กœ OUTER๋„ ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœํ•˜๊ฒŒ LEFT JOIN์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณค ํ•œ๋‹ค

์ปฌ๋ ‰์…˜ ์กฐ์ธ

์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์„ ํ‚ค๋กœ ์žก์•„์„œ ์กฐ์ธํ•˜๋Š” ๊ฒƒ์„ ์ปฌ๋ ‰์…˜ ์กฐ์ธ์ด๋ผ๊ณ  ํ•œ๋‹ค

Member -> Team์œผ๋กœ์˜ ์กฐ์ธ์€ ๋‹ค๋Œ€์ผ ์กฐ์ธ์ด๋ฉด์„œ ๋‹จ์ผ ๊ฐ’ ์—ฐ๊ด€ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉ(Member.team) Team -> Member์œผ๋กœ์˜ ์กฐ์ธ์€ ์ผ๋Œ€๋‹ค ์กฐ์ธ์ด๋ฉด์„œ ์ปฌ๋ ‰์…˜ ๊ฐ’ ์—ฐ๊ด€ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉ(Team.members) ์˜ˆ์‹œ๋กœ ๋ณด์ž

SELECT t, m FROM Team t LEFT JOIN t.members m

t LEFT JOIN t.members ์ด๋ ‡๊ฒŒ ํŒ€๊ณผ ํŒ€์ด ๋ณด์œ ํ•œ ํšŒ์›๋ชฉ๋ก์„ ์ปฌ๋ ‰์…˜ ๊ฐ’ ์—ฐ๊ด€ ํ•„๋“œ๋กœ ์™ธ๋ถ€ ์กฐ์ธ ํ–ˆ๋‹ค

์„ธํƒ€ ์กฐ์ธ

WHERE์ ˆ์„ ์‚ฌ์šฉํ•ด์„œ ์„ธํƒ€ ์กฐ์ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  -> ๋‚ด๋ถ€ ์กฐ์ธ๋งŒ ์ง€์› ํŠน์ง•์œผ๋กœ๋Š” ์ „ํ˜€ ๊ด€๊ณ„ ์—†๋Š” ์—”ํ‹ฐํ‹ฐ๋„ ์กฐ์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค

JOIN ON

์กฐ์ธ์„ ๊ฑธ ๋•Œ ON ์ ˆ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์กฐ์ธ์„ ๊ฑฐ๋Š” ๋Œ€์ƒ์„ ํ•„ํ„ฐ๋ง ํ•˜๊ณ  ์กฐ์ธํ•  ์ˆ˜ ์žˆ๋‹ค ์ฐธ๊ณ ๋กœ ๋‚ด๋ถ€ ์กฐ์ธ์˜ ON์ ˆ์€ where์ ˆ์„ ์‚ฌ์šฉํ•  ๋•Œ์™€ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™์œผ๋ฏ€๋กœ ๋ณดํ†ต ์™ธ๋ถ€ ์กฐ์ธ์—์„œ๋งŒ ์‚ฌ์šฉ

fetch ์กฐ์ธ

์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ํŽ˜์น˜ ์กฐ์ธ ::= [ LEFT [OUTER] | INNER ] JOIN FETCH ์กฐ์ธ ๊ฒฝ๋กœ

์—”ํ‹ฐํ‹ฐ ํŽ˜์น˜ ์กฐ์ธ

fetch ์กฐ์ธ์€ ์กฐ์ธ์˜ ์ข…๋ฅ˜๋ผ๊ธฐ ๋ณด๋‹ค๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด๊ณ  ์—”ํ‹ฐํ‹ฐ๋‚˜ ์ปฌ๋ ‰์…˜์„ ํ•œ ๋ฒˆ์— ๊ฐ™์ด ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค ์‚ฌ์šฉ ์˜ˆ์‹œ๋กœ ๋ณด์ž

String jpql = "select m from Member m join fetch m.team";
List<Member> members = em.createQuery(jpql, Member.class).getResultList();
members.forEach(member -> {
    //ํŒจ์น˜ ์กฐ์ธ์œผ๋กœ ํšŒ์›๊ณผ ํŒ€์„ ํ•จ๊ป˜ ์กฐํšŒํ•ด์„œ ์ง€์—ฐ ๋กœ๋”ฉ ๋ฐœ์ƒ ์•ˆํ•จ
    System.out.println("username = "+member.getUserName() + ", teamname = "+ member.getTeam().name());
})

join ๋‹ค์Œ์— fetch ์ด๋ ‡๊ฒŒ ์ ๊ณ ๋‚˜๋ฉด ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋‚˜ ์ปฌ๋ ‰์…˜์„ ํ•จ๊ป˜ ์กฐํšŒํ•˜๋Š”๋ฐ ์—ฌ๊ธฐ์„œ๋Š” member ๊ทธ๋ฆฌ๊ณ  member.team์„ ํ•จ๊ป˜ ์กฐํšŒํ•˜๊ฒŒ ๋œ๋‹ค.

๋งŒ์•ฝ์— ํšŒ์›๊ณผ ํŒ€์„ ์ง€์—ฐ๋กœ๋”ฉ์œผ๋กœ ์„ค์ •ํ•ด๋‘์—ˆ๋‹ค๋ฉด ํšŒ์›์„ ์กฐํšŒํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ํŽ˜์น˜ ์กฐ์ธ์„ ์‚ฌ์šฉํ•ด์„œ ํŒ€๋„ ํ•จ๊ป˜ ์กฐํšŒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ๊ด€๋œ ํŒ€ ์—”ํ‹ฐํ‹ฐ๋Š” ํ”„๋ก์‹œ๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ๋‹ค ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ง€์—ฐ ๋กœ๋”ฉ์ด ์ผ์–ด๋‚˜์ง€ ์•Š์œผ๋ฉฐ ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๋ถ„๋ฆฌ๋˜์–ด๋„ ์—ฐ๊ด€๋œ ํŒ€์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค

์ปฌ๋ ‰์…˜ ํŽ˜์น˜ ์กฐ์ธ

์ผ๋Œ€๋‹ค ๊ด€๊ณ„์ธ ํŽ˜์น˜ ์กฐ์ธ๊ฐ™์€์€ ๊ฒฝ์šฐ์—๋Š”

String jpql = "select t from Team t join fetch t.members where t.name = 'ํŒ€A'";
List<Team> teams = em.createQuery(jpql, Team.class).getResultList();

teams.forEach(team -> {
    System.out.println("teamname = " + team.getName() + ", team = "+team);
    team.getMembers.forEach(member -> {
        //ํŽ˜์น˜ ์กฐ์ธ์œผ๋กœ ํŒ€๊ณผ ํšŒ์›์„ ํ•จ๊ป˜ ์กฐํšŒํ•ด์„œ ์ง€์—ฐ ๋กœ๋”ฉ ๋ฐœ์ƒ ์•ˆํ•จ
        System.out.println("->username = "+member.getUsername()+"member = "+member);
    })
})

์ปฌ๋ ‰์…˜์„ ํŽ˜์น˜ ์กฐ์ธํ•œ select t์œผ๋กœ๋งŒ ํŒ€์„ ์กฐํšŒํ–ˆ๋Š”๋ฐ ์ˆ˜ํ–‰๋œ SQL์„ ๋ณด๋ฉด ํŒ€๊ณผ ์—ฐ๊ด€๋œ ํšŒ์›๋„ ํ•จ๊ป˜ ์กฐํšŒํ•จ ๊ทธ๋Ÿผ team ํ…Œ์ด๋ธ”์—์„œ 'ํŒ€A'๋Š” ํ•˜๋‚˜์ด์ง€๋งŒ memberํ…Œ์ด๋ธ”๊ณผ ์กฐ์ธํ•˜๋ฉด์„œ ๊ฒฐ๊ณผ๊ฐ€ ์ฆ๊ฐ€ํ•ด์„œ ํŒ€ A๊ฐ€ 2๋ฒˆ ์กฐํšŒ๋จ ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ์ฃผ์†Œ๋กœ 2๋ฒˆ ์กฐํšŒ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค

ํŽ˜์น˜ ์กฐ์ธ๊ณผ DISTINCT

์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” SQL์˜ DISTINCT๋ช…๋ น์–ด์™€ ๊ฐ™์ด ์ค‘๋ณต๋œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ช…๋ น ํ•˜์ง€๋งŒ ํŽ˜์น˜ ์กฐ์ธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ SQL์— DISTINCT๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋„ ์ค‘๋ณต์„ ์ œ๊ฑฐ ๊ทธ๋Ÿฌ๋ฉด ์œ„์—์„œ์ฒ˜๋Ÿผ 2ํšŒ ์กฐํšŒํ•œ ๊ฒƒ์„ DISTINCT๋ฅผ ํ†ตํ•ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Œ

ํŽ˜์น˜ ์กฐ์ธ๊ณผ ์ผ๋ฐ˜ ์กฐ์ธ์˜ ์ฐจ์ด

JPQL์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์—ฐ๊ด€๊ด€๊ณ„๊นŒ์ง€ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ง€ SELECT ์ ˆ์— ์ง€์ •ํ•œ ์—”ํ‹ฐํ‹ฐ๋งŒ์„ ์กฐํšŒํ• ๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์— team๋งŒ ์กฐํšŒํ•˜๊ณ  ์—ฐ๊ด€๋œ member๋Š” ์กฐํšŒํ•˜์ง€ ์•Š๋Š”๋‹ค ๋งŒ์•ฝ ํšŒ์›์—์„œ ์ง€์—ฐ ๋กœ๋”ฉ์„ ์„ค์ •ํ•ด๋‘๋ฉด ํ”„๋ก์‹œ๋‚˜ ์•„์ง ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์€ ์ปฌ๋ ‰์…˜ ๋ž˜ํผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ฆ‰์‹œ ๋กœ๋”ฉ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ํšŒ์› ์ปฌ๋ ‰์…˜์„ ์ฆ‰์‹œ ๋กœ๋”ฉํ•˜๊ธฐ ์œ„ํ•ด ์ฟผ๋ฆฌ๋ฅผ ํ•œ ๋ฒˆ ๋” ์‹คํ–‰

ํŽ˜์น˜ ์กฐ์ธ์˜ ํŠน์ง•๊ณผ ํ•œ๊ณ„

ํŽ˜์น˜ ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด SQL ํ•œ ๋ฒˆ์œผ๋กœ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋“ค์„ ํ•จ๊ป˜ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์–ด์„œ SQL ํ˜ธ์ถœ ํšŸ์ˆ˜๋ฅผ ์ค„์—ฌ์„œ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™” ๊ฐ€๋Šฅ ์—”ํ‹ฐํ‹ฐ์— ์ง์ ‘ ์ ์šฉํ•˜๋Š” ๋กœ๋”ฉ ์ „๋žต์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธ€๋กœ๋ฒŒ ๋กœ๋”ฉ ์ „๋žต์ด๋ผ ๋ถ€๋ฅธ๋‹ค ์žฅ์  ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๊ธ€๋กœ๋ฒŒ ๋กœ๋”ฉ ์ „๋žต์„ ์ฆ‰์‹œ ๋กœ๋”ฉ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ํ•ญ์ƒ ์ฆ‰์‹œ ๋กœ๋”ฉ์ด ์ผ์–ด๋‚˜๊ฒŒ ๋œ๋‹ค ์ผ๋ถ€๋Š” ๋น ๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ „์ฒด๋กœ ๋ณด๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ž์ฃผ ๋กœ๋”ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์Œ ๋”ฐ๋ผ์„œ ๊ธ€๋กœ๋ฒŒ ๋กœ๋”ฉ ์ „๋žต์€ ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ง€์—ฐ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•˜๋ฉด ํŽ˜์น˜ ์กฐ์ธ์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์  ํŽ˜์น˜ ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฟผ๋ฆฌ ์‹œ์ ์— ์กฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€์—ฐ๋กœ๋”ฉ์ด ๋ฐœ์ƒx -> ์ค€์˜์† ์ƒํƒœ์—์„œ๋„ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๊ฐ€๋Šฅ ๋‹จ์  ํŽ˜์น˜ ์กฐ์ธ ๋Œ€์ƒ์—๊ฒŒ๋Š” ๋ณ„์นญ์„ ์ค„ ์ˆ˜ ์—†์Œ ๋‘˜ ์ด์ƒ์˜ ์ปฌ๋ ‰์…˜์„ ํŽ˜์น˜ํ•  ์ˆ˜ ์—†์Œ ์ปฌ๋ ‰์…˜์„ ํŽ˜์น˜ ์กฐ์ธํ•˜๋ฉด ํŽ˜์ด์ง• API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ ํŽ˜์น˜ ์กฐ์ธ์€ SQL ํ•œ ๋ฒˆ์œผ๋กœ ์—ฐ๊ด€๋œ ์—ฌ๋Ÿฌ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์–ด์„œ ์„ฑ๋Šฅ์ตœ์ ํ™”์— ์œ ์šฉํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•ด์„œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ชจ์–‘์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๋ชจ์–‘์œผ๋กœ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๊ตณ์ด ํŒจ์น˜ ์กฐ์ธ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  dto๊ฐ€ ๋” ์ข‹์Œ

๊ฒฝ๋กœ ํ‘œํ˜„์‹

๊ฒฝ๋กœ ํ‘œํ˜„์‹์€ ์‰ฝ๊ฒŒ .์„ ํ†ตํ•ด์„œ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ž„ ์šฉ์–ด ์ •๋ฆฌ ์ƒํƒœ ํ•„๋“œ : ๋‹จ์ˆœํžˆ ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ํ•„๋“œ ์—ฐ๊ด€ ํ•„๋“œ : ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์œ„ํ•œ ํ•„๋“œ, ์ž„๋ฒ ๋””๋“œ ํƒ€์ž… ํฌํ•จ ๋‹จ์ผ ๊ฐ’ ์—ฐ๊ด€ ํ•„๋“œ : @ManyToOne, @OneToOne, ๋Œ€์ƒ์ด ์—”ํ‹ฐํ‹ฐ ์ปฌ๋ ‰์…˜ ๊ฐ’ ์—ฐ๊ด€ ํ•„๋“œ : @OneToMany, @ManyToMany, ๋Œ€์ƒ์ด ์ปฌ๋ ‰์…˜

ํŠน์ง• JPQL์—์„œ ๊ฒฝ๋กœ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•ด์„œ ๊ฒฝ๋กœ ํƒ์ƒ‰์„ ํ•˜๋ ค๋ฉด ๋‹ค์Œ 3๊ฐ€์ง€ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธ

  • ์ƒํƒœ ํ•„๋“œ ๊ฒฝ๋กœ : ๊ฒฝ๋กœ ํƒ์ƒ‰์˜ ๋ -> ๋”๋Š” ํƒ์ƒ‰ ๋ถˆ๊ฐ€

  • ๋‹จ์ผ ๊ฐ’ ์—ฐ๊ด€ ๊ฒฝ๋กœ : ๋ฌต์‹œ์ ์œผ๋กœ ๋‚ด๋ถ€ ์กฐ์ธ์ด ์ผ์–ด๋‚˜๊ณ  ๊ณ„์† ํƒ์ƒ‰ ๊ฐ€๋Šฅ

  • ์ปฌ๋ ‰์…˜ ๊ฐ’ ์—ฐ๊ด€ ๊ฒฝ๋กœ : ๋ฌต์‹œ์ ์œผ๋กœ ๋‚ด๋ถ€ ์กฐ์ธ์ด ์ผ์–ด๋‚˜์ง€๋งŒ ๋”๋Š” ํƒ์ƒ‰ ๋ถˆ๊ฐ€๋Šฅ

์˜ˆ์‹œ ์ƒํƒœ ํ•„๋“œ ๊ฒฝ๋กœ ํƒ์ƒ‰

select m.username, m.age from Member m

์—ฌ๊ธฐ์„œ m.username, m.age๋Š” ์ƒํƒœ ํ•„๋“œ ๊ฒฝ๋กœ ํƒ์ƒ‰์ด๋‹ค ๋‹จ์ผ ๊ฐ’ ์—ฐ๊ด€ ๊ฒฝ๋กœ ํƒ์ƒ‰

select o.member from Order o

๋‹จ์ˆœํ•˜๊ฒŒ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋ฌต์‹œ์ ์œผ๋กœ ๋‚ด๋ถ€ ์กฐ์ธ์ด ์ผ์–ด๋‚˜๊ฒŒ ๋œ๋‹ค. ํ•ญ์ƒ ๋ฌต์‹œ์ ์œผ๋กœ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์€ ๋‚ด๋ถ€ ์กฐ์ธ ๊ทธ๋ฆฌ๊ณ  ๋ช…์‹œ์ ์œผ๋กœ JOIN์„ ์ ์–ด์ฃผ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅ์€ ํ•˜๋‹ค ์ปฌ๋ ‰์…˜ ๊ฐ’ ์—ฐ๊ด€ ๊ฒฝ๋กœ ํƒ์ƒ‰ ์ปฌ๋ ‰์…˜๊นŒ์ง€์˜ ๊ฒฝ๋กœ ํƒ์ƒ‰์„ ์–ด๋ ต์ง€ ์•Š๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ปฌ๋ ‰์…˜์—์„œ๋ถ€ํ„ฐ ๊ฒฝ๋กœ ํƒ์ƒ‰์„ ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค ๋งŒ์•ฝ์— ์ปฌ๋ ‰์…˜ ๋‚ด๋ถ€์—์„œ ๊ฒฝ๋กœ ํƒ์ƒ‰์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์กฐ์ธ์„ ์‚ฌ์šฉํ•ด์„œ ์ƒˆ๋กœ์šด ๋ณ„์นญ์„ ๋„ฃ์–ด์ค€ ๋‹ค์Œ๋ถ€ํ„ฐ ๊ฒฝ๋กœ ํƒ์ƒ‰์„ ์ง„ํ–‰

๋ฌต์‹œ์  ์กฐ์ธ ์‹œ ์ฃผ์˜ ์‚ฌํ•ญ ํ•ญ์ƒ ๋‚ด๋ถ€ ์กฐ์ธ์ด๋ผ๋Š” ์  ์ปฌ๋ ‰์…˜์˜ ๊ฒฝ๋กœ ํƒ์ƒ‰์€ ๋์ด๋‹ค -> ๋‚ด๋ถ€๋กœ ๋“ค์–ด๊ฐ€๊ณ ์ž ํ•˜๋ฉด ๋ช…์‹œ์ ์œผ๋กœ ์กฐ์ธ์„ ๊ฑธ์–ด ๊ฒฝ๋กœ ํƒ์ƒ‰์€ SELECT, WHERE์—์„œ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋ฌต์‹œ์  ์กฐ์ธ์œผ๋กœ ์ธํ•ด์„œ FROM์ ˆ์— ์˜ํ–ฅ์„ ์ค€๋‹ค

##์„œ๋ธŒ ์ฟผ๋ฆฌ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ WHERE, HAVING์ ˆ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  SELECT, FROM ์ ˆ์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ

์„œ๋ธŒ ์ฟผ๋ฆฌ ํ•จ์ˆ˜

[NOT] EXISTS (subquery), {ALL | ANY | SOME} (subquery), [NOT] IN (subquery) EXISTS

  • ๋ฌธ๋ฒ• : [NOT] EXISTS (subquery)

  • ์„ค๋ช… : ์„œ๋ธŒ์ฟผ๋ฆฌ์— ๊ฒฐ๊ณผ๊ฐ€ ์กด์žฌํ•˜๋ฉด ์ฐธ์ด๋‹ค. NOT์€ ๋ฐ˜๋Œ€

  • ์˜ˆ์‹œ : ํŒ€A์˜ ์†Œ์†์ธ ํšŒ์› select m from Member m where exists (select t from m.team t where t.name = 'ํŒ€A')

{ALL | ANY | SOME}

  • ๋ฌธ๋ฒ• : {ALL | ANY | SOME} (subquery)

  • ์„ค๋ช… : ๋น„๊ต ์—ฐ์‚ฐ์ž์™€ ๊ฐ™์ด ์‚ฌ์šฉ

    • ALL : ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋ฉด ์ฐธ

    • ANY, SOME : ๋‘˜์€ ๊ฐ™์€ ์˜๋ฏธ๋กœ ํ•˜๋‚˜๋ผ๋„ ๋งŒ์กฑํ•˜๋ฉด ์ฐธ

  • ์˜ˆ์‹œ : ์ „์ฒด ์ƒํ’ˆ ๊ฐ๊ฐ์˜ ์žฌ๊ณ ๋ณด๋‹ค ์ฃผ๋ฌธ๋Ÿ‰์ด ๋งŽ์€ ์ฃผ๋ฌธ๋“ค select o from Order o where o.orderAmount > ALL (select p.stockAmount from Product p) ์–ด๋–ค ํŒ€์ด๋“  ํŒ€์— ์†Œ์†๋œ ํšŒ์› select m from Member m where m.team = ANY(select t from Team t)

IN

  • ๋ฌธ๋ฒ• : [NOT] IN (subquery)

  • ์„ค๋ช… : ์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๊ฐ™์€ ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์ฐธ

  • ์˜ˆ์‹œ : 20์„ธ ์ด์ƒ์„ ๋ณด์œ ํ•œ ํŒ€ select t from Team t where t IN (select t2 from team t2 join t2.members m2 where m2.age >= 20)

์กฐ๊ฑด์‹

####ํƒ€์ž… ํ‘œํ˜„ ๋ฌธ์ž - ''์‚ฌ์ด์— ํ‘œํ˜„, '์„ ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ''์ด๋ ‡๊ฒŒ 2๊ฐœ๋กœ ใ……์ž‘์„ฑ ์ˆซ์ž - Long -> L, Double -> D, Float -> F ๋‚ ์งœ - DATE -> {d 'yyyy-mm-dd'}, TIME -> {t 'hh-mm-ss'}, DATETIME -> {ts 'yyyy-mm-dd hh:mm:ss.f'} Boolean - TRUE, FALSE Enum - ํŒจํ‚ค์ง€๋ช…์„ ํฌํ•จํ•œ ์ „์ฒด ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ OrderStatus.OK ์—”ํ‹ฐํ‹ฐ ํƒ€์ž… - ์—”ํ‹ฐํ‹ฐ์˜ ํƒ€์ž…์„ ํ‘œํ˜„ํ•œ๋‹ค. ์ฃผ๋กœ ์ƒ์†๊ณผ ๊ด€๋ จํ•ด์„œ ์‚ฌ์šฉ

์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„

์—ฐ์‚ฐ์ž์˜ ์šฐ์„ ์ˆœ์œ„๋Š”

  1. ๊ฒฝ๋กœ ํƒ์ƒ‰ ์—ฐ์‚ฐ(.)

  2. ์ˆ˜ํ•™์—ฐ์‚ฐ

  3. ๋น„๊ต์—ฐ์‚ฐ

  4. ๋…ผ๋ฆฌ์—ฐ์‚ฐ

๋…ผ๋ฆฌ ์—ฐ์‚ฐ๊ณผ ๋น„๊ต์‹

๋…ผ๋ฆฌ ์—ฐ์‚ฐ

  • AND: ๋‘˜๋‹ค ๋งŒ์กฑํ•˜๋ฉด ์ฐธ

  • OR: ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ๋งŒ์กฑํ•ด๋„ ์ฐธ

  • NOT: ์กฐ๊ฑด์‹์˜ ๊ฒฐ๊ณผ ๋ฐ˜๋Œ€

๋น„๊ต์‹ = | > | >= | < | <= | <>

Between, IN, Like, NULL ๋น„๊ต

Between ์‹

  • ๋ฌธ๋ฒ• : X [NOT] BETWEEN A AND B

  • ์„ค๋ช… : X๋Š” A ~ B ์‚ฌ์ด์˜ ๊ฐ’์ด๋ฉด ์ฐธ

  • ์˜ˆ์‹œ : ๋‚˜์ด๊ฐ€ 10~20์ธ ํšŒ์›์„ ์ฐพ์ž select m from Member m where m.age between 10 and 20

IN ์‹

  • ๋ฌธ๋ฒ• : X [NOT] IN

  • ์„ค๋ช… : X์™€ ๊ฐ™์€ ๊ฐ’์ด ์˜ˆ์ œ์— ํ•˜๋‚˜๋ผ๋„ ์žˆ์œผ๋ฉด ์ฐธ์ด๋‹ค. IN ์‹์˜ ์˜ˆ์ œ๋Š” ์„œ๋ธŒ ์ฟผ๋ฆฌ์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • ์˜ˆ์‹œ : ์ด๋ฆ„์ด ํšŒ์›1์ด๋‚˜ ํšŒ์›2์ธ ํšŒ์›์„ ์ฐพ์ž select m from Member m where m.username in ('ํšŒ์›1', 'ํšŒ์›2')

Like ์‹

  • ๋ฌธ๋ฒ• : X [NOT] LIKE

  • ์„ค๋ช… : ๋ฌธ์žํ‘œํ˜„์‹๊ณผ ํŒจํ„ด ๊ฐ’์„ ๋น„๊ต

NULL ๋น„๊ต์‹

  • ๋ฌธ๋ฒ• : {๋‹จ์ผ๊ฐ’ ๊ฒฝ๋กœ | ์ž…๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ} IS [NOT] NULL

  • ์„ค๋ช… : NULL์ธ์ง€ ๋น„๊ตํ•œ๋‹ค. NULL์€ =์œผ๋กœ ๋น„๊ตํ•˜๋ฉด ์•ˆ ๋˜๊ณ  ๊ผญ IS NULL์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

์ปฌ๋ ‰์…˜ ์‹

์ปฌ๋ ‰์…˜์€ ํŠน๋ณ„ํ•ด์„œ ์ปฌ๋ ‰์…˜ ์ „์šฉ ์‹๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•จ

๋นˆ ์ปฌ๋ ‰์…˜ ๋น„๊ต ์‹

  • ๋ฌธ๋ฒ• : {์ปฌ๋ ‰์…˜ ๊ฐ’ ์—ฐ๊ด€ ๊ฒฝ๋กœ} IS [NOT] EMPTY

  • ์„ค๋ช… : ์ปฌ๋ ‰์…˜์— ๊ฐ’์ด ๋น„์—ˆ์œผ๋ฉด ์ฐธ

์ปฌ๋ ‰์…˜์˜ ๋ฉค๋ฒ„ ์‹

  • ๋ฌธ๋ฒ• : {์—”ํ‹ฐํ‹ฐ๋‚˜ ๊ฐ’} [NOT] MEMBER [OF] {์ปฌ๋ ‰์…˜ ๊ฐ’ ์—ฐ๊ด€ ๊ฒฝ๋กœ}

  • ์„ค๋ช… : ์—”ํ‹ฐํ‹ฐ๋‚˜ ๊ฐ’์ด ์ปฌ๋ ‰์…˜์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ์ฐธ

์Šค์นผ๋ผ ์‹

์Šค์นผ๋ผ ์‹์ด๋ผ๋Š” ์ˆซ์ž, ๋ฌธ์ž, ๋‚ ์งœ, case, ์—”ํ‹ฐํ‹ฐ ํƒ€์ž…๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ์ ์ธ ํƒ€์ž…๋“ค ์ˆ˜ํ•™ ์‹

  • +, - : ๋‹จํ•ญ ์—ฐ์‚ฐ์ž

  • *, /, +, - : ์‚ฌ์น™ ์—ฐ์‚ฐ

๋ฌธ์žํ•จ์ˆ˜

  • CONCAT

  • SUBSTRING

  • TRIM

  • LOWER

  • UPPER

  • LENGTH

  • LOCATE

์ˆ˜ํ•™ํ•จ์ˆ˜

  • ABS

  • SQRT

  • MOD

  • SIZE

  • INDEX

๋‚ ์งœํ•จ์ˆ˜

  • CURRENT_DATE

  • CURRENT_TIME

  • CURRENT_TIMESTAMPE ์ด๊ฑด ์‚ด์ง ๋ฐฉ์–ธ๋ฐ”์ด๋ผ์„œ... ํ•„์š”ํ•  ๋–„

CASE

ํฌ๊ฒŒ 4๊ฐ€์ง€๊ฐ€ ์กด์žฌ ๊ธฐ๋ณธ CASE

CASE
    {WHEN <์กฐ๊ฑด์‹> THEN <์Šค์นผ๋ผ์‹>}
    ELSE <์Šค์นผ๋ผ์‹>
END

์‹ฌํ”Œ CASE

CASE <์กฐ๊ฑด๋Œ€์ƒ>
    {WHEN <์Šค์นผ๋ผ์‹1> THEN <์Šค์นผ๋ผ์‹2>}
    ELSE <์Šค์นผ๋ผ์‹>
END

COALESCE -๋ฌธ๋ฒ• : COALESCE(<์Šค์นผ๋ผ์‹> {, <์Šค์นผ๋ผ์‹>}+) -์„ค๋ช… : ์Šค์นผ๋ผ์‹์„ ์ฐจ๋ก€๋Œ€๋กœ ์กฐํšŒํ•ด์„œ null์ด ์•„๋‹ˆ๋ฉด ๋ฐ˜ํ™˜

NULLIF -๋ฌธ๋ฒ• : NULLIF(<์Šค์นผ๋ผ์‹>, <์Šค์นผ๋ผ์‹>) -์„ค๋ช… : ๋‘ ๊ฐ’์ด ๊ฐ™์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋‹ค๋ฅด๋ฉด ์ฒซ ๋ฒˆ์งธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ง‘ํ•ฉ ํ•จ์ˆ˜๋Š” null์„ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ณดํ†ต ์ง‘ํ•ฉ ํ•จ์ˆ˜์™€ ๊ฐ™์ด์”€

Last updated

Was this helpful?