SQL(Structured Query Language)은 데이터베이스 관리 시스템(DBMS)에서 사용되는 언어입니다. 테이블을 만들고 테이블에 데이터를 추가하거나 수정하며, 필요한 정보를 조회하는 데 사용합니다. SQL Server, Oracle, MySQL, PostgreSQL, DB2 등 다양한 DBMS에서 사용됩니다.
명령어의 종류는 DDL(테이블 생성, 변경, 삭제), DML(데이터 조회, 수정), DCL(권한 관리), TCL(트랜잭션 제어)로 나눌 수 있습니다.
✍️ MySQL을 기준으로 작성되었습니다.
관계형 데이터베이스의 기본 구조(테이블)를 잡는데 사용하는 언어
CREATE TABLE addresses (
id INT PRIMARY KEY,
member_id INT,
email VARCHAR(50)
address VARCHAR(100)
);
ALTER TABLE members
ADD COLUMN phone_number VARCHAR(20);
-- 새로운 컬럼을 추가하고 속성 지정
ALTER TABLE members
ALTER COLUMN class_a VARCHAR(30) NOT NULL;
-- NOT NULL을 명시하지 않으면 자동으로 NULL 허용
-- 한번에 하나의 컬럼만 변경할 수 있으며 괄호를 쓰지 않는다
DROP TABLE members; -- 테이블의 내용 및 구조 자체를 완전히 삭제
CREATE TABLE parent ( -- 상위 테이블 생성
id INT PRIMARY KEY -- id 열을 기본키로 지정
);
CREATE TABLE child ( -- 하위 테이블 생성
id INT PRIMARY KEY, -- id 열을 기본키로 지정
parent_id INT, -- parent_id 열을 생성
FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE
-- parent_id 열을 외래키로 지정 + 상위 테이블의 id 열을 참조하도록 설정 + 상위 테이블 행 삭제시 의존하는 하위 테이블 행도 삭제되도록 제약
);
TRUNCATE TABLE employees; -- employees 테이블의 모든 데이터를 빠르게 삭제
💡 DROP vs TRUNCATE vs DELETE
- DROP: DDL 명령으로, 테이블과 데이터를 완전히 삭제합니다. 로그를 남기지 않아 ROLLBACK이 불가능하고 자동으로 COMMIT됩니다.
- TRUNCATE: DDL 명령으로, 테이블 구조를 남기고 데이터만 삭제합니다. 로그를 남기지 않아 ROLLBACK이 불가능하고 자동으로 COMMIT됩니다.
- DELETE: DML 명령으로, 테이블 구조를 남기고 데이터만 삭제합니다. WHERE와 함께 원하는 데이터를 골라 삭제할 수 있습니다. 마지막 COMMIT 지점으로 ROLLBACK이 가능하며, 수동 COMMIT이 필요합니다.
테이블에 저장한 데이터를 조작하는데 사용하는 언어
SELECT *
FROM members
WHERE status = 'Active';
UPDATE members
SET status = 'Inactive'
WHERE id = 101;
DELETE FROM members
WHERE id = 105;
💡 WHERE
SELECT, UPDATE, DELETE를 WHERE절과 함께 쓰면 원하는 조건으로 필터링된 값을 조회/수정/삭제할 수 있습니다.-- '김'으로 시작하는 이름을 가진 사람을 조회 SELECT * FROM CUSTOMER WHERE NAME LIKE '김%'; -- 오더 개수가 5가 넘으면 CATEGORY를 VIP로 수정 UPDATE CUSTOMER SET CATEGORY = 'VIP' WHERE ORDER_TOTAL > 5; -- 폰 번호가 NULL인 행을 삭제 DELETE FROM CUSTOMER WHERE PHONE_NO IS NULL;
💡 GROUP BY
집계함수(count, sum, min, max 등)를 조건으로 사용하고자 할 때는, WHERE절이 아닌 GROUP BY절에서 사용할 수 있습니다. [GROUP BY 칼럼이나 표현식]을 먼저 작성한 다음에 [HAVING 그룹의 조건식]의 형태로 추가합니다.SELECT attr, AVG(weight) AS 몸무게 -- SELECT에서는 AS 사용 가능 FROM trainee GROUP BY attr -- attr 칼럼을 기준으로 같은 값끼리 그룹화 HAVING AVG(weight) > 90; -- 그룹화 조건: 몸무게 칼럼 값이 90 이상인 것만 그룹화이때 주의할 점은, GROUP BY절에 나열된 열은 반드시 SELECT 절이나 혹은 집계 함수 안에 나타나야 한다는 것입니다.
💡 HAVING
데이터를 집계해서 그룹화했을 때 조건을 지정하는 용도로 사용합니다. 주로 GROUP BY와 함께 사용하지만, GROUP BY절이 없어도, 집계함수를 사용해서 조건을 지정하는 방식으로도 사용이 가능합니다.SELECT SUM(salary) AS total_salary FROM employees HAVING SUM(salary) > 200000;
INSERT INTO members (name, email)
VALUES ('Alice', 'alice@example.com');
SELECT members.name, addresses.address
FROM members
INNER JOIN addresses
ON members.id = addresses.member_id;
데이터베이스에 접근 및 제어 권한을 관리하는 언어
GRANT SELECT ON wifi_history TO user1234;
-- user1234라는 사용자에게 wifi_history라는 테이블 SELECT 권한을 부여
REVOKE SELECT ON wifi_history FROM user1234;
-- user1234라는 사용자에게 wifi_history라는 테이블 SELECT 권한을 회수
CREATE ROLE manager_role; -- role을 생성하고 이름 지정
GRANT SELECT, INSERT, UPDATE ON employees TO manager_role; -- role에 권한 부여
GRANT manager_role TO 'john_doe'@'localhost';
-- 로컬호스트의 특정 사용자에게 해당 role 부여
DML로 조작된 결과물을 트랜잭션 단위로 묶어서 제어하는 언어
💡 Auto Commit
- SQL Server
DDL 명령어(CREATE, ALTER, DROP, TRUNCATE 등)는 Auto Commit입니다. DML 명령어(SELECT, INSERT, UPDATE, DELETE 등)도 기본적으로는 Auto Commit이지만, 1️⃣ BEGIN TRANSACITON을 사용해서 트랜잭션을 명시적으로 관리하거나 2️⃣ Auto Commit을 False로 설정하면 수동 커밋으로 전환이 가능합니다.- Oracle
DDL 명령어는 Auto Commit이지만, DML 명령어는 기본적으로 Auto Commit이 아닙니다. 명시적으로 COMMIT 또는 ROLLBACK 필요합니다.
SELECT [column1], [column2], COUNT([column3]) AS [alias_for_count] -- 조회할 컬럼 선택 및 별명 지정
FROM [table1] -- 조회할 테이블 지정
JOIN [table2] ON [table1].[matching_column] = [table2].[matching_column] -- 결합할 테이블 지정하고 결합 조건 명시
WHERE [condition_column] = '[value]' -- 행 필터링 기준
GROUP BY [column1], [column2] -- 그룹화 기준
HAVING COUNT([column3]) > [number] -- 그룹화 조건
ORDER BY [alias_for_count] DESC -- 내림차순 정렬
LIMIT [limit_number]; -- 출력할 최대 행 개수
💡 ORDER BY 절은 결과를 정렬하는 데 사용되며, 그 정렬 기준이 되는 열이 SELECT 절이나 GROUP BY 절에 포함되어야 합니다.