SQL 기초

·2024년 12월 2일

SQL

관계형 데이터베이스를 관리하기 위해 설계한 프로그래밍 언어이다.

명령어 종류

데이터 정의 언어(DDL)

데이터베이스 객체의 구조를 정의하거나 수정하는 데 사용되는 명령어다.

주요 명령어

  • CREATE
  • DROP
  • ALTER
  • TRUNCATE

CREATE

데이터베이스 객체를 생성한다.

-- create database
CREATE DATABASE new_database;

-- create table 
CREATE TABLE users (
	id INT AUTO_INCREMENT PRIMARY KEY,    
    username VARCHAR(50) NOT NULL,        
    email VARCHAR(100),                   
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP  
)

DROP

데이터베이스 객체를 삭제한다.

--데이터베이스 삭제
DROP DATABASE new_database;

--테이블 삭제
DROP TABLE IF EXISTS users;

--테이블의 열 삭제 
ALTER TABLE users DROP COLUMN username ;

ALTER

데이터베이스 구조를 수정한다.

1. 열 추가

-- 단일 열 추가
ALTER TABLE users ADD COLUMN age INT NOT NULL;

-- 동시에 여러 열 추가
ALTER TABLE users 
ADD COLUMN phone_number VARCHAR(20),
ADD COLUMN address VARCHAR(255);

2. 열 수정

-- 열의 데이터 타입 수정
ALTER TABLE users MODIFY COLUMN age INT UNSIGNED;

-- 열 이름 변경
ALTER TABLE users CHANGE COLUMN phone_number contact_number VARCHAR(20);

-- 열 길이 수정
ALTER TABLE users MODIFY COLUMN name VARCHAR(255);


3. 열 삭제

-- "address" 열 삭제
ALTER TABLE users DROP COLUMN address;


4. 기본 값 추가 및 변경

-- 기본값 추가
ALTER TABLE users ALTER COLUMN status SET DEFAULT 'active';

-- 기본값 삭제
ALTER TABLE users ALTER COLUMN status DROP DEFAULT;


5. 키 추가 및 삭제 

-- PRIMARY KEY 추가
ALTER TABLE users ADD PRIMARY KEY (id);

-- PRIMARY KEY 삭제
ALTER TABLE users DROP PRIMARY KEY;

-- 외래 키 추가
ALTER TABLE users ADD CONSTRAINT fk_department 
FOREIGN KEY (department_id) REFERENCES departments(id);

-- 외래 키 삭제
ALTER TABLE users DROP FOREIGN KEY fk_department;


6. 열 순서 변경

-- "nickname" 열을 "body" 열 뒤로 이동
ALTER TABLE users MODIFY COLUMN nickname VARCHAR(50) AFTER body;

-- 열을 맨 앞으로 이동
ALTER TABLE users MODIFY COLUMN age INT FIRST;


7. 테이블 이름 변경

-- 테이블 이름 변경
ALTER TABLE users RENAME TO customers;


8. AUTO_INCREMENT 추가 및 변경 

-- AUTO_INCREMENT 설정
ALTER TABLE users MODIFY COLUMN id INT AUTO_INCREMENT;

-- AUTO_INCREMENT 초기값 설정
ALTER TABLE users AUTO_INCREMENT = 10;


9. NOT NULL 설정

-- NOT NULL 제약 추가
ALTER TABLE users MODIFY COLUMN nickname VARCHAR(50) NOT NULL;

-- NOT NULL 제약 삭제
ALTER TABLE users MODIFY COLUMN nickname VARCHAR(50) NULL;

TRUNCATE

데이터베이스의 모든 데이터를 삭제한다. 그러나 구조는 유지된다.

1. 테이블 초기화

TRUNCATE TABLE logs;

데이터 조작 언어(DML)

데이터베이스의 데이터를 조작(검색, 삽입, 수정, 삭제)하는 명령어다.

주요 명령어

  • INSERT
  • SELECT
  • UPDATE
  • DELETE

INSERT

테이블에 새로운 데이터를 추가한다.

-- 단일 행 추가
INSERT INTO users (id, name, age) VALUES (1, '홍길동', 25);

-- 다중 행 추가
INSERT INTO users (id, name, age) VALUES 
(2, '김철수', 30),
(3, '이영희', 22);

-- SELECT 결과를 기반으로 데이터 추가
INSERT INTO backup_users (id, name, age, backup_date)
SELECT 
    id, 
    name, 
    age, 
    CURRENT_TIMESTAMP 
FROM users 
WHERE age > 20;

SELECT

데이터를 조회한다.

-- 기본 조회 (필요한 열만 선택)
SELECT id, name, age FROM users;

-- 조건부 조회 (인덱스 활용)
SELECT * FROM users 
WHERE age > 25 AND status = 'ACTIVE';

-- 정렬 및 페이징
SELECT * FROM users 
ORDER BY age DESC, name ASC 
LIMIT 10 OFFSET 0;

-- 그룹화 및 HAVING 절 사용
SELECT 
    age, 
    COUNT(*) AS count, 
    AVG(salary) AS avg_salary
FROM users 
GROUP BY age 
HAVING COUNT(*) > 5;

-- 서브쿼리
SELECT * FROM users u
WHERE EXISTS (
    SELECT 1 FROM backup_users bu 
    WHERE bu.id = u.id
);

UPDATE

테이블에 존재하는 데이터를 수정한다.

-- 데이터 업데이트 
UPDATE users 
SET 
    name = '김길동', 
    updated_at = CURRENT_TIMESTAMP 
WHERE id = 1 AND status = 'ACTIVE';

-- 조건부 다중 열 업데이트
UPDATE users 
SET 
    age = age + 1, 
    status = CASE 
        WHEN age >= 65 THEN 'SENIOR' 
        ELSE status 
    END
WHERE age < 70;

DELETE

테이블에서 데이터를 삭제한다.

-- 조건부 삭제
DELETE FROM users 
WHERE 
    age < 20 AND 
    status = 'INACTIVE' AND 
    last_login < DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR);

-- 다중 조건 삭제 
DELETE FROM users 
WHERE id IN (
    SELECT id FROM backup_users 
    WHERE backup_date < DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH)
);

데이터 제어 언어(DCL)

데이터베이스의 접근 권한과 관련된 명령어다.

주요 명령어

  • GRANT
  • REVOKE

GRANT

용자가 데이터베이스 객체에 대해 특정 작업을 수행할 수 있는 권한을 부여한다.

-- 특정 사용자에게 SELECT 권한 부여
GRANT SELECT ON database_name.table_name TO 'username'@'host';

-- 특정 사용자에게 SELECT, INSERT 권한 부여
GRANT SELECT, INSERT ON database_name.table_name TO 'username'@'host';

-- 특정 데이터베이스에 대한 모든 권한 부여
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'host';

-- 글로벌 권한 부여 (모든 데이터베이스 접근 가능)
GRANT ALL PRIVILEGES ON *.* TO 'username'@'host';

-- GRANT OPTION 포함 권한 부여 (사용자가 다른 사용자에게 권한을 부여할 수 있음)
GRANT ALL PRIVILEGES ON database_name.table_name TO 'username'@'host' WITH GRANT OPTION;

REVOKE

사용자에게 부여된 권한을 철회한다.

-- 특정 테이블에서 SELECT 권한 회수
REVOKE SELECT ON database_name.table_name FROM 'username'@'host';

-- 특정 사용자로부터 특정 권한 회수
REVOKE INSERT, UPDATE ON database_name.table_name FROM 'username'@'host';

-- 모든 권한 회수
REVOKE ALL PRIVILEGES ON database_name.* FROM 'username'@'host';

-- 글로벌 권한 회수
REVOKE ALL PRIVILEGES ON *.* FROM 'username'@'host';

SQL의 연산자

종류연산자설명예시
비교 연산자=두 값이 같은지 비교SELECT * FROM users WHERE age = 25;
!= / <>두 값이 다른지 비교SELECT * FROM products WHERE price != 100;
>첫 번째 값이 두 번째 값보다 큰지 비교SELECT * FROM orders WHERE total_amount > 500;
<첫 번째 값이 두 번째 값보다 작은지 비교SELECT * FROM employees WHERE salary < 3000;
>=첫 번째 값이 두 번째 값보다 크거나 같은지 비교SELECT * FROM customers WHERE points >= 1000;
<=첫 번째 값이 두 번째 값보다 작거나 같은지 비교SELECT * FROM inventory WHERE quantity <= 10;
논리 연산자AND두 조건이 모두 참일 때 참SELECT * FROM students WHERE age > 18 AND grade = 'A';
OR두 조건 중 하나라도 참일 때 참SELECT * FROM employees WHERE department = 'Sales' OR department = 'Marketing';
NOT조건을 부정SELECT * FROM products WHERE NOT price < 50;
수학 연산자+두 값의 합을 구함SELECT price + tax FROM orders;
-두 값의 차를 구함SELECT salary - deductions FROM employees;
*두 값의 곱을 구함SELECT quantity * unit_price FROM invoice;
/두 값의 나눗셈을 구함SELECT total / 2 FROM sales;
%두 값의 나머지를 구함SELECT quantity % 2 FROM products;
문자열 연산자CONCAT()두 문자열을 결합SELECT CONCAT(first_name, ' ', last_name) FROM users;

참고 자료

profile
장기적 성장하기

0개의 댓글