Software/데이터베이스(SQL)

[데이터베이스]DML(Data Manipulation Language) 왕초보 개발자를 위한 SQL 이야기.

friendly 2020. 8. 1. 21:50
반응형

안녕하세요. 늙은 개발자 신기한 연구소입니다. ㅎㅎㅎ

읽다가 잘못 표현된 부분이나 궁금한 부분이 있으면 댓글 주세요.

2000년 처음 오라클(ORACLE) 교육을 받을 때가 기억나네요.

강사가 앞에서 SELECT, INSERT, UPDATE, DELETE를 설명하는데..

그 문법적인 내용은 이해를 했지만..

그래서? 저걸 어디에 어떻게 사용하는 거야? 그 답답한 마음이 생각나네요.

강사는 그런 부분을 설명해 주지 않고 그냥 저 문법적인 내용과 유형만 설명하고 끝!

나중에 취업하고 프로젝트 뛰면서..

아~ 이렇게 사용하는 거구나~!!

눈이 번쩍 트이더군요.

이번 포스팅은 바로 SQL에서 데이터를 다루는 SELECT, INSERT, UPDATE, DELETE에 대해 아주 기초적인 부분을 다뤄볼까 합니다.

시작~

DML은 데이터를 다루는 언어입니다.

데이터를 입력하고 입력된 데이터를 수정도 하고 잘못된 데이터는 삭제도 하고 필요한 데이터는 조회도 할 수 있는 명령어입니다.

 

땡땡마트에서 장을 보던 고객이 맛있는 쮠라면이 없다고 해서 재고관리 프로그램을 실행해서 조회를 합니다.

재고명을 쮠라면으로 입력하고 검색을 하니 재고가 0으로 나옵니다.

그래서 주문을 했고 다음날 쮠라면 100 상자가 입고되어서 재고관리에서 쮠라면 100 상자를 입력합니다.

며칠 뒤 쮠라면이 또 없다는 고객의 문의에 재고관리 프로그램으로 조회했는데 아직 10 상자가 남은 것으로 나옵니다. 이상해서 확인해보니 저번에 100 상자가 아닌 110 상자로 오타가 있었습니다.

그래서 재고를 10 상자에서 0 상자로 수정하고 저장을 합니다.

이렇게 장사가 잘 되어서 아르바이트생 한 명을 뽑았습니다.

사원 등록 프로그램에서 열심히 등록을 했는데 다음날 아침 갑자기 못하겠다고 전화가 왔어요.

그래서 사원 관리 프로그램에서 아르바이트생을 삭제합니다.

 

더 자세한 기능들이 많겠지만 간단한 마트 프로그램을 예로 들어서 DML에 대해 설명을 해볼게요.

 

처음 쮠라면을 재고를 조회하는 기능이 있었습니다.

화면에는 다양한 조건으로 검색할 수 있게 디자인되어 있겠지요.

바코드, 상품명 등으로요.

상품명을 넣고 조회를 클릭하면 화면에서 서버의 재고 조회기능 함수에 해당 조건을 실어서 조회 요청을 보냅니다.

그럼 서버는 재고조회 함수는 해당 조건을 받아서 데이터베이스에 조회를 요청합니다.

우리는 오라클을 사용한다고 가정하겠습니다.

해당 DBMS는 조회 SQL을 받아서 실행하고 그에 맞는 결과 데이터(재고정보)를 다시 서버의 재고조회기능 함수에 전달합니다.

서버의 재고조회 함수는 이 데이터를 받아서 화면에 보내줍니다.

화면단에서는 해당 정보가 오면 화면 디자인(그리드라고 합니다.)에 맞게 데이터를 보여줍니다.

 

화면단->서버->DBMS->서버->화면단..

 

저장이나 수정 그리고 삭제도 같은 패턴으로 진행합니다.

다른 점은 조회는 요청 목록을 전달받고 저장, 수정 그리고 삭제는 성공 여부를 전달받습니다.

 

먼저 데이터를 입력하는 SQL문을 보겠습니다.

그전에 SQL을 실행할 수 있는 툴이 있는데요..

프로젝트에 투입되면 오렌지, 토드, SQL Developer 등의 툴을 만나실 겁니다.

해당 툴들을 사용해서 데이터베이스에 접속한 뒤 명령문을 통해 조회, 입력, 수정, 삭제를 직접 실행할 수 있습니다.

즉, 서버단에 요청 쿼리를 만들기 전에 위 툴을 사용해서 미리 SQL문이 오류가 없는지 검증을 할 수 있어요.

 

INSERT 문

DBMS에 데이터를 저장하는 명령어입니다.

 

[유형 1]

INSERT INTO TABLE_NAME

VALUES (value 1, value 2… value n);

 

[유형 2]

INSERT INTO TABLE_NAME (column 1, column 2, column 5, column 9)

VALUES (value 1, value 2, value 5, value 9);

 

INSERT문의 기본 유형들입니다.

유형 1은 테이블 전체 컬럼에 값을 넣을 경우 값만 컬럼의 순서대로 입력해 주면 됩니다.

반드시 순서대로 넣어야 합니다. 그리고 마지막은 세미콜론(;) 잊지 마시고요.

유형 2는 테이블 행을 추가하는 데 모든 컬럼값이 아닌 원하는 컬럼값만 지정할 때 사용합니다. 그래서 입력할 컬럼을 순서대로 기입하고 values 뒤에 해당 컬럼에 매칭 되게 순서대로 값을 입력해 주면 됩니다. 쉽죠?

주의할 점은 PK나 NOT NULL은 무조건 값을 넣어야 합니다. 안 그러면 오류 날껄요? 

 

INSERT문은 기본적으로 하나를 만들면 한 개의 행(데이터)만 넣을 수 있습니다.

 

위 사례를 가지고 간단하게 실제 SQL문을 작성해 볼게요.

우선 재고 상품을 저장하는 테이블의 명은 GOODS로 하겠습니다.

 

[예문]

--쮠라면 100 상자 입력하기

INSERT INTO GOODS (GOODS_ID, BARCODE, GOODS_NAME, GOODS_QTY, REG_DATE)

VALUES (‘NDL001’, ‘880123123123’, ‘쮠라면’, 100, SYSDATE);

 

이 쿼리를 실행하면 쮠라면 100 상자에 대한 한 줄(행)의 데이터가 입력됩니다.

 

UPDATE 문

DBMS의 값을 수정(갱신)합니다.

 

[유형 1]

UPDATE TABLE_NAME

SET column 1 = value 1,

Column 2 = value 2;

 

데이터베이스에 저장된 값의 일부를 수정할 수 있습니다.

SET 다음에 수정하고 싶은 컬럼을 지정하고 “=”를 사용한 뒤 값을 넣어주면 됩니다.

2개 이상의 컬럼을 지정하고 싶으면 콤마(,)를 사용해서 나열하면 됩니다.

기본 숫자 값은 “=” 뒤에 숫자 값만 넣으면 되고 (Col = 3)

문자 값은 “=” 뒤에 싱글 쿼테이션(‘, 싱글 따옴표)으로 감싸면 됩니다. (Col = ‘쮠라면’)

그리고 값을 비우고 싶을 때는 빈 값의 표현인 싱글 쿼테이션만 두 개 연속 사용하거나 (col = ‘’)

값 할당을 제거하고 싶으면 null을 사용하면 됩니다. (col = null)

‘’과 null은 다른 개념입니다. ‘’는 빈 값이라는 의미이고 null은 할당 자체를 아직 안 했다는 의미입니다. ASCII 코드 값도 null은 00이고 ‘’는 32입니다. 다르죠? ㅎㅎ

 

그럼 위 쮠라면 가지고 수정 SQL문을 작성해 볼께요

 

[예문]

--쮠라면 수량 110->100으로 수정

UPDATE GOODS

SET GOODS_QTY = 100  -- 숫자니까 싱글 따옴표는 없어요~

WHERE

GOODS_ID= ‘NDL001’; 

 

우선 유형과 다르게 WHERE문이 마지막에 나타났습니다.

WHERE문을 넣지 않고 실행하면 GOODS 테이블 전체 데이터의 수량이 100으로 바뀌는 대 참사가 일어납니다. ㅎㅎㅎ

WHERE문은 다양하게 사용할 수 있기에 따로 포스팅할 계획입니다.

위 문장을 실행하면 상품코드가 NDL001 (누들 순번 1이라는 의미로 임의로 만들어 본 거예요. ㅎㅎ)인 행의 수량을 100으로 수정한다는 의미입니다.

그런데 화면에서 쮠라면을 선택했는데 어떻게 상품코드가 NDL001인지 알 수 있을까요?

화면에 그리드(엑셀의 표처럼 생긴)에 데이터 목록이 조회가 될 것이고 보통 2가지 타입으로 구성하는데요. 쮠라면 옆에 상품코드를 보여주기도 하고 일반 고객이 보는 화면이라면 상품코드를 가져오기는 하지만 안 보이게 히든(HIDDEN)해 둘 수 있어요.

그래서 해당 상품을 선택해서 수정을 보낼 때 상품코드도 같이 서버 함수에 보내면 해당 코드를 UPDATE문의 WHERE절에서 사용할 수 있답니다.

전체 데이터를 수정할 것이 아니라면 WHERE 조건을 반드시 사용하시고

SQL툴에 미리 넣고 테스트해보고 난 후 프로그램에 반영하는 습관을 들여야 합니다.

DML 문은 COMMIT;을 하지 않으면 반영이 안 되기에 실행만 하고 조회해서 맞는지 확인하고 ROLLBACK;으로 원복 하면 된답니다.

 

DELETE 문

DBMS의 값을 삭제합니다.

 

[유형 1]

DELETE (FROM) TABLE_NAME;

 

잘못 입력된 데이터는 삭제를 해야 합니다.

데이터를 삭제하는 방법은 3가지로 볼 수 있는데요.

DROP TABLE은 데이터뿐 아니라 테이블 자체도 날려버립니다.

그래서 일반 개발자는 권한이 없을 거예요. ㅎㅎ

TRUNCATE TABLE은 테이블의 구성은 그대로 살려두지만 데이터는 싹 날려버립니다.

테이블을 깨끗하게 밀어버리고 새로 데이터 받기에 좋겠네요.

그리고 DELETE 문입니다.

이 3가지도 나중에 포스팅할 계획입니다.

우선은 DELETE에 대해 알아봅니다.

유형을 보면 FROM에 괄호가 있습니다.

FROM을 생략해도 된다는 의미입니다.

 

땡땡마트로 예문을 만들어볼게요.

직원 테이블은 EMP로 하겠습니다.

 

[예문]

--바로 그만둔 아르바이트생 정보를 삭제

DELETE FROM EMP

WHERE EMP_ID = ‘T009’;

또는

DELETE EMP

WHERE EMP_ID = ‘T009’;

로 사용할 수 있습니다.

아래 보면 FROM을 빼고 사용했지만 잘 작동합니다.

 

DELETE문도 주의할 점은 WHERE절이 꼭 필요하다는 겁니다. 넣지 않는다면 어떻게 될지 상상이 되시지요?

운영을 하다 보면 DELETE 문 실수가 종종 일어나는데요.

운영에 DELETE 문 요청을 보내면 DBA가 실행을 해주는데..

완료했다고 피드백이 와서 확인해 보면 삭제가 안되어 있는 경우가 아주 가끔 있어요.

DBA가 개발에서 삭제를 한 거였답니다. ㅎㅎ

반대 상황이었다면 심각한 상황이 될 수도 있었겠지요?

삭제와 관련된 명령어들은 항상 주의해야 합니다.

 

마지막으로 가장 많이 사용하는 명령어입니다.

 

SELECT 문

DBMS에서 원하는 데이터를 뽑아내기 위해 사용(조회)하는 명령어입니다

도서관에 가면 검색용 컴퓨터가 있습니다.

책 이름, 저자 이름 등을 넣고 검색을 하면 관련된 책들이 쭉~ 나옵니다.

도서관의 엄청난 분량의 책들은 모두 데이터베이스에 저장되어 있습니다.

그중 원하는 정보를 잘 뽑아내야 책을 빌릴 수 있겠지요?

 

[유형]

SELECT [ALL/DISTINCT] column 1, column 2 …  --조회하고 싶은 컬럼명을 , 로 연결해서 입력

FROM TABLE_NAME;

 

SELECT 문은 데이터를 조회할 때 사용합니다.

위 [] 안의 ALL과 DISTINCT가 있는데 전체 조회 시는 ALL을 사용하고 중복된 컬럼을 합쳐서 보고 싶으면 DISTINCT를 사용하면 됩니다.

ALL은 기본적으로 생략하고 사용합니다.

DISTINCT는 SELECT 바로 뒤에 사용하고 DISTINCT 다음의 컬럼에 대해서만 중복을 제거합니다.

컬럼 부분은 원하는 부분을 보고 싶은 순서대로 콤마(,)로 연결해서 나열하면 됩니다.

 

쮠라면을 검색해볼게요.

 

[예문]

SELECT GOODS_ID, GOODS_NAME, GOODS_QTY, BARCODE

FROM GOODS

WHERE GOODS_ID = ‘NDL001’;

 

결과는 ‘NDL001’, ‘쮠라면’, 100, ‘880123123123’ 이렇게 나올 겁니다.

이 부분을 화면의 그리드에 한 셀씩 넣어주면 우리가 보는 목록으로 나올 거고요.

 

SELECT문도 주의할 점이 있어요.

데이터가 대용량일 경우는 꼭 툴에서 미리 소요시간과 데이터 정확도를 확인 후 반영해야 합니다.

그렇지 않고 SELECT 문을 잘못 만들어서 실행하면…

결과가 늦어지면서 부하가 걸리고 특히 빠른 처리 속도가 필요한 시스템일 경우 대형 사고가 터질 수 있답니다.

 

월 결산을 말일에 하는데 SELECT 문을 검증하지 않고 그냥 실행했다가 24시간 이상이 걸릴 수도 있답니다. 결산을 해야 1일부터 다시 사용할 수 있는데 1일 업무시간이 시작되었는데도 마감이 안되었다면 업무 마비 사태가 발생하는 거라 대형사고에 속합니다.

편의점, 통신사 등이 대표적이겠네요..

그래서 대형 기업들은 수시로 튜닝하면서 관리를 한답니다.

 

쉽게 설명한다고 했는데 도움이 되었나 모르겠네요.

누구든 처음은 있는 겁니다.

프로그래머(개발자)를 준비하는 예비 취준생분들이나,

이제 막 시작하는 왕초보 개발자분들..

넘 걱정하지 말고 차근차근 준비하면서 옆 선임들에게 도움받으면 잘 될 거예요.

꽤 경력이 되는 저도 아직 부족함을 느끼면서 계속 공부를 하고 있는 건 비~밀~ ㅋㅋ

다음에는 더 쉽게 표현할 수 있게 노력해볼게요.

감사합니다.

반응형