SQL(Structured Query Language)은, 데이터베이스에서 정보를 저장하고 처리하기 위한 프로그램 언어이다. R의 dplyR 문법과 비슷하다고 해서 흥미가 생겼고, SQL 할 줄 알아야 직무 확장성이 생긴다는(!) 선배 말씀에 호다닥 기초부터 다져보고자 한다.
이때, 테이블과 필드 이름은 소문자만 가능하며, 공백이 없어야 한다. 또, 테이블명과 필드명을 통틀어 중복이 없어야 한다.
(+) 쿼리 작성 후 마지막에는 세미 콜론(;)을 찍어준다!
아래와 같은 형태의 테이블이 있다고 가정하자.
SELECT 필드명: 특정 필드를 골라 나타낸다.
#1 그냥 고르기
SELECT 제목
FROM 영화;
#2 고르고 이름 바꾸기
SELECT 제목 as 영화제목
FROM 영화;
COUNT(필드명): 레코드 수를 센다.
SELECT COUNT(DISTINCT 연도) AS
FROM 영화;
SELECT 연도
FROM 영화
WHERE 연도=2023;
SELECT 연도
FROM 영화
WHERE 연도=2023;
AND / OR / BETWEEN : 여러 개의 조건 다룸
#1
SELECT 제목
FROM 영화
WHERE 연도 > 1994
AND 연도 < 2000;
#2 (#1과 같은 의미)
SELECT 제목
FROM 영화
WHERE 연도 BETWEEN 1994 and 2000;
#3
SELECT *
FROM 영화
WHERE 연도 > 2000
AND 연도 < 2010
AND 국가 = '한국';
LIKE / NOT LIKE / IN
LIKE "표현식": 표현식을 만족하는 문자
NOT LIKE "표현식": 표현식을 만족하지 않는 문자
IN (a,b,c): 괄호 안에 포함되는 문자 (숫자 등 다른 데이터 타입도 가능)
%: 0개 이상의 문자
_: 문자 1개
ex) 이름의 세번째 문자가 t?
WHERE 이름 LIKE '__t%'
ex) 1920,1930,1940 중 하나?
WHERE 연도 IN (1920,1930,1940)
NULL: 누락되거나, 알 수 없는 값 (missing value)
#1
SELECT COUNT(예산) AS 예산_정제
FROM 영화;
#2
SELECT COUNT(예산) AS 예산_정제
FROM 영화
WHERE 예산 IS NOT NULL;
```
=> 위 두 코드를 통해 동일한 결과를 얻을 수 있음!
<필드 내 연산>
AVG(필드명), SUM(필드명), MIN(필드명), MAX(필드명), COUNT(필드명)
Q. 예산이 1,000,000원 이상인 영화들의 예산 간 합을 구하라.
SELECT SUM(예산)
FROM 영화
WHERE 예산>1000000;
<레코드 내 연산>
SELECT 이익 - 예산 as 순이익
FROM 영화
WHERE (이익-예산) > 0;
💡실행 순서는 코드 적는 순서와 달리 FROM -> WHERE -> SELECT 이므로, WHERE에는 SELECT에서 바꾼 이름 사용 불가그룹 짓지 않을 필드를 SELECT하면 오류 발생
그룹 지은 후 필터링하려면 HAVING 사용
Q. 연도별 영화 이익 합을 구하라.
(단, 이익이 1,000,000 이상인 영화를 대상으로 합을 구하며, 합이 10,000,000 이상인 연도만을 나타내라. 합 기준 내림차순으로 정렬하며, 상위 5개 연도만 나타내라.)
SELECT 연도, SUM(이익) AS 이익합
FROM 영화
WHERE 이익 > 1,000,000
GROUP BY 연도
HAVING SUM(이익) > 10,000,000
ORDER BY 이익합
LIMIT 5;
💡실행 순서는 코드 적는 순서와 달리 FROM -> WHERE -> GROUP BY -> HAVING - SELECT -> ORDER BY -> LIMIT 이므로, HAVING에는 SELECT에서 바꾼 이름 사용 불가