SQL: 프로그래머스

MUUU·2022년 3월 11일
0

MS_SQL & TABLEAU

목록 보기
6/7

-동물수 구하기: 중복제거, null값 제거

SELECT COUNT(DISTINCT NAME) 
FROM ANIMAL_INS 
WHERE NAME IS NOT NULL

-LIMIT 1 : 값 하나만 반환

-고양이와 개는 몇마리 있을까

SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) 
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE
  • 동명동물 수 찾기
SELECT NAME, COUNT(NAME) FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME) > 1 
ORDER BY NAME
  • group by 이후의 조건절은 where가 아닌, having
  • 입양시각구하기
SELECT HOUR(DATETIME) AS 'HOUR', COUNT(HOUR(DATETIME)) AS 'COUNT' 
FROM ANIMAL_OUTS 
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) <= 19 
GROUP BY HOUR(DATETIME) 
ORDER BY HOUR(DATETIME)
  • HOUR라는 집계함수가 있다!
  • 입양시각구하기2
SET @hour := -1; -- 변수 선언
SELECT (@hour := @hour + 1) as HOUR,
(SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour) as COUNT
FROM ANIMAL_OUTS
WHERE @hour < 23

: 안해도 될거같은데 이런게 있다...

  • NULL 처리하기
SELECT ANIMAL_TYPE, 
IFNULL(NAME, "No name") AS NAME, SEX_UPON_INTAKE 
FROM ANIMAL_INS

-없어진 기록찾기

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

왼: OUTS
오: INS

  • 있었는데요 없었습니다
-- 코드를 입력하세요
SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME FROM ANIMAL_INS 
LEFT JOIN ANIMAL_OUTS ON ANIMAL_INS.ANIMAL_ID=ANIMAL_OUTS.ANIMAL_ID 
WHERE ANIMAL_INS.DATETIME>ANIMAL_OUTS.DATETIME 
ORDER BY ANIMAL_INS.DATETIME
  • 오랜기간 보호한 동물(1)
SELECT A.NAME, A.DATETIME
FROM ANIMAL_INS A 
LEFT JOIN ANIMAL_OUTS B ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL
ORDER BY A.DATETIME
LIMIT 3
  • 보호오세어 중성화한 동물
SELECT B.ANIMAL_ID, B.ANIMAL_TYPE, B.NAME
FROM
    (
    SELECT *
    FROM ANIMAL_INS A
    WHERE SEX_UPON_INTAKE LIKE "%Intact%"
    ) SQ1, ANIMAL_OUTS B
WHERE SQ1.ANIMAL_ID = B.ANIMAL_ID
AND B.SEX_UPON_OUTCOME NOT LIKE "%Intact%"

-루시와 엘라찾기

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE FROM ANIMAL_INS 
WHERE NAME in ("Lucy", "Ella" , "Pickle" , "Rogan" , "Sabrina" , "Mitty")
ORDER BY ANIMAL_ID
  • in 연산자는 여러값을 반환

-이름에 EL이 들어가는 동물 찾기

-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS
WHERE NAME LIKE "%el%" AND ANIMAL_TYPE="Dog"
ORDER BY NAME

-중성화여부 파악하기

SELECT ANIMAL_ID, NAME, 
CASE
 WHEN SEX_UPON_INTAKE LIKE '%Neutered%' OR SEX_UPON_INTAKE LIKE '%Spayed%'
 THEN 'O'
 ELSE 'X' END as '중성화'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
  • 오랜기간 보호한 동물
SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS A, ANIMAL_OUTS B
WHERE A.ANIMAL_ID = B.ANIMAL_ID
ORDER BY B.DATETIME-A.DATETIME DESC
LIMIT 2

-DATETIME에서 DATE로 변경

SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') as '날짜'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

-순위함수
RANK: 1 222 5
DENSE RANK: 1 222 33
ROW NUMBER: 동점이어도 1 2 3 4 5

NTITLE: 뒤에 적는 숫자만큼 등분하기
PARTITION BY: 직급별 순위

NVL(columns, exp1) : NULL값이면 exp1값으로 변환
NULLIF

ROLLUP
CUBE : CUBE가 더 많이 보여줌


데이터모델링: 추상화/ 단순화/ 명확성
개념적모델링(ERD, 전사적관점, 추상화수준 높음)/ 논리적모델링(정규화를 통해 재사용성 높임)/물리적모델링
데이터모델의 3가지관점: 데이터/ 프로ㅔ스/ 데이터와프로세스
피터첸: ERD
엔터티: 유형/ 개념/ 사건
엔터티: 기본 중심 행위

데이터중복제거: 정규화
3층스키마: ANSI표준
논리적독립성; 개념스키마 무영향
물리적독립성: 응용프로그램 변화없음

외부스키마(사용ㅈ관점, 응용프로그램 접근)/개념스키마(통합데이터베이스구조,설계자관점)/내부스키마(개발자관점, 물리적구조)

관계차수: 카디널리티
1:N: 한명의고객은 여러계좌 개설가능
필수 |---0 선택

카디널리티: 하나의 릴레이션에서 튜플의 전체갯수

슈퍼키:: 유일성만족/ 최소성 불만족(NOT NULL)
후보키: 유일성/ 최소성 둘다 만족


정규화: 제5정규화까지 있지만 제3정규화까지 하는 편=> 테이블분리
이상현상

제1정규화: 원자성확보. 기본키설정
제2정규화: 기본키 2개이상,, 부분함수 종속성제거 (생략가능)
제3정규화: 기본키 제외한 칼럼간에 종속성(수직). 이행함수종속성 제거
: 주식별자과 연관성낮음
BCNF: 기본키를 제외하고 후보키가 잇는 경우,,, 중첩

NESTED LOOP: 이중FOR문... => 인덱스, 옵티마이저, 반정규화(데이터를 중첩)

반정규화: 조회속도는 향상, 데이터모델 유연성은 낮아짐
: 클러스터링

반정규화 기법
1)계산된칼럼추가
2)테이블수직분할
3)테이블수평분할 ( 파티션기법): 특정값의 범위에 따라 분할
4)테이블병합: 슈퍼타입/ 서브타임: 부모자식

트랜잭션: 작업처리단위
원자성: 전부또는 일부 실행
일관성: 모순되지 않을것
고립성: 연산중간결과 다른 트랜잭션 접근불가
연속성: 성공시 영구적 보장

CASCADE: 연속적으로 :: 참조무결성 준수가능
(ON DELETE CASCADE: 따라서 삭제)

VIEW: 뷰에 대한 입력, 수정, 삭제 시 제약발생/ 보안성 향상
뷰는 변경불가. 삭제 후 재생성 ALTER 불가

ORDER BY ENAME, SAL DESC: ENAME은 오름차순, SAL은 내림차순 정렬
NVL(col, 0) 널값이면 0으로 변환
NVL2(col, 1,0) 널값아니면1, 널값이면0으로 반환
COALESCE: 널값아니면 1 반환 (NVL과 유사)
COALESCE(NULL,2,1): 널값아니면 2반환..?

NULLIF(exp1, exp2): 두 값이 같으면 널값, 다르면 exp1 반환

GROUP BY
HAVING 조건
ORDER BY 정렬

COUNT() 널값 제외하고 계산
DISTINCT 고유한 값만

DECODE: IF 문
DECODE (DEPTNO, NULL, 전체합계, DEOPTNO): DEPTNO가 NUL값이면 전체합계, 아니면 DEPTNO 출력
CASE
WHEN THEN
ELSE
END

ROWNUM: 논리적인 일렬번호 행수 (ROW NUMBER)와 분명히 다름
결과집합에 따른 가상의 순번
ROWID: 신기한 고유 ID번호

WITH 서브쿼리

GRANT ON TO PREFERENCES: 제약조건
GRANT WITH ADMIN OPTION: 절대권한
REVOKE 회수

COUNT(*): NULL값 포항 행수
COUNT(MGR) : NULL값 제외한 행수 계산

UNION: 중복된 데이터를 제거하여 합친다. 정렬발생
UNION ALL: 중복없이 그냥 합친다
CROSS JOIN; 카테시안 곱

계층형조회: LPAD
LEVEL =1 의미없음(ROOT값) LEVEL=2 4칸 공백
계층형 조회에서 가장 상위레벨: 1

서브쿼리에서 FROM절: 인라인뷰
멀티로우섭쿼리: 겨롸가 모두 동일하면 TRUE: ALL
한행만 반환: 스칼라 섭쿼리
ROLLUP: GROUP BY 칼럼에 대해서 SUBTOTAL 만들어 줌

GROUPING: 계산되면 1반환 그렇지않으면 0반환
ROLLUP (DEPTNO,JOB): 부서별, 부서별직업별, 전체합계
CUBE(DEPTNO, JOB): 전체합계, 직업별, 부서별, 부서별직업별
GROUPING SETS(DEPTNO, JOB): 직업별합계, 부서별합계 :: 각각의 그룹으로: 서로관계가 없다


윈도우함수: 행과 행간의 관계 정의
SELECT WINDOW_FUNC(ARGS)
OVER (PARTITION BY col
ORDER BY WINDOWING절) FROM table

LAG: 이전행 가져옴
LEAD: 특정위치 행 가져옴

CUME_DIST: 현재행보다 작거나 같은건수 누적백분율 , 누적분포 0~1
PERCENT_RANK: 제일먼저 나온 늦게나온, 백분율로
NTILE: N등분
RATIO_TO_REPORT:SUM에 대한 행 별 칼럼 백분율을 소수점까지 조회

RANGE PARTITION: 값의범위 기준
LIST PARTITION: 특정값 기준
HASH PARTITION:\ GOTLGKATNDLDYD

-옵티마이저 조인: SQL 실행계획 수립

HASH JOIN: EQUI 조인에서만 실행된다, 동등조건으로 할 수 있다. 작은 테이블을 HASH 메모리에
NESTED_LOOP_JOIN: 프로그래밍에서 사용되는 중첩된 반복문과 유사한 방식으로 조인을 수행하는 방식. RANDOM ACCESS 가장많이 발생
SORT MERGE 조인: SORT_AREA라는 공간에 두개의 테이블을 로딩

HIGH WATER MARK: 데이터가 저장된 최상위 위치

LOCAL non-prefixed partition index: a,b로 다르면 non-prefixed

TRUNCATE: 로그기록 없이, 외래키 무결성 확인않고 LOCK 취득후 빠르게 삭제. 자동 커밋,ROLLBACK 불가

CONNECT BY: CONNECT BY ISLEAF는 LEAF면 1 아니면 0

교집합: INTERSECT

UPPER LOWER: 대문자 소문자

트랜잭션 특징이 아닌것은? 독립성

윈도우함수

profile
데이터분석

0개의 댓글