SQL/SQLD

#9 SQL

sundori 2025. 4. 7. 23:42

목차

    데이터베이스

    우리가 살아가는 세상에는 상상할 수 없을 만큼 방대한 양의 데이터가 존재하며, 지금 이 순간에도 끊임없이 새로운 데이터가 생겨나고 있다.

    예를들어, 아침마다 타는 지하철이 몇 시 몇 분에 어느역으로 도착하는지, 오늘 학교 식당의 메뉴는 무엇인지 같은 정보들도 모두 데이터다.

    이처럼 일상 속에서 생성되는 수많은 정보들을 효율적으로 저장하고 관리하는 공간이 바로 데이터베이스이다.

     

    관계형 데이터베이스 (RDB: Relational Database)

    모든 데이터를 행(Row)과 열(Column)로 이루어진 테이블(Table) 형태로 저장하는 방식을 말한다.

    서로 다른 테이블끼리도 관계(Relation)를 맺어 데이터를 조합해서 활용이 가능하다. 이러한 RDB를 관리, 감독하기 위한 시스템을 RDBMS(Relational Database Management System)이라고 부르며 우리가 익히 알고 있는 Oracle, SQL Server(MSSQL), MySQL,PostgreSQL 등이 이에 속한다.

     

    이러한 관계형 데이터베이스의 특징으로는 정해진 스키마의 필요(컬럼과 데이터 타입을 미리 정의해야함), SQL을 이용해서 데이터 처리,

    정합성, 일관성 확보에 강함(ACID 보장), 관계(외래키 등)를 통한 복잡한 조인 가능이 있다.

     

    학생 테이블
    ID 이름 학번
    1 철수 2023001
    2 영희 2023002
    성적 테이블
    ID 학번 과목
    1 2023001 수학
    2 2023001 영어
    3 2023002 과학

    → 학번을 기준으로 두 테이블을 조인하면, 각 학생의 성적 데이터를 가져올 수 있음

    Table

    관계형 DB는 모든 데이터를 2차원 테이블 형태로 표현한다. 2차원  테이블 형태는 예를들어 엑셀로 보면 이해하기 쉬울 것이다.

    엑셀 테이블
    Mysql 테이블

    이러한 테이블을 보면  항목을 나타내는 각각의 세로 열(id, email, password, nickname, createdAt, updatedAt)을 열(Column)이라고 하고 각각의 가로 행을 로우(Row)라고 한다. 새로운 유저가 가입을 하게 된다면 새로운 행(Row)가 추가가 될 것이다.

    새로운 유저 추가
    컬럼 업데이트

    SQL(Structured Query Language)

    SQL은 Structured Query Language의 약자로, 관계형 데이터베이스에서 데이터를 조회, 삽입, 수정, 삭제하거나 구조를 정의할 때 사용하는 표준화된 언어이다. SQL은 단순히 데이터를 읽는 데 그치지 않고. 테이블을 생성하거나, 권한을 관리하고, 트랜잭션을 제어하는 등 데이터베이스 전반을 다루는 핵심 도구로 사용된다.

    SQL의 주요 기능(명령 유형)
    유형 역할 예시
    DDL(Data Definition Language) 테이블/스키마 정의 CREATE, ALTER, DROP
    DML(Data Manipultaion Language) 데이터 조회/삽입/수정/삭제 SELECT, INSERT, UPDATE, DELETE
    DCL(Data Contorl Language) 권한 부여/회수 GRANT, REVOKE
    TCL(Transaction Control Language) 트랜잭션 제어 COMMIT, ROLLBACK
    -- 1. 데이터 조회
    SELECT * FROM users WHERE email = 'test@example.com';
    
    -- 2. 데이터 삽입
    INSERT INTO users (email, nickname) VALUES ('abc@gmail.com', '철수');
    
    -- 3. 데이터 수정
    UPDATE users SET nickname = '영희' WHERE id = 1;
    
    -- 4. 테이블 생성
    CREATE TABLE users (
      id INT PRIMARY KEY AUTO_INCREMENT,
      email VARCHAR(255),
      nickname VARCHAR(100)
    );

     

    비관계형 데이터베이스(NoSQL: Non-Relational Database)

    테이블과 관계 중심이 아닌 유연한 구조로 데이터를 저장하는 방식을 말한다.

    문서, 키-값, 그래프, 컬럼 기반 등 다양한 형태로 저장이 가능하다.

     

    분류 예시 특징
    문서형 MongoDB, CouchDB JSON 형태로 데이터 저장
    키-값형 Redis, DynamoDB 캐시, 빠른 조회에 최적
    컬럼형 Cassandra, HBase 대규모 로그/이벤트 저장에 강함.
    그래프형 Neo4j, ArangoDB 노드와 관계 중심의 데이터 구조(SNS 등)

     

    이러한 비관계형 데이터베이스의 특징으로는 유연한 스키마 구조로 서로 구조가 달라도 같은 컬렉션에 저장이 가능, 수평적 확장(스케일아웃)이 용이하여 빅데이터 처리에 강함, 성능이 중요한 서비스에 적합(대규모 읽기, 쓰기), 조인/트랜잭션 같은 기능은 상대적으로 약하다.

     

    {
      "name": "철수",
      "studentId": "2023001",
      "grades": [
        {"subject": "수학", "score": 90},
        {"subject": "영어", "score": 85}
      ]
    }

    SELECT 문

    데이터베이스(DB)에 저장된 데이터 중에서 원하는 정보를 조회할 때 사용하는 SQL 명령어다.

    SELECT 컬럼1, 컬럼2, ... FROM 테이블명 WHERE 조건;

     

    예를 들어 아래와 같이 사용할 수 있다:

    SELECT name, price FROM menu WHERE name = '김치전';

    → menu 테이블에서 이름이 '김치전'인 행을 찾아, 해당 행의 name과 price 컬럼만 조회한다.

     

    전체 컬럼 조회하기 *(asterisk)

     

    SELECT * FROM 테이블;

    모든 컬럼을 조회하고 싶을 때는 *(asterisk)를 사용한다.

    이때 컬럼의 조회 순서는 테이블에 정의된 컬럼 순서와 동일하며 WHERE 절이 없으면 해당 테이블의 모든 행(Row)가 조회된다.

     

    예시:

    SELECT * FROM users;

    → users의 테이블의 모든 사용자 정보 전체를 가져온다.

     

    별칭

    SQL에서 테이블명이나 컬럼명에 임시 이름(별칭)을 부여하는 기능을 말한다. 

    별칭을 사용하면 쿼리 가독성이 좋아지고, 조인이나 집계 결과를 다룰 때 매우 유용하다.

    예시: 

    SELECT nickname AS '사용자 닉네임' FROM Users;

    위의 코드를 보면 AS 키워드를 사용해 컬럼에 별칭을 부여하였다.

    별칭은 결과 출력 시 표시되는 이름이다.

    '또는 "로 묶을 수 있으며, 공백이 있는 별칭은 묶는 것이 좋다.

     

    테이블 별칭 주기

    예시:

    SELECT u.email, u.nickname FROM users AS u;

    users 테이블에 u라는 약칭(별칭)을 붙인 것으로 이후 쿼리 안에서 users 대신 u를 사용할 수 있다.

    한 번 별칭을 지정하면 이후에는 테이블명을 반복해서 쓰지 않아도 되므로 코드를 더 간결하게 만들 수 있다.

    그러면 의문점이 들 것이다. 테이블 별칭은 왜 사용하는 것인지 말이다.

     

    1. 조인을 사용할 때 테이블 구분을 명확하게 하기 위해

    SELECT s.name, c.name 
    FROM students AS s
    JOIN classes AS c ON s.class_id = c.id;

    → 같은 name 컬럼이 여러 테이블에 있을 때,
    어떤 테이블의 컬럼인지 구분해야 하므로 별칭이 필수적이다.

     

    2. 긴 테이블명을 줄여서 쓰기 위해

    SELECT u.email FROM user_account_information_details AS u;

    → 테이블명이 길면 반복해서 쓰기 번거로우니,
    짧게 u로 지정해 쿼리 가독성과 생산성을 높일 수 있다.

     

    3. 하위 쿼리(서브 쿼리)에 이름을 붙일 때

    SELECT sub.nickname
    FROM (SELECT * FROM users WHERE email LIKE '%gmail.com') AS sub;

    → 하위 쿼리에 별칭을 주지 않으면 SQL 문법 오류가 발생함

     

    4. 다중 테이블에서 같은 컬럼명을 사용할 때

    SELECT u.id, o.id
    FROM users AS u
    JOIN orders AS o ON u.id = o.user_id;

    → id 컬럼이 두 테이블에 모두 존재하므로, 테이블 별칭 없이는 에러가 나거나 결과가 모호해짐

     

    이와 같이 테이블 별칭을 쓰는 이유는 다양하다.

     

    산술 연산자

    산술 연산자는 우리가 수학에서 사용하는 사칙연산(+, -, *, / 등)처럼,
    숫자(NUMBER) 또는 날짜(DATE) 데이터 타입에 대해 계산을 수행할 수 있는 연산자를 말한다.

    SQL에서도 이 연산자들을 활용해 값을 계산하거나, 조회 결과를 가공할 수 있다.

    연산자 의미 예시 우선순위 비고
    () 괄호로 우선순위를 조정할 수 있음 (a + b) * c 1 수식의 실행 순서를 직접 제어
    * 곱하기 salary * 12 2 연봉 계산 시 자주 사용
    / 나누기(0으로 나눌 경우 에러 발생) price / 3 0으로 나누면 에러 발생
    + 더하기 score + bonus 3 날짜 + 숫자 = 날짜 연산 가능
    - 빼기 price -discount 날짜- 숫자도 가능
    % (SQL Server) 나머지(0으로 나눌 경우 NULL 반환) value % 2 3 0으로 나누면 NULL 반환됨
    -- 연봉 계산
    SELECT name, salary * 12 AS annual_salary FROM employees;
    
    -- 부가세 포함 가격 계산
    SELECT product_name, price + (price * 0.1) AS price_with_vat FROM products;
    
    -- 시험 평균 점수
    SELECT (math + english + science) / 3 AS average FROM scores;
    
    -- 짝수/홀수 판단 (SQL Server)
    SELECT id, name, CASE WHEN id % 2 = 0 THEN '짝수' ELSE '홀수' END AS parity FROM users;

    주의할 점

    • 0으로 나눌 경우 MySQL에서는 에러, SQL SERVER에서는 NULL 반환
    • 문자열 타입과 연산하면 자동 형변환이 발생할 수 있어 데이터 타입 확인 필수
    • NULL이 포함된 산술 연산은 결과도 NULL이 됨 (100 + NULL = NULL)

    SQL의 산술 연살자는 단순한 수치 계산뿐 아니라, 날짜 계산, 할인율 적용, 평균/비율 계산 등 실무에 자주 사용되는 연산 도구이다.

    괄호를 활용한 연산 순서 제어와 0 또는 NULL에 대한 예외 처리에 특히 주의하자.

     

    합성 연산자

    합성 연산자는 SQL에서 문자열과 문자열을 연결(concatenate)할 때 사용하는 연산자다.
    여러 개의 문자열, 컬럼, 혹은 상수 값을 하나의 문자열로 이어 붙이고자 할 때 사용한다.

     

    예시:

    • MySQL
    SELECT CONCAT('안녕', ' ', '세계') AS greeting;
    -- 결과: '안녕 세계'
    • 테이블에서 성과 이름 합치기
    SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
    • Oracle
    SELECT first_name || ' ' || last_name AS full_name FROM users;

    주의할 점

     

    • NULL과 연결하면 결과도 NULL
      • 예: CONCAT('Hello', NULL) → NULL
      • 해결 방법: CONCAT(IFNULL(col, ''), ...) 또는 COALESCE() 함수로 NULL 처리
    • DBMS에 따라 연산자 문법이 다르므로 이식성 주의
      • MySQL에서는 ||가 논리 연산자로 동작함 (문자열 연결 아님)
    • 숫자 + 문자열 자동 형변환 발생할 수 있음
      • 가능하면 CAST()나 CONVERT()로 명시적 형변환 권장

    합성 연산자는 여러 문자열을 하나로 합칠 때 필수적인 기능이며,
    DBMS마다 사용하는 방식이 다르므로 문법 차이를 잘 이해하고 써야 한다.
    특히 NULL 처리와 문자/숫자 혼합 사용에 주의할 필요가 있다.

     

    728x90

    'SQL > SQLD' 카테고리의 다른 글

    #11 WHERE 절  (0) 2025.04.10
    #10 함수  (0) 2025.04.10
    #8 트랜잭션과 NULL  (0) 2025.04.07
    #7 반정규화(De-Normalization)  (0) 2025.04.06
    #6 정규화(Normalization)  (2) 2024.12.06