MySQL의 사용 - JOIN

김재현·2022년 7월 17일
0

Programmers

목록 보기
27/28
post-custom-banner

MySQL이 제공하는 컬럼 타입.

Numeric Type

  • INTEGER, INT, TINYINT, SMALLINT, MEDIUMINT, BIGINT
  • DECIMAL(돈 관련), NUMERIC
  • FLOAT, DOUBLE(큰 숫자 잘 표현, 용량 더 큼), BIT

Date and Time Type

  • DATE, DATETIME, TIMESTAMP(대부분 이것으로 충당), TIME, YEAR

String Type

  • CHAR(고정된 값을 알 때 사용), VARCHAR(고정된 값을 모를 때 사용), BINARY, VARBINARY, BLOB, TEXT, ENUM, SET

Json Type

  • 다양한 JSON 조작함수를 제공.

Spatial Type

  • 위도와 경도를 중심으로 한 위치 관련 타입.

테이블 편집

INSERT

  • 테이블에 레코드 추가.

    INSERT INTO 필드리스트 VALUE 삽입값
    의 형식으로 사용.

  • VALUE 뒤에 적어둔 순서가 원래 테이블을 만들 때 지정했던 필드의 순서와 같다면, 테이블 뒤에 필드 리스트를 지정하지 않아도 된다.

DELETE

  • 조건을 기반으로 테이블에서 레코드 삭제 혹은 레코드 전체 삭제.
    레코드를 다 삭제하더라도 테이블은 계속 존재한다. DROP TABLE과의 차이점.

    DELETE FROM 테이블명 WHERE 조건
    DELETE FROM 테이블명

  • DELETE FROM VS TRUNCATE
    DELETE FROM : 조건을 만족하는 레코드를 삭제. 조건을 달 수 있고, 속도가 다소 느림.
    TRUNCATE : 조건 없이 모든 레코드를 삭제. 속도가 빠르다. 트랙잭션을 사용해도 롤백이 불가능하다.

UPDATE

  • 조건을 기반으로 테이블에서 특정 레코드(들)의 필드 값을 수정.

    UPDATE 테이블이름 SET (수정할) 필드이름 = 새로운 값.
    WHERE ~~

  • WHERE을 사용하지 않는다면 테이블의 모든 값이 수정될 수 있다. 따라서 WHERE에 조건을 달아서 수정 범위를 제한해주자.
    위의 사진에서는 vital의 모든 weight 값이 모두 92로 변경될 수 있다. 따라서 WHERE을 사용, vital = 4이라는 조건을 제시해야 한다.

NULL의 표기

  • NULL은 =, != 사용하지 못하기 때문에 특별한 표기를 사용해야함.

    WHERE vital_id = NULL; -> x
    WHERE vital_id IS NULL; -> o

JOIN

  • 스타 스키마 형태로 모델링을 할 경우 데이터가 흩어지기 때문에, 이렇게 흩어진 여러 테이블의 정보를 모으는 것.
  • 종류로는 INNER / LEFT / RIGHT / CROSS / SELF / OUTER 가 있음.
  • SQL 조인은 두 개 이상의 테이블들을 공통 필드를 가지고 통합하는 것.
    스타 스키마로 구성된 테이블들로 분산되어 있던 정보를 통합하는데 사용.
  • JOIN의 결과로 양쪽의 필드를 모두 가진 새로운 테이블이 생성.
    조인의 방식에 따라서 다음 두 가지가 달라짐.
    1 어떤 레코드들이 선택되는가?
    2 어떤 필드들이 채워지는가?

  • JOIN 앞에 키워드를 붙여 어떤 종류의 JOIN인지 설정.
    붙이지 않는다면 Default인 INNER가 사용됨.

JOIN 시 고려해야 할 점.

  • 먼저 중복 레코드가 없고, Primary key의 유일함(uniqueness)가 보장됨을 체크한다.
    • 아주 중요!
    • JOIN을 하는 key들은 primary key이거나 되는 경우가 많음.
  • JOIN하는 테이블들간의 관계를 명확하게 정의.
    • One to one
      완전한 one to one : session & session_channel
      한쪽이 부분집합이 되는 one to one
    • One to many? (order vs order_items)
      이 경우 중복이 더 큰 문제가 됨. -> 증폭!
    • Many to one?
      방향만 바꾸면 One to many로 보는 것과 사실상 동일.
    • Many to many?
      이는 one to one이나 one to many로 바꾸는 것이 가능하다면 변환하여 조인하는 것이 덜 위험.
  • 어느 테이블을 베이스로 잡을지 (From에 사용할지) 결정해야 함. (INNER 경우에는 큰 문제가 안 될 수 있지만, LEFT와 같은 경우에는 중요하다.)

INNER JOIN

  • 양쪽 테이블들에서 매치가 되는 레코드만 리턴함.
    교집합과 비슷.
  • 양쪽 테이블들의 필드가 모두 채워진 상태로 리턴된다.

    SELECT * FROM 테이블(베이스)
    (INNER) JOIN 테이블 ON 테이블의 매칭 방법

LEFT JOIN

  • 왼쪽 테이블(Base)의 모든 레코드를 리턴함.
  • 오른쪽 테이블의 필드는 왼쪽 레코드와 매칭되는 경우에만 채워진 상태로 리턴됨.

    SELECT * FROM 테이블(베이스)
    LEFT JOIN 테이블 ON 매칭 방법

FULL JOIN

  • 왼쪽 테이블과 오른쪽 테이블의 모든 레코드들을 리턴함.
  • 매칭되는 경우에만 양쪽 테이블들의 모든 필드들이 채워진채로 리턴됨.
  • MySQL에서는 지원을 하지 않기 때문에 LEFT와 RIGHT를 UNION해야 함.
    • UNION : 두개의 SELECT 결과를 합쳐 새로운 결과를 내지만, 중복되는 레코드가 생기면 하나만 남긴다.
    • UNION ALL : 중복되어도 그대로 출력한다.

SELECT FROM 테이블
LEFT JOIN 테이블 ON
UNION
SELECT FROM 테이블
RIGHT JOIN 테이블 ON

CROSS JOIN

  • 왼쪽 테이블과 오른쪽 테이블의 모든 레코드들의 조합을 리턴함.
  • JOIN 문법이 없기 때문에

    CROSS JOIN 테이블

후에 아무것도 붙이지 않아도 된다.

SELF JOIN

  • 동일한 테이블을 Alias(명명)을 달리해서 자기 자신과 JOIN함.

    SELECT FROM 테이블
    JOIN 테이블 ON ~

  • JOIN을 어떻게 사용하느냐에 따라서 유용하게 사용 가능하다.

Query의 일반적 순서.

SELECT 필드이름 1, 필드이름 2.
FROM 테이블이름(베이스)
JOIN 테이블 ON 매칭 방법
WHERE 선택조건.
GROUP BY 필드이름 1, 필드이름 2.
(HAVING 선택조건)
ORDER BY 필드이름
LIMIT N;

post-custom-banner

0개의 댓글