메뉴 건너뛰기

infra

4차 강의분-MYSQL

박영식2002.07.20 19:28조회 수 2092댓글 0

    • 글자 크기
. Table 만들기

ORACLE( 다른 데이터베이스도 마찬가지지만.. )에서 TABLE을 만들 때는 CREATE TABLE 문을 사용합니다.

우선 STUDENT TABLE을 만들어볼까요?

CREATE TABLE student
( name VARCHAR2( 15 ) NOT NULL,
secure_no VARCHAR2( 14 ) NOT NULL,
age NUMBER NOT NULL,
birth DATE,
city VARCHAR2( 15 ),
eng_score DECIMAL( 3, 2 ),
kor_score DECIMAL( 3, 2 ),
math_score DECIMAL( 3, 2 )
PRIMARY KEY ( secure_no ) );

을 실행한 후에 COMMIT;을 발행하면 TABLE이 만들어져요~!

우선 TABLE이나 열에 이름을 주는 규칙부터 알아보죠.

TABLE 또는 열에 이름 주기 규칙~!

테이블은 독특한 이름을 갖으면 구분하기 쉽겠죠? 프로젝트를 하다보니 어떤 일정한 규칙을 세워서 만들기도 하네요. 예를 들면 TS001, TS002... 이런 식으로..
테이블 이름은 30BYTE를 초과할 수 없다.
테이블 이름은 알파벳 문자로 시작해야 한다.
테이블 이름은 알파벳( A ~ Z ), 숫자( 0 ~ 9 ) 그리고 $, #, _(밑줄) 문자를 사용할 수 있다.
테이블 이름은 SQL 예약어를 사용할 수 없다.
ORACLE에서는 테이블이 254개 열을 가질 수 있다.
그럼 위에든 예에 대해서 설명할께요.

열의 LIST는 괄호를 사용하고, 아마도 젤 중요한 것은 NOT NULL이란 부분있죠? 이것을 기본 키라고 해요.

기본 키가 되는 열은 NULL이 될 수 없다.
LONG, LONG RAW로 정의되는 열은 기본 키가 될 수 없다.
기본 키는 최고 16개의 열을 초과할 수 없다.
기본 키( PRIMARY KEY )는 TABLE내에서 UNIQUE해야 합니다. 안 그러면 뒤비지죠~! ORACLE에서는 그런 경험은 없었는데, DB2에서는 PRIMARY KEY가 뒤비나서 시스템이 뻑~! 간 적이 있네요. 위에서 보면 secure_no( 주민등록 번호 )는 항상 UNIQUE하겠죠?
Table 변경하기

프로젝트를 하다보면 가끔 TABLE을 변경해야 할 필요가 있어요~! 후후.. 그냥 DROP 시킨 후에 다시 CREATE하는 방법도 있고, 요즘 4GL들은 TABLE을 CREATE하고 ALTER하는 것을 지원하니까 그걸 사용하기도 하구요.

TABLE 정의 문을 변경할 때는 ALTER TABLE 문을 사용합니다. TABLE의 내용이 아니라 TABLE의 구조를 변경하는 거죠.

ALTER TABLE로는 다음과 같은 것들을 수행할 수 있습니다.

TABLE에 새로운 열을 추가하기.
열의 폭을 늘이거나 줄이기.
NOT NULL인 열의 속성을 NULL로 NULL인 열의 속성을 NOT NULL로 변경하기.
열에 초기값 지정하기.
열에 대한 제약조건 지정하기.
ALTER TABLE에는 다음 세가지 형식이 있어요.

ALTER TABLE table_name ADD ( ... );
ALTER TABLE table_name MODIFY ( ... );
ALTER TABLE table_name DROP PRIMARY KEY;
보면 알겠지만, 첫 번째 형식은 TABLE에 열, 기본 키, 또는 외부 키를 테이블에 추가하는데 사용하고, 두 번째 형식은 기존의 열들을 변경하는데 사용합니다.
세 번째는 TABLE의 기본 키를 DROP시키는데 사용하죠~!

그럼 예를 들께요.

① NOT NULL을 NULL로 바꾸기!

ALTER TABLE student MODIFY (age NUMBER NULL );

② NULL을 NOT NULL로 바꾸기

ALTER TABLE student MODIFY (age NUMBER NOT NULL );

③ 열의 폭 늘이기

ALTER TABLE student MODIFY (name VARCHAR2( 20 ));

④ 열의 폭 줄이기

ALTER TABLE student MODIFY (name VARCHAR2( 15 ));

고친 후에 DESC STUDENT;로 확인이 가능하겠죠?
쉬어가는 페이지

UPDATE, INSERT, DELETE 문에 대해 공부하기 전에 먼저 잠깐 설명하고 넘어갈 것이 있네요. 어떻게 보면 별 것 아닌 것 같지만, 상당히 중요한 부분이죠. ORACLE 같은 경우 여러 가지 DML문을 사용해서 처리를 하는 프로그램에서 COMMIT을 빼먹으면~!

흐~! 끔찍..

1) TRANSACTION

트랜잭션은 하나의 논리적 작업 단위입니다.

2) COMMIT

어떻게 보면 파일을 저장한다는 개념하고 비슷해요. 데이터베이스의 변경된 내용들을 저장한다고 보면 되나요?

테이블을 만들거나 수정, 삭제한 후에 COMMIT을 발행해야만 실제로 데이터베이스에 적용이 된다고 보면 됩니다.

3)ROLLBACK

ROLLBACK은 UNDO하고 비슷한 개념이죠. ROLLBACK은 트랜잭션이나 세션이 시작된 이후에 사용자가 수행한 데이터베이스의 변경내용을 취소시킵니다. UNDO라기 보다는 SAVE를 하지 않고 프로그램을 종료시킬 때와 동일한 일이 벌어지겠네요.

만약에 INSERT, DELETE, UPDATE 등의 문장을 잘못 사용하였을 경우 ROLLBACK을 사용하게 되면 명령이 취소되는 거죠.

4)SAVE POINT

SQL을 계속적으로 사용할 경우, SAVE POINT를 사용하면 유용합니다. 일종의 저장이라는 개념하고도 비슷한데, 사용은 다음과 같이 합니다.

SAVEPOINT AAA;

SAVE POINT는 ROLLBACK 문과 함께 사용하게 됩니다.

ROLLBACK AAA;

하게 되면 SAVEPOINT 이후로 발생한 TRANSACTION만 취소가 되는 것이죠.

그럼 이제 본격적으로 TABLE을 INSERT, UPDATE, DELETE 해볼까요?
. Insert 문

TABLE에 열을 추가합니다. TABLE에 DATA를 넣는다는 말이죠~!

사용법은 다음과 같습니다.

INSERT INTO student
( name, secure_no, age, birth, city, eng_score, kor_score, math_score )
VALUES
( '김말자', '730304-2011111', 27, '18-JAN-72', 'SUWON', 100, 90, 95' );

사용할 때 가능하면 모든 값을 그 길이만큼 채워서 INSERT할 것을 추천합니다. 왜냐구요? 글세.. 여기서 student는 TABLE 명이고, 괄호안의 것들은 COLUMN NAME입니다.

그러니까 이런 구조네요.

INSERT INTO TABLE_NAME
( COLUMN NAMES )
VALUES
( COLUMN VALUES );

여기에서 COLUMN NAMES의 값들과 COLUMN VALUES의 값들의 수는 일치해야 합니다.

INSERT 문에서 COLUMN VALUES에 들어갈 수 있는 값들은 다음과 같습니다.

NULL
LITERAL VALUE(정수, 문자.. 모 이런 것~!)
연산자와 함수가 있는 표현식(예를 들면, SUBSTR(lsRemark, 27, 2) 같은 것)
물론 위의 세가지 값이 혼용될 수도 있죠.

INSERT 문에서 COLUMN NAMES의 DATA TYPE과 COLUMN VALUES의 DATA TYPE은 일치해야 합니다. 위에서 보면 문자나 날짜는 '로 막고, 숫자는 기냥 썼죠.. 일치하지 않으면 물론 ERROR가 발생합니다. 그리고 물론 TABLE의 CREATE시 지정한 크기를 넘는 DATA를 INSERT 해도 ERROR가 발생합니다.

그리고 PSEUDOCOLUMNS (의사열)이라는 것이 있는데,

USER : 현재 ORACLE에 연결되어 있는 USER ID.
SYSDATE : 현재 일시.
를 사용하면 편해요. USER는 문자열 COLUMN에 사용할 수 있고, SYSDATE는 DATE형 COLUMN에 사용할 수 있죠.

참~! INSERT할 경우 COLUMN NAMES는 생략할 수도 있어요. 아래와 같이..

INSERT INTO student
VALUES
('김말자', '720412-1521616', 27, '18-JAN-72', 'SUWON', 100, 90, 95');

모든 COLUMN에 INSERT한다는 가정이 포함되죠. 하지만 이건 별로 추천할 만한 방법이 아닌 듯 싶네요.

INSERT 문에서도 SELECT 문에서와 같이 SUB QUERY를 사용할 수 있어요. 그러면 COLUMN VALUES를 지정해서 넣는 대신에 SELECT 문을 사용할 수 있겠죠. 그럼 예를 들어볼까요?

INSERT INTO student
(name, secure_no, age, birth, city, eng_score, kor_score, math_score)
VALUES
SELECT name, secure_no, age, birth, city, eng_score, kor_score, math_score
FROM all_student ;

SUB QUERY를 이용하면 쉽게 많은 데이터를 생성할 수 있을 것 같네요. 테스트 데이터로 활용하면 더 좋겠죠?

쭈~욱 보니까, INSERT 문도 별로 어렵지 않죠? 그럼 담에는 UPDATE 문은 어떻게 사용하나 봐요~!


Update 문

TABLE 내에 있는 한 개 이상의 열을 변경하기 위해 사용합니다.

사용법은 다음과 같습니다.

UPDATE student
SET eng_score=85, kor_score=90
WHERE ename='쎌리';

student TABLE의 쎌리학생의 성적을 변경시키는 명령문이네요~!

그러니까 이런 구조네요.

INSERT TABLE_NAME
SET ( COLUMN NAMES=VALUE )
WHERE ( 조건 );

INSERT 문에서는 WHERE 조건이 없는데, 짜잔~! 여기는 사용할 수 있죠. SQL을 사용할 때 SELECT 다음으로 많이 사용하는 것이 UPDATE 문이 아닌가 싶어요~!

쭈~욱 보니까, UPDATE 문은 INSERT 문 보다 더 쉽네요~! 다음엔 DELETE 문을 알아보기로 해요~!
Delete 문

TABLE 내에 있는 한 개 이상의 열을 삭제하기 위해 사용합니다.

사용법은 다음과 같습니다.

DELETE FROM student
WHERE ename='쎌리';

student TABLE의 쎌리학생의 정보를 삭제해 버리네요. 흐~! 짤렸나보다.

그러니까 이런 구조네요.

DELETE TABLE_NAME
WHERE ( 조건 );

DELETE 문은 UPDATE 문 보다 더 쉽네요~!

잘못 삭제했을 경우에는 ROLLBACK을 사용하면 되죠~!

그리고 DML 문은 아니지만 DELETE와 같이 DATA를 삭제할 수 있는 명령어가 있어요.
TRUNCATE가 바로 그것인데, 어떤 TABLE 내의 모든 행을 삭제하고자 할 경우에는 DELETE 문을 사용하는 것 보다는 TRUNCATE 문을 사용하는 것이 훨씬 효율적입니다.

TRUNCATE TABLE student ;

TRUNCATE 문은 삭제된 TABLE을 복구하는 것을 가정하지 않기 때문에 수행속도는 DELETE 문보다 빠르지만, 한번 삭제가 되면 복구할 수 없는 단점이 있어요. 왜냐구요? DML 문이 아니니까~!

박영식 (비회원)
    • 글자 크기
5차 세미나 iis+mysql+php+zeroboard / 그리고 apm (by 박영식) 4차 강의분-SQL (by 박영식)

댓글 달기

이전 1 ... 2 3 4 5 6 7 8 9 10 11 다음
첨부 (0)
위로