SQL ANSI 표준 문법

sun·2024년 8월 3일
0

SQLD

목록 보기
6/7

SELECT

데이터를 읽어오는 구문, 현업에서 사용하다 보면 가장 복잡하고 고려할 사항이 많은 중요하고 어려운 구문이다.

SELECT FIELD1, FIELD2, ... FROM TABLE {WHERE 조건};

서비스시 가장 빈번하게 사용되는 구문이다. 테이블에서 지정된 값을 가져오는 구문이며, 모든 값을 가져오기 위해 으레 FIELD 부분을 생략하고 * 을 표기하기도 한다. SUM이나 COUNT 같은 집계 함수가 들어가기도 한다.

SELECT FIELD1 AS F1 FROM TABLE {WHERE 조건};

필드명을 가져와야 할 경우 AS 구문을 사용한다.

SELECT * FROM DOCUMENT WHERE AUTHOR='무명씨';

작성자가 '무명씨'인 모든 문서의모든 항목을 가져오는 구문.

SELECT TITLE FROM DOCUMENT WHERE DATE >= TO_DATE('2024/05/05', 'YYYY/MM/DD/');

2024년 5월5일 이후 작성된 모든 문서의 제목을 가져오는 구문 (TO_DATE 함수는 문자열을 시간 데이터로 바꾸는 함수로 오라클 한정.)

SELECT TITLE FROM DOCUMENT WHERE DATE BTWEEN ('2000/01/01', 'YYYY/MM/DD/')AND('2020/02/26,'YYYY/MM/DD/');

날짜와 날짜 사이를 검색할 때는 BETWEEN A AND B 형식으로도 가능하다.
2000년 01월 01일 부터 2020년 02월 26일까지 작성된 모든 문서의 제목을 가져오는 구문이다.

SELECT * FROM DOCUMENT WHERE NO BETWEEN 1 AND 10;

1이상 10 이하의 번호를 가지는 DOCUMENT 테이블 내의 모든 항목을 가져오는 구문.

SELECT * FROM DOCUMENT WHERE AUTHOR IN ('무명씨', '홍길동');

작성자가 무명씨, 홍길동인 문서의 모든 항목을 가져오는 구문.

SELECT FROM DOCUMENT WHERE AUTHOR LIKE '김';

작성자가 김으로 시작되는 문서의 모든 항목을 가져오는 구문. '김%'로 표현하기도 한다.

실제 업무에서는 여러 쿼리를 조합하거나 테이블을 UNION, INTERSECTION, JOIN 등으로 가공하여 사용하는 경우가 많으므로 쿼리가 매우 복잡해진다.

SELECT DOUCUMENT FROM (
SELECT DOCUMENT, COUNT(DOCUMENT) CNT
FORM REL_DOCUMENT_KEYWORD
WHERE KEYWORD IN (
SELECT ID FROM KEYWORD WHERE KEYWORD IN ('KEY1', 'KEY2','KEY3','KEY4')
GROUP BY DOCUMENT
) WHERE CNT=4;

역 인덱스 문서 검색 쿼리인데 특정 키워드가 포함된 문서를 고속으로 찾는 쿼리이다. (KEY1-4)라는 키워드가 모두 포함된 문서를 찾는다.

다만, 위와 같이 인라인 뷰를 사용하는 경우는 주의해야 할 점이 있다. 인라인 뷰를 통해 접근할 데이터의 수를 어떻게 해서든 최소화 해야한다는 것이다. 인라인 뷰 안의 SQL문에서는 WHERE절에서 인덱스가 잘 적용되겠지만 인라인 뷰 바깥에서는인라인 뷰 내부에서 조회된 데이터가 마치 엑셀 쉬트처럼 인덱스고 뭐고 없는 데이터 덩어리가되어버리기 때문이다. 이것 때문에 인라인 뷰와 비슷하게 생성되는 스냅샷의 경우 별도로 스냅샷에 인덱스를 생성하는 경우가 많다.

INSERT

데이터를 입력하는 구문 형식

INSERT INTO TABLE(FIELD1, FIELD2,...)VALUES(VALUE1, VALUE2,...)

TABLE에 FIELD1 = VALUE1, FIELD=VALUE2, ...와 같은 속성값을 가지는 항목을 새로 생성하여 삽입한다. 만약 테이블에 입력될 값이 문자라면 반드리 " 으로 문자열 (String)임을 표시해 주어야 탈이 없다.
이는 UPDATE 구문에서도 마찬가지이다. TABLE 이름 바로 뒤에 필드 목록을 생략해도 되지만 생략하려면 VALUES 뒤에 것의 갯수와 내용이 테이블 스키마와 정확히 일치해야 한다.

UPDATE

UPDATE TABLE SET FIELD1=VALUE1, FIELD2=VALUE2,
{WHERE 조건};

데이터를 수정하는 구문으로 TABLE의 FIELD1에 VALUE1, FIELD2에 VALUE2, ...로 변경한다. WHERE절이 없을 경우 테이블 모든 항목으로 바뀌므로, 대개 WHERE절과 함께 사용하여 범위를 한정해 준다.

UPDATE DOCUMENT SET TITLE='무제' WHERE AUTHOR='무명씨';

작성자가 '무명씨'인 모든 문서의 제목을 '무제'로 바꾸는 명령.

위 예제로는 보여주기 어렵겠지만, SELECT문으로 특정 데이터를 쿼리해서 UPDATE문으로 수정하는 경우가 현업에서는 의외로 자주 발생한다. 이런 경우 상관없는 데이터가 영향을 받는지, 그리고 업데이터 작업이 신속히 끝날 수 있는지 철저히 검증하고 작업을 해야하나다. 엄한 데이터에 영향을 주던가, DB LOCK 걸리게 하기 딱 이다.

DELETE

DELETE FROM TABLE {WHERE 조건};

데이터를 삭제하는 구문. 말 그대로 데이터를 삭제하는 구문이다.
조건절이 없을경우 테이블의 모든 데이터를 비우게 되므로, 대개 조건절과 함께 사용된다.

DROP

DROP TABLE TABLE_NAME

데이터베이스 내의 개체를 삭제해 버린다.

DROP DATABASE DATABASE_NAME;

데이터 베이스 내의 모든 테이블, 스키마, 관계(Relation)를 전부 삭제한다. 워낙에 치명적인 명령어라서 슈퍼유저 권한이 아니면 명령이 먹히지 않는다. 어쨋거나 이 명령이 서비스 중인 DB에서 실행되면 해당 서버를 물리적으로 파괴한 것과 동등한 위력.

TRUNCATE TABLE TABLE_NAME;

참고로 상단의 4개(select, insert,update, delete) 는 데이터 조작어(DML)이지만 drop과 truncate는 데이터 정의어(DDL)이다.

데이터 제어어 DCL에 해당하는 GRANT(권한부여), REVOKE(권한회수)만 외우고 CREATE만 DDL에 속하며 나머지 6자리 글자의 명령어는 DML이라고 외우자.

참고 :

https://namu.wiki/w/SQL/%EB%AC%B8%EB%B2%95

0개의 댓글