HomePostAbout
thumbnail
SQL 실전 압축 정리본
Tip
SQL
2024.11.06.

최근 여러 기업의 코딩테스트를 준비하다 보니, SQL도 준비할 필요를 느꼈습니다!
여러 블로그와 사이트를 찾으며 모은 정보를 다음과 같이 공유합니다. 😎
참고 블로그 출처는 아래 Source를 확인하세요!

기본 SELECT


-- 가독성을 위해 각 문법의 내용을 모두 합쳤습니다.
-- 아래 질의문 통째로는 사용하지 않습니다!

SELECT 
    *                                   -- 모든 요소
    price, bookname                     -- 특정요소
    price AS p                          -- 이름 변경, 공백 또는 특수 문자 포함시 "" 넣어주면 됨.
    price p                             -- 생략 가능
    DISTINCT publisher                  -- 중복 비허용
    SUM(price)                          -- 집계 함수
    AVG() COUNT() MAX() MIN()           -- 그룹 없이도 사용가능
    UPPER(bookname) LOWER(bookname)     -- 대소문자
    SUBSTR(city, 1, 3)                  -- 3번째 글자까지
    CONCAT(a, b)                        -- 2개 연결
    ROUND(AVG(price),0)                 -- 소수 첫 번째 자리에서 반올림
    -- DATE_OF_BIRTH 를 "%Y(소문자의 경우 뒤에 두글자)-%m(대문자의 경우 영어)-%d(대문자의 경우 th)" 형태로
    DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') DATE_OF_BIRTH  


    -- GROUP BY의 경우
    custid, COUNT(*) AS total_c, SUM(price) AS total_p -- custid(고객) 마다 구매 총 갯수, 합계 금액
    custid, SUM(discount*price) AS total_p             -- 집계함수 내 연산 가능
    -- ONLY_FULL_GROUP_BY 활성화시 오류 발생! GROUP_BY가 아닌 컬럼 price가 포함되어서
    -- ONLY_FULL_GROUP_BY 비활성시 임의의 값 반환. 대부분 그룹 내 첫번째 행 값
    custid, price                                      

 
FROM Book b                             -- 약칭 사용 가능

WHERE -- GROUP BY 이전에 적용
    price < 20000                       -- =, <>(!=), <, <=, >, >= 사용 가능
    price IN (10000, 20000, 30000)      -- (a = b) OR의 연속
    bookname LIKE '파이썬 입문'          -- '파이썬 입문' 와 동일한 값.
    bookname = '파이썬 입문'
    WHERE bookname LIKE '%자바%';       -- 특정 단어를 포함하는 경우
    bookname LIKE '_바%'                -- 왼쪽 두 번째 위치에 ‘바’라는 문자열을 갖는 경우
    price IS NULL
    price IS NOT NULL
    (price < 20000) AND (bookname LIKE '파이썬 입문')
    MONTH(DATE_OF_BIRTH) = 3            -- DATE_OF_BIRTH 의 월이 3인 경우
    YEAR(), DAY(), HOUR(), MINUTE(), SECOND(), WEEK()

    -- 서브 쿼리
    price > (SELECT MAX(price) FROM Book WHERE bookname LIKE '파이썬 입문')
    SELECT * FROM (SELECT column1 FROM table1) AS sub_table;    -- 별칭 설정해주기

GROUP BY
    -- GROUP BY 로 묶고 그냥 출력하면 마지막 것만 남는다. 마치 DISTINCT 처럼 작동.
    custid
    o.USER_ID, o.PRODUCT_ID             -- 2개를 기준으로 묶기도 가능!

HAVING -- GROUP BY 이후에 적용
    count(*) >= 2                       -- custid(고객)중 row(구매한 도서)가 2개 이상인 경우

ORDER BY 
    price DESC, publisher ASC;          -- 내림차순 price, 오름차순 publisher

LIMIT
    10                                  -- 상위 10개만 조회
    2 OFFSET 3                          -- 3번째 데이터부터 2건만 조회
;                                       -- 마지막에 세미콜론 권장

JOIN

-- where 기반 간단 join
SELECT b.name country_name, a.language, a.isofficial, a.percentage
FROM countrylanguage a, country b
WHERE a.countrycode = b.code AND a.countrycode = 'KOR'  -- 단일 인용부호''는 문자열

-- INNER JOIN
SELECT B.mem_id, M.addr                  -- mem_id 를 select 할시 오류 발생. 어느 mem_id인지 모름
FROM buy B
INNER JOIN member M
    ON B.mem_id = M.mem_id
WHERE B.mem_id = 'GRL'

-- OUTER JOIN
-- 두 테이블 중 한쪽에만 있는것도 출력하고 싶을때
SELECT M.mem_id, M.mem_name, B.prod_name, M.addr
-- LEFT 테이블
FROM member M           
-- RIGHT 테이블. LEFT RIGHT는 테이블 순서만 바꾸면 된다. FULL은 전부
LEFT OUTER JOIN buy B                   -- LEFT에 있는건 모두 나오도록 함. 없는 값에 대해서는 NULL
    ON B.mem_id = M.mem_id
ORDER BY M.mem_id

-- CROSS JOIN : 카테시안 곱, 대용량 데이터를 만들때 사용함. 조건 없는 INNER와 동일

-- SELF JOIN : 조직도 등을 위해 설정
SELECT A.emp "직원", B.emp "직속상관", B.phone "상관연락처"                  -- mem_id 를 select 할시 오류 발생. 어느 mem_id인지 모름
FROM emp_table A
INNER JOIN emp_table B
    ON A.manager = B.emp
WHERE A.emp = '경리부장'                -- 이중 인용부호 "" 는 식별자

UNION

-- 서브쿼리로 활용 가능
(SELECT cost AS price FROM books1   -- 컬럼값을 동일하게 해준다. 서로 컬럼 갯수가 다르면 오류, 이름이 다르면 앞선거 기준
UNION                               -- UNION DISTINCT과 동일. 중복 비허용. 중복 허용은 UNION ALL
SELECT price FROM books2)

비트연산

-- A개발자 = 9    Python(1), C++(8)
-- B개발자 = 3    Python(1), C#(2)
-- C개발자 = 6    C#(2), 국어(4)
-- D개발자 = 8    C++(8)

-- & 2의 경우, C#를 사용가능한 개발자는 0보다 큰 정수 가 결과 값으로 나온다.
-- A개발자(9) & 2 = 1001 & 0010 = 0000 = 0
-- B개발자(3) & 2 = 0011 & 0010 = 0010 = 3
-- C개발자(6) & 2 = 0110 & 0010 = 0010 = 2
-- D개발자(8) & 2 = 1000 & 0010 = 0000 = 0

-- & 3(Python(1), C#(2))의 경우, Python or C# 하나라도 사용가능한 개발자는 0보다 큰 정수 가 결과 값으로 나온다
-- A개발자(9) & 3 = 1001 & 0011 = 0001 = 1
-- B개발자(3) & 3 = 0011 & 0011 = 0011 = 3
-- C개발자(6) & 3 = 0110 & 0011 = 0010 = 2
-- D개발자(8) & 3 = 1000 & 0011 = 0000 = 0

SELECT DISTINCT d.ID, d.EMAIL, d.FIRST_NAME, d.LAST_NAME    --둘 다 쓸줄 알면 id당 두줄이 되므로, 하나로 줄인다.
FROM DEVELOPERS d
JOIN SKILLCODES s
    ON ((d.SKILL_CODE & (s.CODE)) > 0) and ((s.NAME = 'Python') or (s.NAME = 'C#'))
ORDER BY d.ID

Source

Just an developer with drinks
2022 HyeonDong, Powered By Gatsby.