[sql] Programmers sql 연습

Kyumin Park·2022년 7월 13일
1
post-custom-banner

헤비 유저가 소유한 장소

HOST_ID 별로 COUNT가 1개보다 많은 경우 SELECT 후 결과 먼저 보고

SELECT 
    HOST_ID,
    COUNT(*) AS COUNT
FROM 
	PLACES
GROUP BY 
	HOST_ID
HAVING 
	COUNT(*)>1

SELECT 
    ID,
    NAME,
    HOST_ID
FROM
    PLACES
WHERE 
    HOST_ID IN 
    (SELECT HOST_ID FROM PLACES
    GROUP BY HOST_ID HAVING COUNT(*)>1)
ORDER BY ID

느낀점

  • 어떤 모양의 테이블이 나와야 하는지 먼저 생각 or 그림그려본 후에 쿼리문을 짜는 것이 도움이 많이 되었음.
  • 한번에 쿼리문 완성시키려 하지 말고 단계단계 한 다음에 서브쿼리로 집어넣는 것이 더 효율적인듯 서브쿼리 성능문제는요...?
  • GROUB BY 에서 조건을 걸고싶을때는 HAVING을 사용하자
  • IN 명령어는 유용하다

없어진 기록 찾기 - 입양 간 기록은 있는데 입양 온 기록이 없는 경우의 데이터 찾아보기

SELECT
    OUTS.ANIMAL_ID,
    OUTS.NAME
FROM 
	ANIMAL_OUTS OUTS
LEFT OUTER JOIN
	ANIMAL_INS INS
ON
	OUTS.ANIMAL_ID = INS.ANIMAL_ID
WHERE
	INS.ANIMAL_ID IS NULL
ORDER BY
	OUTS.ANIMAL_ID

느낀점

  • in,out과 같이 sql 예약어로 이미 사용중인 것들이 있으니까 테이블 별칭도 잘 써야함
  • outer join은 합집합 느낌 , inner join은 교집합 느낌?
  • join 선언 전에 있는 것이 좌 테이블, 선언 후는 우 테이블
  • join 선언시 사용하는 방향이 기준 테이블임
    예) left outer join 인 경우에는 왼쪽 테이블을 기준으로, 오른쪽 테이블 값이 없으면 null 표시

cf ) 별다른 명시 없이 join만 쓰면 inner join이 default
left/right를 명시하는 경우에는 무조건 outer join임
예 ) left join = left outer join 임
right join = right outer join 임

동명 동물 수 찾기 - GROUP BY, HAVING 연습

SELECT
   NAME, 
   COUNT(NAME) AS COUNT
FROM
   ANIMAL_INS
WHERE 
   NAME IS NOT NULL
GROUP BY 
	NAME
HAVING 
	COUNT(NAME)>1
ORDER BY 
	NAME

느낀점

  • GROUP BY 에서 조건을 걸려면 HAVING을 쓴다.
  • HAVING에서 AND 연산자로 조건 여러개를 하는 방식은 지원을 하지 않는 듯.
  • GROUP BY 앞에 WHERE 연산자로 조건을 추가할 수 있음

예시 )

SELECT
    	GROUP BY 절에 지정한 컬럼,
        위 컬럼별로 집계할 컬럼 또는 값
    FROM
    	TABLEWHERE 
    	조건
    GROUP BY 
    	그룹으로 묶을 컬럼 값
    HAVING 
    	조건

위에서 WHERE과 HAVING은 조건이 따로 없으면 생략 가능
GROUP BY 뒤에 오는 조건절은 WHERE이 아닌 HAVING임!

post-custom-banner

0개의 댓글