SQL 명령어

ho's·2022년 7월 4일
0

🐋 SQL 명령어에 대해 알아보자

🔍 TRUNCATE

TRUNCATE는 ( , ) , 뒤의 숫자만큼 소수점을 나타낸다.
뒤의 숫자가 음수 일 경우에, 소수 점 자리에서 앞으로 한칸씩 0을 표시하면서 표기한다.

SELECT * FROM price; 를 하면 아래와 같이 나온다.

위에서 가격에 대한 정보를 좁혀보자

SELECT Price FROM Products
WHERE TRUNCATE(Price,0) = 12;

Price가 12.xxx인 정보들을 불러오게 된다.

🔍 CONCAT

CONCAT - 괄호 안의 내용 이어붙임

SELECT CONCAT('O-ID: ', OrderID) FROM Orders;

SELECT CONCAT('언제 태어났니?' , BirthDate) FROM Employees;

CONCAT_WS(S, ...) 괄호 안의 내용 S로 이어붙임

🔍 데이터 변경하기

LEFT, SUBSTR, RIGHT

TRIM - 공백을 없애 준다.

검색시 사용자도 모르게 공백을 포함할 수 있는 경우에 TRIM을 이용하면 잘못 검색해도 공백없이 검색이 된다.

SELECT * FROM Categories
WHERE CategoryName = TRIM(' Beverages '); 

REPLACE - 정보의 내용을 수정한다.

SELECT 
	REPLACE(Description, ',' ,' and')
    FROM Categories;

위의 사진 처럼 나온다. 하지만 and가 2번 나오는 것을 알수 있다. 위의 sql문을 실행하기 전에 먼저 and, 로 바꾸자.

CONVERT - 자료형을 변환해준다.

SELECT
	'01' = '1',
    CONVERT('01', DECIMAL) = CONVERT('1', DECIMAL);

DECIMAL은 SQL에서 숫자자료형 중 하나이다.

DATE, TIME - 문자열을 시간으로 바꿔준다.

	'2021-6-1' = '2021-06-01',
    DATE('2021-6-1') = DATE('2021-06-01'),
    '1:2:3' = '01:02:03',
    TIME('1:2:3') = TIME('01:02:03');

배운 내용을 종합해서 사용해보자.

SELECT
	OrderDate,
    CONCAT(
    CONCAT_WS(
    	'/',
        YEAR(OrderDate), MONTH(OrderDate), DAY(OrderDate)
    ),
    ' ',
    UPPER(LEFT(DAYNAME(OrderDate), 3))
    )
FROM Orders;

위와 같이 내가 원하는 형태로 데이터를 재조직할 수 있다!

🔍 IF문

IF(조건 , T , F)

  • 조건이 참이라면 T, 거짓이라면 F 반환
SELECT IF( 1 > 2, '1은 2보다 크다.' , '1은 2보다 작다.');

CASE

CASE의 활용

SELECT
IF (Price > 30, 'Expensive' , 'Cheap'),
CASE 
	WHEN Price < 20 THEN '저가'
    WHEN Price BETWEEN 20 AND 30 THEN '일반'
    ELSE '고가'
END
FROM Products;

🔍 GROUP BY

  • 각 데이터의 내용들을 겹치져지지 않게 묶는 쿼리문
SELECT CategoryID FROM Products
GROUP BY CategoryID;

SELECT * FROM Customers;

위와 같이 고객정보가 나타난다.
나라별, 도시별로 GROUP BY 를 해보자!

SELECT
	Country, City,
    CONCAT_WS(', ' , City, Country)
FROM Customers
GROUP BY Country, City;

좀 더 복잡한 예제

select * from Products

  • 각각의 ProductID 마다, QuantitySum을 구해보자.
SELECT
	ProductID,
    SUM(Quantity) AS QuantitySum
FROM OrderDetails
GROUP BY ProductID
ORDER BY QuantitySum DESC;

좀 더 복잡한 예제2

  • Product테이블에서 CategoryID로 묶은 후, 최댓값, 최솟값, 중간값((최대+최소)/2), 평균값을 구해보도록 하자.
SELECT
	CategoryID,
    MAX(Price) AS MaxPrice,
    MIN(Price) AS MinPrice,
    TRUNCATE((MAX(Price) + MIN(Price)) / 2,2) AS MedianPrice,
    TRUNCATE(AVG(Price),2 ) AS AveragePrice
FROM Products
GROUP BY CategoryID;

좀 더 복잡한 예제3 - ROLLUP

  • ROLLUP은 총합을 나타내준다.
    사용 방법은 sql문 끝에
WITH ROLLUP;

을 해준다.

SELECT
	ProductID,
    SUM(Quantity) AS QuantitySum
FROM OrderDetails
GROUP BY ProductID
WITH ROLLUP;

위의 사진과 같이 맨 아래부분에 공백이 주어진다.

ROLLUP을 사용할때 ORDER BY와는 함께 사용할 수 없다.

🔍 HAVING - 그룹화된 데이터 걸러내기

예제1

Suppliers 테이블에서 Country로 묶고 조건을 주어주자.

SELECT
	Country, COUNT(*) AS Count
    FROM Suppliers
    GROUP BY Country
    HAVING Count <= 3;

예제2

SELECT
	COUNT(*) AS Count, OrderDate
FROM Orders
WHERE OrderDate > DATE('1996-12-31')
GROUP BY OrderDate
HAVING Count > 2;

위의 sql문의 처리과정은
1. WHERE문이 먼저 처리가 된다. 즉, OderDate가 1996-12-31보다 이후인 것들만 불러오게 된다.
2. OrderDate로 GROUPBY해준다.
3. count>2 인 경우에만 처리해준다.

🔍 DISTINCT - 중복된 값을 제거한다.

  • GROUP BY와 달리 집계함수가 사용되지 않는다.
  • GROUP BY와 달리 정렬하지 않으므로 더 빠르다.

DISTINCT는 정렬되지 않지만 ORDER BY를 통해 정렬할 수 있다.

SELECT DISTINCT Country
FROM Cusotmers
ORDER BY Country;

GROUP BY와 DISTINCT 함께 사용하기

SELECT
	Country,
    COUNT(DISTINCT CITY)
FROM Customers
GROUP BY Country;

  • 만약에 아래와 같은 sql문을 작성한다면 위의 결과와 달라질 것이다.
SELECT
	Country,
    COUNT(*)
FROM Customers
GROUP BY Country;

그 이유는 DISTINCT를 사용하지 않고 *를 사용하면 중복을 허락하고 같은 도시여도 카운트하기 때문이다.

profile
그래야만 한다

0개의 댓글