요약
MySQL
실습
- MySQL의 관리/개발 도구인 'MySQL Workbench'에서 진행
구문 실행 순서
SELECT gender, COUNT(*) AS emp_count
FROM employee
WHERE retire_date IS NULL
GROUP BY gender
ORDER BY gender DESC;
- (2)-(3)-(4)-(1)-(5)
- 'ORDER BY'가 가장 마지막으로 실행: 'SELECT'에서 지정한 별칭(emp_count)을 사용 가능
집계 과정에서 NULL 처리
HAVING 절
- 'GROUP BY'한 결과에 대한 조건
- 논리적 DB에 대해 동작
- 성능에 영향을 줄 수 있으므로 되도록 쓰지 않는 것을 권장
- 'WHERE': 'GROUP BY'이전에 대한 조건 지정 -> 물리적 DB에 대해 동작
- 'SELECT'에서 지정한 별칭 사용 불가(SELECT보다 먼저 실행됨)
SELECT emp_id, COUNT(duration) AS cnt
FROM vacation
WHERE begin_date = '20171231'
GROUP BY emp_id
HAVING COUNT(duration) >= 3;
ORDER BY gender DESC;
순위함수
함수 | 순위 결과 | 문법 |
---|
RANK() | 1, 2, 2, 4 | RANK() OVER(순위기준) AS 새 컬럼명 |
DENSE_RANK() | 1, 2, 2, 3 | DENSE_RANK() OVER(순위기준) AS 새 컬럼명 |
ROW_NUMBER() | 1, 2, 3, 4 | ROW_NUMBER() OVER(순위기준) AS 새 컬럼명 |
nTILE(num) | 1, 1, 2, 2, 3, 3 | NTILE(num: 그룹으로 나눌 정수) OVER (순위기준) AS 새 컬럼명 |
PARTITION BY [컬럼1] ORDER BY [컬럼2]
0과 NULL의 순위
- 음수의 존재를 생각하면 쉬움
- 순위: 0 > 음수 > NULL
ELT 함수
ELT(숫자, '값1', '값2', '값3')
DML - INSERT
- 모든 열의 정보가 순서대로 나열될 경우 열 이름을 생략 가능
- 하지만, 가독성을 위해 열 정보 지정을 권장
INSERT INTO 테이블명(열1, 열2, ...)
VALUES (값1, 값2, ...), (), (), ...
DML - UPDATE
UPDATE 테이블명
SET 변경 내용
WHERE 행 조건
- 여러 번의 UPDATE는 'SAFE UPDATE' 기능에 의해 막힐 수 있음 -> 설정 변경 필요
테이블 복사하기
CREATE TABLE 테이블명
SELECT * FROM 원본 테이블
DML - DELETE
DELETE FROM 테이블명
WHERE 삭제 조건
- 모든 행(테이블)을 지워야하는 경우 'TRUNCATE'가 더 빠름
JOIN
종류 | JOIN 기준 | 기타 |
---|
(INNER) JOIN | 양쪽 모두(교집합) | 디폴트 JOIN |
LEFT OUTER JOIN | 왼쪽 기준 | |
RIGHT OUTER JOIN | 오른쪽 기준 | |
FULL OUTER JOIN | 양쪽 모두(합집합) | MySQL에는 없음 |
CROSS JOIN | 양쪽 모두 (교차가능한 모든 경우의 수) | 구문에 'ON'이 없음 |
하위 쿼리
- 괄호 안에 또 다른 쿼리문이 있는 것
- 'JOIN'문보다 작성이 쉬운 장점
EXISTS 함수
- 서브쿼리의 내용이 있는지 없는지만 확인하는 함수
EXISTS(서브 쿼리)
'NOT'과 함께 쓰이는 경우
NOT LIKE
NOT IN
NOT BETWEEN
IS NOT NULL
NOT EXISTS
마무리
- JOIN과 서브쿼리를 잘 사용하는 것이 SQL에서 중요한 것 같음