SQL 심화

Mixer·2022년 6월 13일
0
post-custom-banner

SQL 종류

  • Data Definition Language
    DDL은 데이터를 정의할 때 사용하는 언어이다
    테이블을 만들 때 사용하는 CREATE이나 테이블을 제거할 때 사용되는 DROP 등이
    DDL에 포함된다
    -> 데이터베이스의 테이블과 같은 오브젝트를 정의할 때 사용한다

  • Data Manipulation Language
    DML은 데이터베이스에 데이터를 저장할 때 사용하는 언어이다.
    INSERT처럼 새로운 레코드를 추가할 때 사용되는 문법을 포함해 데이터를 삭제하는 나, 변경하는 UPDATE가 DML에 포함된다

  • Data Control Language
    DCL은 데이터베이스에 대한 접근 권한과 관련된 문법이다.
    어느 유저가 데이터베이스에 접근할 수 있는지 권한을 설정한다.
    권한을 주는 GRANT나, 권한을 가져가는 REVOKE등이 DCL에 포함된다
  • Date Query Language
    DQL은 정해진 스키마 내에서 쿼리할 수 있는 언어이다.
    SELECT가 DQL에 해당하는데, 이렇게 언어를 분류했어도 DQL을 DML의 일부분으로 취급하기도한다.
  • Transacation Control Language
    TCL은 DML을 거친 데이터의 변경사항을 수정할 수 있다
    COMMIT처럼 DML이 작업한 내용을 데이터베이스에 커밋하거나, ROLLBACK 처럼 커밋했던 내용을 다시 롤백하는 문법이 있다.

SQL Advanced

CASE 사용하기

SQL에서도 프로그래밍 언어의 if문과 같은 기능을 사용할 수 있다.

SELECT CASE
  	WHEN CustomerId <= 25 THEN 'GROUP 1'
    WHEN CustomerId <= 50 THEN 'GROUP 2'
  	ELSE 'GROUP 3'
  END
  FROM customers

이 쿼리문은 CustomerId 필드값에 따라 3개의 그룹 ('GROUP1', 'GROUP2', 'GROUP3')으로 나뉜다.
CustomerId 필드값이 25이하인 경우엔 'GROUP1', 26부터 50사이인 경운 'GROUP 2', 51 이상은 'GROUP 3'로 분류한다

SUBQUERY

쿼리문을 작성할때, 다른 쿼리문을 포함할 수 있다.
이 때 포함되는 다른 쿼리문을 SUBQUERY 라 한다
서브쿼리는 실행되는 쿼리에 중첩으로 위치해, 정보를 전달한다
서브쿼르는 '소괄호'로 감싸야한다.

서브쿼리의 결과는 개별 값이나 레코드 리스트이다
그리고 서브쿼리의 결과를 하나의 칼럼으로 사용할수 있다.

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

IN, NOT IN

IN 은 특정한 값이 서브쿼리에 있는지 확인할 수 있다.
다음 쿼리는 customers 테이블에서 'CustomerId'의 값이 서브쿼리에서 돌려받는 값에 속한 결과들만 조회하고있다.

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

만약 IN대신 NOT IN을 사용한다면, 서브쿼리에서 조회된 10 미만을 제외한(10을 초과하는) 레코드를 조회한다.

EXISTS

EXISTS 또는 NOT EXISTS는 돌려받은 서브쿼리에 존재하는 레코드를 확인한다
만약 조회하려는 레코드가 존재한다면 참, 그렇지 않으면 거짓을 리턴한다

SELECT EmployeeId
FROM employee 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
Minthug'life
post-custom-banner

0개의 댓글