PRIMARY KEY
vs. UNIQUE
PRIMARY KEY
테이블의 각 row를 구분해주는 값이 들어가는 column. 주민등록번호와 같은 값이다. 한 테이블에서 두 개 이상의 row가 동일한 PK
를 가질 수는 없다.
UNIQUE
마찬가지로 두 개 이상의 row가 동일한 값을 가져서는 안 되는 column. 다만 PK
와 차이점은 PK
는 테이블 당 하나의 column만 지정할 수 있지만 UNIQUE
는 여러 column에 지정할 수 있다. 이런 column은 대체키(Alternative Key)로도 사용할 수 있다.
WHERE
vs. HAVING
WHERE
각 row에 조건을 걸 때 사용한다.
HAVING
집계된 그룹(SUM
, AVG
, COUNT
등)에 조건을 걸 때 사용한다.
예를 들어 학생의 이름(name), 반(class), 나이(age)가 적힌 테이블(student)이 있다고 가정하자.
name | class | age |
---|---|---|
Soo | 1반 | 5 |
May | 2반 | 7 |
나이가 10살 이상인 학생을 확인하려면 각 학생 row마다 확인하는 것이므로 WHERE
을 사용한다.
SELECT name, class
FROM student
WHERE age >= 10;
결과
name class April 6반 June 4반
만약 반에 소속된 학생의 평균 나이가 10살 이상인 반을 확인하려면 집계된 정보(AVG(age)
를 확인하는 것이므로 HAVING
을 사용한다.
SELECT class, AVG(age)
FROM student
GROUP BY 1 -- SELECT에서 선택한 column명을 숫자로 대신 표기할 수 있다.
HAVING AVG(age) >= 10;
결과
class AVG(age) 2반 10 5반 11
SQL은 각 쿼리 절(clause)의 순서에 매우 민감해서 이를 무시하면 결과가 나오지 않을 수도 있다. 올바른 순서는 다음과 같다.
SELECT col1, AVG(col3) AS average
CASE
WHEN col2 > 0 THEN 'positive'
WHEN col2 < 0 THEN 'negative'
ELSE 'zero'
END AS 'position'
FROM table1
JOIN table2 ON ...
WHERE table1.col1 = 'something'
GROUP BY col1
HAVING AVG(col3) < 5
ORDER BY col1
LIMIT 100;
SELECT Col_name AS Newname
AS
는 alias의 약자로 별칭을 만들어주는 절이다. 위 코드를 실행하면 Col_name을 Newname로 바꾸어 보여준다. 다만 실제 테이블에서 Col_name이 Newname로 바뀌는 것이 아니라 결과만 그렇게 보이는 것이다.
주의할 것은 별칭(Newname)을 WHERE
등 다음 단계의 쿼리에서 사용할 수 없다는 점이다. 즉 SELECT Col_name AS Newnmae ORDER BY Newname
과 같은 쿼리가 불가능하다. 쿼리에서 별칭을 사용하고 싶다면 서브쿼리를 따로 만들어야 한다. 구체적인 방법은 이 블로그 참조