JPQL part1

์ด์ „์˜ ๋‹ค์–‘ํ•œ ๊ฒƒ๋“ค์„ ๋ดค๊ฒ ์ง€๋งŒ ์–ด๋–ค ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋“  ํ•ญ์ƒ JPQL์ด ๋จผ์ €๋กœ ์‹œ์ž‘๋˜๊ฒŒ ๋œ๋‹ค ์ผ๋‹จ ํ•œ๋ฒˆ JPQL์˜ ํŠน์ง•์„ ์ •๋ฆฌํ•ด๋ณด์ž

  • JPQL์€ ๊ฐ์ฒด์ง€ํ–ฅ ์ฟผ๋ฆฌ ์–ธ์–ด์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ…Œ์ด๋ธ”์„ ๋Œ€์ƒ์œผ๋กœ ์ฟผ๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ฟผ๋ฆฌ

  • JPQL์€ SQL์„ ์ถ”์ƒํ™”ํ•ด์„œ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค SQL์— ์˜์กดํ•˜์ง€ ์•Š์Œ

  • JPQL๋„ ๊ฒฐ๊ตญ์€ SQL๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค๋Š” ์ 

๊ธฐ๋ณธ ๋ฌธ๋ฒ•๊ณผ ์ฟผ๋ฆฌ API

JPQL๋„ SQL๊ณผ ๋น„์Šทํ•˜๊ฒŒ select, update, delete๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค :๊ทผ๋ฐ insert๋Š” ์™œ ์—†๋ƒ? -> EntityManager.persist()๋กœ ์ €์žฅํ•˜๋ฉด ๋˜๋‹ˆ๊นŒ

SELECT ๋ฌธ

์˜ˆ์‹œ๋ฅผ ๋ด๋ณผ๊นŒ

SELECT m FROM Member AS m where m.username = 'Hello'

ํŠน์ง•๋ณ„๋กœ ๋ณด์ž

๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„

์—”ํ‹ฐํ‹ฐ์˜ ์†์„ฑ์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ -> Member, username์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ณ  select, from as ์™€ ๊ฐ™์€ JPQL ์šฉ์–ด๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Œ

์—”ํ‹ฐํ‹ฐ ์ด๋ฆ„

JPQL์—์„œ ์‚ฌ์šฉํ•œ Member๋Š” ํด๋ž˜์Šค ๋ช…์ด ์•„๋‹ˆ๋ผ ์—”ํ‹ฐํ‹ฐ ๋ช…์ด๋‹ค. ์—”ํ‹ฐํ‹ฐ ๋ช…์„ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ์ด์ƒ์€ ํด๋ž˜์Šค๋ช…์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์—”ํ‹ฐํ‹ฐ๋ช…์œผ๋กœ ์ฒ˜๋ฆฌ ๊ทธ๋ž˜์„œ ๊ธฐ๋ณธ๊ฐ’์ธ ํด๋ž˜์Šค ๋ช…์„ ์—”ํ‹ฐํ‹ฐ ๋ช…์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœ

๋ณ„์นญ์€ ํ•„์ˆ˜

๊ตณ์ด as์„ ์‚ฌ์šฉํ•ด์„œ ๋ณ„์นญ์„ ์‚ฌ์šฉํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š”๋ฐ, JPQL์€ ๋ณ„์นญ์„ ํ•„์ˆ˜๋กœ ์‚ฌ์šฉํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

TypeQuery, Query

์ž‘์„ฑํ•œ JPQL์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฟผ๋ฆฌ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ์ฟผ๋ฆฌ ๊ฐ์ฒด๋กœ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด TypeQuery, Query์ด๋ ‡๊ฒŒ ์กด์žฌํ•˜๋Š”๋ฐ ์ฐจ์ด์ ์œผ๋กœ๋Š” ๋ฐ˜ํ™˜ํ•  ํƒ€์ž…์ด ์žˆ๋‹ค๋ฉด TypeQuery, ๋ฐ˜ํ™˜ํ•  ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด Query ์ด๋ ‡๊ฒŒ ๋‚˜๋ˆ„์–ด ์ง„๋‹ค TypeQuery, Query ์‚ฌ์šฉ๊ธฐ

TypedQuery<Member> query = em.createQuery("SELECT m FROM Member m", Member.class);

List<Member> resultList = query.getResultList();
for(Member member : resultList){
    System.out.println("member = "+member);
}

---------------------------------------------------------------------------------------------------------

Query query = em.createQuery("SELECT m.username, m.age from Member m");
List resultList = query.getResultList();

for(Object o : resultList){
    Object[] result = (Object[]) o;
    System.out.println("username = " + result[0]);
    System.out.println("age = " + result[1]);
}

์ฒซ ๋ฒˆ์งธ๋Š” ๋ฆฌํ„ด๋  ํƒ€์ž…์„ ๋ฏธ๋ฆฌ ์•Œ๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์กฐํšŒํ•œ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์–ด๋ ต์ง€ ์•Š๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด ๋‘ ๋ฒˆ์งธ๋Š” ๋ฐ˜ํ™˜ํ•  ํƒ€์ž…์ด ์• ๋งคํ•˜๋‹ค ๋ณด๋‹ˆ๊นŒ ์กฐ์ฃ„ํ•˜๋Š” ๊ฒƒ๋„ ์–ด๋ ต๊ฒŒ ์กฐํšŒํ•˜๋Š” ๋ชจ์Šต์ด๋‹ค... ๊ทธ๋ž˜ ๊ตณ์ด ์ฐพ์•„์„œ ๋˜ ํƒ€์ž… ๋ณ€ํ™˜ํ•˜๊ณ  ์žˆ์ง€ ๋ง๊ณ  ๊ทธ๋ƒฅ ์• ์ดˆ๋ถ€ํ„ฐ ์ •ํ•ด์ง„ ํƒ‘์œผ๋กœ ๋นผ๋ฒ„๋ฆฌ์ž.... ๊ฒฐ๊ณผ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š”

  1. query.getResultList() : ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ œ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋งŒ์•ฝ์— ๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด ๋นˆ ์ปฌ๋ ‰์…˜์„ ๋ฐ˜ํ™˜

  2. query.getSingleResult() : ๊ฒฐ๊ณผ๊ฐ€ ์ •ํ™•ํžˆ ํ•˜๋‚˜์ผ ๋•Œ ์‚ฌ์šฉํ•จ - ๊ฒฐ๊ณผ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” NoResultException์„ ๋˜์ง€๊ณ  ๊ฒฐ๊ณผ๊ฐ€ ํ•˜๋‚˜๋ณด๋‹ค ๋งŽ์œผ๋ฉด NonUniqueResultException์„ ๋˜์ง

ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ

JDBC์—์„œ๋Š” ์œ„์น˜ ๊ธฐ์ค€ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ๋งŒ์„ ์ง€์›ํ•˜๊ณ  ์žˆ์ง€๋งŒ JPQL์€ ์ด๋ฆ„ ๊ธฐ์ค€ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ๋„ ์ง€์›ํ•จ

์ด๋ฆ„ ๊ธฐ์ค€ ํŒŒ๋ผ๋ฏธํ„ฐ

ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ด๋ฆ„์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ณ , ์ด๋ฆ„ ๊ธฐ์ค€ ํŒŒ๋ผ๋ฏธํ„ฐ ์•ž์—๋Š” :์„ ์‚ฌ์šฉํ•œ๋‹ค

String usernameParam = "User1";
TypedQuery<Member> query = em.createQuery("SELCT m FROM Member m WHERE m.username = :username",
Member.class);

query.setParameter("username", usernameParam);
List<Member> resultList = query.getResultList();

:username ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•ด์ฃผ๊ณ , query.setParameter(์ด๋ฆ„, ๊ฐ’) ์ด๋ ‡๊ฒŒ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๊ฐ’์„ ๋ฐ”์ธ๋”ฉํ•ด์ฃผ์ž

์œ„์น˜ ๊ธฐ์ค€ ํŒŒ๋ผ๋ฏธํ„ฐ

List<Member> members = em.createQuery("select m from Member m where m.username = ?1", Member.class)
      .setParameter(1, usernameParam)
      .getResultList();

์œ„์น˜ ๊ธฐ๋ฐ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ?(๋ฌผ์Œํ‘œ) ๋‹ค์Œ์— ์œ„์น˜ ๊ฐ’์„ ์ฃผ๋Š” ๊ฑธ๋กœ ์‹œ์ž‘ํ•œ๋‹ค ๊ทธ๋ฆฌ๊ณ  query.setParameter(์œ„์น˜, ๊ฐ’) ์œผ๋กœ ๊ฐ’์„ ๋ฐ”์ธ๋”ฉํ•ด์คŒ

ํ”„๋กœ์ ์…˜

ํ”„๋กœ์ ์…˜์ด๋ž€? select ์ ˆ์— ์กฐํšŒํ•  ๋Œ€์ƒ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ SELECT ํ”„๋กœ์ ์…˜๋Œ€์ƒ FROM ์ด๋ ‡๊ฒŒ ๋Œ€์ƒ์„ ์ง€์ •ํ•˜๋Š”๋ฐ ํƒ€์ž…์œผ๋กœ๋Š” ๋‹ค์–‘ํ•˜๊ฒŒ ์žˆ๋‹ค

์—”ํ‹ฐํ‹ฐ ํ”„๋กœ์ ์…˜

SELECT m FROM Member m
SELECT m.team FROM Member m

์œ„ ์ฟผ๋ฆฌ๋ฌธ 2๊ฐœ ๋‹ค ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ”„๋กœ์ ์…˜์˜ ๋Œ€์ƒ์œผ๋กœ ์ •ํ•ด์„œ ๊ฐ์ฒด๋ฅผ ๋ฐ”๋กœ ์กฐํšŒํ–ˆ๋‹ค ์ด๊ฑด ํ•˜๋‚˜ํ•˜๋‚˜ ์กฐํšŒํ•˜๋Š” SQL๊ณผ๋Š” ์ฐจ์ด๊ฐ€ ์žˆ์Œ ์ด๋ ‡๊ฒŒ ์กฐํšŒํ•œ ์—”ํ‹ฐํ‹ฐ๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๊ด€๋ฆฌ๋จ

์ž„๋ฒ ๋””๋“œ ํƒ€์ž… ํ”„๋กœ์ ์…˜

์—”ํ‹ฐํ‹ฐ์™€ ๋น„์Šทํ•˜์ง€๋งŒ ์—ญ์‹œ ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ์กฐํšŒ์˜ ์‹œ์ž‘์ ์ด ๋  ์ˆ˜ ์—†๋‹ค๋Š” ์ œ์•ฝ์ด ์กด์žฌํ•œ๋‹ค.

String query = "select o.address from Order o";
List<Address> addresses = em.createQuery(query, Address.class).getResultList();

์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์€ ์—”ํ‹ฐํ‹ฐ ํƒ€์ž…์ด ์•„๋‹Œ ๊ฐ’ ํƒ€์ž…์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ ‡๊ฒŒ ์ง์ ‘ ์กฐํšŒํ•œ ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š”๋‹ค

์Šค์นผ๋ผ ํƒ€์ž… ํ”„๋กœ์ ์…˜

์ˆซ์ž, ๋ฌธ์ž, ๋‚ ์งœ์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…๋“ค์„ ์Šค์นผ๋ผ ํƒ€์ž…์ด๋ผ๊ณ  ์ •์˜ํ•œ๋‹ค. ์˜ˆ๋กœ ์ „์ฒด ํšŒ์›์˜ ์ด๋ฆ„์„ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”

List<String> query = em.createQuery("SELECT username FROM Member", String.class).getResultList();

์—ฌ๋Ÿฌ ๊ฐ’ ์กฐํšŒ

๋งŒ์•ฝ์— ํ”„๋กœ์ ์…˜์—์„œ ์—ฌ๋Ÿฌ ๊ฐ’๋“ค์„ ์„ ํƒํ•˜๊ฒŒ ๋˜๋Š” ์ˆœ๊ฐ„, ์œ„์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ TypeQuery๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ  ๋‹จ์ˆœํ•œ Query๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ์ œ๋กœ ํ™•์ธ

Query query = em.createQuery("SELECT m.username, m.age FROM Member m");
List resultList = query.getResultList();

Iterator iterator = resultList.iterator();
while(iterator.hasNext()){
    Object[] row = (Object[]) iterator.next();
    String username = (String) row[0];
    Integer age = (Integer) row[1];
}

์ด๋ ‡๊ฒŒ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—”ํ‹ฐํ‹ฐ ํƒ€์ž…๋„ ์—ฌ๋Ÿฌ ๊ฐ’์„ ํ•จ๊ป˜ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Œ

List<Object[]> resultList =
    em.createQuery("SELECT o.member, o.product, o.orderAmount FROM Order o").getResultList();

for(Object[] row : resultList){
  Member member = (Member) row[0];
  Product product = (Product) row[1];
  int orderAmount = (Integer) row[2];
}

NEW ๋ช…๋ น์–ด ์œ„์˜ ๊ฒฝ์šฐ์—๋Š” ๋ชจ๋“  result๋ฅผ ๋ฐ›์•„์ฃผ๋Š” ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ €๋ ‡๊ฒŒ Object[]์œผ๋กœ ๋ฆฌํ„ด๋ฐ›์•„์„œ ๊ฐ๊ฐ ๋งคํ•‘ํ•ด์ฃผ๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณค๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ DTO๋ฅผ ์ƒ์„ฑํ•จ์œผ๋กœ์จ ์˜๋ฏธ ์žˆ๋Š” ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด์„œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค..! ๋Œ€์‹  DTO๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ -> AllArgsConstructer๋Š” ํ•„์ˆ˜๋กœ ํ•„์š”ํ•˜๋‹ค๋Š”์ 

TypeQuery<UserDTO> query = em.createQuery("SELCT new jpabook.jpql.UserDTO(m.username, m.age) FROM Member m", UserDTO.class);
List<UserDTO> resultList = query.getResultList();

new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ •--๋ง ๊ท€์ฐฎ์€ ๊ฐ์ฒด๋ณ€ํ™˜ ์ž‘์—…์„ ์†์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ์ข‹๋„ค์š”! ๊ทธ๋ž˜๋„ ์ฃผ์˜ํ•  ์  2๊ฐ€์ง€

  1. ํŒจํ‚ค์ง€ ๋ช…์„ ํฌํ•จํ•œ ์ „์ฒด ํด๋ž˜์Šค ๋ช…์„ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ !

  2. ์ˆœ์„œ์™€ ํƒ€์ž…์ด ์ผ์น˜ํ•˜๋Š” ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์ !

ํŽ˜์ด์ง• API

ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ์šฉ SQL์„ ์ž‘์„ฑํ•˜๋Š” ์ผ์€ ์ •๋ง ๋งค์šฐ ์ง€๋ฃจํ•œ ์ ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งˆ๋‹ค ํŽ˜์ด์ง• ์ฒ˜๋ฆฌํ•˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ์  ๊ทธ๋ž˜์„œ JPA์—์„œ๋Š” 2๊ฐœ์˜ API๋กœ ์ถ”์ƒํ™” ํ•ด๋‘์—ˆ๋‹ค

  • setFirstResult(int startPosition) : ์กฐํšŒ ์‹œ์ž‘ ์œ„์น˜

  • setMaxResult(int maxResult) : ์กฐํšŒํ•  ๋ฐ์ดํ„ฐ ์ˆ˜

TypeQuery<Member> query = em.createQuery("SELECT m FROM Member m ORDER BY m.username DESC", Member.class);
query.setFirstResult(10);
query.setMaxResult(20);
query.getResultList();

์œ„์˜ ์ฝ”๋“œ๋Š” 10์ด ์‹œ์ž‘์ด๊ธฐ ๋•Œ๋ฌธ์— 11๋ถ€ํ„ฐ 20๊ฐœ๋ฅผ ์กฐํšŒํ•œ๋‹ค. ์ฆ‰ 11 ~ 30๋ฒˆ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค. ๋งŒ์•ฝ ๋” ์ถ”๊ฐ€์ ์œผ๋กœ ํŽ˜์ด์ง• API๋ฅผ ์ตœ์ ํ™”์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ๋‹ค์‹œ ์ฟผ๋ฆฌ๋ฅผ ์งœ์•ผํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์ž...!

์ง‘ํ•ฉ๊ณผ ์ •๋ ฌ

์ง‘ํ•ฉ์€ ์ง‘ํ•ฉํ•จ์ˆ˜์™€ ํ•จ๊ป˜ ํ†ต๊ณ„ ์ •๋ณด๋ฅผ ๊ตฌํ•  ๋•Œ ์‚ฌ์šฉํ•จ

์ง‘ํ•ฉ ํ•จ์ˆ˜

  • COUNT : ๊ฒฐ๊ณผ ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค -> ๋ฐ˜ํ™˜ ๊ฐ’ Long

  • MAX, MIN : ์ตœ๋Œ€, ์ตœ์†Œ ๊ฐ’์„ ๊ตฌํ•œ๋‹ค -> ๋ฌธ์ž, ์ˆซ์ž, ๋‚ ์งœ ๋“ฑ์— ์‚ฌ์šฉ

  • AVG : ํ‰๊ท ๊ฐ’์„ ๊ตฌํ•˜๊ณ  ์ˆซ์ž ํƒ€์ž…์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ -> ๋ฐ˜ํ™˜ ๊ฐ’ double

  • SUM : ํ•ฉ์„ ๊ตฌํ•˜๊ณ  ์ˆซ์ž ํƒ€์ž…์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ -> ๊ฐ ๋”ํ•œ ํƒ€์ž…์— ๋งž๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ

์ฃผ์˜ํ• ์ 

  • null ๊ฐ’์€ ๋ฌด์‹œ๋˜๊ณ  ์ง‘๊ณ„๋จ

  • ๊ฐ’์ด ์—†๋Š”๋ฐ min, max, avg, sum์„ ๋•Œ๋ฆฌ๋ฉด null์ด ๋˜์ง€๋งŒ count๋Š” 0์ด ๋จ

  • distinct๋Š” ์ค‘๋ณต๋œ ๊ฐ’์„ ์ œ๊ฑฐํ•˜๊ณ  ๋‚˜์„œ ์ถœ๋ ฅ๋จ

  • distinct๋Š” count๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์„ ์ง€์›ํ•˜์ง€ ์•Š์Œ

GROUP BY, HAVING

GROUP BY ๋Š” ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌํ•  ๋•Œ ํŠน์ • ๊ทธ๋ฃน๋ผ๋ฆฌ ๋ฌถ๋Š” ์˜ˆ์•ฝ์–ด์ด๋‹ค. HAVING์€ GROUP BY์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š”๋ฐ GROUP BY๋กœ ๊ทธ๋ฃนํ™”ํ•œ ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•„ํ„ฐ๋ง ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•์€ ์ด๋Ÿฌํ•˜๋‹ค

groupby_์ ˆ :: = GROUP BY {๋‹จ์ผ๊ฐ’ ๊ฒฝ๋กœ | ๋ณ„์นญ }+
having_์ ˆ :: = HAVING ์กฐ๊ฑด์‹

์ด๋Ÿฌํ•œ ์ฟผ๋ฆฌ๋“ค์€ ๋ณดํ†ต ํ†ต๊ณ„(reporting)์ฟผ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค ์•„์ฃผ ์œ ์šฉํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฟผ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ์—” ์–ด๋ ค์›€ ์•„์ฃผ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋“ค์„ ํ†ต๊ณ„์ฒ˜๋ฆฌ ํ•˜๊ธฐ์—๋Š” ํ†ต๊ณ„ ๊ฒฐ๊ณผ๋งŒ ์ €์žฅํ•˜๋Š” ํ…Œ์ด๋ธ”์„ ๋ณ„๋„๋กœ ๋งŒ๋“ค์–ด ๋‘๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ ์€ ์ƒˆ๋ฒฝ์— ๋Œ๋ ค์„œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์•ˆ์ด ๋ฒ ์ŠคํŠธ #### ORDER BY ORDER BY๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์ด๋‚˜, ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ฆฌํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ• ```java orderby_์ ˆ ::= ORDER BY {์ƒํƒœํ•„๋“œ ๊ฒฝ๋กœ | ๊ฒฐ๊ณผ ๋ณ€์ˆ˜ [ASC | DESC]}+ ``` ASC : ์˜ค๋ฆ„์ฐจ์ˆœ(๊ธฐ๋ณธ๊ฐ’ - ๋”ฐ๋กœ ์„ค์ •์•ˆํ•ด๋„ ์•Œ์•„์„œ ์˜ค๋ฆ„์ฐจ์ˆœ) DESC : ๋‚ด๋ฆผ์ฐจ์ˆœ

Last updated

Was this helpful?