반응형
Intro
이번에 MySQL문법을 따르는, table에서 정보를 검색하는 query를 정리하겠습니다.
최근 코딩테스트에서 SQL문제가 나오는 경우가 많은데, 아래 명령어들을 참고해서 문제를 해결하는 연습을 해보면 좋을거 같습니다.
추천 사이트: 프로그래머스
기초 query (제 기준ㅎㅎ)
SELECT
- 기본 형식
SELECT col_name
FROM table_name; - 중복 제거 검색
SELECT DISTINCT col_name - 개수 검색 ##합: SUM, 평균: AVG
SELECT COUNT(col_name) - UNIQUE값 개수 검색
SELECT COUNT(DISTINCT col_name) - 검색 결과 중 n개만 보기
Query 마지막에 LIMIT n; - NULL값 채우기: IFNULL( , )
SELECT IFNULL(col_name, 0)
ORDER BY
- 기본 형식
SELECT col_name, column1, column2
FROM table_name
ORDER BY
column1 [ASC|DESC], ##1순위 정렬
column2 [ASC|DESC], ##2순위 정렬
...; - 실행 순서
FROM -> SELECT -> ORDER BY - FIELD: 정렬할 때 숫자나, 알파벳 순으로 정렬하지 않고, 정렬 순서를 지정하고 싶을 때 사용
ORDER BY FILED ([col_name], priority1, priority2, …, );
WHERE
- 기본 형식
SELECT lastname, firstname
FROM employees
WHERE condition1 (AND/OR condition2 AND/OR condition3 ….)
ORDER BY firstname;
A. AND가 OR보다 우선 순위임, OR먼저 하려면 괄호를 사용해야함 - 실행 순서
FROM -> WHERE -> SELECT -> ORDER BY - BETWEEN - 범위 조건에 사용
WHERE officeCode BETWEEN 1 AND 3 - LIKE - %, _을 이용해서 패턴 매칭, %은 문자열 길이 상관 X, _은 1글자만 가능
WHERE lastName LIKE ‘%son’ ## lastName이 son으로 끝나는 사람 조회 - IN – membership 조건
WHERE officeCode IN (1, 2, 3) - IS (NOT) NULL – NULL 있(없)는지 확인
WHERE officeCode IS (NOT) NULL - CAST- 형 변환에 사용
CAST('2003-01-01' AS DATE) ##string to date variable
MIN(), MAX()
- MIN
SELECT MIN(Price) AS SmallestPrice
FROM Products; - MAX
SELECT MAX(Price) AS LargestPrice
FROM Products;
Aliases (AS)
- 이름을 바꿀 때 사용, 이때, 바꿀 이름에 띄어쓰기가 있으면 “”이나 []로 감싸야함
고오급 query (제 기준ㅎㅎ)
INDEX
- 역할
A. DB를 full-scan하지 않고 자주 필요한 정보를 빠르게 찾기 위해서 위치를 저장해 놓음 - 사용 예시: CREATE INDEX index_category ON book_store(category)
A. 테이블 book-store의 컬럼 category에 대해서 인덱스 index_category생성
B. 이후 SELECT * FROM book_store WHERE category = 'java'할 때 full-scan없이 탐색 가능 (category가 ‘java’인 instance에 id를 통해 바로 접근 가능)
JOIN
- 역할
A. 공통 컬럼을 기준으로 2개 이상의 테이블의 instance (컬럼까지)를 합치는 연산 - 사용 예시
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID; - INNER JOIN
A. 대상 테이블들에 공통된 값을 가진 instance들을 합침
B. 3개 이상의 테이블에 대해서 join을 할 때는, 계산 효율성을 따져서 하나씩 join - LEFT (RIGHT) JOIN
A. 기준 테이블의 모든 instance를 유지한 채로, 매칭되는 값이 있는 다른 테이블의 값을 가져오는 JOIN, 매칭되지 않은 instance의 다른 테이블 컬럼 값은 NULL이 된다. - FULL OUTER JOIN
A. JOIN에 참여하는 모든 테이블의 instance를 합침, 결과가 매우 커질 수 있음
B. 최소 크기는 JOIN에 참여하는 테이블 중 가장 큰 테이블, 최대는 모든 테이블의 합 - SELF JOIN
A. 자기 자신과 하는 JOIN, JOIN을 쓰지 않음
B. 기본 형태
SELECT column_name(s)
FROM table1 T1, table1 T2 ## 같은 테이블에 대한 다른 aliases
WHERE condition;
C. 예시
SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID AND A.City = B.City
ORDER BY A.City;
UNION
- 여러 개의 SELECT문으로부터 나온 결과의 합집합을 보여주는 명령어 (행 방향 CONCAT)
- 단, 두 SELECT문의 컬럼 순서가 달라도 무조건 붙여서 보여주기 때문에 주의해야함
- 기본 예시
SELECT City, Country FROM Customers
WHERE Country='Germany'
UNION ## UNION ALL로 하면 중복 제거 없이 보여줌
SELECT City, Country FROM Suppliers
WHERE Country='Germany'
ORDER BY City; - UNION하는 두 결과를 구분하고 싶을 때
SELECT 'Customer' AS Type, ContactName, City, Country
FROM Customers
UNION
SELECT 'Supplier', ContactName, City, Country
FROM Suppliers;
DATE_FORMAT
- 날짜를 지정한 형식으로 출력
- 예시
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d') AS DATE
FROM DUAL
IF
- IF(조건, ‘참인 경우 출력’, ‘거짓인 경우 출력’)
- 예시
SELECT user.seq, IF(user.seq <= 3, 'A', IF(user.seq <=6, 'B', 'C')) AS if_result
FROM user - Case문 변환
SELECT user.seq,
CASE
WHEN (user.seq <= 3) THEN 'A'
WHEN (user.seq BETWEEN 4 AND 6) THEN 'B'
ELSE 'C' - END AS case_result
FROM user
GROUP BY
- The GROUP BY statement is often used with aggregate functions (COUNT, MAX, MIN, SUM, AVG) to group the result-set by one or more columns.
- 예시 (ShipperName별 주문 수를 확인하기 위한 query)
SELECT Shippers.ShipperName, COUNT(Orders.OrderID) AS NumberOfOrders
FROM Orders
LEFT JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID
GROUP BY ShipperName;
HAVING
- The HAVING clause was added to SQL because the WHERE keyword could not be used with aggregate functions. -> aggregated function의 결과에 조건을 명시할 때 사용
- 예시
SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrders
FROM Orders
INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
WHERE LastName = 'Davolio' OR LastName = 'Fuller'
GROUP BY LastName
HAVING COUNT(Orders.OrderID) > 25;
ANY, ALL
- WHERE, HAVING절과 함께 사용
- ANY
A. Subquery의 row 중 조건을 만족하는 row가 1개 이상이면 true
B. 예제
SELECT ProductName
FROM Products
WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE Quantity = 10); - SELECT DISTINCT(ProductName)
FROM Products
INNER JOIN OrderDetails ON Products.ProductID = OrderDetails.ProductID
WHERE OrderDetails.Quantity = 10; - ALL
A. Subquery의 모든 row가 조건을 만족하면 true
WITH (CTE, Common Table Expressions)
- Single statement의 범위 안에서 존재하는 임시 결과 set
- CTE사용을 위해선 WITH 명령어를 함께 사용, ‘,’로 구분해서 세부 내용 채우기
A. 기본 형태
WITH [RECURSIVE]
cte_name [(col_name [, col_name] ...)] AS (subquery)
[, cte_name [(col_name [, col_name] ...)] AS (subquery)] - i. Recursive는 여러 cte중 하나라도 recursive인게 (cte가 자기 자신 참고) 있으면 명시해야함
B. 예시
WITH
cte1 AS (SELECT a, b FROM table1),
cte2 AS (SELECT c, d FROM table2)
SELECT b, d FROM cte1 JOIN cte2
WHERE cte1.a = cte2.c;
cte_name [(col_name [, col_name] ...)] AS (subquery)
i. 각 CTE (cte1, cte2)는 ; 이전의 어디에서나 reference될 수 - RECURSIVE CTE
A. 예시
WITH RECURSIVE cte (n) AS (
SELECT 1
UNION ALL # 행방향 concat
SELECT n + 1 FROM cte WHERE n < 5
)
SELECT * FROM cte;
마무리
다음에는 본격적인, TABLE에서 정보를 추출하기 위한 Query에 대해서 정리하겠습니다!
References
반응형
'[기타]' 카테고리의 다른 글
[기타 - 유닛 테스트(Unit test)란? (0) | 2021.07.25 |
---|---|
[기타 - 독시젠(Doxygen) 사용법(1)] (0) | 2021.05.31 |
개발자 취업 준비 추천 사이트 (구글, 원티드 ) (0) | 2021.05.23 |
[기타 - Call by value vs Call by reference] (0) | 2021.05.05 |
[MySQL] 기본 명령어(1) - DB, Table 관리 (2) | 2021.05.01 |