500===Dev Database/ORACLE 데이터베이스

SQL 기본 문법 - 데이터 대화의 언어 마스터하기 💾

블로글러 2019. 2. 14. 14:47

데이터베이스와 친해지고 싶으신가요? SQL은 데이터베이스와 대화하는 언어입니다. 마치 도서관에서 사서에게 책을 찾아달라고 요청하듯이, SQL은 데이터베이스에 원하는 정보를 요청하는 방법입니다.

여러분이 도서관에 비유해서 생각해보세요.

  • 데이터베이스는 체계적으로 정리된 도서관입니다.
  • 테이블은 특정 주제별로 분류된 책장입니다.
  • 레코드(행)는 각각의 책이고, 열(컬럼)은 책의 속성(제목, 저자, 출판년도 등)입니다.
  • SQL은 이 도서관에서 원하는 책을 찾고, 새 책을 추가하고, 책 정보를 수정하는 언어입니다.

왜 필요한가?

SQL이 해결하는 문제들은 다음과 같습니다:

  1. 대용량 데이터 관리: 엑셀로는 관리하기 어려운 대규모 데이터도 효율적으로 저장하고 검색할 수 있습니다.
  2. 데이터 무결성 보장: 제약조건을 통해 데이터의 정확성과 일관성을 유지합니다.
  3. 다중 사용자 동시 접근: 여러 사용자가 동시에 데이터에 접근하고 작업할 수 있습니다.
  4. 복잡한 데이터 관계 표현: 테이블 간의 관계를 설정하여 복잡한 데이터 구조를 효과적으로 표현합니다.
  5. 효율적인 데이터 분석: 집계 함수와 그룹화를 통해 데이터 분석을 쉽게 수행할 수 있습니다.

기본 원리

SQL의 핵심 원리를 알아볼까요?

데이터 조회 (SELECT)

-- 기본 데이터 조회
SELECT 컬럼명1, 컬럼명2 FROM 테이블명;

-- 모든 컬럼 조회
SELECT * FROM 테이블명;

-- 조건부 조회
SELECT 컬럼명1, 컬럼명2 FROM 테이블명 WHERE 조건식;

-- 정렬
SELECT 컬럼명 FROM 테이블명 ORDER BY 컬럼명 [ASC|DESC];

-- 그룹화 및 집계
SELECT 그룹컬럼, COUNT(*), SUM(컬럼명) 
FROM 테이블명 
GROUP BY 그룹컬럼
HAVING 집계조건;

데이터 조작 (INSERT, UPDATE, DELETE)

-- 데이터 추가
INSERT INTO 테이블명(컬럼1, 컬럼2) VALUES(값1, 값2);

-- 데이터 수정
UPDATE 테이블명 SET 컬럼1=값1, 컬럼2=값2 WHERE 조건식;

-- 데이터 삭제
DELETE FROM 테이블명 WHERE 조건식;

데이터 정의 (CREATE, ALTER, DROP)

-- 테이블 생성
CREATE TABLE 테이블명 (
    컬럼명1 데이터타입 [제약조건],
    컬럼명2 데이터타입 [제약조건],
    ...
);

-- 테이블 구조 변경
ALTER TABLE 테이블명 ADD 컬럼명 데이터타입;
ALTER TABLE 테이블명 MODIFY 컬럼명 새데이터타입;
ALTER TABLE 테이블명 DROP COLUMN 컬럼명;

-- 테이블 삭제
DROP TABLE 테이블명;

테이블 간 관계 (JOIN)

-- 내부 조인 (양쪽 테이블에 모두 존재하는 데이터만)
SELECT a.컬럼명, b.컬럼명
FROM 테이블A a
INNER JOIN 테이블B b ON a.공통컬럼 = b.공통컬럼;

-- 왼쪽 외부 조인 (왼쪽 테이블의 모든 데이터 포함)
SELECT a.컬럼명, b.컬럼명
FROM 테이블A a
LEFT JOIN 테이블B b ON a.공통컬럼 = b.공통컬럼;

-- 오른쪽 외부 조인 (오른쪽 테이블의 모든 데이터 포함)
SELECT a.컬럼명, b.컬럼명
FROM 테이블A a
RIGHT JOIN 테이블B b ON a.공통컬럼 = b.공통컬럼;

실제 예제

온라인 쇼핑몰의 데이터베이스를 가정해 보겠습니다.

테이블 생성

-- 고객 테이블
CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE,
    join_date DATE
);

-- 상품 테이블
CREATE TABLE products (
    product_id INT PRIMARY KEY,
    name VARCHAR(200) NOT NULL,
    price DECIMAL(10, 2),
    stock INT DEFAULT 0
);

-- 주문 테이블
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
    status VARCHAR(20),
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

-- 주문 상세 테이블
CREATE TABLE order_items (
    order_id INT,
    product_id INT,
    quantity INT,
    price DECIMAL(10, 2),
    PRIMARY KEY (order_id, product_id),
    FOREIGN KEY (order_id) REFERENCES orders(order_id),
    FOREIGN KEY (product_id) REFERENCES products(product_id)
);

기본 사용법

-- 데이터 추가
INSERT INTO customers (customer_id, name, email, join_date)
VALUES (1, '홍길동', 'hong@example.com', '2023-01-15');

INSERT INTO products (product_id, name, price, stock)
VALUES (1, '스마트폰', 1200000, 50);

-- 주문 생성
INSERT INTO orders (order_id, customer_id, status)
VALUES (1, 1, '배송 준비중');

INSERT INTO order_items (order_id, product_id, quantity, price)
VALUES (1, 1, 2, 1200000);

-- 데이터 조회
-- 모든 고객 목록
SELECT * FROM customers;

-- 재고가 10개 미만인 상품
SELECT name, stock FROM products WHERE stock < 10;

-- 특정 고객의 주문 내역
SELECT o.order_id, o.order_date, p.name, oi.quantity, oi.price
FROM orders o
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
WHERE o.customer_id = 1;

-- 월별 판매량 집계
SELECT 
    YEAR(o.order_date) AS year,
    MONTH(o.order_date) AS month,
    SUM(oi.quantity) AS total_sold,
    SUM(oi.quantity * oi.price) AS total_sales
FROM orders o
JOIN order_items oi ON o.order_id = oi.order_id
GROUP BY YEAR(o.order_date), MONTH(o.order_date)
ORDER BY year, month;

실전 활용

다음은 실제 프로젝트에서 어떻게 활용되는지 보여주는 예시입니다:

상황 일반적인 방법 SQL 활용 방법 개선효과
재고 확인 전체 목록을 불러와 수동 확인 SELECT * FROM products WHERE stock < 10 즉시 부족 재고 파악
매출 분석 엑셀로 데이터 내보내기 후 계산 SELECT SUM(quantity*price) FROM order_items 실시간 분석 가능
고객 세그먼트 분석 다중 시스템에서 데이터 취합 JOIN을 활용한 통합 쿼리 360도 고객 이해 가능
데이터 업데이트 수동으로 여러 기록 변경 UPDATE 구문으로 일괄 변경 오류 감소 및 시간 절약

주의사항 및 팁 💡

⚠️ 이것만은 주의하세요!

  1. SQL 인젝션 방지

    • 사용자 입력을 직접 쿼리에 연결하지 마세요.
    • 항상 prepared statements나 파라미터화된 쿼리를 사용하세요.
  2. 트랜잭션 관리

    • 여러 연관 작업은 트랜잭션으로 묶어 데이터 일관성을 유지하세요.
    BEGIN TRANSACTION;
    -- 여러 SQL 명령어 실행
    COMMIT; -- 성공 시
    -- 또는
    ROLLBACK; -- 실패 시
  1. 대용량 데이터 처리

    • SELECT * 대신 필요한 컬럼만 지정하세요.
    • 적절한 WHERE 조건으로 결과를 제한하세요.
    • 대용량 데이터는 페이징 처리하세요 (LIMIT, OFFSET 활용).

💡 꿀팁

  • 인덱스 활용: 자주 검색하는 컬럼에 인덱스를 생성하여 검색 속도를 높이세요.

      CREATE INDEX idx_customer_email ON customers(email);
  • 뷰(VIEW) 활용: 복잡한 쿼리를 재사용하기 위해 뷰로 저장하세요.

      CREATE VIEW order_summary AS
      SELECT c.name, p.name AS product, oi.quantity, oi.price
      FROM customers c
      JOIN orders o ON c.customer_id = o.customer_id
      JOIN order_items oi ON o.order_id = oi.order_id
      JOIN products p ON oi.product_id = p.product_id;
  • EXPLAIN 명령으로 쿼리 분석: 쿼리 실행 계획을 확인하여 최적화하세요.

      EXPLAIN SELECT * FROM customers WHERE email = 'hong@example.com';
  • 정규화와 비정규화 균형: 상황에 맞게 데이터 모델을 설계하세요. 완벽한 정규화가 항상 최선은 아닙니다.

마치며

지금까지 SQL 기본 문법에 대해 알아보았습니다. SQL은 데이터베이스 관리의 핵심 도구로, 초기에는 다소 어렵게 느껴질 수 있지만 기본 원리를 이해하면 강력한 데이터 관리와 분석이 가능해집니다.

처음에는 간단한 SELECT 쿼리부터 시작하여 점차 복잡한 JOIN과 서브쿼리로 발전시켜 나가는 것이 좋습니다. 무엇보다 실제 데이터로 직접 실습해보는 것이 가장 효과적인 학습 방법입니다.

혹시 궁금한 점이 있으시거나, 더 알고 싶은 내용이 있으시면 댓글로 남겨주세요.

참고 자료 🔖


#SQL #데이터베이스 #관계형데이터베이스 #개발자입문 #데이터분석

728x90

'500===Dev Database > ORACLE 데이터베이스' 카테고리의 다른 글

Stripe and Java Integration Guide  (0) 2024.06.05
CRUD 쿼리 ++ 모음  (0) 2019.01.14