SQL 더 알아보기

be kid·2022년 2월 14일
0

BEB - 웹 개발 과정

목록 보기
26/28

데이터베이스 정규화 Database Normalization

데이터베이스의 설계와 관련이 있는데 설계에 따라 데이터가 어떻게 저장될 지 그 구조를 결정하기 때문이다.

  • Data Redundancy
    • 데이터 중복(data redundancy)은 실제 데이터의 동일한 복사본이나 부분적인 복사본을 뜻함
    • 이러한 중복으로 데이터를 복구할 때에 더 수월할 수 있지만 대체로 몇가지 문제점을 지님
      • 일관된 자료 처리의 어려움
      • 저장 공간 낭비
      • 데이터 효율성 감소
  • Data Integrity
    • 데이터 정규화는 데이터 무결성을 강화하는 목적도 지님
    • 데이터 무결성(data integrity)은 데이터의 수명 주기 동안 정확성과 일관성을 유지하는 것을 뜻함
      입력된 데이터가 오염되지 않고, 입력된 그대로 데이터를 사용할 수 있다는 의미
  • Anomaly
    • 데이터 이상 현상(anomaly)은 기대한 데이터와 다른, 이상 현상을 가리킴
      • 갱신 이상(update anomaly)
        • 여러 행(레코드)에 걸쳐 동일한 데이터가 있을 때, 어떤 행을 갱신해야 하는지 논리적인 일관성이 없는 경우에 발생함
      • 삽입 이상(insertion anomaly)
        • 데이터를 삽입하지 못하는 경우를 가리킴
      • 삭제 이상(deletion anomaly)
        • 데이터의 특정 부분을 지울 때 의도치 않게 다른 부분도 함께 지우는 이상 현상

SQL 종류

SQL에는 데이터를 조회하고 테이블을 만드는 등 다양한 문법이 있는데 쿼리문을 어떻게 작성하느냐에 따라 그 기능이나 작업이 달라진다.

일반적인 분류

  • Data Definition Language (DDL)
    • 데이터를 정의할 때 사용하는 언어. 테이블을 만들 때 사용하는 CREATE나 테이블을 제거할 때 사용되는 DROP등이 DDL에 해당됨. 데이터베이스의 테이블과 같은 오브젝트를 정의할 때 사용함
  • Data Manipulation Language (DML)
    • 데이터베이스에 데이터를 저장할 때 사용하는 언어. INSERT처럼 새로운 레코드를 추가할 때 사용되는 문법을 포함해 데이터를 삭제하는 DELETE나 변경하는 UPDATE도 포함됨
  • Data Control Language (DCL)
    • 데이터베이스에 대한 접근 권한과 관련된 문법. 어느 유저가 데이터베이스에 접근할 수 있는지 권한을 설정함. 권한을 주는 GRANT나 권한을 가져가는 REVOKE등이 포함됨
  • Data Query Language (DQL)
    • 정해진 스키마 내에서 쿼리할 수 있는 언어임. SELECT가 DQL에 해당함. 이렇게 언어를 분류했지만, DQL을 DML의 일부분으로 취급하기도 함
  • Transaction Control Language (TCL)
    • DML을 거친 데이터의 변경사항을 수정할 수 있음. COMMIT처럼 DML이 작업한 내용을 데이터베이스에 커밋하거나 ROLLBACK처럼 커밋했던 내용을 다시 롤백하는 문법이 있음

SQL 추가 문법

CASE

if문과 같은 기능, 특정 조건에 따라 다른 결과를 받을 수 있음

SELECT CASE
					WHEN CustomerId <= 25 THEN 'GROUP1'
					WHEN CustomerId <= 50 THEN 'GROUP2'
					ELSE 'GROUP3'
FROM customers

CustomerId값에 따라 3개의 그룹으로 나뉜다.

SUBQUERY

쿼리문 안에 중첩으로 쿼리문을 작성하며 소괄호로 감싼다.

SELECT CustomerId, CustomerId = (SELECT CustomerId FROM customoers WHERE CustomerID=2)
FROM customers
WHERE CustomerId<6

IN, NOT IN

특정한 값이 서브쿼리에 있는지 확인할 수 있음.

SELECT *
FROM customers
WHERE CustomerId IN (SELECT CustomerId FROM customers WHERE CustomerId < 10)

EXISTS

돌려받은 서브쿼리에 존재하는 레코드를 확인함. 조회하려는 레코드가 존재하면 TRUE, 없으면 FALSE를 리턴.

SELECT EmployeeId
FROM employees e
WHERE EXISTS (
	SELECT 1
	FROM customers c
	WHERE c.SupportRepId = e.EmployeeId
	)
ORDER BY EmployeeId

FROM

FROM에도 서브쿼리를 사용할 수 있음

SELECT *
FROM (
	SELECT CustomerId
	FROM customers
	WHERE CustomerId < 10
	)
profile
개쩌는 개발자가 되고 싶다 !

0개의 댓글