SQL 잔잔한 팁

Soo Im·2021년 5월 29일
0

잔잔한 팁

목록 보기
3/5

1. PRIMARY KEY vs. UNIQUE

PRIMARY KEY
테이블의 각 row를 구분해주는 값이 들어가는 column. 주민등록번호와 같은 값이다. 한 테이블에서 두 개 이상의 row가 동일한 PK를 가질 수는 없다.
UNIQUE
마찬가지로 두 개 이상의 row가 동일한 값을 가져서는 안 되는 column. 다만 PK와 차이점은 PK는 테이블 당 하나의 column만 지정할 수 있지만 UNIQUE는 여러 column에 지정할 수 있다. 이런 column은 대체키(Alternative Key)로도 사용할 수 있다.

2. 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

3. Query 순서

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;

4. 별칭(alias) 사용시 주의할 점

SELECT Col_name AS Newname

AS는 alias의 약자로 별칭을 만들어주는 절이다. 위 코드를 실행하면 Col_name을 Newname로 바꾸어 보여준다. 다만 실제 테이블에서 Col_name이 Newname로 바뀌는 것이 아니라 결과만 그렇게 보이는 것이다.
주의할 것은 별칭(Newname)을 WHERE다음 단계의 쿼리에서 사용할 수 없다는 점이다.SELECT Col_name AS Newnmae ORDER BY Newname과 같은 쿼리가 불가능하다. 쿼리에서 별칭을 사용하고 싶다면 서브쿼리를 따로 만들어야 한다. 구체적인 방법은 이 블로그 참조

0개의 댓글