(SQL) MySQL – 데이터 터치

  • by


규칙 만들기

SQL에서도 조건을 만들 수 있습니다.

IF 함수를 사용하여 조건을 만들면 좋지만 기본 구조는 다음과 같습니다.

IF(조건식, 참일 때 값, 거짓일 때 값)

IF 절은 주로 SELECT 절에서 사용되며 결과 값을 새 열로 반환합니다.

예를 들어, mypokemon 테이블의 이름과

공격력이 50 이상인 경우는 strong, 또는 weak로 표기한 attack_class를 취득하고 싶은 경우는, 다음과 같이 작성합니다.

SELECT name, IF(attack >= 50, 'strong', 'weak') AS attack_class
FROM mypokemon;

이렇게 하면 attack>=50이 참이면 strong 또는 weak로 표시됩니다.

데이터가 NULL인지 확인하는 것이 매우 중요합니까?

널값을 다른 값으로 채우기 위해 IFNULL 함수사용할 수 있습니다.

IFNULL((컬럼 이름), NULL일 때 값)

해당 열 값이 NULL인 행에 설정된 NULL이면 값을 반환합니다.

예를 들어, name 및 name 열에 NULL 값이 있으면 unknown과 적은 결과

full_name으로 가져오려면 다음과 같이 작성하십시오.

SELECT name, IFNULL(name, 'unknown') AS full_name
FROM mypokemon;

CASE

CASE 함수는 데이터를 구별할 때 사용할 수 있습니다.

두 가지 형식으로 나타낼 수 있습니다.

처음에는 조건식에 열 이름 포함하는 방법입니다.

CASE
    WHEN 조건식1 THEN 결과값1
    WHEN 조건식2 THEN 결과값2
    ELSE 결과값3
END

두 번째는 열 이름을 먼저 그리는 방법입니다.

CASE (컬럼 이름)
    WHEN 조건값1 THEN 결과값1
    WHEN 조건값2 THEN 결과값2
    ELSE 결과값3
END

ELSE는 생략할 수 있지만 생략하면 널값이 리턴됩니다.

예를 들어 보겠습니까?

이름과 공격력을 attack_class로 구분하여 가져옵니다.

공격력이 100 이상인 경우는 very strong, 60 이상 100 미만인 경우는 strong, 또는 weak 로 구분하려면 이와 같이 작성합니다.

SELECT name,
CASE
    WHEN attack >= 100 THEN 'very strong'
    WHEN attack >= 60 THEN 'strong'
    ELSE 'weak'
END AS attack_class
FROM mypokemon;

JOIN

JOIN는 문자 그대로 테이블끼리를 맞출 때 사용하는 키워드입니다.

가장 기본적으로 생각되는 JOIN 방식은 INNER JOIN 하지만 간단 집합라고 생각하십시오.

SELECT (컬럼 이름)
FROM (테이블 A 이름)
INNER JOIN (테이블 B 이름)
ON (테이블 A 이름).(컬럼 A 이름) = (테이블 B 이름).(컬럼 B 이름)
WHERE 조건식;

이와 같이 공통의 열에 근거해 조건을 걸어 조인할 수 있습니다.

더 쉽게 작성하는 방법도 있습니다.

SELECT (컬럼 이름)
FROM (테이블 A 이름), (테이블 B 이름)
WHERE (테이블 A 이름).(컬럼 A 이름) = (테이블 B 이름).(컬럼 B 이름)
AND (조건식)

따라서 FROM 절에 테이블 이름을 나란히 쓰고 WHERE 절에 조건을 지정하는 방법도 있습니다.

다음 LEFT OUTER JOIN그리고 RIGHT OUTER JOIN있습니다.

LEFT OUTER JOIN은 왼쪽 테이블을 기반으로 표시되며 오른쪽 테이블에 없는 데이터는 NULL로 표시됩니다.

RIGHT OUTER JOIN에서 오른쪽 테이블을 왼쪽으로 움직이면 결국 LEFT OUTER JOIN이 되므로

LEFT OUTER JOIN을 주로 사용하는 것 같습니다!

SELECT (컬럼 이름)
FROM (테이블 A 이름)
LEFT JOIN / RIGHT JOIN (테이블 B 이름)
ON (테이블 A 이름).(컬럼 A 이름) = (테이블 B 이름).(컬럼 B 이름) WHERE 조건식;

LEFT OUTER JOIN과 RIGHT OUTER JOIN도 마찬가지로 공통 열을 ON 절에 넣어 조인합니다.

두 테이블의 모든 값을 합산하려면 어떻게 해야 합니까?

불행히도 MySQL에는 OUTER JOIN 키워드가 없기 때문에

LEFT JOIN과 RIGHT JOIN UNION로 연결해야 합니다.

이렇게하면 LEFT JOIN 한 결과와 RIGHT JOIN 한 결과가 중복 제거되어 함께 표시됩니다.

SELECT (컬럼 이름)
FROM (테이블 A 이름)
LEFT JOIN (테이블 B 이름)
ON (테이블 A 이름).(컬럼 A 이름) = (테이블 B 이름).(컬럼 B 이름)
UNION
SELECT (컬럼 이름)
FROM (테이블 A 이름)
RIGHT JOIN (테이블 B 이름)
ON (테이블 A 이름).(컬럼 A 이름) = (테이블 B 이름).(컬럼 B 이름);

UNION그리고 UNION ALL실버 일본 집합를 의미하는 연산으로,

쿼리 1과 쿼리 2의 결과를 함께 표시할 수 있습니다.

두 가지 차이점은 무엇입니까?

UNION은 중복 값을 제외하고 표시하고 UNION ALL은 중복 값도 표시한다는 특징이 있습니다.

SELF JOIN는 같은 테이블에 있는 값을 맞출 때 사용합니다.

컴퓨터/전자기기 > 데스크탑/노트북 > 삼성/애플/LG

이와 같이 계층이 있을 때 계층을 한 번에 표시하려면 SELF JOIN을 사용한다고 가정합니다.

SELECT (컬럼 이름)
FROM (테이블 A 이름) AS t1
INNER JOIN (테이블 A 이름) AS t2
ON t1.(컬럼 A 이름) = t2.(컬럼 A 이름)
WHERE 조건식;

w3schools에서 JOIN 관련 예제를 살펴보자!

먼저 주문 ID와 직원 이름(FirstName, LastName), 주문 날짜를 추출해 봅시다.

SELECT O.OrderID, CONCAT(E.FirstName, ' ', E.LastName) Name, O.OrderDate
FROM Orders O, Employees E
WHERE O.EmployeeID = E.EmployeeID

직원 ID를 기반으로 Orders 및 Employees 테이블을 INNER JOIN

필요한 데이터를 추출한 예입니다.

CONCAT 함수를 통해 별도로 있던 직원 이름을 하나의 열로 요약했습니다.

위의 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.


그런 다음 주문 내역이 없는 고객의 고객 ID와 고객 이름을 추출합니다.

SELECT C.CustomerID, C.CustomerName
FROM Customers C LEFT OUTER JOIN Orders O ON C.CustomerID = O.CustomerID
WHERE OrderID IS NULL

고객은 전체가 나오고 Orders 테이블에 고객이 없으면 주문 내역이 없다고 판단해야하기 때문에

Customers 테이블을 기반으로 LEFT OUTER JOIN을 한 예입니다.

위의 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.


SELF JOIN의 예를 하나 살펴 보겠습니까?

SELECT A.EmployeeID, A.LastName, A.FirstName,
       B.EmployeeID BossID, B.LastName BossLN, B.FirstName BossFN
FROM Employees A, Employees B
WHERE A.EmployeeID = B.EmployeeID + 1

Employees 테이블에서 자신보다 1 번 적은 4 번이 직속 상사라고 가정했을 때

자신의 4번과 이름, 상사의 4번과 이름을 출력하는 예입니다.

위의 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.



예를 보면 이해하기 쉽지 않습니까?

JOIN을 자유자재로 할 수 있으면, 현업에서 SQL을 잘 취급하면 인정된다고 합니다!

저도 열심히 연습하려고 합니다 💪