[SQL] 자주 사용하는 SQL 정리

Junseo Kim·2021년 3월 26일
0

계속 추가할 예정입니다!


테이블 관련

테이블 생성

CREATE TABLE 테이블명 (
    column명 datatype,
    column명 datatype,
    ...
);
// 예제 
CREATE TABLE customers ( 
    customer_id int NOT NULL,
    customer_name char(50) NOT NULL,
    address char(50),
    city char(50),
    state char(25),
    zip_code char(10),
    CONSTRAINT customers_pk PRIMARY KEY (customer_id)
);

조회 결과로 테이블 생성

CREATE TABLE 생성할 테이블명 AS SELECT * FROM 기존 테이블명;
// 예제
CREATE TABLE tmp_customers AS SELECT * FROM Customers;

테이블 Column 명 변경

ALTER TABLE 테이블명 RENAME COLUMN 예전 이름 TO 바꿀 이름;
// 예제
ALTER TABLE tmp_customers RENAME COLUMN CustomerName TO Name;

테이블 삭제

DROP TABLE 테이블명;
// 예제
DROP TABLE tmp_customers;

데이터 조회

SELECT 
    columnAS 별칭, 
    column, 
    ... 
FROM 
    테이블명 
WHERE 
    조건식
// 예제
SELECT
    CustomerName AS 이름,
    Address
FROM
    Customers
WHERE
    City = 'Berlin';

LIKE

WHERE 절에 사용 가능

LIKE '%hello'; // 앞 내용이 무엇이든 끝이 hello인 모든 요소

LIKE 'hello%'; // 앞은 무조건 hello로 시작하고 끝은 상관 없는 모든 요소

LIKE '%hello%'; // 앞과 뒤는 상관없으나 중간에 무조건 hello가 포함되어 있는 모든 요소
// 예제
SELECT 
    * 
FROM 
    table 
WHERE 
    text LIKE 'SQL%';

LIKE의 반대인 NOT LIKE도 존재한다.

// 예제
SELECT 
    Country,
    City,
    Address,
    PostalCode
FROM 
    Suppliers
WHERE
    Address NOT LIKE '%.%'; // Address에 .이 포함되지 않은 모든 요소

BETWEEN a AND b

a와 b를 포함한 모든 사이값들

// 예제
SELECT
    *
FROM
    Products
WHERE
    CategoryId BETWEEN '1996-07-01' AND '1996-07-05';

IN

괄호안의 list 값 중 하나라도 일치하는 모든 요소.

// 예제
SELECT
    *
FROM
    Orders
WHERE
    OrderDate IN(5, 6); // OrderDate가 5나 6인 모든 요소 

데이터 가공

CONCAT

문자열 합치기

// 예제
SELECT 
    CONCAT(LastName, ' ', FirstName) AS FullName
FROM 
    Employees;

SUBSTRING

문자열 자르기

// 예제
SELECT 
    SUBSTRING(BirthDate, 1, 4) // 1부터 4개 자르기
FROM 
    Employees;

데이터 집계

데이터 수

SELECT 
    COUNT(*)
FROM 
    Employees;

중복 제거

SELECT 
    COUNT(DISTINCT Country) 
FROM 
    Customers;

GROUP BY

데이터를 그룹화하여 집계함수에 넘겨줄 때 사용. 지정한 Column 이외의 Column은 반드시 집계함수를 사용해야함. 사용하지 않으면 SELECT DISTINCT와 같은 효과를 보임.

SELECT 
    Country, 
    COUNT(*) AS CountByCountry
FROM 
    Customers 
GROUP BY 
    Country; 
// Customers 에서
// Country 별로 그룹화 한 후
// Country와 각 Country 수를 가져옴

GROUP BY 로 그룹화 한 이후에는 WHERE 절로 조건을 걸 수 없다. 이 경우 HAVING을 사용한다.(집계함수는 WHERE절에서 사용 불가)

SELECT 
    Country, 
    COUNT(Country) AS CountByCountry 
FROM 
    Customers
WHERE
	Country <> 'Germany'
GROUP BY 
    Country 
HAVING 
    COUNT(Country) = 1;
// Customers 에서
// Contry가 Germany가 아닌 요소들을 
// Country 별로 그룹화 한 후
// Country 수가 1인 요소들의
// Country와 각 Country 수를 가져옴

JOIN(복수의 테이블 다루기)

INNER JOIN

sql문에 그냥 JOIN으로 사용할 때 적용되는 JOIN. 집합의 교집합이다. ON 명령어와 함께 사용한다.

// 예제 
SELECT
    Products.ProductId AS `상품아이디`,
    Products.ProductName AS `상품이름`,
    SUM(OrderDetails.Quantity) AS `총수량`
FROM
    Products
        JOIN OrderDetails
            ON Products.ProductID = OrderDetails.ProductId
GROUP BY
    `상품아이디`
HAVING
    `총수량` >= 200
ORDER BY `총수량` DESC;

LEFT JOIN

왼쪽 집합에만 있는 것과, 집합의 교집합을 합친것. RIGHT JOIN과 반대

// 예제
SELECT
    Customers.CustomerID AS `고객아이디`,
    Customers.CustomerName AS `고객이름`,
    SUM(OrderDetails.Quantity) AS `주문량`
FROM
    Customers
        LEFT JOIN Orders
            ON Customers.CustomerID = Orders.CustomerID
        LEFT JOIN OrderDetails
            ON Orders.OrderID = OrderDetails.OrderID
GROUP BY
    Customers.CustomerID
ORDER BY `주문량` DESC;

RIGHT JOIN

오른쪽 집합에만 있는 것과, 집합의 교집합을 합친것. LEFT JOIN과 반대

// 예제 
SELECT
    Customers.CustomerID AS `고객아이디`,
    Customers.CustomerName AS `고객이름`,
    SUM(OrderDetails.Quantity) AS `주문량`
FROM
    OrderDetails
    	RIGHT JOIN Orders
            ON OrderDetails.OrderID = Orders.OrderID
        RIGHT JOIN Customers
            ON Orders.CustomerID = Customers.CustomerID
GROUP BY
    Customers.CustomerID
ORDER BY `주문량` DESC;

0개의 댓글