n312_SQL κΈ°λ³Έ

ssu_hyunΒ·2021λ…„ 9μ›” 13일
0

[codestates] AI Bootcamp

λͺ©λ‘ 보기
26/62

πŸ† ν•™μŠ΅ λͺ©ν‘œ

  • νŠΈλžœμž­μ…˜μ— λŒ€ν•΄μ„œ μ„€λͺ…ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • ACID에 λŒ€ν•΄μ„œ μ„€λͺ…ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • SQL 닀쀑 ν…Œμ΄λΈ” 쿼리λ₯Ό 날릴 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • GROUP BYλ₯Ό μ‚¬μš©ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.



SQL

데이터 쑰회(SELECT)와 μ—¬λŸ¬μ ˆλ“€

데이터 쑰회(SELECT)λŠ” 데이터 μ‘°μž‘μ–΄(DML)이며, 데이터 λΆ„μ„μ—μ„œ κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” λͺ…λ Ήμ–΄μž…λ‹ˆλ‹€.

데이터 쑰회(SELECT)λŠ” μ—¬λŸ¬ μ ˆλ“€κ³Ό ν•¨κ»˜ μ‚¬μš©λ˜μ–΄, 뢄석에 ν•„μš”ν•œ 데이터λ₯Ό μ‘°νšŒν•©λ‹ˆλ‹€.

SQL λͺ…λ Ήμ–΄

SELECT

μ„ νƒμ΄λΌλŠ” λ‹¨μ–΄μ²˜λŸΌ 데이터셋에 포함될 νŠΉμ„±λ“€μ„ νŠΉμ •ν•©λ‹ˆλ‹€.

  • 일반 λ¬Έμžμ—΄
    SELECT 'hello world';
  • 숫자
    SELECT 2;
  • κ°„λ‹¨ν•œ μ—°μ‚°
    SELECT 15 + 3;

FROM

ν…Œμ΄λΈ”κ³Ό 관련이 μžˆλŠ” 경우 ν•„μˆ˜λ‘œ λͺ…μ‹œν•΄μ•Ό ν•˜λŠ” λͺ…λ Ήμ–΄ μž…λ‹ˆλ‹€. 결과듀을 λ„μΆœν•΄λ‚Ό λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ„ λͺ…μ‹œν•©λ‹ˆλ‹€.

  • νŠΉμ • νŠΉμ„±μ„ ν…Œμ΄λΈ”μ—μ„œ μ‚¬μš©
SELECT νŠΉμ„±_1
FROM ν…Œμ΄λΈ”_이름;

-- μ˜ˆμ‹œ
SELECT FirstName
FROM customers;

νŠΉμ • νŠΉμ„±λ“€μ„ ν…Œμ΄λΈ”μ—μ„œ μ‚¬μš©
SELECT νŠΉμ„±1, νŠΉμ„±_2
FROM ν…Œμ΄λΈ”
이름;

-- μ˜ˆμ‹œ
SELECT customers.FirstName, customers.LastName
FROM customers;
ν…Œμ΄λΈ”μ˜ λͺ¨λ“  νŠΉμ„±μ„ 선택
SELECT *
FROM ν…Œμ΄λΈ”_이름;

-- μ˜ˆμ‹œ
SELECT *
FROM customers;

  • λŠ” μ™€μΌλ“œμΉ΄λ“œ (wildcard) 둜 μ „λΆ€ 선택할 λ•Œμ— μ‚¬μš©λ©λ‹ˆλ‹€.

WHERE
(μ„ νƒμ μœΌλ‘œ) ν•„ν„° 역할을 ν•˜λŠ” μΏΌλ¦¬λ¬Έμž…λ‹ˆλ‹€.

νŠΉμ • κ°’κ³Ό λ™μΌν•œ 데이터 μ°ΎκΈ°
SELECT νŠΉμ„±1, νŠΉμ„±_2
FROM ν…Œμ΄λΈ”
이름
WHERE νŠΉμ„±_1 = "νŠΉμ • κ°’";

-- μ˜ˆμ‹œ
SELECT customers.FirstName, customers.LastName
FROM customers
WHERE customers.FirstName = 'Helena';
νŠΉμ • 값을 μ œμ™Έν•œ 데이터 μ°ΎκΈ°
SELECT νŠΉμ„±1, νŠΉμ„±_2
FROM ν…Œμ΄λΈ”
이름
WHERE νŠΉμ„±_2 <> "νŠΉμ • κ°’";

-- μ˜ˆμ‹œ
SELECT customers.FirstName, customers.LastName
FROM customers
WHERE customers.FirstName <> 'Helena';
νŠΉμ • 값보닀 ν¬κ±°λ‚˜ μž‘μ€ 데이터λ₯Ό ν•„ν„°ν•  λ•Œμ—λŠ” '<', '>', λΉ„κ΅ν•˜λŠ” 값을 ν¬ν•¨ν•˜λŠ” '이상', 'μ΄ν•˜' 값은 '<=', '>=' 을 μ‚¬μš©ν•©λ‹ˆλ‹€.
SELECT νŠΉμ„±1, νŠΉμ„±_2
FROM ν…Œμ΄λΈ”
이름
WHERE νŠΉμ„±_1 > "νŠΉμ • κ°’";

SELECT νŠΉμ„±1, νŠΉμ„±_2
FROM ν…Œμ΄λΈ”
이름
WHERE νŠΉμ„±1 <= "νŠΉμ • κ°’";
λ¬Έμžμ—΄μ—μ„œ νŠΉμ • κ°’κ³Ό λΉ„μŠ·ν•œ 값듀을 ν•„ν„°ν•  λ•Œμ—λŠ” LIKE 와 '%' ν˜Ήμ€ '*' λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
SELECT νŠΉμ„±_1, νŠΉμ„±_2
FROM ν…Œμ΄λΈ”
이름
WHERE νŠΉμ„±_2 LIKE "%νŠΉμ • λ¬Έμžμ—΄%";

-- μ˜ˆμ‹œ
SELECT customers.FirstName, customers.LastName
FROM customers
WHERE customers.LastName LIKE '%han%';
리슀트의 κ°’λ“€κ³Ό μΌμΉ˜ν•˜λŠ” 데이터λ₯Ό ν•„ν„°ν•  λ•Œμ—λŠ” IN 을 μ‚¬μš©ν•©λ‹ˆλ‹€.
SELECT νŠΉμ„±1, νŠΉμ„±_2
FROM ν…Œμ΄λΈ”
이름
WHERE νŠΉμ„±_2 IN ("νŠΉμ •κ°’_1", "νŠΉμ •κ°’_2");

-- μ˜ˆμ‹œ
SELECT customers.FirstName, customers.LastName
FROM customers
WHERE customers.LastName IN ('Hansen', 'Johansson');
값이 μ—†λŠ” NULL κ³Ό 같은 경우λ₯Ό 찾을 λ•Œμ—λŠ” IS λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
SELECT *
FROM ν…Œμ΄λΈ”_이름
WHERE νŠΉμ„±_1 IS NULL;

-- μ˜ˆμ‹œ
SELECT *
FROM employees
WHERE employees.ReportsTo is NULL;
NULL 은 μ–΄λ–€ κ²½μš°μ— μ‚¬μš©μ΄ λ˜λ‚˜μš”?

값이 μ—†λŠ” 경우λ₯Ό μ œμ™Έν•  λ•Œμ—λŠ” NOT 을 μΆ”κ°€ν•΄ μ΄μš©ν•©λ‹ˆλ‹€.
SELECT *
FROM ν…Œμ΄λΈ”_이름
WHERE νŠΉμ„±_1 IS NOT NULL;
ORDER BY
λŒλ €λ°›λŠ” 데이터 κ²°κ³Όλ₯Ό μ–΄λ–»κ²Œ μ •λ ¬ν•˜μ§€μ— λŒ€ν•œ 선택적 ν•­λͺ©μž…λ‹ˆλ‹€.

κΈ°λ³Έ 정렬은 μ˜€λ¦„μ°¨μˆœμž…λ‹ˆλ‹€.

SELECT *
FROM ν…Œμ΄λΈ”_이름
ORDER BY νŠΉμ„±_1;

-- μ˜ˆμ‹œ
SELECT *
FROM employees
ORDER BY employees.EmployeeId;
λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œλ„ μ •λ ¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

SELECT *
FROM ν…Œμ΄λΈ”_이름
ORDER BY νŠΉμ„±_1 DESC;

-- μ˜ˆμ‹œ
SELECT *
FROM employees
ORDER BY employees.EmployeeId DESC;
LIMIT
λŒλ €λ°›λŠ” 데이터 κ²°κ³Ό 갯수λ₯Ό μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μΏΌλ¦¬λ¬Έμ—μ„œ μ‚¬μš©μ„ ν•  λ•Œμ—λŠ” λ§ˆμ§€λ§‰μ— μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

데이터 κ²°κ³Ό 갯수λ₯Ό 200개 ν•œμ •μœΌλ‘œ μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

SELECT *
FROM ν…Œμ΄λΈ”_이름
LIMIT 200;

-- μ˜ˆμ‹œ
SELECT *
FROM customers
LIMIT 10;
DISTINCT
μœ λ‹ˆν¬ν•œ 값듀을 λ°›κ³  싢을 λ•Œμ—λŠ” SELECT 뒀에 λΆ™μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

νŠΉμ„±_1 κΈ°μ€€μœΌλ‘œ μœ λ‹ˆν¬ν•œ κ°’λ“€λ§Œ μ„ νƒν•©λ‹ˆλ‹€.

SELECT DISTINCT νŠΉμ„±1
FROM ν…Œμ΄λΈ”
이름;

-- μ˜ˆμ‹œ
SELECT DISTINCT employees.Title
FROM employees;
νŠΉμ„±_1, νŠΉμ„±_2, νŠΉμ„±_3 의 μœ λ‹ˆν¬ν•œ 'μ‘°ν•©' 값듀을 μ„ νƒν•©λ‹ˆλ‹€.

SELECT
DISTINCT
νŠΉμ„±1
,νŠΉμ„±_2
,νŠΉμ„±_3
FROM ν…Œμ΄λΈ”
이름;
INNER JOIN
μ„œλ‘œ κ³΅ν†΅λœ λΆ€λΆ„μœΌλ‘œλ§Œ μ—°κ²°ν•©λ‹ˆλ‹€.

INNER JOIN μ΄λ‚˜ JOIN 으둜 μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

SELECT *
FROM ν…Œμ΄λΈ”_1
JOIN ν…Œμ΄λΈ”_2 ON ν…Œμ΄λΈ”_1.νŠΉμ„±_A = ν…Œμ΄λΈ”_2.νŠΉμ„±_B;

-- μ˜ˆμ‹œ
SELECT
c.FirstName || ' ' || c.LastName AS 'Customer Name',
e.Firstname || ' ' || e.LastName AS 'Employee Name'
FROM customers AS c
JOIN employees AS e ON c.SupportRepId = e.EmployeeId;
OUTER JOIN
Outer JOIN 은 λ‹€μ–‘ν•œ 선택지가 μžˆμŠ΅λ‹ˆλ‹€.

μ €ν¬λŠ” 기본적인 'left inclusive', 'right inclusive', 'full outer join' 을 λ³Ό κ²ƒμž…λ‹ˆλ‹€.

LEFT INCLUSIVE 은 LEFT OUTER JOIN 으둜 진행을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

SELECT *
FROM ν…Œμ΄λΈ”_1
LEFT OUTER JOIN ν…Œμ΄λΈ”_2 ON ν…Œμ΄λΈ”_1.νŠΉμ„±_A = ν…Œμ΄λΈ”_2.νŠΉμ„±_B
RIGHT INCLUSIVE 도 λΉ„μŠ·ν•˜κ²Œ RIGHT OUTER JOIN 으둜 진행할 수 μžˆμŠ΅λ‹ˆλ‹€.

SELECT *
FROM ν…Œμ΄λΈ”_1
RIGHT OUTER JOIN ν…Œμ΄λΈ”_2 ON ν…Œμ΄λΈ”_1.νŠΉμ„±_A = ν…Œμ΄λΈ”_2.νŠΉμ„±_B
sqlite μ—μ„œλŠ” RIGHT OUTER JOIN / FULL OUTER JOIN 을 μ§€μ›ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μˆœμ„œλ₯Ό λ°”κΎΈμ–΄ LEFT JOIN 을 μ΄μš©ν•˜λŠ” 방법을 μ‚¬μš©ν•©λ‹ˆλ‹€.

μ—¬λŸ¬ 개 써보기
이제 각 λͺ…λ Ήμ–΄λ₯Ό ν†΅ν•©ν•΄μ„œ μ‹€ν–‰ν•΄λ³΄λŠ” μ—°μŠ΅μ„ ν•˜κ² μŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ 'Brazil' μ—μ„œ 온 고객듀을 λ„μ‹œλ³„λ‘œ 묢은 뒀에 각 λ„μ‹œ μˆ˜μ— 따라 λ‚΄λ¦„μ°¨μˆœ μ •λ ¬ ν›„ CustomerId 에 따라 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œ 결과의 3개만 λ°›λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€.

ν•˜μ§€λ§Œ κΌ­ ν•˜λ‚˜μ˜ λͺ…λ Ήμ–΄λ§Œ 정닡이 μ•„λ‹μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜ SQL 쿼리문을 μ–΄λ–»κ²Œ λ‹€λ₯΄κ²Œ μ“Έ 수 μžˆμ„κΉŒμš”?

SELECT c.CustomerId, c.FirstName, count(c.City) as 'City Count'
FROM customers AS c
JOIN employees AS e ON c.SupportRepId = e.EmployeeId
WHERE c.Country = 'Brazil'
GROUP BY c.City
ORDER BY 3 DESC, c.CustomerId ASC
LIMIT 3;

[reference]

ER λ‹€μ΄μ–΄κ·Έλž¨ / ERD 기호 및 ν‘œκΈ°λ²•

0개의 λŒ“κΈ€