공부/Computer Science

[SQL] 코딩테스트를 위한 쿼리문 및 문법 정리

남쪽마을밤송이 2022. 10. 28. 00:21

 SELECT 

  • 찾을 컬럼
  • COUNT와 같은 함수를 사용할 때는 AS로 컬럼 이름을 정할 수 있음

 

 ORDER BY 

  • order by 뒤에 우선순위가 있는 열을 적음
  • 다중정렬 : 순서대로 정렬의 우선순위를 의미하며 2가지 이상의 필드를 조합하여 정렬할 수 있음
-- NAME 오름차순, 같을 경우 DATE 내림차순으로
ORDER BY NAME, DATE DESC

 

 GROUP BY 

  • 집계함수와 함께 사용되어 결과를 지정한 컬럼에 따라 그룹으로 묶을 수 있음
-- 각 도시에 사는 사람이 몇명인지 계산하여 출력
SELECT COUNT(id)
FROM customers
GROUP BY country;

 

 LIMIT 

  • 결과 개수 제한
-- NAME 순으로 오름차순 정렬된 테이블 가장 위에서부터 2개의 레코드 결과만 가져옴
ORDER BY NAME LIMIT 2

 

 DISTINCT 

  • 중복제거
-- 중복제거 된 NAME 개수
SELECT COUNT(DISTINCT NAME)

 

 IF 

  • SELECT, WHERE 절에서 사용
  • IF(조건, 해당할 때, 해당하지 않을 때) 의 형식
-- result 컬럼에 '크다' 출력
SELECT IF(10 > 5, '크다', '작다') AS result;

 

 LIKE 

  • WHERE 절과 함께 특정 패턴을 검색할 때 사용
  • %는 모든 문자열, 모든 길이를 의미
  • _는 한 글자를 의미
SELECT *
FROM Student
WHERE Student_ID like 'a%';

LIKE 'a%' -- a로 시작되는 모든 것
LIKE 'a_%_%' -- a로 시작되고 최소 3이상의 길이를 가진 것
LIKE '_a%' -- 두번째 자리에 a가 들어가는 모든 것

 

 IN 

  • WHERE 절 내 여러 값을 설정하고자 할 때 사용
  • 연산 속도가 상대적으로 빠름
  • or 연산과 유사한 효과
-- Customers 중 country가 UK이거나 KOREA인 것 모두 출력
SELECT *
FROM Customers
WHERE country IN ('UK', 'Korea');

 

 BETWEEN 

  • WHERE 절 내 검색 조건으로 범위를 지정하고자 할 때 사용
  • BETWEEN과 AND 사이에 들어가는 값은 ~ 이상 ~ 이하 범위
-- 가격이 10 이상 20 이하인 모든 상품 출력
SELECT *
FROM products
WHERE price BETWEEN 10 AND 20;

-- 응용
SELECT *
FROM products
WHERE (price BETWEEN 10 and 20) AND NOT id IN(2,3);

 

 IFNULL 

  • 결과 중 컬럼값이 NULL인 경우를 처리
-- NAME값이 NULL이면 'NO NAME'으로 변경
SELECT IFNULL(NAME, 'NO NAME')
...

 

 UNION 

  • SELECT의 컬럼 리스트를 기준으로 두 개 이상의 질의 결과를 하나의 테이블로 합치고자 할 때 사용
  • 기본적으로 중복값을 제거
  • 중복값을 포함하고 싶은 경우 UNION ALL을 사용
SELECT *
FROM customers
UNION
SELECT city FROM orders
ORDER BY city;

 

 INNER JOIN 

  • 교집합
-- test1 과 test2 의 number 컬럼을 서로 비교하여
-- 중첩되는 값이 존재하면 test1.number 컬럼의 중첩 값만 출력
SELECT test1.number 
FROM test1
JOIN test2
ON test1.number = test2.number;
  • 동일 테이블의 조인 결과를 구할수도 있음
-- 우유와 요거트를 동시에 구입한 장바구니의 아이디 출력
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 /  RIGHT JOIN 

  • 왼쪽 / 오른쪽 기준 병합
-- test1(왼)과 test2(오)의 number 컬럼을 서로 비교하여
-- 중첩되는 값이 존재하면 왼쪽 테이블(test1)의 number 컬럼의 값을 출력
SELECT test1.number 
FROM test1
LEFT JOIN test2
ON test1.number = test2.number;

 

 OUTER JOIN 

  • 매칭되는 값이 없어도 출력
  • OUTER JOIN에도 LEFT, RIGHT, FULL 세 종류가 있는데 이는 INNER JOIN과 마찬가지로 왼쪽, 오른쪽 기준 매칭되는 값이 없어도 모두 출력함
-- 조건에 부합하지 않는 test2.number도 null값으로 출력
SELECT test1.*, test2.number 
FROM test1 
LEFT OUTER JOIN test2 
ON test1.number = test2.number;

 

 

 집계함수 

  • SELECT에서 사용
  • 종류는 MIN, MAX, COUNT, AVG, SUM이 있음
SELECT COUNT(id) FROM products;
SELECT AVG(price) FROM products;
SELECT SUM(price) FROM products;

 

 기타함수 

  • 절댓값 : ABS
  • 올림 / 버림 / 반올림 : CEIL, FLOOR, ROUND
  • 제곱 : POW
SELECT ABS(-100) ...
SELECT CEIL(10, 1) ... -- 소수점 첫째자리에서 올림
SELECT FLOOR(10, 1) ... -- 소수점 첫째자리에서 버림
SELECT ROUND(10, 1) ... -- 소수점 첫째자리에서 반올림
SELECT POW(10, 2) ... -- 첫 번째 숫자를 두 번째 숫자만큼 제곱

 

출처

https://paris-in-the-rain.tistory.com/100

https://moonsbeen.tistory.com/375