Computer Science/데이터베이스

코딩테스트를 위한 MySQL 문법 정리

돌돌김 2021. 1. 12. 01:18

간혹가다 코딩테스트를 보는 기업들 중, SQL 문제가 1문제씩 나오는 기업들이 있다.(ex. SK C&C, 현대 IT&E, 은행권)

 

MySQL은 정보처리기사 시험공부나 데이터베이스 전공시간에만 다루고 실무에서 사용하지 않는 이상 취준생이라면 잘 만질일이 없다.

 

 

 

SQL 관련 문제는 프로그래머스를 참고하면 좋다. 시험보기 1~2주전 한번 다 풀어보면 좋다.

 

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

 

만약 이걸 다 풀었다면 해커랭크에서도 문제를 풀어 볼 수 있다.

 

 

 

Solve SQL Code Challenges

A special-purpose language designed for managing data held in a relational database.

www.hackerrank.com

 

 

 

MySQL 정리

 

 

IF

  • select, where 절 에서 사용가능

    SELECT IF(10 > 5, '크다', '작다') AS result;
    

 

 

Order By

  • Order by 뒤에 우선순위가 있는 열을 순서대로 적는다.

 

 

LIKE

  • where 절과 함께 특정 패턴을 검색할 때 사용

    SELECT *
    FROM Student
    WHERE Student_ID like 'a%';
    
    LIKE 'a%' // a로 시작되는 모든 것
    LIKE 'a_%_%' // a로 시작되고 최소 3이상의 길이를 가진 것
    LIKE '_a%' // 두번째 자리에 a가 들어가는 모든 것
    

 

 

IN

  • where절 내 여러 값을 설정하고자 할 때 사용

  • 연산 속도가 상대적으로 빠름

  • or 연산과 유사한 효과

    select *
    from Customers
    where country in ('UK', 'Korea') // Customers 중 country가 UK이거나 KOREA인 것 다 뽑기
    
  • 문제 : 동물 보호소에 들어온 동물 중 이름이 'Lucy, Ella, Pickle, Rogan, Sabrina, Mitty'인 동물의 아이디와 이름, 성별 및 중성화 여부를 조회하는 SQL 문을 작성해주세요.

    select ANIMAL_ID, NAME, SEX_UPON_INTAKE
    from ANIMAL_INS ani
    where NAME in ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty');
    

 

 

Between

  • where 절 내 검색 조건으로 범위를 지정하고자 할 때 사용
  • betweenand 사이에 들어 가는 값은 ~이상 ~ 이하 이다
select *
from products
where price between 10 and 20;

select *
from products
where price not between 10 and 20;

select *
from products
where (price between 10 and 20) and not  id in(2,3); // 이렇게 쓸 수도 있다

 

 

Null의 처리

Ifnull 사용

SELECT ANIMAL_TYPE, IFNULL(NAME,'No name') AS NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS

coalesce 사용

SELECT ANIMAL_TYPE, coalesce(NAME,'No name') AS NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS

coalesce는 정의된 열 중 null이 아닌 첫번째 값을 화면에 출력.
coalesce('a', 'b')인 경우, 가장 왼쪽이 null이 아닌 'a'이다. 그러므로 a가 출력이 된다.
coalesce(null, 'b', 'c')인 경우, 'b'가 출력된다.

 

 

Case 문

CASE

​ WHEN 조건1 THEN '조건1 반환값'

​ WHEN 조건2 THEN '조건2 반환값'

​ ELSE '충족되는 조건 없을때 반환값'

END

생긴건 swtich .. case 와 비슷하게 생겼다. WHEN .. THEN은 쌍으로 같이다녀야하고 조건을 여러개 추가 할 수 있다.

 

SELECT, WHERE, ORDER BY 절에서 사용 가능하고 보통 SELECT 절에서 많이 쓰인다.

ELSE를 생략하면 결과 값이 NULL이 나오므로 주의

SELECT 
    seq, 
    CASE
        WHEN (u.seq BETWEEN 1 AND 3) THEN 
            CASE 
                WHEN (u.enabled IS TRUE) THEN 'A+'
                ELSE 'A0'
            END 
        WHEN (u.seq BETWEEN 4 AND 6) THEN
            CASE 
                WHEN (u.enabled IS TRUE) THEN 'B+'
                ELSE 'B0'
            END
        ELSE 'C+'
    END AS case_result
FROM `user` u

 

 

Limit

// 조건식이 있는 경우
SELECT 열명 
FROM 테이블명 
WHERE 조건식 
LIMIT 행수     

// 조건식이 없는 경우
SELECT 열명
FROM 테이블명
LIMIT 행수                  


// 지정한 숫자 개수 리턴
SELECT *
FROM
LIMIT 0,3; // 0번부터 3개

 

 

Group By

  • 집계함수와 함께 사용 되어, 결과를 지정한 칼럼에 따라 그룹으로 묶고자 할 때 사용

    select count(id)
    from customers
    group by country // 각 도시에 사는 사람이 몇명인지

 

 

MIN(), MAX(), COUNT(), AVG(), SUM()

  • 집계함수

  • select 에서 사용

    • count : null은 숫자로 세지 않는다.
    select count(id) from products;
    select avg(price) from products;
    select sum(price) from products;
  • 문제 : 평균 잔고(balance) 가 700이상인 지점의 이름과 평균 잔고를 구하라

    select branch_name, avg(balance)
    from account
    group by branch_name 
    having avg(balance) >= 700;

 

 

Union

  • select의 칼럼 리스트를 기준으로 두 개 이상의 질의 결과를 하나의 테이블로 합치고자 할 때 사용
  • 기본적으로 중복값을 제거한다.
  • 중복값을 포함하고 싶은 경우 union all을 사용한다.
select *
from customers
union
select city from orders
order by city;

 

 

Join

INNER JOIN : 교집합

select test1.number 
from test1 join test2 on test1.number = test2.number;
  • 결과 : 3

  • test1 과 test2 의 number 컬럼을 서로 비교하여 중첩되는 값이 존재하면 test1.number 컬럼의 중첩 값만 출력한다.

  • 동일 테이블의 조인 결과를 구할 때도 쓴다.

    우유와 요거트를 동시에 구입한 장바구니가 있는지 알아보려 합니다. 우유와 요거트를 동시에 구입한 장바구니의 아이디를 조회하는 SQL 문을 작성해주세요. 이때 결과는 장바구니의 아이디 순으로 나와야 합니다.

select distinct c.cart_id 
from cart_products c inner join cart_products p on(c.cart_id=p.cart_id) 
where (c.name='우유' and p.name='요거트') or (c.name='요거트'and p.name='우유') 
order by c.cart_id;

 

LEFT JOIN : 왼쪽 기준

select test1.number 
from test1 left join test2 on test1.number = test2.number;
  • 결과 : 3 2 1

  • test1(왼) 과 test2(오) 의 number 컬럼을 서로 비교하여 중첩되는 값이 존재하면 왼쪽 테이블(test1)의 number 컬럼의 값을 출력한다.

 

RIGHT JOIN : 오른쪽 기준

# test1.number 컬럼을 출력하는 경우
select test1.number 
from test1 right join test2 on test1.number = test2.number;

# test2.number 컬럼을 출력하는 경우
select test2.number 
from test1 right join test2 on test1.number = test2.number;

결과1 : 3 null null
결과2 : 3 4 5

  • left join 과 마찬가지로 중첩되는 값을 기준으로 오른쪽 테이블의 number 컬럼 값을 출력한다.

 

 

OUTER JOIN : 매칭되는 값이 없어도 출력

select test1.*, test2.number 
from test1 
left outer join test2 
on test1.number = test2.number;

결과 : 3 c 3 / 2 b null / 1 a null ( 3line )

  • 조건에 부합하지 않는 test2.number (test1.number 가 1, 2 일때 해당 테이블의 값은 null 이지만 null로 출력되게끔 join됨 )
  • OUTER JOIN 에도 LEFT, RIGHT, FULL 가 있는데 이는 INNER JOIN과 마찬가지로 왼쪽, 오른쪽 기준 매칭되는 값이 없어도 모두 출력함