Abstract

지난포스트에서는 MySQL의 기본적인 문법인 CRUD + 간단한 정렬(order by), 조건문(where)들을 살펴보았다.
이번포스트에서는 좀더 심화된 조건문(like)과 병합(join)등에 대해 살펴보자.

Table 생성

-- Set Schema
CREATE TABLE classmates (
  id INTEGER PRIMARY KEY AUTO_INCREMENT,
	-- autoincrement가 지정되어있는 primary key의 경우 
	-- 삭제된 후 다시 데이터를 insert해도 삭제된 부분이 채워지지않는다.
  name TEXT NOT NULL,
  age INT NOT NULL,
  address TEXT NOT NULL
);

-- Insert data
INSERT INTO classmates (name, age, address)
VALUES 
('바지락', 33, '울산'),
('가자미', 33, '부산'),
('가자미', 25, '김해'),
('갈매기', 15, '울산')
;

TABLE 2번 선택

다음과 같이 한개의 command에 SELECT문을 여러번 사용할 수 있다.

SELECT t.name FROM (SELECT name, age FROM classmates WHERE age >= 20) AS t;

조건문

LIKE 2% : 2로 시작(0개이상)
%2 : 2로끝남
%2% : 2가들어감
_2% : 아무값이나 들어가고 두번째가 2로 시작
1___ : 1로 시작하고 4자리

SELECT * FROM classmates
WHERE age LIKE '2_';  -- 20대인 row만 출력
SELECT * FROM classmates
WHERE age >= 30 and name LIKE '%미';  -- 두가지 이상의 조건 연결

GROUPBY에서 조건 HAVING 사용

SELECT name, COUNT(name) AS count
FROM classmates
GROUP BY name
HAVING COUNT(name) > 1
;   -- name=가자미, count=2인 table 반환

IN

SELECT id, name FROM classmates
WHERE name in ('가자미', '전복');  -- 포함되어있는 것

병합(JOIN)

두개의 테이블을 어떠한 column을 기준으로 합치는것으로 MySQL에서는 크게 3가지 방법이 있다.

  • INNSER JOIN : 두개의 테이블중 중복된 것들만 뽑아 합치는것. 결과물의 row가 가장 작다
  • LEFT JOIN(=LEFT OUTER JOIN) : 왼쪽 테이블이 모든 원소를 가지며 합쳤을때 오른쪽 테이블에 없는 값들은 NULL값이 된다.
  • RIGHT JOIN(=RIGHT OUTER JOIN) : 위와 동(left, right 반대)
  • CROSS JOIN : 특정 기준값 없이 두 테이블의 모든 경우의 수 결합을 나열
    설명 참고 또다른 table 생성
    -- Set Schema
    CREATE TABLE classmates2 (
    id INTEGER PRIMARY KEY AUTO_INCREMENT,
    name TEXT NOT NULL,
    age INT NOT NULL,
    address TEXT NOT NULL
    );
    -- Insert data
    ALTER TABLE classmates2 convert to character set UTF8;
    INSERT INTO classmates2 (name, age, address)
    VALUES 
    ('바지락', 26, '울산'),
    ('우럭', 33, '서울'),
    ('가자미', 25, '김해'),
    ('갈매기', 15, '울산'),
    ('조기', 100, '대구')
    ;
    

기본적인 사용법

joined_table: {
    table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]
  | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
  | table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
}

예제

-- LEFT JOIN
SELECT c1.name, c1.age as c1_age, c2.age as c2_age FROM classmates AS c1 LEFT JOIN classmates2 AS c2 ON c1.name = c2.name;

결과물은 아래와 같다.