이번 글에서는 mycompany라는 가상의 회사 데이터베이스를 구성하며, 실제 업무에서 자주 등장하는 테이블 관계와 함께 SQL 문법을 학습합니다.
데이터베이스와 테이블 생성
mysql> CREATE DATABASE mycompany;
Query OK, 1 row affected (0.01 sec)
mysql> USE mycompany;
Database changed
mysql> CREATE TABLE Department (
-> dept_id CHAR(3) PRIMARY KEY,
-> dept_name VARCHAR(20),
-> dept_location VARCHAR(20)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE TABLE Project (
-> proj_id VARCHAR(3) PRIMARY KEY,
-> proj_name VARCHAR(20),
-> proj_location VARCHAR(20),
-> dept_id CHAR(3),
-> FOREIGN KEY (dept_id) REFERENCES Department(dept_id)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE TABLE Employee (
-> SSN VARCHAR(9) NOT NULL PRIMARY KEY,
-> lastname VARCHAR(20),
-> firstname VARCHAR(20),
-> sex CHAR(1),
-> dept_id CHAR(3),
-> FOREIGN KEY (dept_id) REFERENCES Department(dept_id)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE TABLE WorksOn (
-> SSN VARCHAR(9) NOT NULL,
-> proj_id VARCHAR(3) NOT NULL,
-> hours INT,
-> PRIMARY KEY (SSN, proj_id),
-> FOREIGN KEY (SSN) REFERENCES Employee(SSN),
-> FOREIGN KEY (proj_id) REFERENCES Project(proj_id)
-> );
Query OK, 0 rows affected (0.01 sec)
데이터 삽입
mysql> INSERT INTO Department (dept_id, dept_name, dept_location) VALUES
-> ('D01', 'Engineering', 'New York'),
-> ('D02', 'Marketing', 'Chicago'),
-> ('D03', 'HR', 'Boston');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> INSERT INTO Employee (SSN, lastname, firstname, sex, dept_id) VALUES
-> ('101', 'Smith', 'Liam', 'M', 'D01'),
-> ('102', 'Johnson', 'Ava', 'F', 'D01'),
-> ('103', 'Brown', 'Ethan', 'M', 'D02'),
-> ('104', 'Davis', 'Mia', 'F', 'D03'),
-> ('105', 'Taylor', 'Lucas', 'M', 'D02');
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> INSERT INTO Project (proj_id, proj_name, proj_location, dept_id) VALUES
-> ('P01', 'AI Dev', 'New York', 'D01'),
-> ('P02', 'Ad Campaign', 'Chicago', 'D02'),
-> ('P03', 'Hiring System', 'Boston', 'D03');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> INSERT INTO Project (proj_id, proj_name, proj_location, dept_id) VALUES
-> ('P04', 'Cloud Infra', 'New York', 'D01');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO WorksOn (SSN, proj_id, hours) VALUES
-> ('101', 'P01', 40), -- Liam → AI Dev
-> ('102', 'P01', 35), -- Ava → AI Dev
-> ('103', 'P02', 30), -- Ethan → Ad Campaign
-> ('104', 'P03', 25), -- Mia → Hiring System
-> ('101', 'P03', 10), -- Liam → Hiring System
-> ('105', 'P02', 20), -- Lucas → Ad Campaign
-> ('102', 'P04', 25), -- Ava → Cloud Infra
-> ('101', 'P04', 30); -- Liam → Cloud Infra
Query OK, 8 rows affected (0.01 sec)
Records: 8 Duplicates: 0 Warnings: 0
mysql> SHOW TABLES;
+---------------------+
| Tables_in_mycompany |
+---------------------+
| Department |
| Employee |
| Project |
| WorksOn |
+---------------------+
4 rows in set (0.00 sec)
확인용 기본 쿼리
mysql> SELECT * FROM WorksOn;
+-----+---------+-------+
| SSN | proj_id | hours |
+-----+---------+-------+
| 101 | P01 | 40 |
| 101 | P03 | 10 |
| 101 | P04 | 30 |
| 102 | P01 | 35 |
| 102 | P04 | 25 |
| 103 | P02 | 30 |
| 104 | P03 | 25 |
| 105 | P02 | 20 |
+-----+---------+-------+
8 rows in set (0.00 sec)
mysql> SELECT firstname, lastname FROM Employee;
+-----------+----------+
| firstname | lastname |
+-----------+----------+
| Liam | Smith |
| Ava | Johnson |
| Ethan | Brown |
| Mia | Davis |
| Lucas | Taylor |
+-----------+----------+
5 rows in set (0.00 sec)
mysql> SELECT DISTINCT sex FROM Employee;
+------+
| sex |
+------+
| M |
| F |
+------+
2 rows in set (0.01 sec)
mysql> SELECT * FROM Employee WHERE sex = 'F';
+-----+----------+-----------+------+---------+
| SSN | lastname | firstname | sex | dept_id |
+-----+----------+-----------+------+---------+
| 102 | Johnson | Ava | F | D01 |
| 104 | Davis | Mia | F | D03 |
+-----+----------+-----------+------+---------+
2 rows in set (0.00 sec)
mysql> SELECT COUNT(*) AS female_count FROM Employee WHERE sex = 'F';
+--------------+
| female_count |
+--------------+
| 2 |
+--------------+
1 row in set (0.01 sec)
UPDATE - 기존 데이터 수정
mysql> ALTER TABLE Employee ADD city VARCHAR(20);
Query OK, 0 rows affected (0.14 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM Employee;
+-----+----------+-----------+------+---------+------+
| SSN | lastname | firstname | sex | dept_id | city |
+-----+----------+-----------+------+---------+------+
| 101 | Smith | Liam | M | D01 | NULL |
| 102 | Johnson | Ava | F | D01 | NULL |
| 103 | Brown | Ethan | M | D02 | NULL |
| 104 | Davis | Mia | F | D03 | NULL |
| 105 | Taylor | Lucas | M | D02 | NULL |
+-----+----------+-----------+------+---------+------+
5 rows in set (0.01 sec)
ALTER는 컬럼을 추가, 변경, 삭제하거나 제약 조건을 수정하는 데 사용됩니다.
mysql> UPDATE Employee SET city = 'Springfield' WHERE firstname = 'Ethan';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT * FROM Employee;
+-----+----------+-----------+------+---------+-------------+
| SSN | lastname | firstname | sex | dept_id | city |
+-----+----------+-----------+------+---------+-------------+
| 101 | Smith | Liam | M | D01 | NULL |
| 102 | Johnson | Ava | F | D01 | NULL |
| 103 | Brown | Ethan | M | D02 | Springfield |
| 104 | Davis | Mia | F | D03 | NULL |
| 105 | Taylor | Lucas | M | D02 | NULL |
+-----+----------+-----------+------+---------+-------------+
5 rows in set (0.00 sec)
- SET: 어떤 값을 어떻게 바꿀지 지정합니다.
- WHERE: 어떤 행을 수정할지 지정합니다. 없으면 전체 행이 바뀝니다.
ORDER BY
mysql> SELECT * FROM Employee ORDER BY firstname;
+-----+----------+-----------+------+---------+-------------+
| SSN | lastname | firstname | sex | dept_id | city |
+-----+----------+-----------+------+---------+-------------+
| 102 | Johnson | Ava | F | D01 | NULL |
| 103 | Brown | Ethan | M | D02 | Springfield |
| 101 | Smith | Liam | M | D01 | NULL |
| 105 | Taylor | Lucas | M | D02 | NULL |
| 104 | Davis | Mia | F | D03 | NULL |
+-----+----------+-----------+------+---------+-------------+
5 rows in set (0.02 sec)
mysql> SELECT * FROM Employee ORDER BY firstname DESC;
+-----+----------+-----------+------+---------+-------------+
| SSN | lastname | firstname | sex | dept_id | city |
+-----+----------+-----------+------+---------+-------------+
| 104 | Davis | Mia | F | D03 | NULL |
| 105 | Taylor | Lucas | M | D02 | NULL |
| 101 | Smith | Liam | M | D01 | NULL |
| 103 | Brown | Ethan | M | D02 | Springfield |
| 102 | Johnson | Ava | F | D01 | NULL |
+-----+----------+-----------+------+---------+-------------+
5 rows in set (0.00 sec)
mysql> SELECT firstname, lastname, dept_id FROM Employee ORDER BY dept_id ASC, firstname DESC;
+-----------+----------+---------+
| firstname | lastname | dept_id |
+-----------+----------+---------+
| Liam | Smith | D01 |
| Ava | Johnson | D01 |
| Lucas | Taylor | D02 |
| Ethan | Brown | D02 |
| Mia | Davis | D03 |
+-----------+----------+---------+
5 rows in set (0.01 sec)
먼저 dept_id를 기준으로 오름차순 정렬 후, 같은 부서 내에서는 firstname을 기준으로 내림차순 정렬을 하는 쿼리이다.
COUNT()
mysql> SELECT COUNT(*) AS femail_empl FROM Employee WHERE sex = 'F';
+-------------+
| femail_empl |
+-------------+
| 2 |
+-------------+
1 row in set (0.00 sec)
COUNT()는 행의 개수를 세는 집계 함수(aggregate function)입니다.
GROUP BY
GROUP BY는 특정 컬럼을 기준으로 행을 그룹화하고, 그 그룹에 대해 집계함수를 적용할 수 있게 해 줍니다.
mysql> SELECT dept_id, COUNT(*) AS employee_count FROM Employee GROUP BY dept_id;
+---------+----------------+
| dept_id | employee_count |
+---------+----------------+
| D01 | 2 |
| D02 | 2 |
| D03 | 1 |
+---------+----------------+
3 rows in set (0.01 sec)
- Employee 테이블에서 dept_id를 기준으로 그룹을 나눕니다.
- 각 그룹에 대해 직원 수(COUNT(*))를 셉니다.
- AS employee_count는 결과 컬럼 이름을 보기 좋게 지정한 것입니다.
Cartesian Product
Cartesian Product (카티션 프로덕트)는 두 테이블을 JOIN할 때 조건 없이 결합할 경우 발생합니다. 이 경우 모든 행 조합이 생성되며, 결과 행 수는 두 테이블의 행 수를 곱한 만큼 됩니다.
mysql> SELECT * FROM Employee;
+-----+----------+-----------+------+---------+-------------+
| SSN | lastname | firstname | sex | dept_id | city |
+-----+----------+-----------+------+---------+-------------+
| 101 | Smith | Liam | M | D01 | NULL |
| 102 | Johnson | Ava | F | D01 | NULL |
| 103 | Brown | Ethan | M | D02 | Springfield |
| 104 | Davis | Mia | F | D03 | NULL |
| 105 | Taylor | Lucas | M | D02 | NULL |
+-----+----------+-----------+------+---------+-------------+
5 rows in set (0.00 sec)
mysql> SELECT * FROM Department;
+---------+-------------+---------------+
| dept_id | dept_name | dept_location |
+---------+-------------+---------------+
| D01 | Engineering | New York |
| D02 | Marketing | Chicago |
| D03 | HR | Boston |
+---------+-------------+---------------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM Employee, Department;
+-----+----------+-----------+------+---------+-------------+---------+-------------+---------------+
| SSN | lastname | firstname | sex | dept_id | city | dept_id | dept_name | dept_location |
+-----+----------+-----------+------+---------+-------------+---------+-------------+---------------+
| 101 | Smith | Liam | M | D01 | NULL | D01 | Engineering | New York |
| 101 | Smith | Liam | M | D01 | NULL | D02 | Marketing | Chicago |
| 101 | Smith | Liam | M | D01 | NULL | D03 | HR | Boston |
| 102 | Johnson | Ava | F | D01 | NULL | D01 | Engineering | New York |
| 102 | Johnson | Ava | F | D01 | NULL | D02 | Marketing | Chicago |
| 102 | Johnson | Ava | F | D01 | NULL | D03 | HR | Boston |
| 103 | Brown | Ethan | M | D02 | Springfield | D01 | Engineering | New York |
| 103 | Brown | Ethan | M | D02 | Springfield | D02 | Marketing | Chicago |
| 103 | Brown | Ethan | M | D02 | Springfield | D03 | HR | Boston |
| 104 | Davis | Mia | F | D03 | NULL | D01 | Engineering | New York |
| 104 | Davis | Mia | F | D03 | NULL | D02 | Marketing | Chicago |
| 104 | Davis | Mia | F | D03 | NULL | D03 | HR | Boston |
| 105 | Taylor | Lucas | M | D02 | NULL | D01 | Engineering | New York |
| 105 | Taylor | Lucas | M | D02 | NULL | D02 | Marketing | Chicago |
| 105 | Taylor | Lucas | M | D02 | NULL | D03 | HR | Boston |
+-----+----------+-----------+------+---------+-------------+---------+-------------+---------------+
15 rows in set (0.00 sec)
JOIN
JOIN은 둘 이상의 테이블을 연결해서 하나의 결과로 보여주는 SQL 연산자입니다. 공통된 컬럼(예: 외래 키)을 기준으로 데이터를 연결할 수 있습니다.
INNER JOIN
mysql> SELECT * FROM Employee, Department WHERE Employee.dept_id = Department.dept_id;
+-----+----------+-----------+------+---------+-------------+---------+-------------+---------------+
| SSN | lastname | firstname | sex | dept_id | city | dept_id | dept_name | dept_location |
+-----+----------+-----------+------+---------+-------------+---------+-------------+---------------+
| 101 | Smith | Liam | M | D01 | NULL | D01 | Engineering | New York |
| 102 | Johnson | Ava | F | D01 | NULL | D01 | Engineering | New York |
| 103 | Brown | Ethan | M | D02 | Springfield | D02 | Marketing | Chicago |
| 104 | Davis | Mia | F | D03 | NULL | D03 | HR | Boston |
| 105 | Taylor | Lucas | M | D02 | NULL | D02 | Marketing | Chicago |
+-----+----------+-----------+------+---------+-------------+---------+-------------+---------------+
5 rows in set (0.04 sec)
이 쿼리는 Employee와 Department 테이블을 카티션 프로덕트로 결합한 뒤 WHERE 절에서 dept_id가 같은 행만 남기는 방식입니다.
mysql> SELECT * FROM Employee JOIN Department ON Employee.dept_id = Department.dept_id;
+-----+----------+-----------+------+---------+-------------+---------+-------------+---------------+
| SSN | lastname | firstname | sex | dept_id | city | dept_id | dept_name | dept_location |
+-----+----------+-----------+------+---------+-------------+---------+-------------+---------------+
| 101 | Smith | Liam | M | D01 | NULL | D01 | Engineering | New York |
| 102 | Johnson | Ava | F | D01 | NULL | D01 | Engineering | New York |
| 103 | Brown | Ethan | M | D02 | Springfield | D02 | Marketing | Chicago |
| 104 | Davis | Mia | F | D03 | NULL | D03 | HR | Boston |
| 105 | Taylor | Lucas | M | D02 | NULL | D02 | Marketing | Chicago |
+-----+----------+-----------+------+---------+-------------+---------+-------------+---------------+
5 rows in set (0.03 sec)
동일한 결과를 냅니다.
LEFT JOIN
왼쪽 테이블의 모든 행을 반환하고, 오른쪽 테이블에서 일치하는 행이 없으면 NULL을 반환합니다.
mysql> INSERT INTO Department VALUES('D04', 'Business', 'Toronto');
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM Department;
+---------+-------------+---------------+
| dept_id | dept_name | dept_location |
+---------+-------------+---------------+
| D01 | Engineering | New York |
| D02 | Marketing | Chicago |
| D03 | HR | Boston |
| D04 | Business | Toronto |
+---------+-------------+---------------+
4 rows in set (0.00 sec)
새로운 과를 추가하였습니다.
mysql> SELECT * FROM Employee E LEFT JOIN Department D ON E.dept_id = D.dept_id;
+-----+----------+-----------+------+---------+-------------+---------+-------------+---------------+
| SSN | lastname | firstname | sex | dept_id | city | dept_id | dept_name | dept_location |
+-----+----------+-----------+------+---------+-------------+---------+-------------+---------------+
| 101 | Smith | Liam | M | D01 | NULL | D01 | Engineering | New York |
| 102 | Johnson | Ava | F | D01 | NULL | D01 | Engineering | New York |
| 103 | Brown | Ethan | M | D02 | Springfield | D02 | Marketing | Chicago |
| 105 | Taylor | Lucas | M | D02 | NULL | D02 | Marketing | Chicago |
| 104 | Davis | Mia | F | D03 | NULL | D03 | HR | Boston |
+-----+----------+-----------+------+---------+-------------+---------+-------------+---------------+
5 rows in set (0.00 sec)
왼쪽 테이블 (Employee)의 데이터는 조건에 부합하지 않아도 모두 결합되어야 합니다. 즉, 왼쪽 테이블은 모두 출력되어야 합니다. Employee는 모두 포함되고, Department에 매칭되는 값이 없으면 NULL을 출력합니다.
RIGHT JOIN
mysql> SELECT * FROM Employee E RIGHT JOIN Department D ON E.dept_id = D.dept_id;
+------+----------+-----------+------+---------+-------------+---------+-------------+---------------+
| SSN | lastname | firstname | sex | dept_id | city | dept_id | dept_name | dept_location |
+------+----------+-----------+------+---------+-------------+---------+-------------+---------------+
| 101 | Smith | Liam | M | D01 | NULL | D01 | Engineering | New York |
| 102 | Johnson | Ava | F | D01 | NULL | D01 | Engineering | New York |
| 103 | Brown | Ethan | M | D02 | Springfield | D02 | Marketing | Chicago |
| 104 | Davis | Mia | F | D03 | NULL | D03 | HR | Boston |
| 105 | Taylor | Lucas | M | D02 | NULL | D02 | Marketing | Chicago |
| NULL | NULL | NULL | NULL | NULL | NULL | D04 | Business | Toronto |
+------+----------+-----------+------+---------+-------------+---------+-------------+---------------+
6 rows in set (0.04 sec)
오른쪽 테이블의 데이터가 조건에 부합하지 않아도 모두 결합되어야 합니다. 즉, 오른쪽 테이블은 모두 출력되어야 합니다. Department는 모두 포함되고, 매칭되지 않는 Employee는 NULL을 출력합니다.
UNION
두 개 이상의 SELECT 결과를 하나로 합칩니다. 중복 제거가 기본이며, UNION ALL을 쓰면 중복도 포함합니다.
mysql> UPDATE Employee SET city = 'Calgary' WHERE sex = 'F';
Query OK, 2 rows affected (0.01 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> UPDATE Employee SET city = 'Halifax' WHERE sex = 'M';
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0
mysql> SELECT * FROM Employee;
+-----+----------+-----------+------+---------+---------+
| SSN | lastname | firstname | sex | dept_id | city |
+-----+----------+-----------+------+---------+---------+
| 101 | Smith | Liam | M | D01 | Halifax |
| 102 | Johnson | Ava | F | D01 | Calgary |
| 103 | Brown | Ethan | M | D02 | Halifax |
| 104 | Davis | Mia | F | D03 | Calgary |
| 105 | Taylor | Lucas | M | D02 | Halifax |
+-----+----------+-----------+------+---------+---------+
5 rows in set (0.01 sec)
우선, city를 업데이트합니다. Employee 테이블에는 총 두 개의 도시가 존재합니다.
mysql> SELECT * FROM Department;
+---------+-------------+---------------+
| dept_id | dept_name | dept_location |
+---------+-------------+---------------+
| D01 | Engineering | New York |
| D02 | Marketing | Chicago |
| D03 | HR | Boston |
| D04 | Business | Toronto |
+---------+-------------+---------------+
4 rows in set (0.00 sec)
Department 테이블에는 뉴욕, 시카고, 보스턴, 토론토 총 네 개의 도시가 존재합니다.
mysql> SELECT dept_location FROM Department UNION (SELECT city FROM Employee);
+---------------+
| dept_location |
+---------------+
| New York |
| Chicago |
| Boston |
| Toronto |
| Halifax |
| Calgary |
+---------------+
6 rows in set (0.00 sec)
합집합을 리턴하므로 총 여섯 개의 도시가 출력됩니다.
INTERSECTION
두 SELECT 결과에 모두 포함된 레코드만 반환합니다. MySQL은 직접 지원하지 않으므로, INNER JOIN 또는 IN으로 구현합니다.
mysql> INSERT INTO Project VALUES('P05', 'Sales Campaign', 'London', 'D02');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM Project;
+---------+----------------+---------------+---------+
| proj_id | proj_name | proj_location | dept_id |
+---------+----------------+---------------+---------+
| P01 | AI Dev | New York | D01 |
| P02 | Ad Campaign | Chicago | D02 |
| P03 | Hiring System | Boston | D03 |
| P04 | Cloud Infra | New York | D01 |
| P05 | Sales Campaign | London | D02 |
+---------+----------------+---------------+---------+
5 rows in set (0.00 sec)
우선 프로젝트 도시에 런던을 추가하였습니다.
mysql> SELECT DISTINCT D.dept_location FROM Department D JOIN Project P ON P.proj_location = D.dept_location;
+---------------+
| dept_location |
+---------------+
| New York |
| Chicago |
| Boston |
+---------------+
3 rows in set (0.01 sec)
부서와 프로젝트가 같은 위치에 있는 경우, 그 위치를 중복 없이 가져오고 싶을 때 사용되는 쿼리입니다.
DIFFERENCE
mysql> SELECT proj_location FROM Project WHERE proj_location NOT IN (SELECT dept_location FROM Department);
+---------------+
| proj_location |
+---------------+
| London |
+---------------+
1 row in set (0.01 sec)
우선, SELECT dept_location FROM Department 쿼리문으로 부서가 존재하는 모든 위치를 뽑습니다.
mysql> SELECT dept_location FROM Department;
+---------------+
| dept_location |
+---------------+
| New York |
| Chicago |
| Boston |
| Toronto |
+---------------+
그리고 proj_location NOT IN (...) 를 사용하여 그 위치 목록에 포함되지 않는 프로젝트의 proj_location을 찾습니다.
와일드카드(Wildcard)
SQL에서는 특정 패턴을 가진 문자열을 검색할 때 LIKE 연산자와 와일드카드를 함께 사용합니다.
% | 0개 이상의 임의의 문자 | 'A%', '%ing' |
_ | 정확히 1개의 임의의 문자 | 'A_', '__b' |
mysql> SELECT * FROM Project WHERE proj_location LIKE '%on%';
+---------+----------------+---------------+---------+
| proj_id | proj_name | proj_location | dept_id |
+---------+----------------+---------------+---------+
| P03 | Hiring System | Boston | D03 |
| P05 | Sales Campaign | London | D02 |
+---------+----------------+---------------+---------+
2 rows in set (0.00 sec)
Boston과 London을 출력합니다.
mysql> SELECT * FROM Project WHERE proj_id LIKE 'P_3';
+---------+---------------+---------------+---------+
| proj_id | proj_name | proj_location | dept_id |
+---------+---------------+---------------+---------+
| P03 | Hiring System | Boston | D03 |
+---------+---------------+---------------+---------+
1 row in set (0.00 sec)
P03을 출력합니다.
DROP COLUMN
SQL에서 테이블을 생성한 이후에 더 이상 필요하지 않은 열을 삭제하고 싶을 때 사용하는 명령어입니다.
mysql> ALTER TABLE Employee ADD address VARCHAR(30);
Query OK, 0 rows affected (0.12 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM Employee;
+-----+----------+-----------+------+---------+---------+---------+
| SSN | lastname | firstname | sex | dept_id | city | address |
+-----+----------+-----------+------+---------+---------+---------+
| 101 | Smith | Liam | M | D01 | Halifax | NULL |
| 102 | Johnson | Ava | F | D01 | Calgary | NULL |
| 103 | Brown | Ethan | M | D02 | Halifax | NULL |
| 104 | Davis | Mia | F | D03 | Calgary | NULL |
| 105 | Taylor | Lucas | M | D02 | Halifax | NULL |
+-----+----------+-----------+------+---------+---------+---------+
5 rows in set (0.00 sec)
mysql> ALTER TABLE Employee DROP COLUMN address;
Query OK, 0 rows affected (0.10 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM Employee;
+-----+----------+-----------+------+---------+---------+
| SSN | lastname | firstname | sex | dept_id | city |
+-----+----------+-----------+------+---------+---------+
| 101 | Smith | Liam | M | D01 | Halifax |
| 102 | Johnson | Ava | F | D01 | Calgary |
| 103 | Brown | Ethan | M | D02 | Halifax |
| 104 | Davis | Mia | F | D03 | Calgary |
| 105 | Taylor | Lucas | M | D02 | Halifax |
+-----+----------+-----------+------+---------+---------+
5 rows in set (0.00 sec)
한 번 삭제하면 해당 열의 데이터도 함께 영구적으로 삭제되며, 외래 키로 설정된 열을 삭제하려면 먼저 제약조건(Foreign Key Constraint)을 해제해야 합니다.
VIEWS
SQL에서 View(뷰) 는 복잡한 SELECT 쿼리를 저장해놓고, 마치 테이블처럼 사용할 수 있게 해주는 가상 테이블입니다. 매번 긴 쿼리를 작성하지 않아도 돼서, 가독성도 좋고 유지관리도 쉽습니다.
mysql> CREATE VIEW v AS SELECT firstname, lastname, dept_name FROM Department JOIN Employee ON Department.dept_id = Employee.dept_id;
Query OK, 0 rows affected (0.01 sec)
mysql> SHOW TABLES;
+---------------------+
| Tables_in_mycompany |
+---------------------+
| Department |
| Employee |
| Project |
| WorksOn |
| v |
+---------------------+
5 rows in set (0.01 sec)
mysql> SELECT * FROM v;
+-----------+----------+-------------+
| firstname | lastname | dept_name |
+-----------+----------+-------------+
| Liam | Smith | Engineering |
| Ava | Johnson | Engineering |
| Ethan | Brown | Marketing |
| Mia | Davis | HR |
| Lucas | Taylor | Marketing |
+-----------+----------+-------------+
5 rows in set (0.01 sec)
마케팅 부서만 조회해 보겠습니다.
mysql> CREATE VIEW MarketingEmployee AS SELECT firstname, lastname FROM Employee WHERE dept_id
-> IN (SELECT dept_id FROM Department WHERE dept_name = 'Marketing');
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT * FROM MarketingEmployee; +-----------+----------+
| firstname | lastname |
+-----------+----------+
| Ethan | Brown |
| Lucas | Taylor |
+-----------+----------+
2 rows in set (0.00 sec)
다음 포스팅에서 이어집니다.
'Computer Science > SQL' 카테고리의 다른 글
SQL | LeetCode 584. 조건문으로 필터링하기 (0) | 2025.04.29 |
---|---|
SQL | 실습으로 배우는 SQL 문법 - 2 (0) | 2025.04.28 |
SQL | Selection, JOIN, View 실습 (vetdb 예제) - 2 (0) | 2025.04.26 |
SQL | 관계형 데이터베이스 설계 (vetdb에서 Owner와 Pet 테이블 만들기) - 1 (2) | 2025.04.25 |
SQL | OUTER JOIN (0) | 2025.04.24 |