Post

🐘 PostgreSQL κΈ°λ³Έ 03 - SELECT둜 μ‹œμž‘ν•˜λŠ” 데이터 νƒν—˜

🐘 PostgreSQL κΈ°λ³Έ 03 - SELECT둜 μ‹œμž‘ν•˜λŠ” 데이터 νƒν—˜

πŸ“™ γ€Žμ‹€μš© SQL』을 읽고 μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€.

기초 SELECT ꡬ문

1
SELECT * FROM teachers;
  • μœ„ ꡬ문은 teachers ν…Œμ΄λΈ”μ˜ λͺ¨λ“  데이터λ₯Ό μ‘°νšŒν•˜λŠ” SELECT ꡬ문이닀.
  • *λŠ” μ™€μΌλ“œ μΉ΄λ“œλΌκ³  λΆˆλ¦°λ‹€.
  • μ™€μΌλ“œ μΉ΄λ“œλŠ” μ–΄λ–€ 값을 λŒ€μ²΄ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 문자둜, νŠΉμ •ν•œ 무언가가 μ•„λ‹ˆλΌ, κ·Έ 값이 될 수 μžˆλŠ” λͺ¨λ“ κ²ƒμ„ λŒ€ν‘œν•œλ‹€.
  • FROM ν‚€μ›Œλ“œλŠ” 쿼리가 νŠΉμ • ν…Œμ΄λΈ”λ‘œλΆ€ν„° 데이터λ₯Ό κ°€μ Έμ˜€λ„λ‘ μ§€μ‹œν•œλ‹€.
idfirst_namelast_nameschoolhire_datesalary
1JanetSmithF.D. Roosevelt HS2011-10-3036,200
2LeeReynoldsF.D. Roosevelt HS1993-05-2265,000
3SamuelColeMyers Middle School2005-08-0143,500
4SamanthaBushMyers Middle School2011-10-3036,200
5BettyDiazMyers Middle School2005-08-3043,500
6KathleenRoushF.D. Roosevelt HS2010-10-2238,500
1
TABLE teachers;
  • μœ„ λͺ…령어도 같은 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€.

μ—΄μ˜ ν•˜μœ„ μ§‘ν•© μΏΌλ¦¬ν•˜κΈ°

1
SELECT last_name, first_name, salary FROM teachers;
  • μœ„ ꡬ문과 같이 쿼리가 검색할 열을 μ œν•œν•˜λ©΄ κ³Όλ„ν•œ 정보λ₯Ό 헀쳐 보지 μ•Šμ•„λ„ λ˜λ―€λ‘œ 맀우 μ‹€μš©μ μ΄λ‹€.
  • 특히 λŒ€μš©λŸ‰ λ°μ΄ν„°λ² μ΄μŠ€λΌλ©΄ κ·Έ μ‹€μš©μ„±μ€ λ†’μ•„μ§„λ‹€.
  • μœ„ ꡬ문처럼 열은 μ›ν•˜λŠ” μˆœμ„œλŒ€λ‘œ ν˜ΈμΆœν•  수 μžˆλ‹€.
last_namefirst_namesalary
SmithJanet36,200
ReynoldsLee65,000
ColeSamuel43,500
BushSamantha36,200
DiazBetty43,500
RoushKathleen38,500
  • 일반적으둜 뢄석을 μ‹œμž‘ν•  λ•ŒλŠ” λ°μ΄ν„°μ˜ μœ λ¬΄μ™€ μ›ν•˜λŠ” ν˜•νƒœμ˜ 데이터인지 λ¨Όμ € ν™•μΈν•˜λŠ” 것이 μš°μ„ μ΄λ‹€.
  • λ‚ μ§œλŠ” 연도-μ›”-일둜 ν‘œν˜„μ΄ λ˜μ—ˆλŠ”μ§€, λͺ¨λ“  행에 값이 λ“€μ–΄ μžˆλŠ”μ§€ 등이닀.
  • μ΄λŸ¬ν•œ μš”μ†Œλ“€μ€ λͺ¨λ‘ 잠재적인 μœ„ν—˜ μš”μ†Œμ΄λ‹€.
  • 데이터가 μœ μ‹€λ˜μ—ˆμ„ μˆ˜λ„ 있고, μž‘μ—… κ³Όμ • μ–΄λ”˜κ°€ 데이터 관리가 잘λͺ» λ˜μ—ˆμ„ μˆ˜λ„ μžˆλ‹€.

ORDER BY둜 데이터 μ •λ ¬ν•˜κΈ°

1
2
3
4
5
6
7
8
9
-- μ—΄ μ΄λ¦„μœΌλ‘œ μ •λ ¬
SELECT first_name, last_name, salary
FROM teachers
ORDER BY salary DESC;

-- μ—΄ μœ„μΉ˜μ— λŒ€ν•œ μˆ«μžκ°’μœΌλ‘œ μ •λ ¬
SELECT first_name, last_name, salary
FROM teachers
ORDER BY 3 DESC;
  • SQLμ—μ„œλŠ” ORDER BY ν‚€μ›Œλ“œμ™€ 정렬이 ν•„μš”ν•œ μ—΄, 열듀이 λ‹΄κΈ΄ μ ˆμ„ 톡해 결과의 μˆœμ„œλ₯Ό μ •λ ¬ν•  수 μžˆλ‹€.
  • λ°μ΄ν„°λŠ” λ’€μ£½λ°•μ£½ μ„žμ—¬ μžˆμ„ λ•Œλ³΄λ‹€ μˆœμ„œλŒ€λ‘œ μ •λ ¬λ˜μ–΄ μžˆμ„ λ•Œ μ΄ν•΄ν•˜κΈ° 쉽고, νŒ¨ν„΄μ„ λ”μš± 순쑰둭게 λ“œλŸ¬λ‚Ό 수 μžˆλ‹€.
  • DESCλŠ” λ‚΄λ¦Όμ°¨μˆœμ„ μ˜λ―Έν•˜λ©°, ASC ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ 곡백으둜 두면 기본적으둜 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬λœλ‹€.
  • ORDER BY μ ˆμ—λŠ” μ—΄ 이름 λŒ€μ‹  숫자λ₯Ό 넣을 μˆ˜λ„ μžˆλ‹€.
  • μˆ«μžμ—λŠ” 열이 λ°˜ν™˜λ˜λŠ” μœ„μΉ˜μ— λŒ€ν•œ 값이 λ“€μ–΄κ°„λ‹€.
first_namelast_namesalary
LeeReynolds65,000
SamuelCole43,500
BettyDiaz43,500
KathleenRoush38,500
JanetSmith36,200
SamanthaBush36,200
1
2
3
SELECT last_name, school, hire_date
FROM teachers
ORDER BY school ASC, hire_date DESC;
  • μœ„ ꡬ문처럼 μ—¬λŸ¬ 개의 열을 κΈ°μ€€μœΌλ‘œ μ •λ ¬ν•  μˆ˜λ„ μžˆλ‹€.
  • κ·ΈλŸ¬λ‚˜ νš¨κ³Όκ°€ 거의 λˆˆμ— 띄지 μ•Šμ„ 것이닀.
  • 데이터 μš”μ•½μ€ κ²°κ³Όκ°€ νŠΉμ • μ§ˆλ¬Έμ— λŒ€λ‹΅ν•˜λŠ” 것에 μ΄ˆμ μ„ λ§žμΆ”μ—ˆμ„ λ•Œ κ°€μž₯ 쉽기 λ•Œλ¬Έμ—, 더 λ‚˜μ€ 방법은 κ°€μž₯ μ€‘μš”ν•œ μ—΄λ“€λ‘œ 쿼리λ₯Ό μ œν•œν•˜κ³  κΆκΈˆν•œ 것이 생길 λ•Œλ§ˆλ‹€ 쿼리λ₯Ό μ‹€ν–‰ν•˜λŠ” 것이닀.
  • κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™λ‹€.
last_nameschoolhire_date
SmithF.D. Roosevelt HS2011-10-30
RoushF.D. Roosevelt HS2010-10-22
ReynoldsF.D. Roosevelt HS1993-05-22
BushMyers Middle School2011-10-30
DiazMyers Middle School2005-08-30
ColeMyers Middle School2005-08-01

DISTINCT둜 κ³ μœ κ°’ μ°ΎκΈ°

1
2
3
SELECT DISTINCT school
FROM teachers
ORDER BY school;
  • ν…Œμ΄λΈ”μ„ λ‹€λ£° λ•Œ μ—΄ μ•ˆμ˜ 행이 쀑볡 값을 κ°–κ³  μžˆλŠ” κ²½μš°κ°€ ν”ν•˜λ‹€.
  • 예λ₯Ό λ“€μ–΄ 각 학ꡐ λ³„λ‘œ μ±„μš©ν•˜λŠ” μ„ μƒλ‹˜μ˜ μˆ˜κ°€ λ‹€μˆ˜μ΄κΈ° λ•Œλ¬Έμ— teachers ν…Œμ΄λΈ”μ˜ school μ—΄μ—λŠ” 같은 학ꡐ 이름이 μ—¬λŸ¬ 번 μ €μž₯λœλ‹€.
  • 쿼리에 DISTINCT ν‚€μ›Œλ“œλ₯Ό λ„£μœΌλ©΄ 쀑볡을 μ œκ±°ν•˜κ³  값을 ν•˜λ‚˜μ”© 보여쀄 수 μžˆλ‹€.
school
F.D. Roosevelt HS
Myers Middle School
  • μ΄λŠ” 데이터 ν’ˆμ§ˆμ„ νŒŒμ•…ν•˜λŠ” 데 도움이 λ˜λŠ” 첫 단좔이닀.
  • κ°€λ Ή μ–΄λ–€ ν•™κ΅μ˜ 이름이 μ—¬λŸ¬κ°€μ§€ ν˜•μ‹μœΌλ‘œ λ‚˜νƒ€λ‚˜λŠ” κ²½μš°μ— 철자 λ³€ν˜•μ„ μ‰½κ²Œ μ°Ύμ•„λ‚΄κ³  μˆ˜μ •ν•  수 μžˆλ‹€.
  • DISTINCTλŠ” 특히 λ‚ μ§œλ‚˜ 숫자λ₯Ό λ‹€λ£° λ•Œ 일관성이 λ–¨μ–΄μ§€κ±°λ‚˜ κΉ¨μ§„ ν˜•μ‹μ„ μ°ΎλŠ”λ° μœ μš©ν•˜λ‹€.
  • 또 λ‹€λ₯Έ μ˜ˆμ‹œλ‘œ λ‚ μ§œκ°€ text 데이터 νƒ€μž…μ˜ ν˜•νƒœλ‘œ κΈ°μž…λœ 데이터셋을 받을 μˆ˜λ„ μžˆλŠ”λ°, μ΄λŠ” κΌ­ ν”Όν•΄μ•Ό ν•  ν–‰μœ„μ΄λ‹€.
  • κ°€λ Ή λ‹€μŒκ³Ό 같은 κΈ°ν˜•μ μΈ λ‚ μ§œ ν˜•νƒœλ₯Ό μœ λ°œν•˜κ²Œ λœλ‹€.
date
5/30/2023
6//2023
6/1/2023
6/2/2023
1
2
3
SELECT DISTINCT school, salary
FROM teachers
ORDER BY school, salary;
  • DISTINCT ν‚€μ›Œλ“œλŠ” μ—¬λŸ¬ μ—΄μ—μ„œλ„ λ™μ‹œμ— μž‘λ™ν•œλ‹€.
  • 열을 μΆ”κ°€ν•˜κ²Œ 될 경우 쿼리가 각각에 λŒ€ν•œ κ³ μœ ν•œ κ°’μ˜ μŒμ„ 결과둜 보여쀀닀.
schoolsalary
F.D. Roosevelt HS36,200
F.D. Roosevelt HS38,500
F.D. Roosevelt HS65,000
Myers Middle School36,200
Myers Middle School43,500
  • 이 κΈ°μˆ μ€ β€˜ν…Œμ΄λΈ” μ•ˆμ˜ xλ§ˆλ‹€ λ‚˜μ˜¬ 수 μžˆλŠ” y κ°’μœΌλ‘œλŠ” 뭐가 μžˆμ„κΉŒ?β€™λΌλŠ” μ§ˆλ¬Έμ— λŒ€ν•œ 닡을 μ œκ³΅ν•œλ‹€.

WHERE둜 ν–‰ ν•„ν„°λ§ν•˜κΈ°

1
2
3
SELECT last_name, school, hire_date
FROM teachers
WHERE school = 'Myers Middle School';
  • νŠΉμ • 기쀀에 λΆ€ν•©ν•˜λŠ” 열듀에 λ‹΄κΈ΄ ν–‰λ§Œ λ³΄μ—¬μ£ΌλŠ” 쿼리가 ν•„μš”ν•  λ•Œκ°€ μžˆλ‹€.
  • 이런 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ WHERE ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.
  • WHERE ν‚€μ›Œλ“œλŠ” μˆ˜ν•™, 비ꡐ, 논리 연산을 μˆ˜ν–‰ν•˜λŠ” μ—°μ‚°μžλ₯Ό μ΄μš©ν•΄ λ§Œλ“€μ–΄ λ‚Έ 쑰건에 따라 νŠΉμ • κ°’, κ°’μ˜ λ²”μœ„λ₯Ό ν¬ν•¨ν•˜λŠ” 행을 찾도둝 ν•œλ‹€.
  • λ˜ν•œ κ·Έ 기쀀을 λ°”νƒ•μœΌλ‘œ 행을 μ œμ™Έν•  μˆ˜λ„ μžˆλ‹€.
last_nameschoolhire_date
ColeMyers Middle School2005-08-01
BushMyers Middle School2011-10-30
DiazMyers Middle School2005-08-30
  • 비ꡐ μ—°μ‚°μžλŠ” =, !=(<>), >, <, <=, >=, BETWEEN, IN, LIKE, ILIKE, NOT 등이 μžˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
-- Janet 이름을 κ°€μ§„ μ„ μƒλ‹˜ μ°ΎκΈ°
SELECT first_name, last_name, school
FROM teachers
WHERE first_name = 'Janet';

-- F.D. Roosevelt HSλ₯Ό μ œμ™Έν•œ λͺ¨λ“  학ꡐ 이름 좜λ ₯ν•˜κΈ°
SELECT school
FROM teachers
WHERE school <> 'F.D. Roosevelt HS';

-- 2000λ…„ 1μ›” 1일 이전에 고용된 μ„ μƒλ‹˜ 좜λ ₯ν•˜κΈ°
SELECT first_name, last_name, hire_date
FROM teachers
WHERE hire_date < '2000-01-01';
  
-- 연봉이 $43,500 이상인 μ„ μƒλ‹˜ μ°ΎκΈ°
SELECT first_name, last_name, salary
FROM teachers
WHERE salary >= 43500;

-- 연봉이 $40,000~$65,000인 μ„ μƒλ‹˜ μ°ΎκΈ°
SELECT first_name, last_name, school, salary
FROM teachers
WHERE salary BETWEEN 40000 AND 65000;

SELECT first_name, last_name, school, salary
FROM teachers
WHERE salary >= 40000 AND salary <= 65000;
  • BETWEEN을 μ‚¬μš©ν•  λ•ŒλŠ” 이쀑 계산을 μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.
  • 예λ₯Ό λ“€μ–΄ BETWEEN 10 AND 20을 ν•œ 이후 BETWEEN 20 AND 30을 μ‹€ν–‰ν•˜λ©΄ 두 쿼리 κ²°κ³Ό λͺ¨λ‘μ—μ„œ 20을 κ°’μœΌλ‘œ κ°–λŠ” 행이 λ‚˜νƒ€λ‚œλ‹€.
  • BETWEEN보닀 λͺ…μ‹œμ μΈ 초과, 미만 μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄ 이쀑 계산을 λ°©μ§€ν•  수 μžˆλ‹€.

WHERE에 LIKE와 ILIKE μ‚¬μš©ν•˜κΈ°

  • 두 μ—°μ‚°μžλŠ” μ§€μ •λœ νŒ¨ν„΄μ— λ§žλŠ” λ‹€μ–‘ν•œ 문자λ₯Ό κ²€μƒ‰ν•˜κΈ° λ•Œλ¬Έμ—, μ •ν™•ν•œ 철자λ₯Ό λͺ¨λ₯΄κ±°λ‚˜ 잘λͺ» μž‘μ„±ν•œ 단어λ₯Ό 찾을 λ•Œ νŽΈλ¦¬ν•˜λ‹€.
  • κ°€λ Ή λ‹€μŒ 기호λ₯Ό μ‚¬μš©ν•˜μ—¬ μΌμΉ˜μ‹œν‚¬ νŒ¨ν„΄μ„ μ§€μ •ν•œλ‹€.
  • 두 κΈ°ν˜ΈλŠ” ν˜Όν•©ν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.
  1. νΌμ„ΌνŠΈ 기호(%): 문자 ν•œ 개 λ˜λŠ” μ—¬λŸ¬ κ°œμ™€ λ§€μΉ­ν•˜λŠ” μ™€μΌλ“œ μΉ΄λ“œ
  2. 언더바(_): 문자 ν•œ κ°œμ™€ λ§€μΉ­ν•˜λŠ” μ™€μΌλ“œ μΉ΄λ“œ
  • 예λ₯Ό λ“€μ–΄ bakerλΌλŠ” 단어λ₯Ό 찾고자 ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같이 λ§€μΉ­ν•  수 μžˆλ‹€.
    1
    2
    3
    4
    
    LIKE 'b%'
    LIKE '%ak%'
    LIKE '_aker'
    LIKE 'ba_er'
    
  • ANSI SQL ν‘œμ€€μΈ LIKE μ—°μ‚°μžλŠ” λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜λŠ” 반면, PostgreSQLμ—μ„œλ§Œ μ μš©λ˜λŠ” μ—°μ‚°μžμΈ ILIKE μ—°μ‚°μžλŠ” λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•ŠλŠ”λ‹€.
1
2
3
4
5
6
7
SELECT first_name
FROM teachers
WHERE first_name LIKE 'sam%';

SELECT first_name
FROM teachers
WHERE first_name ILIKE 'sam%';
  • κ°€λ Ή 첫 번째 WHERE μ ˆμ—μ„œλŠ” λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜κΈ° λ•Œλ¬Έμ— 0개의 κ²°κ³Όκ°€ λ‚˜μ˜€μ§€λ§Œ, 두 번째 WHERE μ ˆμ—μ„œλŠ” ν…Œμ΄λΈ”μ—μ„œ Samuelκ³Ό SamanthaλΌλŠ” 결괏값을 보여쀀닀.
  • μ‚¬λžŒμ˜ μ΄λ¦„μ΄λ‚˜ μž₯μ†Œ, μ œν’ˆ λ˜λŠ” 고유 λͺ…사λ₯Ό κΈ°μž…ν•œ μž‘μ—…μžκ°€ λͺ¨λ“  데이터λ₯Ό μΌκ΄€λ˜κ²Œ 적어 λ‘κΈ°λŠ” 쉽지 μ•ŠκΈ° λ•Œλ¬Έμ— ILIKE와 μ™€μΌλ“œ μΉ΄λ“œλ₯Ό ν™œμš©ν•˜λ©΄ μ’‹λ‹€.
  • λ‹€λ§Œ LIKE와 ILIKEλŠ” νŒ¨ν„΄μ„ κ²€μƒ‰ν•˜λ―€λ‘œ, λ°μ΄ν„°λ² μ΄μŠ€κ°€ 컀질 수둝 검색 μ„±λŠ₯이 λ–¨μ–΄μ§ˆ 수 μžˆλ‹€.
  • 이 λ¬Έμ œλŠ” 인덱슀λ₯Ό 톡해 ν•΄κ²°ν•  수 μžˆλ‹€.

AND와 OR둜 μ—°μ‚°μž 쑰건 κ²°ν•©ν•˜κΈ°

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT *
FROM teachers
WHERE school = 'Myers Middle School'
	  AND salary < 40000;

SELECT *
FROM teachers
WHERE last_name = 'Cole'
	  OR last_name = 'Bush';

SELECT *
FROM teachers
WHERE school = 'F.D. Roosevelt HS'
	  AND (salary < 38000 OR salary > 40000);
  • λ§Œμ•½ ν•œ μ ˆμ—μ„œ κ΄„ν˜Έ 없이 OR와 ANDλ₯Ό λͺ¨λ‘ μ‚¬μš©ν•  경우 λ°μ΄ν„°λ² μ΄μŠ€λŠ” AND 쑰건을 λ¨Όμ € ν‰κ°€ν•œ ν›„ OR 쑰건을 ν‰κ°€ν•œλ‹€λŠ” 점을 μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

ν™œμš©

1
2
3
4
SELECT first_name, last_name, school, hire_date, salary
FROM teachers
WHERE school LIKE '%Roos%'
ORDER BY hire_date DESC;
  • WHERE 절과 ORDER BY 정렬을 ν¬ν•¨ν•œ SELECT 문이닀.
  • μœ„ μ½”λ“œλŠ” Roosevelt High School의 μ„ μƒλ‹˜μ„ κ°€μž₯ μ΅œκ·Όμ— 고용된 μˆœμ„œλŒ€λ‘œ 보여쀀닀.
  • κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™λ‹€.
first_namelast_nameschoolhire_datesalary
JanetSmithF.D. Roosevelt HS2011-10-3036,200
KathleenRoushF.D. Roosevelt HS2010-10-2238,500
LeeReynoldsF.D. Roosevelt HS1993-05-2265,000
  • 쿼리 κ²°κ³Όλ₯Ό 톡해 νŠΉμ • ν•™κ΅μ˜ μ„ μƒλ‹˜ λͺ…단에 λŒ€ν•œ μ±„μš© κΈ°κ°„κ³Ό 연봉 μˆ˜μ€€μ˜ 연관성을 확인할 수 μžˆλ‹€.
This post is licensed under CC BY 4.0 by the author.