광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ
반응형

DML

Data Manipulation Language

 

SQL에서는 SELECT, UPDATE, INSERT, DELETE가 여기에 해당하며 테이블 말고 그 안에 내용물을 건드리거나(UPDATE, INSERT, UPDATE) 조회할 때(SELECT) 쓴다. 이 중에서도 SELECT는 DB의 내용물 첨삭 없이 그냥 조회만 하는거라 조회쿼리, 나머지는 DB의 내용물에 뭔가 변화가 있으니까 갱신쿼리라고 한다.

 

SELECT

데이터베이스에서 뭐 좀 찾아줘 하는 쿼리. 기본 형식은

select * from (table);

셀렉트에서 프롬 빼먹는건 C언어에서 리턴제로 빼먹는거랑 같다. 오류난다. (해봐서 안다)

 

이게 정렬이 좀 중구난방, 추가순으로 정렬되는데(일단 오라클은 그렇다) 그럴때는

select * from (table) order by (기준);

뒤에 오더바이를 붙여주면 특정 기준으로 정렬할 수 있다. 만약 어떤 조건을 만족하는 레코드들만 보고 싶다면

 

select * from (table) where (조건) order by (기준);

셀렉트 웨어 오더바이를 잊지 말자.

 

UPDATE

UPDATE (table_name) SET (column1) = (값) WHERE (조건)

조건문 빼면 어떻게 되냐고? 해당 컬럼 전체 값이 바뀐다. 예를 들어서 데이터베이스에서 홍길동이라는 사람 나이가 30세인데 31세로 잘못 썼다, 그러면 UPDATE문으로 나이=30 where 이름=홍길동 하면 된다.

 

DELETE

DELETE FROM (table_name) WHERE (조건);

얘도 조건 없으면 다 날리고 where 쓰면 조건에 부합하는 레코드만 날린다.

 

INSERT

INSERT INTO (table_name) (column) VALUES (values); --특정 컬럼에만 값을 넣을 때
INSERT INTO (table_name) VALUES (values); --모든 컬럼에 값을 넣을 때

터미널에서 쓸 때 제일 번거로운 것 중 하나. 터미널 SQLPlus에서는 한글 쳤다가 오타나서 지우면 이상한 공백같은 게 남아서 명령문이 제대로 실행 안 된다. 이거는 위 아래 다 통용되는거고, 특정 컬럼에만 값을 넣거나 다 때려박거나가 가능하다. 단, PK나 NOT NULL 제약조건 붙어있는 컬럼에는 반드시 값이 들어가야 쿼리가 실행된다. 아, 두번째 형식으로 쓰되 중간에 비는 값이 있다면 ''나 NULL을 넣자. 두번째 형식은 순차적으로 넣는거라 빈다고 값 빼면 형식을 조사버리는 수가 있다. 아니면 스키마 안맞는다고 안들어감.

 

INSERT ALL 
  2  INTO STADIUM (STADIUM_ID,STADIUM_NAME) VALUES ('TP1','임시경기장1')
  3  INTO STADIUM (STADIUM_ID,STADIUM_NAME) VALUES ('TP2','임시경기장2')
  4  SELECT * from DUAL;

옆에 있는 숫자는 터미널에서 복사해서 이렇게 된 거니까 빼도 된다. 터미널에서 여러줄 쓰면 옆에 2 3 4 이런식으로 숫자가 뜬다. 아무튼, 여러개를 한꺼번에 넣고 싶다고요? 그렇다면 INSERT ALL이다.

DDL

Data Definition Language

 

CREATE, ALTER, DROP이 여기에 해당된다. DML과 달리 얘는 데이터베이스 자체를 건드리는쿼리인데 보통 수정(ALTER), 생성(CREATE), 삭제(DROP)를 담당한다. 데피니션이 들어간 걸 보면 아시겠지만 얘는 데이터베이스의 스키마를 건드릴 수 있다.

 

CREATE

CREATE TABLE (table_name) (
	COLUMN1 (datatype) 제약조건.
	COLUMN2 (datatype) 제약조건,
	...
	COLUMNn (datatype) 제약조건,
	CONSTRAINT (제약조건명) PRIMARY KEY (COLUMN1)
);

FK(Foreign key, 남의 집에서 데이터 참조하는 뭐 그런거) 없는 테이블을 만들 때는 이렇게 쓰고

 

CREATE TABLE (table_name) (
	COLUMN1 (datatype) 제약조건.
	COLUMN2 (datatype) 제약조건,
	...
	COLUMNn (datatype) 제약조건,
	CONSTRAINT (제약조건명) PRIMARY KEY (COLUMN1),
	CONSTRAINT (제약조건명) FOREIGN KEY (KEY1) REFERENCES (table_name)(KEY1)
);

만약 남의 집에서 키 갖고오는 게 있으면 이런 식으로 FK도 지정해주면 된다. 그럼 그냥 이렇게 만들면 되나요? FK를 갖고 올 테이블이 있다면 그래도 되는데, FK를 갖고 올 테이블이 없으면 없는걸 가져오라니 날강도가 따로 없구나 하면서 표 안 만들어준다. 그럼 만들고 연결하면 안되나요? 되긴 되는데 권장하지는 않음. 그러니까 착한 SQL 개발자 여러분들은 ERD를 확인하시고 꼭 부모 엔터티부터 만드십시오.

 

아, CREATE문은 제약 조건을 어떻게 지정하느냐에 따라 형식이 꽤 있는데, 제발 짬뽕해서 쓰지는 말자.

CREATE TABLE (table_name) (
	COLUMN1 (datatype) PRIMARY KEY,
	COLUMN2 (datatype) NOT NULL,
	...
	COLUMNn (datatype) REFERENCES (KEY1)
);

이 방식은 제약조건을 묵시적으로 명시한다고 하는데, 이름이 없어서 그런것 걑다. 제약조건명은 없지만 필요한 제약조건이 있으면 알아서 컴퓨터가 갖다 붙이는데, 이건 PRIMARY KEY야 라고 하면 아 이건 NULL이면 안되고(NOT NULL) 유일해야 하는구나(UNIQUE)하고 알아서 붙인다. 참고로 제약조건을 이렇게 명시하게 되면 나중에 지울때 번거롭다.

 

CREATE TABLE (table_name) (
	COLUMN1 (datatype) CONSTRAINT (제약조건명) PRIMARY KEY,
	COLUMN2 (datatype) CONSTRAINT (제약조건명) NOT NULL,
	...
	COLUMNn (datatype) CONSTRAINT (제약조건명) REFERENCES (KEY1)
);

제약조건을 명시하는 형식. 이거 말고 하나 더 있는데

 

CREATE TABLE (table_name) (
	COLUMN1 (datatype).
	COLUMN2 (datatype),
	...
	COLUMNn (datatype),
	CONSTRAINT (제약조건명) PRIMARY KEY (COLUMN1)
);
--제약조건을 확인할 필요가 있는 경우

컬럼 이름하고 데이터 타입까지만 정하고 제약조건을 밑에 몰아두는 경우도 있다.

 

ALTER

ALTER TABLE (table_name) ADD (column1 datatype); --칼럼 추가
ALTER TABLE (table_name) DROP COLUMN (column1); --칼럼 삭제
ALTER TABLE (table_name) REMANE COLUMN (column1) TO (column2); --이름 변경
ALTER TABLE (table_name) MODIFY (column1 NOT NULL);--column1에 NOT NULL 제약조건을 추가

데이터베이스의 스키마(이 컬럼은 무슨 타입이고 제약조건은 이거야)나 컬럼단에서 첨삭을 진행한다. 근데 컬럼의 제약조건은 아무때나 막 바꿀 수 있는 건 아니고… 걍 컬럼이 비어있을 때 바꾼다 생각하시고 표 만들기 전에 스키마 잘 짜십셔.

 

ALTER TABLE (table_name) ADD CONSTRAINT (제약조건명) FOREIGN KEY (key1) REFERENCES key_table(key1); --제약조건 추가(FK)
ALTER TABLE (table_name) ADD (제약조건) ((column)); --제약조건명 없이 추가하는 법
ALTER TABLE (table_name) DROP CONSTRAINT (제약조건명); --제약조건 삭제

위 네 줄은 컬럼단에서 첨삭하거나 NOT NULL 제약조건을 추가할 때 쓰는거고, 다른 제약조건들은 아래 코드를 통해서 붙인다. 위에도 썼지만 제약조건 수정하는건 칼럼이 비어있을 때 빼고는 안된다 생각하시고 걍 표 만들때 스키마단에서부터 잘 짜십셔. 실제로 안되는건 아닌데 일부 케이스에서만 가능하니까.

 

ALTER TABLE (table_name) MODIFY (column DEFAULT default1); --디폴트값 추가
ALTER TABLE (table_name) MODIFY (dolumn DEFAULT NULL); --디폴트값 삭제(NULL로 회귀)

컬럼에 기본값을 추가할 수도 있다.

 

아, 그리고 ALTER는 컬럼명을 바꾸는거고 표 이름은 RENAME으로 바꾼다.

 

DROP

DROP TABLE (table_name); --일반 삭제
DROP TABLE (table_name) CASCADE CONSTRAINT; --제약조건까지 같이 삭제

인스턴스 말고 테이블을 삭제할때는 DROP을 쓴다. 근데 테이블만 지웠다가 제약조건이 찝찝하게 남아서 발목을 붙잡을 것 같으면 제약조건도 같이 삭제한다.

 

TRUNCATE TABLE (table_name);

TRUNCATE는 DROP과 달리 안에 든 인스턴스만 날리고 스키마는 남겨준다. 구레나룻은 남겨주세요같은 느낌인데 얘는 롤백이 안 되니까 신중하게 쓰자.

반응형

'Coding > 코딩잡담' 카테고리의 다른 글

엔터티  (0) 2025.11.10
서브쿼리  (0) 2025.11.05
정규식 테스트 사이트  (0) 2025.10.16
SQL에서 쓰이는 연산자’들’  (0) 2025.10.15
걍 간단한걸로 만들걸… ㅡㅡ  (0) 2025.10.03