SQL 정리

·2026년 1월 25일

SQLD

목록 보기
4/7

링크: https://inf.run/13fan
그 동안 강의를 들으며 노트에 정리한 것을 토대로 기록남기기

1. 기본 문법

1) DDL (Data Definition Language, 데이터 정의어)

    1. Table 생성
    		CREATE Table customers(
    		customer_id INT Auto_Increment Primary Key,
    		address VARCHAR(100) NotNull UNIQUE,
    		name VARCHAR(50) NOTNULL
    		);
    1. Table 생성 및 외래키 제약 설정
    		CREATE Table orders(
    		order_id INT Auto_Increment Primary Key,
             customer_id INT NOT NULL,
    		product_id INT NOT NULL,
    		quantity INT NOT NULL,
             CONSTRATINT fk_orders_customers FOREGIN KEY (customer_id) 
             REFERENCES customers(customer_id)
    		);
    1. Table 변경(추가)
      alter Table customers add column point INT NOT NULL DEFAULT 0;
    1. Table 컬럼 타입 변경
      Alter Table customers modify column address VARCHER(500) NOT NULL;
    1. Table 컬럼 삭제
      Alter Table customer drop point;

Drop VS Truncate
1. Drop 는 구조 자체를 삭제
2. Truncate 는 구조는 유지하되, 내부 Data를 삭제


2) DML(Data Manipulation Language, 데이터 조작어)

    1. 삽입(Insert)
1) 모든 컬럼을 나열

INSERT INTO customers values(
Null,'kangnam@네이버','강감찬'
);
2) 해당 컬럼을 나열
INSERT INTO customers (address,name) 
	   values('kangnam@구글','kangnam')
    1. 수정(Update)
      -> update 에선 거의 where 절이 필수라 생각하기
update customers
set address = 'elre519@네이버'
where name ='강감찬';
    1. 삭제(Delete)
      -> where절은 무조건적으로 사용하기 + 실무에선 PRIMARY KEY 기준 , UNIQUE 컬럼 기준으로 조건 주기
Delete from customers
where name = '강감찬';
    1. 조회(Select)
    Select address, name, customer_id
    from customers
    where customer_id = 1;
    • ㄱ) Between A and B;
    • ㄴ) Not Between A and B;
    • ㄷ) 컬럼 In ('조건1','조건2','조건3');
    • ㄹ) 컬럼 Not In('조건1','조건2','조건3');
    • ㅁ) Like %(모든) , _(하나)
    • ㅂ) Order By 컬럼명 ASC(오름차순), DESC(내림차순);
    • ㅅ) Limit 갯수
    • ㅇ) Offset(건너뛸 갯수) 과 Limit -> 페이징 처리
    • ㅈ) distinct -> 중복 제거
    • Null 중요
      • DB 에서 Null은 중요하다. 의미는 "값이 없는 상태"를 의미.
        따라서

        Select from TABLE
        where 조건 = null;

        입력시 값은 아무것도 나오지 않는다.

      • Null 비교하려면
        is Null, is Not Null 를 사용

      • coalesce : 첫 번째로 Null이 아닌 값을 반환.


2. 집계함수

Q. 왜 중요한가? 
A. DATA를 기반으로 정확한 의사결정을 하기 위해
  • AVG, SUM
  • Count(표현식) : 표현식의 결과를 반환, 다만 Null은 제외
  • Count(*) : 위와 다르게 Null도 반환
  • Max
  • Min

3. Group By

  • 특정 컬럼의 값이 같은 행들을 그룹으로 묶어주는 역할
  • 그룹화된 결과에 집계함수 적용시 '각 그룹에 대한 통계를 냄'
         Where     VS    Having절
시점 : Group By이전       Group By이후
대상 :    개별 행             그룹
        집계함수 X          집계함수 O
        
        
참고로 SQL 적용 순서 
F -> W -> G -> H -> S -> O -> Limit

4. DB Basic

1. Join

  • 하나의 Talble에 모든 컬럼이 존재 할 시
    ㄱ. Data 중복, ㄴ. 갱신 이상, ㄷ. 삽입 이상, ㄹ. 삭제이상 의 문제가 발생
    -> 그래서 DB에서 "정규화" 라는 개념이 존재한다. 정규화는 간단히 말해서 DB를 분리? 했다 생각하자. 그렇기에 Join을 사용한다!.
  • Join은 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것.
  • Join 은 PK, FK를 주로 연결고리 사용.
  • ㄱ. 내부 조인 (Inner Join)
    양쪽 table에 모두 공통된 Data(교집합)를 결과로 보여줌.

    Select *
    From orders
    inner join users on users.user_id = orders.user_id;
    
  • ㄴ. 외부조인 (outer Join)
    양쪽에서 짝이 없는 Data 찾기
if 기준 table 과 join하는 table에 data가 없다면?
A. Null 을 반환
  • ㄷ. 셀프조인(Self Join)
    -> 하나의 table을 자기 자신과 join하는 방법, Alis 를 이용하기
Select e.name As employee_name, M.name As Manager_name
From employee e 
Join employee M on e.manager_id = M.employee_id;
  • ㄹ. 카테시안 곱(cross join)
    -> 행 * 행 이라 생각하기.

5. 서브 쿼리

정의 : '여러 단위에 단계를 논리적으로 하나의 작업 단위로 만듬'

    1. 단일 컬럼
    • 단일 행
      ex) = , > , < 등을 -> Select , Where, Having

    • 다중 행
      ex) in, any, all 등을 -> Where, Having

    1. 다중 컬럼
    • 단일 행
      ex) (c1,c2) = ... 등을 Where, Having

    • 다중 행
      ex) (c1,c2) in ... 등을 Where, Having

    • 다중 행
      ex) From(...) as 등을 From 가상테이블

    1. 상관 쿼리
    • '메인 쿼리' , '서브 쿼리'가 서로 영향을 줌 -> '동적'

    • 추가적으로 독립적으로 실행 X, 메인 쿼리 값을 참조

      Select  product_id, name, category, price
      From product p1
      Where price >=(Select Avg(price)
      			 From product p2
                     where p2.category = p1.categoey);
      
    1. Select 서브쿼리

      • select에 사용하는 서브쿼리는 스칼라만 가능

        select name(
        		   select dept_name 
                    From department d 
                    Where d.dept_id = e.dept_id) As dept_name
        From employees e;               
        
    1. Table 서브쿼리( = Inline view, 하나의 서브쿼리가 하나의 table 역할)
SELECT p.product, p.name, p.price
FROM product p
JOIN (
    SELECT category, MAX(price) AS max_price
    FROM product
    GROUP BY category
) cmp
ON p.category = cmp.category
AND p.price = cmp.max_price;
profile
# h

0개의 댓글