[ICT인턴십] SQL관련 학습 2

김유상·2022년 10월 19일
0

ICT인턴십

목록 보기
3/21

집계 함수 조건

집계 함수를 이용한 수식은 HAVING절에서만 가능하다.

WHERE SUM(CNT) = 1000

위 와 같은 수식은 적절한 SQL문으로서 작동하지 않는다.

제대로 작성한 SQL문을 아래에 남긴다.

SELECT NAME, SUM(CNT)
FROM GS_PRVCNTR
GROUP BY NAME
HAVING SUM(CNT) = 
(SELECT MAX(SUM(CNT))
FROM GS_PRVCNTR
GROUP BY NAME)

SELF INNER JOIN 사용하기

image.png

위 사진과 같은 테이블에서 SELF JOIN을 사용할 만한 합리적인 이유를 찾아냈다!

만약에 연도에 따라 변하는 다른 컬럼의 값을 비교하고 싶은 경우

-> N년의 FIRST_OFFENSE 값과 N+1년의 FIRST_OFFENSE값을 비교해 더 큰 값을 가지는 레코드를 검색하고 싶을 때

JOIN 조건을 아래와 같이 명시하면 해당 조건의 자체 테이블 검색이 가능해진다.

SELECT T1.year, T2.first_offense
FROM STS_CRIMINAL_CONVICTIONS_SEXUAL_VIOLENCE_CRIMES_POLICE AS T1
JOIN STS_CRIMINAL_CONVICTIONS_SEXUAL_VIOLENCE_CRIMES_POLICE AS T2
ON T1.year = T2.year+1
WHERE T1.first_offense > T2.first_offense

같은 테이블 내에 인접 레코드의 정보와 비교할 일은 언제든지 생긴다. 이처럼 JOIN 조건을 활용하면 인접 레코드를 검색, 비교할 수 있다는 점을 알아두자!

서브 쿼리 ANY 사용하기

ANY 키워드는 WHERE 조건절에서 서브 쿼리를 사용할 때, 서브 쿼리에 N개의 레코드가 검색되어 1:N의 조건식이 표현될 때 사용할 수 있다.

ANY를 서브 쿼리 앞에 작성하면 N개의 레코드 중 1개씩 조건에 대입해서 계산해준다.

SELECT T1.year
  FROM GENDER_STS_SEXUAL_VIOLENCE_CRIME_CRIMINALS_POLICE AS T1
  JOIN STS_CRIMINAL_CONVICTIONS_SEXUAL_VIOLENCE_CRIMES_POLICE AS T2
    ON T1.year = T2.year
 WHERE T1.year = ANY(
    SELECT T1.year
    FROM STS_CRIMINAL_CONVICTIONS_SEXUAL_VIOLENCE_CRIMES_POLICE AS T1
    JOIN STS_CRIMINAL_CONVICTIONS_SEXUAL_VIOLENCE_CRIMES_POLICE AS T2
    ON T1.year = T2.year+1
    WHERE T1.ex_convict > T2.ex_convict
 )

위 쿼리를 확인하면 알 수 있듯이 특정 year에 대해서 검색된 서브 쿼리 레코드를 각각 비교한 결과를 전달한다.

ABS 함수

SQL에서는 ABS 함수를 통해 절댓값을 구할 수 있다.

SELECT T1.year, T1.doctor_male, T1.doctor_female
  FROM MOHW_LICENSE_MEDICAL_ACCEPTANCE AS T1
  JOIN NUM_SOCIAL_WORKER_CERTIFICATES_ISSUED_MOHW_YEAR AS T2
    ON T1.year = T2.year
 WHERE ABS(T2.first_class_man - T2.first_class_woman) > ABS(T2.second_class_man - T2.second_class_woman)
   AND T1.year < 2010

위 쿼리처럼 어떤 수치 값을 ABS()로 씌우면 해당 값의 절댓값을 반환해주어 차이를 계산해야 할 때 유용하게 활용할 수 있다.

profile
continuous programming

0개의 댓글