WHERE절
조건절 WHERE
SQL WHERE 절은 데이터베이스 테이블에서 특정 조건에 맞는 행만 선택하여 조회할 때 사용합니다. WHERE 절은 SELECT, UPDATE, DELETE 등 다양한 SQL 문에서 사용되며, 원하는 데이터만 검색하여 추출함으로써 데이터베이스의 부하를 줄일 수 있습니다.
WHERE 절의 기본 구조는 다음과 같습니다:
SELECT column1, column2, ...
FROM table_name
WHERE condition;
condition은 조건을 나타내는 표현식이며, 비교 연산자(<, >, =, <=, >=, <>)나 논리 연산자(AND, OR, NOT)를 사용하여 구성할 수 있습니다.
예를 들어, Users 테이블에서 email의 길이가 10 이상인 사용자만 선택하고 싶다면 다음과 같이 WHERE 절을 사용할 수 있습니다:
SELECT * FROM Users WHERE CHAR_LENGTH(email) >= 10;
UPDATE 명령에서도 WHERE 절을 사용할 수 있습니다. 예를 들어, LoanRecords 테이블에서 return_date가 NULL인 대출 기록의 return_date를 현재 날짜로 업데이트 하려면 다음과 같이 할 수 있습니다:
UPDATE LoanRecords
SET return_date = CURDATE()
WHERE return_date IS NULL;
연산자
WHERE 절에서 사용하는 연산자는 크게 비교 연산자, 논리 연산자, IN, LIKE, BETWEEN, IS NULL 연산자 등이 있습니다.
- 비교 연산자:
- =: 값이 같음을 나타냅니다.
- <> 또는 !=: 값이 다름을 나타냅니다.
- <: 값이 작음을 나타냅니다.
- >: 값이 큼을 나타냅니다.
- <=: 값이 작거나 같음을 나타냅니다.
- >=: 값이 크거나 같음을 나타냅니다.
- 논리 연산자:
- AND: 두 개의 조건이 모두 참일 때 참입니다.
- OR: 두 개의 조건 중 하나 이상이 참일 때 참입니다.
- NOT: 조건의 결과를 부정합니다.
- IN 연산자:
- IN: 주어진 리스트 중 하나라도 일치할 때 사용됩니다.
- 예: SELECT * FROM Books WHERE publisher_id IN (1, 2, 3);
- LIKE 연산자:
- %: 0개 이상의 문자와 일치합니다.
- _: 한 개의 문자와 일치합니다.
- 예: SELECT * FROM Authors WHERE name LIKE 'J%';
- BETWEEN 연산자:
- 값이 지정된 두 값 사이에 있어야 할 때 사용됩니다.
- 예: SELECT * FROM Books WHERE publication_date BETWEEN '2020-01-01' AND '2020-12-31';
- IS NULL 연산자:
- 해당 열의 값이 **NULL**인 행을 선택합니다.
- 예: SELECT * FROM LoanRecords WHERE return_date IS NULL;
NULL이란?
NULL은 데이터베이스에서 아무런 값도 가지지 않는 상태를 의미합니다. NULL은 값 자체가 존재하지 않으므로, 연산이나 비교에 사용될 때 특별한 주의가 필요합니다.
문자열 타입 CHAR와 VARCHAR의 비교
CHAR와 VARCHAR는 문자열 데이터를 저장하는 데 사용됩니다. CHAR는 고정 길이 문자열을 저장하며, 저장된 문자열이 정해진 길이보다 짧으면 나머지는 공백으로 채워집니다. VARCHAR는 가변 길이 문자열을 저장하며, 실제로 사용한 만큼의 공간만 차지합니다.
예를 들어, CHAR(10)에 'John'을 저장하면 'John '으로 저장됩니다. VARCHAR(20)에 'Smith'를 저장하면 'Smith'로 저장되며 추가 공간은 사용되지 않습니다. 이 차이는 데이터 저장 공간의 효율성과 검색 속도에 영향을 미칠 수 있습니다.
FUNCTION
-- 사용자 테이블
CREATE TABLE Users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE
);
-- 출판사 테이블
CREATE TABLE Publishers (
publisher_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
address TEXT
);
-- 도서 테이블
CREATE TABLE Books (
book_id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
publication_date DATE,
publisher_id INT,
FOREIGN KEY (publisher_id) REFERENCES Publishers(publisher_id)
);
-- 저자 테이블
CREATE TABLE Authors (
author_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
-- 대출 기록 테이블
CREATE TABLE LoanRecords (
record_id INT AUTO_INCREMENT PRIMARY KEY,
book_id INT,
user_id INT,
loan_date DATE,
return_date DATE,
loan_amount DECIMAL(10, 2), -- 대출 금액 컬럼 추가
FOREIGN KEY (book_id) REFERENCES Books(book_id),
FOREIGN KEY (user_id) REFERENCES Users(user_id)
);
-- 도서와 저자의 다대다 관계를 위한 테이블
CREATE TABLE Book_Authors (
book_id INT,
author_id INT,
PRIMARY KEY (book_id, author_id),
FOREIGN KEY (book_id) REFERENCES Books(book_id),
FOREIGN KEY (author_id) REFERENCES Authors(author_id)
);
INSERT INTO Users (username, email) VALUES
('johndoe', 'johndoe@example.com'),
('janedoe', 'janedoe@example.com'),
('alice', 'alice@example.com'),
('bob', 'bob@example.com'),
('charlie', 'charlie@example.com'),
('david', 'david@example.com'),
('eve', 'eve@example.com'),
('frank', 'frank@example.com'),
('grace', 'grace@example.com'),
('hannah', 'hannah@example.com');
INSERT INTO Publishers (name, address) VALUES
('Penguin Books', '123 Penguin Street'),
('HarperCollins', '234 Harper Road'),
('Simon & Schuster', '345 Simon Blvd'),
('Random House', '456 Random Avenue'),
('Scholastic', '567 School Lane'),
('Hachette', '678 Hatchet Court'),
('Macmillan', '789 Macmillan Lane'),
('Elsevier', '890 Elsevier Rd'),
('Wiley', '901 Wiley Way'),
('Oxford Press', '012 Oxford Circle');
INSERT INTO Books (title, publication_date, publisher_id) VALUES
('Book One', '2020-01-01', 1),
('Book Two', '2020-02-01', 2),
('Book Three', '2020-03-01', 3),
('Book Four', '2020-04-01', 4),
('Book Five', '2020-05-01', 5),
('Book Six', '2020-06-01', 6),
('Book Seven', '2020-07-01', 7),
('Book Eight', '2020-08-01', 8),
('Book Nine', '2020-09-01', 9),
('Book Ten', '2020-10-01', 10);
INSERT INTO Authors (name) VALUES
('Author A'),
('Author B'),
('Author C'),
('Author D'),
('Author E'),
('Author F'),
('Author G'),
('Author H'),
('Author I'),
('Author J');
INSERT INTO LoanRecords (book_id, user_id, loan_date, return_date, loan_amount) VALUES
(1, 1, '2023-01-01', '2023-01-15', 150.00),
(2, 2, '2023-02-01', '2023-02-14', 200.00),
(3, 3, '2023-03-01', NULL, 250.00),
(4, 1, '2023-03-15', '2023-04-01', 225.00),
(5, 4, '2023-04-01', NULL, 175.50),
(6, 5, '2023-05-01', '2023-05-15', 300.00),
(7, 3, '2023-06-01', '2023-06-14', 180.00),
(8, 2, '2023-07-01', NULL, 195.00),
(9, 1, '2023-08-01', '2023-08-15', 205.00),
(10, 4, '2023-09-01', '2023-09-15', 120.00);
INSERT INTO Book_Authors (book_id, author_id) VALUES
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8),
(9, 9),
(10, 10);
이 쿼리는 각 대출 기록에 대해 금액을 반올림, 절삭, 올림, 내림 처리하고, 나머지, 부호, 제곱근, 지수, 삼각 함수 값을 계산하여 반환합니다. 이를 통해 데이터를 다양한 방법으로 분석하고 이해할 수 있습니다.
날짜 함수(Date Functions)
날짜 함수는 날짜 값을 조작하거나 날짜 정보를 반환하는 데 사용되는 MySQL의 함수입니다. 이 함수들은 날짜 간의 차이를 계산하거나 날짜에 일 또는 월을 더하거나 빼는 등 다양한 날짜 관련 작업을 수행할 수 있습니다.
주요 날짜 함수
- DATE_ADD(date, INTERVAL expr type) - 날짜에 지정된 기간을 더합니다. 여기서 type은 YEAR, MONTH, DAY 등이 될 수 있습니다.
- LAST_DAY(date) - 지정된 날짜가 속한 달의 마지막 날짜를 반환합니다.
- DAYNAME(date) - 지정된 날짜의 요일 이름을 반환합니다.
- DATEDIFF(date1, date2) - 두 날짜 사이의 일수 차이를 반환합니다.
- CONVERT_TZ(dt, from_tz, to_tz) - 날짜와 시간을 한 시간대에서 다른 시간대로 변환합니다.
- CURRENT_TIMESTAMP - 현재 시스템 타임스탬프를 반환합니다.
- DATE_FORMAT(date, format) - 날짜를 지정된 형식으로 형식화합니다.
날짜 함수 사용 예제
예를 들어, LoanRecords 테이블에서 다음과 같은 질의를 수행할 수 있습니다.
SELECT
record_id,
loan_date,
DATE_ADD(loan_date, INTERVAL 3 MONTH) AS loan_date_plus_3_months,
LAST_DAY(loan_date) AS last_day_of_month,
DAYNAME(DATE_ADD(loan_date, INTERVAL 1 DAY)) AS next_day_name,
DATEDIFF(CURRENT_DATE, loan_date) AS days_since_loan,
DATE_FORMAT(loan_date, '%Y-%m') AS formatted_loan_date
FROM
LoanRecords;
SELECT
record_id, -- 각 대출 기록의 고유 식별자를 선택합니다.
loan_date, -- 대출 시작 날짜를 선택합니다.
DATE_ADD(loan_date, INTERVAL 3 MONTH) AS loan_date_plus_3_months, -- 대출 시작 날짜에서 3개월을 더한 날짜를 계산합니다.
LAST_DAY(loan_date) AS last_day_of_month, -- 대출 시작 날짜가 속한 달의 마지막 날짜를 계산합니다.
DAYNAME(DATE_ADD(loan_date, INTERVAL 1 DAY)) AS next_day_name, -- 대출 시작 날짜 다음 날의 요일 이름을 반환합니다.
DATEDIFF(CURRENT_DATE, loan_date) AS days_since_loan, -- 오늘 날짜와 대출 시작 날짜 사이의 일수 차이를 계산합니다.
DATE_FORMAT(loan_date, '%Y-%m') AS formatted_loan_date -- 대출 시작 날짜를 '년-월' 형식으로 포맷합니다.
FROM
LoanRecords; -- LoanRecords 테이블에서 데이터를 조회합니다.
이 쿼리는 각 대출 기록의 loan_date에 대해 3개월 후의 날짜, 해당 월의 마지막 날, 다음 날의 요일, 오늘과 대출 날짜 사이의 일수 차이, 그리고 형식화된 날짜를 계산하고 반환합니다.
변환 함수(Conversion Functions)
변환 함수는 데이터 유형을 변환하거나 다른 형식으로 표현하는 데 사용되는 MySQL의 함수입니다. 이 함수들은 문자열을 숫자 또는 날짜로 변환하거나 숫자 및 날짜를 다른 형식의 문자열로 변환하는 등 다양한 작업을 수행할 수 있습니다.
주요 변환 함수
- CAST(expression AS type) - 표현식을 지정된 데이터 유형으로 변환합니다.
- CONVERT(expression, type) - 표현식을 다른 유형으로 변환합니다. **CAST**와 유사하지만 구문이 다릅니다.
변환 함수 사용 예제
예를 들어, LoanRecords 테이블에서 아래와 같은 질의를 수행할 수 있습니다.
SELECT
record_id,
loan_date,
CAST(loan_date AS CHAR) AS loan_date_char,
loan_amount,
CONVERT(loan_amount, CHAR) AS loan_amount_char
FROM
LoanRecords;
이 질의는 각 대출 기록의 loan_date와 loan_amount를 문자열 형식으로 변환하여 반환합니다.
NULL 관련 함수(Null Functions)
MySQL에서는 NULL 값을 처리하는 데 사용되는 함수들이 있습니다. 이 함수들은 NULL 값을 기본 값으로 대체하거나 여러 표현식 중 NULL이 아닌 첫 번째 값을 선택하는 등 NULL 값에 대한 작업을 수행할 수 있습니다.
주요 NULL 관련 함수
- IFNULL(expression1, expression2) - expression1이 NULL인 경우 expression2를 반환하고, 그렇지 않으면 expression1을 반환합니다.
- COALESCE(expression1, expression2, ...) - 인수 목록에서 첫 번째 NULL이 아닌 값을 반환합니다. 모든 인수가 NULL이면 NULL을 반환합니다.
- NULLIF(expression1, expression2) - expression1과 expression2가 같으면 NULL을 반환하고, 그렇지 않으면 expression1을 반환합니다.
NULL 관련 함수 사용 예제
예를 들어, LoanRecords 테이블에서 아래와 같은 질의를 수행할 수 있습니다.
-- IFNULL 사용 예제
SELECT
record_id,
IFNULL(return_date, 'Not Returned Yet') AS return_status
FROM
LoanRecords;
-- COALESCE 사용 예제
SELECT
record_id,
COALESCE(return_date, loan_date, CURRENT_DATE) AS effective_date
FROM
LoanRecords;
-- NULLIF 사용 예제
SELECT
user_id,
email,
NULLIF(email, '') AS valid_email -- Treat empty string as NULL
FROM
Users;
이 질의들은 각 기록의 **return_date**가 NULL인 경우 기본 값을 제공하거나, 여러 날짜 중 첫 번째 유효한 날짜를 선택하고, 이메일 필드가 비어 있을 때 NULL을 반환하여 데이터 정리를 수행합니다.
실무 활용 예제
실무에서 NULL 관련 함수는 다양한 방식으로 활용됩니다. 예를 들어:
- 수익 계산: IFNULL 함수를 사용하여 직원의 커미션 비율이 NULL인 경우 0으로 처리하고 월급에 커미션을 더하여 총 수익을 계산할 수 있습니다.
CREATE TABLE Employees (
employee_id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(255) NOT NULL,
salary DECIMAL(10, 2),
commission_pct DECIMAL(10, 2) -- 커미션 비율; 급여에 대한 백분율로 표시
);
INSERT INTO Employees (first_name, salary, commission_pct) VALUES
('John', 50000, 0.05),
('Jane', 60000, 0.10),
('Doe', 55000, NULL),
('Alice', 70000, 0.15),
('Bob', 40000, NULL);
SELECT
employee_id, -- 직원의 고유 ID를 선택합니다.
first_name, -- 직원의 이름을 선택합니다.
salary, -- 직원의 기본 급여를 선택합니다.
IFNULL(commission_pct, 0) * salary AS commission, -- 커미션을 계산합니다. 커미션 비율이 NULL인 경우 0을 사용합니다.
salary + (IFNULL(commission_pct, 0) * salary) AS total_income -- 총 수입을 계산합니다. 기본 급여에 커미션을 더합니다.
FROM
Employees; -- Employees 테이블에서 데이터를 조회합니다.
- 주소 정보 처리: COALESCE 함수를 사용하여 주문에 배송 주소가 없는 경우 청구 주소를 사용하고, 그것도 없는 경우 기본 주소를 제공할 수 있습니다.
CREATE TABLE Orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
customer_id INT,
shipping_address VARCHAR(255),
billing_address VARCHAR(255)
);
INSERT INTO Orders (customer_id, shipping_address, billing_address) VALUES
(1, '1234 Elm St, YourCity, YS', NULL),
(2, NULL, '4321 Pine St, MyCity, MS'),
(3, '7890 Maple St, OurCity, OS', '7890 Maple St, OurCity, OS'),
(4, NULL, NULL);
SELECT
order_id, -- 주문 ID를 선택합니다.
customer_id, -- 고객 ID를 선택합니다.
COALESCE(shipping_address, billing_address, 'No Address Provided') AS address -- 배송 주소와 청구 주소 중 첫 번째로 사용 가능한 주소를 사용합니다.
FROM
Orders; -- Orders 테이블에서 데이터를 조회합니다.
- 특정 값으로 나누기 연산 수행: 나눗셈에서 분모가 0이 되는 것을 방지하기 위해 NULLIF 함수를 사용하여 분모가 0인 경우 NULL을 반환하도록 할 수 있습니다.
CREATE TABLE OrderItems (
product_id INT,
product_name VARCHAR(255),
total_price DECIMAL(10, 2),
total_quantity INT
);
INSERT INTO OrderItems (product_id, product_name, total_price, total_quantity) VALUES
(1, 'Widget A', 100.00, 10),
(2, 'Widget B', 150.00, 5),
(3, 'Widget C', 200.00, 0), -- 이 경우 항목당 평균 가격은 계산되지 않습니다.
(4, 'Widget D', 250.00, 25);
SELECT
product_id, -- 제품 ID를 선택합니다.
product_name, -- 제품 이름을 선택합니다.
total_price / NULLIF(total_quantity, 0) AS average_price_per_item -- 총 가격을 총 수량으로 나누어 항목당 평균 가격을 계산합니다.
FROM
OrderItems; -- OrderItems 테이블에서 데이터를 조회합니다.
이 예제들은 MySQL에서의 NULL 처리 방법을 보여주며, 다양한 데이터베이스 작업에서 유용하게 사용될 수 있습니다.
단일행 CASE 표현식
MySQL에서 단일행 CASE 표현식은 조건에 따라 다른 값을 반환하는 데 사용되는 논리 구조입니다. 이 구조는 조건적 논리를 쿼리에 통합하여 복잡한 데이터 질의를 단순화하고, 동적 결과를 생성합니다. CASE 표현식은 두 가지 형태로 사용됩니다: Simple CASE Expression과 Searched CASE Expression.
Simple CASE Expression
Simple CASE Expression은 입력 값에 따라 여러 가능한 결과 중 하나를 반환합니다.
CASE
WHEN value1 LIKE input_expression THEN result1
WHEN value2 LIKE input_expression THEN result2
...
ELSE default_result
END
Searched CASE Expression
Searched CASE Expression은 하나 이상의 조건을 평가하여 해당하는 첫 번째 조건의 결과를 반환합니다.
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END
사용 예제
이제 위의 테이블 구조를 참조하여 실제 데이터를 사용한 예제를 보겠습니다.
Simple CASE Expression 예제
Users 테이블에서 사용자의 이메일 도메인에 따라 사용자 유형을 분류하는 예제입니다.
SELECT
user_id, -- 사용자의 고유 ID를 선택합니다.
email, -- 사용자의 이메일 주소를 선택합니다.
CASE
WHEN email LIKE '%@example.com' THEN 'Corporate' -- 이메일 주소가 '@example.com'으로 끝나면 'Corporate'로 분류합니다.
WHEN email LIKE '%@gmail.com' THEN 'Personal' -- 이메일 주소가 '@gmail.com'으로 끝나면 'Personal'로 분류합니다.
ELSE 'Other' -- 위의 경우에 해당하지 않으면 'Other'로 분류합니다.
END AS user_type -- 분류된 사용자 유형을 'user_type'이라는 새로운 열로 표시합니다.
FROM
Users; -- Users 테이블에서 데이터를 조회합니다.
Searched CASE Expression 예제
LoanRecords 테이블에서 대출 기록의 상태를 평가하여 상태에 따라 메시지를 반환하는 예제입니다.
SELECT
record_id, -- 대출 기록의 고유 식별자를 선택합니다.
loan_date, -- 대출 시작 날짜를 선택합니다.
return_date, -- 대출 반환 날짜를 선택합니다.
CASE
WHEN return_date IS NULL THEN 'Not Returned Yet' -- 반환 날짜가 NULL인 경우, 대출이 아직 반환되지 않았음을 나타냅니다.
WHEN DATEDIFF(loan_date, return_date) < -13 THEN 'Overdue' -- 반환 날짜로부터 현재까지의 일수가 14일을 초과하는 경우, 대출이 연체되었음을 나타냅니다.
ELSE 'Returned On Time' -- 위의 조건에 해당하지 않는 경우, 대출이 제시간에 반환되었음을 나타냅니다.
END AS loan_status -- 대출의 상태를 'loan_status'라는 이름의 열로 표시합니다.
FROM
LoanRecords; -- LoanRecords 테이블에서 데이터를 조회합니다.
이 예제들은 MySQL에서 CASE 표현식의 활용 방법을 보여줍니다. Simple CASE는 명시적인 값을 비교하는 반면, Searched CASE는 조건식을 평가하여 보다 동적인 결과를 생성할 수 있습니다. 이를 통해 데이터 분석 및 보고서 작성 과정에서 유연성을 크게 향상시킬 수 있습니다.
JOIN
JOIN의 개념
SQL에서 JOIN은 두 개 이상의 테이블 간의 관계를 표현하고, 이를 기반으로 새로운 결과 집합을 생성하는 연산입니다. JOIN 연산을 통해 여러 테이블에 걸쳐 있는 데이터를 결합하여 원하는 정보를 얻을 수 있습니다.
ANSI 표준 조인 (ANSI Standard Joins)
ANSI 표준 조인은 SQL에서 테이블 간의 연결을 정의하는 방법 중 하나로, ANSI(SQL 표준을 개발한 기구)에서 제시한 표준화된 형식입니다. ANSI 표준 조인은 가독성이 좋고, 일관성을 유지할 수 있는 방식으로 테이블 간의 관계를 표현할 수 있습니다.
ANSI 조인의 종류
- INNER JOIN: 두 테이블 간의 일치하는 행만 결과에 포함합니다.
- LEFT OUTER JOIN: 왼쪽 테이블의 모든 행을 결과에 포함하고, 오른쪽 테이블에서 일치하는 행이 없는 경우 NULL 값을 사용합니다.
- RIGHT OUTER JOIN: 오른쪽 테이블의 모든 행을 결과에 포함하고, 왼쪽 테이블에서 일치하는 행이 없는 경우 NULL 값을 사용합니다.
- FULL OUTER JOIN: 두 테이블의 모든 행을 결과에 포함하고, 일치하는 행이 없는 경우 NULL 값을 사용합니다.
ANSI 조인의 구문
SELECT column1, column2, ...
FROM table1
JOIN type table2
ON table1.column = table2.column;
예제
예를 들어, Books 테이블과 Publishers 테이블이 있을 때, 각 도서가 속한 출판사의 정보를 얻고 싶다면 다음과 같이 작성할 수 있습니다.
SELECT Books.book_id, Books.title, Publishers.name
FROM Books
INNER JOIN Publishers
ON Books.publisher_id = Publishers.publisher_id;
이렇게 ANSI 표준 조인을 사용하면 SQL 쿼리의 구조가 명확해지고, 테이블 간의 관계를 이해하기 쉬워집니다.
MySQL 조인의 종류
1. MySQL INNER JOIN: 두 테이블 간의 일치하는 행만 결과에 포함합니다.
- MySQL OUTER JOIN: 결과에 두 테이블 중 하나의 모든 행을 포함하며, 일치하는 행이 없는 경우 NULL 값을 사용합니다. OUTER JOIN은 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN으로 나뉩니다.
MySQL INNER JOIN
SELECT column1, column2, ...
FROM table1
INNER JOIN table2
ON table1.column = table2.column;
MySQL LEFT OUTER JOIN
SELECT Books.title, Authors.name
FROM Books
LEFT JOIN Book_Authors
ON Books.book_id = Book_Authors.book_id
LEFT JOIN Authors
ON Book_Authors.author_id = Authors.author_id;
예제
예를 들어, Books 테이블과 Authors 및 Book_Authors 테이블을 사용하여 각 도서의 저자 정보를 얻고 싶다면 다음과 같이 작성할 수 있습니다.
- MySQL INNER JOIN
SELECT Books.title, Authors.name
FROM Books
INNER JOIN Book_Authors
ON Books.book_id = Book_Authors.book_id
INNER JOIN Authors
ON Book_Authors.author_id = Authors.author_id;
- MySQL LEFT OUTER JOIN
SELECT Books.title, Authors.name
FROM Books
LEFT JOIN Book_Authors
ON Books.book_id = Book_Authors.book_id
LEFT JOIN Authors
ON Book_Authors.author_id = Authors.author_id;
NATURAL JOIN과 USING절
NATURAL JOIN과 USING 절은 두 테이블 간의 JOIN을 수행할 때, 특정 조건을 기반으로 테이블 간 관계를 자동으로 인식하고 결합하는 방식입니다. 이들은 주로 두 테이블 간에 이름이 같은 컬럼이 존재하고, 이 컬럼들이 연결고리로 사용되어야 하는 경우 유용합니다.
NATURAL JOIN
NATURAL JOIN은 두 테이블 간에 같은 이름을 가진 모든 컬럼을 기준으로 JOIN을 수행합니다. 이 때 일치하는 컬럼은 결과 집합에서 중복으로 표시되지 않습니다.
NATURAL JOIN 구문
SELECT column1, column2, ...
FROM table1
NATURAL JOIN table2;
NATURAL JOIN 예제
예를 들어, Books 테이블과 Publishers 테이블이 있고, 두 테이블 모두 **publisher_id**라는 같은 이름의 컬럼을 공유한다고 가정해봅시다. 이 경우, NATURAL JOIN을 사용하여 도서 정보와 출판사 정보를 결합할 수 있습니다.
SELECT Books.title, Publishers.name
FROM Books
NATURAL JOIN Publishers;
USING 절
USING 절은 두 테이블 간의 JOIN을 수행할 때, 명시적으로 일치하는 컬럼 이름을 지정하여 JOIN을 수행합니다. 이 때 지정된 컬럼은 결과 집합에서 중복으로 표시되지 않습니다.
USING 절 구문
SELECT column1, column2, ...
FROM table1
JOIN table2
USING (column_name);
예를 들어, Books 테이블과 Publishers 테이블을 publisher_id를 기준으로 조인하고 싶다면 다음과 같이 작성할 수 있습니다.
SELECT Books.title, Publishers.name
FROM Books
JOIN Publishers
USING (publisher_id);
USING 절을 사용하면 명시적으로 어떤 컬럼을 기준으로 JOIN을 수행할지 지정할 수 있으므로, 코드의 가독성이 높아집니다. 그러나 NATURAL JOIN과 USING 절을 사용할 때 주의할 점은, 컬럼 이름이 동일한 경우에만 적용할 수 있다는 것입니다. 그렇지 않은 경우에는 일반 JOIN 절을 사용해야 합니다.