Search
Duplicate
🙉

2장 - SQL 기초

상태
Done
생성자
2장 - SQL 기초

6강 - SELECT 구문

기본 문법

-- 필수 -- SELECT [DISTINCT] 속성이름() FROM 테이블이름() -- 옵션 -- [WHERE 검색조건()] [GROUP BY 속성이름] -- 일부 DBMS에는 없는 문법 -- [HAVING 검색조건()] -- HAVING은 GROUP BY가 있을 때만 사용 가능 -- [ORDER BY 속성이름 [DESC]]
SQL
복사

WHERE

WHERE 절에 조건으로 사용할 수 있는 술어
술어
연산자
비교
=, <, >, <=, >=
age > 20
범위
BETWEEN
age BETWEEN 20 AND 30 (20 이상 30 이하)
집합
IN, NOT IN
age IN (10, 20, 30)
패턴
LIKE
name LIKE ‘yub%’
NULL
IS NULL, IS NOT NULL
age IS NULL
복합조건
AND, OR, NOT
(age > 20) AND (name LIKE ‘yubchoi’)
%: 0개 이상의 문자
ex) WHERE name LIKE ‘%yub%’;: yub을 포함하는 문자열
_: 1개의 문자
ex) WHERE name LIKE ‘_u%’;: 두 번째 위치에 u가 들어가는 문자열

GROUP BY

GROUP BY를 통해 그룹을 나누면 집계가 가능하다.
집계 함수 이름
설명
COUNT
레코드 수
SUM
숫자의 합
AVG
숫자의 평균
MAX
최대값
MIN
최소값
SELECT floor, COUNT(*) FROM cabinet GROUP BY floor;
SQL
복사

HAVING

결과 집합에 또다시 조건을 걸어 선택하는 기능.
HAVING은 그룹화 또는 집계가 발생한 후 레코드를 필터링하는데 사용되고, WHERE은 그룹화 또는 집계가 발생하기 전에 레코드를 필터링하는데 사용된다.
SELECT floor, COUNT(*) FROM cabinet GROUP BY floor HAVING COUNT(*) >= 100;
SQL
복사

뷰와 서브쿼리

: 하나 이상의 테이블을 합하여 만든 가상의 테이블
-- 뷰 생성 -- CREATE VIEW 뷰이름 [필드이름()] AS -- 뷰 수정 -- CREATE OR REPLACE VIEW 뷰이름 [필드이름()] AS SELECT-- 뷰 삭제 -- DROP VIEW 뷰이름[,...]
SQL
복사
삭제 후 생성보단 수정을 하도록 하자. 뷰1을 생성한 후, 뷰1로 다시 뷰2, 뷰3, … 를 만들었을 때 삭제 시 문제 발생한다.
CREATE VIEW v_share_ban_history AS SELECT * FROM ban_history WHERE ban_type='SHARE';
SQL
복사
서브쿼리: 하나의 SQL문 안에 다른 SQL 문이 중첩된(nested) 쿼리
보통 데이터가 대량일 때 데이터를 모두 합쳐서 연산하는 조인보다 필요한 데이터만 찾아서 공급해주는 서브 쿼리가 성능이 더 좋다.
SELECT * FROM user WHERE user_id IN (SELECT user_id FROM ban_history); -- 서브쿼리를 상수로 전개할 수도 있다. -- SELECT * FROM user WHERE user_id IN (1, 2, 3, 4, 5);
SQL
복사
IN과 서브쿼리를 함께 사용하면 동적으로 상수 리스트가 생성되어 데이터가 바뀌어도 알아서 처리해준다.

7강 - 조건 분기, 집합 연산, 윈도우 함수, 갱신

CASE

CASE WHEN 평가식 THENWHEN 평가식 THEN... ELSEEND
SQL
복사
CASE는 식이므로 SELECT, WHERE, GROUP BY, HAVING, ORDER BY 구와 같이 어디에나 적을 수 있다.

집합 연산

UNION(합집합), INTERSECT(교집합), EXCEPT(차집합)
중복된 레코드는 제거된다. 중복을 제외하고 싶지 않다면 UNION ALL과 같이 ALL 옵션을 붙인다.

윈도우 함수

행과 행 간의 관계를 쉽게 정의하기 위해 만든 함수이다.
SELECT WINDOW_FUNCTION (ARGUMENTS) OVER ([PARTITION BY 속성이름] [ORDER BY 속성이름]) FROM 테이블이름;
SQL
복사
PARTITION BY: 전체 집합을 기준에 의해 소그룹으로 나눔
SELECT lent_type, count(*) OVER(PARTITION BY lent_type) FROM cabinet;
SQL
복사
ORDER BY: 어떤 항목에 대해 순위를 지정할지 기술
SELECT user_id, name, RANK() OVER(ORDER BY name DESC) AS name_rank FROM user;
SQL
복사

트랜잭션과 갱신

SQL의 갱신 작업은 INSERT(삽입), UPDATE(갱신), DELETE(제거)가 있다.
-- INSERT -- INSERT INTO 테이블이름[(속성리스트)] VALUES (값리스트); -- UPDATE -- UPDATE 테이블이름 SET 속성이름1=1[, 속성이름2=2, ...] [WHERE <검색조건>]; -- DELETE -- DELETE FROM 테이블이름 [WHERE 검색조건];
SQL
복사
예시
DELETE를 통해 모든 테이터를 삭제해도 테이블은 삭제되지 않는다. 테이블 자체를 삭제하고 싶다면 DROP TABLE을 이용한다.