CREATE TABLE
CREATE TABLE 테이블_이름(
속성_이름 데이터_타입 [NOT NULL] [DEFAULT 기본_값]
[PRIMARY KEY (속성_리스트)]
[UNIQUE (속성_리스트)]
[FOREIGN KEY (속성_리스트) REFERENCES 테이블_이름(속성_리스트)]
[ON DELETE 옵션] [ON UPDATE 옵션]
[CONSTRAINT 이름] [CHECK(조건)]
);
테이블 생성
속성의 정의
NOT NULL
DEFAULT
PRIMARY KEY
UNIQUE
FOREIGN KEY
CHECK
속성 추가
ALTER TABLE 테이블_이름
ADD 속성_이름 데이터_타입 [NOT NULL] [DEFAULT 기본_값];
//MySQL 예시
ALTER TABLE students
ADD age INT NOT NULL DEFAULT 18;
속성 삭제
ALTER TABLE 테이블_이름 DROP 속성_이름 CASCADE | RESTRICT;
//MySQL 예시
ALTER TABLE students
DROP COLUMN age;
제약조건 추가
ALTER TABLE 테이블_이름 ADD CONSTRAINT 제약조건_이름 제약조건_내용;
//MySQL 예시
ALTER TABLE students
ADD CONSTRAINT chk_age CHECK (age >= 18);
제약조건 삭제
ALTER TABLE 테이블_이름 DROP CONSTRAINT 제약조건_이름;
//MySQL 예시
ALTER TABLE students
DROP CHECK chk_age;
테이블 삭제
DROP TABLE 테이블_이름 CASCADE | RESTRICT;
//MySQL 예시
DROP TABLE students;
데이터 검색
SELECT [ALL | DISTINCT] 속성_리스트 FROM 테이블_리스트;
SELECT * FROM employees;
SELECT DISTINCT department FROM employees;
SELECT first_name, last_name, salary*1.1 AS adjusted_salary FROM employees;
조건 검색
SELECT [ALL | DISTINCT] 속성_리스트 FROM 테이블_리스트 WHERE 조건;
SELECT * FROM employees WHERE salary > 50000;
SELECT first_name, last_name FROM employees WHERE department = 'IT' AND salary >= 60000;
LIKE 연산자를 사용한 검색
SELECT * FROM employees WHERE first_name LIKE 'J%';
SELECT * FROM employees WHERE email LIKE '%@example.com';
NULL을 이용한 검색
SELECT * FROM employees WHERE manager_id IS NULL;
SELECT * FROM employees WHERE last_evaluation IS NOT NULL;
정렬 검색
SELECT [ALL | DISTINCT] 속성_리스트 FROM 테이블_리스트 WHERE 조건 ORDER BY 속성_리스트 [ASC | DESC];
SELECT * FROM employees ORDER BY last_name ASC, first_name ASC;
SELECT * FROM employees WHERE department = 'IT' ORDER BY salary DESC;
집계함수를 이용한 검색
SELECT COUNT(*) FROM employees;
SELECT COUNT(DISTINCT department) FROM employees;
SELECT MAX(salary), MIN(salary), AVG(salary), SUM(salary) FROM employees;
그룹별 검색
SELECT department, COUNT(*) FROM employees GROUP BY department;
SELECT department, AVG(salary) FROM employees GROUP BY department HAVING AVG(salary) > 60000;
여러 테이블에 대한 조인 검색
조인 검색: 여러 테이블을 연결하여 검색
조인 속성: 테이블을 연결해주는 속성, 조인 검색을 하기 위해 필요
조인 속성의 이름은 달라도 되지만 도메인은 동일해야 함
SELECT employees.first_name, employees.last_name, departments.name FROM employees JOIN departments ON employees.department_id = departments.id;
MySQL Join 예시
Implicit join (암시적 조인)
SELECT *
FROM employees e, departments d
WHERE e.department_id = d.id;
Explicit join (명시적 조인)
SELECT *
FROM employees e
JOIN departments d ON e.department_id = d.id;
Inner join
SELECT *
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;
Left outer join
SELECT *
FROM employees e
LEFT OUTER JOIN departments d ON e.department_id = d.id;
Right outer join
SELECT *
FROM employees e
RIGHT OUTER JOIN departments d ON e.department_id = d.id;
Full outer join
SELECT *
FROM employees e
FULL OUTER JOIN departments d ON e.department_id = d.id;
Equi join
SELECT *
FROM employees e
JOIN departments d ON e.department_id = d.id;
Natural join
SELECT *
FROM employees
NATURAL JOIN departments;
Cross join (Cartesian join)
SELECT *
FROM employees e
CROSS JOIN departments d;
Self join
SELECT e1.name AS employee_name, e2.name AS manager_name
FROM employees e1
JOIN employees e2 ON e1.manager_id = e2.id;
서브 쿼리를 이용한 검색
SELECT 문 안에 또 다른 SELECT 문을 포함 가능 (main query 와 sub query)
sub query는 괄호로 묶어 작성, ORDER BY 절 사용 불가, 상위 쿼리보다 먼저 수행
단일 행 서브 쿼리는 일반 비교 연산자 사용 가능
다중 행 서브 쿼리는 일반 비교 연산자 사용 불가능
IN
목록 내의 값 중 하나와 일치하는지 확인
SELECT * FROM employees WHERE department_id IN (1, 2, 3);
NOT IN
SELECT * FROM employees WHERE department_id NOT IN (1, 2, 3);
EXISTS
SELECT * FROM employees WHERE EXISTS (SELECT 1 FROM departments WHERE departments.id = employees.department_id);
NOT EXISTS
SELECT * FROM employees WHERE NOT EXISTS (SELECT 1 FROM departments WHERE departments.id = employees.department_id);
ALL
SELECT * FROM employees WHERE salary > ALL (SELECT salary FROM employees WHERE department_id = 1);
ANY 또는 SOME
SELECT * FROM employees WHERE salary > ANY (SELECT salary FROM employees WHERE department_id = 1);
직접 삽입
INSERT INTO employees (id, first_name, last_name, age)
VALUES (1, 'Alice', 'Johnson', 42);
서브쿼리 사용 데이터 삽입
INSERT INTO employees_backup (id, first_name, last_name, age)
SELECT id, first_name, last_name, age FROM employees WHERE age > 40;
데이터 수정
UPDATE employees
SET age = age + 1
WHERE first_name = 'John' AND last_name = 'Doe';
데이터 삭제
DELETE FROM employees WHERE age > 60;
테이블 혹은 다른 뷰를 기반으로 만든 가상 테이블
논리적으로 존재하며 일반 테이블과 동일한 방법으로 사용 가능
기본 테이블: 기반이 되는 물리적인 테이블
CREATE VIEW EmployeeView (EmployeeID, FullName, Department)
AS SELECT id, CONCAT(first_name, ' ', last_name), department
FROM employees;
생성된 뷰는 일반 테이블 처럼 검색 가능
삽입 삭제 수정도 가능하나 항상 가능한 것은 아님
뷰에 대한 작업은 기본 테이블에 대한 쿼리문으로 변환 후 수행
변경 가능한 뷰
CREATE VIEW SimpleEmployeeView (EmployeeID, FirstName, LastName)
AS SELECT id, first_name, last_name
FROM employees;
변경 불가능한 뷰
CREATE VIEW AggregatedEmployeeView (Department, TotalSalary)
AS SELECT department, SUM(salary)
FROM employees
GROUP BY department;
삭제
DROP VIEW EmployeeView CASCADE;
DROP VIEW EmployeeView RESTRICT;
쿼리문의 집합, 편리하게 사용할 수 있다.