SELECT 문의 기본

ν…Œμ΄λΈ”μ„ μ‘°μž‘ν•˜λŠ” SQL

  • SQL은 주둜 DBMS에 μ €μž₯된 ν…Œμ΄λΈ”μ„ μ‘°μž‘ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•¨
  • ν…Œμ΄λΈ”μ€ μŠ€ν‚€λ§ˆ(폴더)에 μ €μž₯됨
    • MySQLμ—μ„œλŠ” μŠ€ν‚€λ§ˆμ™€ λ°μ΄ν„°λ² μ΄μŠ€κ°€ κ°™μŒ
  • ν΄λ”μ²˜λŸΌ DB도 μ—¬λŸ¬ 개λ₯Ό μž‘μ„±ν•  수 μžˆμ–΄μ„œ ν…Œμ΄λΈ”μ„ 보렀면 DBλ₯Ό 선택해야 함

  • 1개의 DBμ—λŠ” 볡수의 ν…Œμ΄λΈ”μ΄ μ €μž₯λ˜μ–΄ 있음
  • MySQL의 경우 DBλ₯Ό 보렀면 show databases;
  • λ””ν΄νŠΈ(ν˜„μž¬) DBλ₯Ό μ§€μ •ν•˜λ €λ©΄ use λ°μ΄ν„°λ² μ΄μŠ€λͺ…;
  • DB λ‚΄μ˜ ν…Œμ΄λΈ” 리슀트λ₯Ό 얻을 λ•ŒλŠ” show tables; λͺ…령을 μ‚¬μš©ν•¨
    • μ—¬κΈ°μ„œ showλ‚˜ useλŠ” SQL이 μ•„λ‹ˆκ³  관리 λͺ…λ Ή
SELECT μ—΄λͺ… FROM ν…Œμ΄λΈ”λͺ…;
  • μ—΄λͺ…에 λ³„ν‘œ(*)λ₯Ό μ‚¬μš©ν•˜λ©΄ FROM ν…Œμ΄λΈ”λͺ…μ—μ„œ μ§€μ •ν•œ ν…Œμ΄λΈ”μ˜ 전체 열을 지정할 수 있음
  • μž„μ˜μ˜ 열을 콀마(,)둜 ꡬ뢄해 볡수둜 지정할 수 있음
  • DBκ°€ λ‹€λ₯΄λ©΄ 같은 μ΄λ¦„μ˜ ν…Œμ΄λΈ”μ„ μž‘μ„±ν•  수 있음
λͺ…λ Ή μ„€λͺ…
select * from city; λ””ν΄νŠΈ λ°μ΄ν„°λ² μ΄μŠ€μ˜ cityλ₯Ό SELECT함
select * from world.city; λ°μ΄ν„°λ² μ΄μŠ€.ν…Œμ΄λΈ”λͺ…ν˜•νƒœλ‘œ λͺ…μ‹œμ μœΌλ‘œ world λ°μ΄ν„°λ² μ΄μŠ€μ˜ cityλ₯Ό SELECT함

WHERE 쑰건이 ν•„μš”ν•œ 이유

  • DB의 ν…Œμ΄λΈ”μ—μ„œ μ—΄μ˜ μˆ˜λŠ” ν…Œμ΄λΈ”μ„ μž‘μ„±(μ •μ˜)ν–ˆμ„ λ•Œ κ²°μ •λ˜μ–΄ 이후 λͺ…μ‹œμ μœΌλ‘œ λ³€κ²½ν•˜μ§€ μ•ŠλŠ” ν•œ λŠ˜μ–΄λ‚˜μ§€ μ•ŠμŒ
  • ν•˜μ§€λ§Œ ν–‰μˆ˜λŠ” μ œν•œ 없이 늘릴 수 있음
  • ν•„μš”ν•œ 데이터λ₯Ό νš¨μœ¨μ„± 있게 클라에 κ°€μ Έμ˜€λ €λ©΄ SELECTν•˜λŠ” ν–‰μˆ˜λ₯Ό 쀄여야 함
    • WHERE ꡬ문을 지정해 WHERE 쑰건의 ν˜•νƒœλ‘œ SELECT 문의 끝에 좔가함
SELECT μ—΄λͺ… FROM ν…Œμ΄λΈ”λͺ… WHERE 쑰건;
  • 쑰건은 ν…Œμ΄λΈ”μ˜ 각 행을 μ‚΄νŽ΄λ³΄κ³  μΌμΉ˜ν•˜λŠ” ν–‰λ§Œ SELECT 함
    • μ‘°κ±΄μ—λŠ” 비ꡐ μ—°μ‚°μž AND와 ORκ°€ 자주 μ‚¬μš©λ¨

비ꡐ μ—°μ‚°μž

μ—°μ‚°μž μ’…λ₯˜ 의미
= κ°™λ‹€
< > 같지 μ•Šλ‹€
> = κ°™κ±°λ‚˜ 크닀
> 보닀 크닀
< = κ°™κ±°λ‚˜ μž‘λ‹€
< 보닀 μž‘λ‹€

μ—°μ‚°μžμ˜ μš°μ„ μˆœμœ„

  • μ—°μ‚°μžμ—λŠ” μš°μ„ μˆœμœ„κ°€ 있으며 MySQL의 κ²½μš°μ—λ„ 있음
  • μš°μ„ μˆœμœ„λ₯Ό λͺ…ν™•ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄ κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•΄μ•Όν•¨

SQL의 기초적인 기술 κ·œμΉ™

  • SQL은 κ·Έλž˜ν”½ μΈν„°νŽ˜μ΄μŠ€(GUI)둜 μ‘°μž‘λœ λ‚΄μš©λ„ DBMSλ₯Ό μ‘°νšŒν•  λ•Œ λ¬Έμžμ—΄λ‘œ λ³€ν™˜λ¨
  • SQL 문의 λ§ˆμ§€λ§‰μ— λ”œλ¦¬λ―Έν„°, Delimiter(λ¬Έμž₯의 단락을 μ˜λ―Έν•˜λŠ” 기호)λ₯Ό λΆ™μž„(λŒ€λΆ€λΆ„μ€ μ„Έλ―Έμ½œλ‘ (;))
  • ν‚€μ›Œλ“œ(ex, SELECTλ‚˜ FROM λ“±)의 λŒ€λ¬Έμžμ™€ μ†Œλ¬ΈμžλŠ” κ΅¬λ³„ν•˜μ§€ μ•ŠμŒ
    • select도 SELECT도 Select도 같은 μ˜λ―Έμž„
  • μ •μˆ˜λŠ” κΈ°μ‘΄ κ·ΈλŒ€λ‘œ μ‚¬μš©ν•¨. λ¬Έμžμ—΄μ΄λ‚˜ λ‚ μ§œ μ‹œκ°„μ€ μž‘μ€λ”°μ˜΄ν‘œ(β€˜ β€˜)둜 감쌈
    • 수치둜 값을 μ§€μ •ν•˜λŠ” κ²½μš°λŠ” 1000μ΄μ§€λ§Œ, λ¬Έμžμ—΄λ‘œ μ§€μ •ν•˜λŠ” κ²½μš°λŠ” β€˜1000’이 됨
  • 단어(word)λŠ” 반각 μŠ€νŽ˜μ΄μŠ€λ‚˜ κ°œν–‰μœΌλ‘œ ꡬ별함, 전각 μŠ€νŽ˜μ΄μŠ€λŠ” μ‚¬μš©ν•˜μ§€ μ•ŠμŒ

DISTINCT에 μ˜ν•œ 쀑볡 배제

  • μ„ νƒν•œ ν–‰μ—μ„œ μ€‘λ³΅λœ 값을 μ—†μ• κ³  싢은 경우 DISTINCT ν‚€μ›Œλ“œλ₯Ό 지정함

SELECT 문의 μ‘μš©μ‘°μž‘

검색결과 μ •λ ¬

  • SELECT 문을 μ‹€ν–‰ν•˜λ©΄ κ·Έ κ²°κ³ΌλŠ” μ—΄(column)κ³Ό ν–‰(record)으둜 κ΅¬μ„±λœ 2차원 ν‘œλ‘œ ν‘œμ‹œλ¨
  • μ—΄μ˜ μˆœμ„œλŠ” SELECT μ—΄1, μ—΄2, ...와 같이 λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜μ§€ μ•ŠλŠ” ν•œμ€ ν‘œλ₯Ό μž‘μ„±ν•  λ•Œμ˜ μˆœμ„œλŒ€λ‘œ 됨
  • ν–‰μ˜ μˆœμ„œλŠ” ORDER BYλž€ λͺ…λ ΉμœΌλ‘œ 지정함
  • SELECT 문의 결과에 ν–‰μ˜ μˆœμ„œλ₯Ό 지정할 λ•ŒλŠ” μ•„λž˜μ™€ 같이 함
SELECT ~ ORDER BY μ—΄1[, μ—΄2, ...]
  • ORDER BY에 μ‚¬μš©ν•œ μ—΄λͺ…을 정렬킀라고 함
    • μ •λ ¬ν‚€λ₯Ό 콀마둜 ꡬ뢄해 볡수의 열을 지정할 수 있음
  • ORDER BYλ₯Ό μ‚¬μš©ν•˜μ—¬ μ˜€λ¦„μ°¨μˆœ μ •λ ¬ν•  수 있음
  • DESC ν‚€μ›Œλ“œλ₯Ό μΆ”κ°€ν•˜λ©΄ λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬ κ°€λŠ₯
    • DESCend(내리닀)λΌλŠ” 의미
  • ASC ν‚€μ›Œλ“œλ₯Ό μΆ”κ°€ν•˜λ©΄ μ˜€λ¦„μ°¨μˆœ μ •λ ¬ κ°€λŠ₯
    • ASCend(였λ₯΄λ‹€)λΌλŠ” 의미

μ •λ ¬ μˆ˜ν–‰ μ‹œ μ£Όμ˜ν•  점

  • ORDER BY에 μ˜ν•œ 정렬을 μˆ˜ν–‰ν•  λ•Œ ν–‰μ˜ μˆœμ„œλ₯Ό ν™•μ‹€νžˆ μ •ν•˜λ €λ©΄ ν–‰μ˜ μ •λ ¬ν‚€λ₯Ό ν•œ 가지 의미(Unique)둜 μ •ν•΄μ•Ό 함
    • μ •λ ¬ν‚€κ°€ 같은 κ°’μ˜ 행이 볡수 개 μ‘΄μž¬ν•œλ‹€λ©΄ κ·Έ ν–‰λ“€μ˜ μˆœμ„œλŠ” μΌμ •ν•˜μ§€ μ•ŠμŒ
    • μΌμ •ν•œ μˆœμ„œλ‘œ λ‚˜μ—΄ν•˜λ €λ©΄ 콀마(,)둜 ꡬ뢄해 μ •λ ¬ν‚€λ‘œ 지정해야함

ν…Œμ΄λΈ”μ„ μš”μ•½ν•˜λŠ” ν•¨μˆ˜

  • SQLμ—μ„œ 데이터에 λŒ€ν•΄ μ–΄λ– ν•œ μ‘°μž‘μ΄λ‚˜ 계산을 μˆ˜ν–‰ν•˜λ €λ©΄ ν•¨μˆ˜λΌλŠ” 도ꡬλ₯Ό μ‚¬μš©ν•΄μ•Ό 함
    • ex) ν…Œμ΄λΈ” μ „μ²΄μ˜ ν–‰μˆ˜λ₯Ό ν•©μ‚°ν•˜λŠ” 계산을 μˆ˜ν–‰ν•˜λŠ” κ²½μš°μ—λŠ” COUNT ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•¨

ν•¨μˆ˜μ˜ 2μ’…λ₯˜

  • 볡수 ν–‰(μ΄λ‚˜ ν–‰μ˜ κ°’)에 λŒ€ν•΄ 집계λ₯Ό μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜
  • 단일 ν–‰μ˜ 값에 λŒ€ν•΄ μ‘°μž‘μ΄λ‚˜ 계산을 μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜

  • COUNT ν•¨μˆ˜λŠ” μ§‘κ³„μš© ν•¨μˆ˜μ— ν•΄λ‹Ή
    • μ§‘μ•½ν•¨μˆ˜(μ§‘κ³„ν•¨μˆ˜)라고도 뢀름

μ§‘μ•½ν•¨μˆ˜ 5가지

  • COUNT ν…Œμ΄λΈ”μ˜ ν–‰μˆ˜λ₯Ό μ•Œλ €μ£ΌλŠ” ν•¨μˆ˜
  • SUM ν…Œμ΄λΈ”μ˜ 수치 데이터λ₯Ό ν•©κ³„ν•˜λŠ” ν•¨μˆ˜
  • AVG ν…Œμ΄λΈ”μ˜ 수치 데이터 평균을 κ΅¬ν•˜λŠ” ν•¨μˆ˜
  • MAX ν…Œμ΄λΈ”μ˜ μž„μ˜μ—΄ 데이터 쀑 μ΅œλŒ€κ°’μ„ κ΅¬ν•˜λŠ” ν•¨μˆ˜
  • MIN ν…Œμ΄λΈ”μ˜ μž„μ˜μ—΄ 데이터 쀑 μ΅œμ†Œκ°’μ„ κ΅¬ν•˜λŠ” ν•¨μˆ˜

  • μ§‘μ•½ν•¨μˆ˜λŠ” 기본적으둜 NULL을 μ œμ™Έν•˜κ³  집계함
  • COUNT ν•¨μˆ˜λŠ” COUNT(*)둜 ν‘œκΈ°ν•˜μ—¬ NULL을 ν¬ν•¨ν•œ 전체 행을 집계함

λ¬Έμžμ—΄μ„ μ§‘μ•½ν•˜λŠ” GROUP_CONCAT

  • λ¬Έμžμ—΄μ— λŒ€ν•œ μ§‘μ•½ν•¨μˆ˜λŠ” SQL ν‘œμ€€μ—λŠ” μ—†μœΌλ‚˜ MySQLμ—λŠ” GROUP_CONCAT ν•¨μˆ˜(LIST ν•¨μˆ˜)κ°€ 있음
  • SUM ν•¨μˆ˜λŠ” μˆ˜μΉ˜μ— λŒ€ν•œ 집계λ₯Ό 더해 μˆ˜ν–‰ν•˜μ§€λ§Œ, GROUP_CONCAT ν•¨μˆ˜λŠ” λ¬Έμžμ—΄μ— λŒ€ν•œ 집계λ₯Ό λ¬Έμžμ—΄μ˜ κ²°ν•©(CONCATinate)으둜 μˆ˜ν–‰ν•¨

DISTINCT둜 쀑볡 νšŒν”Ό

  • DISTINCT ν‚€μ›Œλ“œλŠ” μ„ νƒν•œ ν–‰μ˜ 값이 μ€‘λ³΅λ˜μ–΄ 이λ₯Ό μ—†μ• κ³  싢을 κ²½μš°μ— μ΄μš©ν•¨
    • 이것은 μ§‘μ•½ν•¨μˆ˜λ‘œλ„ μ΄μš©ν•  수 있음

데이터λ₯Ό 그룹으둜 λ‚˜λˆ„λŠ” GROUP BY

  • μ§‘μ•½ν•¨μˆ˜λŠ” λŒ€μƒμ΄ λ˜λŠ” 데이터 전체λ₯Ό λ²”μœ„λ‘œ μ§‘μ•½ν–ˆλŠ”λ°, λŒ€μƒμ΄ λ˜λŠ” 데이터λ₯Ό λͺ‡ 개의 그룹으둜 λ‚˜λˆ μ„œ μ§‘μ•½ν•˜λŠ” 것도 κ°€λŠ₯
    • 그룹을 λ‚˜λˆŒ λ•ŒλŠ” λ‚˜λˆ„λŠ” ν‚€κ°€ λ˜λŠ” 열을 지정함
SELECT ~ FROM ν…Œμ΄λΈ”λͺ… GROUP BY μ—΄λͺ…1 [, μ—΄λͺ…2, ...]
  • GROUP BY둜 μ§€μ •ν•œ 열은 집약 ν‚€ or κ·Έλ£Ήν™” 킀라고 뢀름
    • ORDER BY처럼 볡수 열을 콀마(,)둜 κ΅¬λΆ„ν•΄μ„œ 지정할 수 있음
  • GROUP BYκ°€ 없을 λ•ŒλŠ” λŒ€μƒ 데이터 μ „μ²΄λ‘œ 집약해 1건의 결과둜 되돌렀쀌
  • GROUP BYκ°€ μžˆμ„ λ•ŒλŠ” μ§€μ •ν•œ κ·Έλ£Ή μ—΄λ§ˆλ‹€ μ§‘μ•½ν•΄μ„œ κ·Έλ£Ή μ—΄λ‘œ λ‚˜λˆˆ 수의 κ²°κ³Όλ₯Ό 되돌렀쀌

λ‚˜λˆ” 그룹에 쑰건 μΆ”κ°€

  • WHERE ꡬ문에 쑰건을 μΆ”κ°€(AND μ—°μ‚°μž μ‚¬μš©)ν•˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•¨
  • COUNT 같은 μ§‘μ•½ν•¨μˆ˜λ₯Ό μž‘μ„±ν•  수 μžˆλŠ” κ²½μš°λŠ” SELECT와 ORDER BY, HAVING λΏμž„

μ§‘μ•½ν•œ 결과에 쑰건 지정

  • κ·Έλ£Ήλ§ˆλ‹€ μ§‘μ•½ν•œ 값을 쑰건으둜 μ„ νƒν•˜κ³  μ‹Άλ‹€λ©΄ HAVING 뒀에 쑰건을 λ‹€μŒκ³Ό 같이 지정함
SELECT ~ FROM ~ GROUP BY ~ HAVING 그룹의 값에 λŒ€ν•œ 쑰건
  • SELECT와 ORDER BY에도 μ§‘μ•½ν•¨μˆ˜λ₯Ό κΈ°μˆ ν•  수 있음
    • ORDER BY둜 κΈ°μˆ ν•˜λŠ” 경우 ORDER BY 뒀에 κΈ°μˆ ν•¨

ORDER BY, GROUP BY, HAVING의 μž‘μ„± μˆœμ„œ

  • μž‘μ„±ν•  λ•Œμ—λŠ” λ°˜λ“œμ‹œ 이 μˆœμ„œλŒ€λ‘œ ν•΄μ•Ό 함
1.SELECT 2.FROM 3.WHERE 4.GROUP BY 5.HAVING 6.ORDER BY

reference

λ°μ΄ν„°λ² μ΄μŠ€ 첫걸음