SQL 정리 - (3)
데이터 조작과 테이블 관리
- 데이터 조작
- create table
- insert
- 작은 따옴표 넣기
- 테이블 복사
- update
- join
- delete
- on conflict
- upsert
- export
- import
- 테이블 관리
- 데이터 타입 boolean
- 참과 거짓의 값을 저장한다.
- 데이터 타입 character
- char 고정형 길이의 문자열을 저장한다.만약 CHAR(10)인데 ‘ABCDE’만 입력할 경우 실제로는 ‘ABCDE’ 뒤로 공백을 붙여 저장한다.
- VARCHAR 가변형 길이의 문자열을 저장한다. 만약 VARCHAR(10)인데 ‘abcde’만 입력할 경우 실제로 ‘abcde’만 저장한다. 공백을 붙이지 않는다.
- text 대용량의 문자 데이터를 저장한다.
- 데이터 타입 numeric
- int 정수형 데이터를 저장한다. 크기는 4byte이다.
- smallint 정수형 데이터를 저장한다. 크기는 2byte이다.
- float 부동 소수정의 데이터를 저장 크기는 8byte이다.
- numeric numeric(15,2)와 같이 전체 크기와 소수점의 자리를 지정할 수 있다.
- 테이블 생성시 칼럼의 제약조건
- not null 해당 제약 조건이 있는 컬럼은 NULL이 저장될수 없다
- UNIQUE 해당 제약 조건이 있는 컬럼의 값은 테이블 내에서 유일해야 한다.(null 가능)
- PRIMARY 해당 제약 조건이 있는 컬럼의 값은 테이블내에서 유일해야 하고 반드시 NOT NULL이어야 한다 .
- CHECK 해당 제약 조건이 있는 컬럼은 지정하는 조건에 맞는 값이 들어가야 한다.
- REFERENCES 해당 제약 조건이 있는 컬럼의 값은 참조하는 테이블의 특정 컬럼에 값이 존재해야 한다.
- ctas(if not exists)
- check
- rename
- add column
- drop column
- type 변경
- rename
- 테이블 제거
- 임시 테이블
- TRUNCATE
- 데이터 타입 boolean
CREATE TABLE LINK (
ID SERIAL PRIMARY KEY
, URL VARCHAR (255) NOT NULL
, NAME VARCHAR (255) NOT NULL
, DESCRIPTION VARCHAR (255)
, REL VARCHAR (50) );
INSERT
INTO LINK (URL, NAME)
VALUES (‘http://naver.com’,’Naver’) ;
COMMIT; #데이터를 insert해주면 commit을 해줘야함
- 작은 따옴표 넣기(‘’‘(넣고싶은거)’’’)
INSERT INTO LINK (URL, NAME)
VALUES (‘'’http://naver.com’’’,’'’Naver’’’) ;
COMMIT;
- 테이블 껍데기 복사
CREATE TABLE LINK_TMP AS
SELECT * FROM LINK WHERE 0=1;
- 껍데기에 데이터 넣기
INSERT INTO LINK_TMP
SELECT *
FROM LINK ;
COMMiT;
- update
ALTER TABLE LINK ADD COLUMN LAST_UPDATE DATE;
ALTER TABLE LINK ALTER COLUMN LAST_UPDATE SET DEFAULT CURRENT_DATE;
SELECT * FROM LINK;
- default값으로 바꿔주기
- where절 없으면 전체컬럼 선택
UPDATE LINK
SET LAST_UPDATE = DEFAULT
WHERE LAST_UPDATE IS NULL;
COMMiT;
UPDATE PRODUCT A
SET NET_PRICE = A.PRICE - (A.PRICE * B.DISCOUNT)
FROM PRODUCT_SEGMENT B
WHERE A.SEGMENT_ID = B.ID;
SELECT * FROM PRODUCT;
COMMIT;
DELETE
FROM LINK_TMP A
USING LINK B
WHERE A.ID = B.ID ;
COMMIT;
SELECT * FROM CUSTOMERS;
INSERT INTO CUSTOMERS (NAME, EMAIL)
VALUES ( ‘Microsoft’, ‘hotline@microsoft.com’ )
ON CONFLICT (NAME) #conflict가 있어도 그냥 넘어가라
DO NOTHING;
INSERT INTO CUSTOMERS (NAME, EMAIL)
VALUES ( ‘Microsoft’, ‘hotline@microsoft.com’
)
ON CONFLICT (NAME)
DO UPDATE
SET EMAIL = EXCLUDED.EMAIL || ‘;’ || CUSTOMERS.EMAIL; #충돌하면 뒤에 이메일 살려줘. ||는 연결할 때 사용 #excluded는 위에서 insert 시도한 email값
COMMIT;
자료 export
COPY CATEGORY(CATEGORY_ID, NAME, LAST_UPDATE)
TO ‘C:\temp\DB_CATEGORY.csv’
DELIMITER ‘,’
CSV HEADER;
자료 import
COPY CATEGORY_IMPORT(CATEGORY_ID, “NAME”, LAST_UPDATE)
FROM ‘C:\temp\DB_CATEGORY.csv’
DELIMITER ‘,’
CSV HEADER ;
조건에 맞는 테이블 생성
CREATE TABLE ACTION_FILM AS
SELECT A.FILM_ID , A.TITLE , A.RELEASE_YEAR , A.LENGTH , A.RATING
FROM FILM A, FILM_CATEGORY B
WHERE A.FILM_ID = B.FILM_ID
AND B.CATEGORY_ID = 1 ;
없으면 만들어라(있으면 에러 발생하지 않고 안만듬)
CREATE TABLE IF NOT EXISTS ACTION_FILM AS
SELECT A.FILM_ID , A.TITLE , A.RELEASE_YEAR , A.LENGTH , A.RATING
FROM FILM A, FILM_CATEGORY B
WHERE A.FILM_ID = B.FILM_ID
AND B.CATEGORY_ID = 1 ;
ALTER TABLE LINKS ADD COLUMN ACTIVE BOOLEAN;
ALTER TABLE LINKS DROP COLUMN ACTIVE;
ALTER TABLE LINKS RENAME COLUMN TITLE TO LINK_TITLE;
ALTER TABLE LINKS ADD COLUMN TARGET VARCHAR(10);
ALTER TABLE LINKS ALTER COLUMN TARGET SET DEFAULT ‘_blank’;
ALTER TABLE LINKS ADD CHECK (TARGET IN (‘_self’, ‘_blank’, ‘_parent’, ‘_top’));
ALTER TABLE VENDORS RENAME TO SUPPLIERS; #table
ALTER TABLE TB_CUST
ADD COLUMN CONTACT_NM VARCHAR NOT NULL;
#이미 값이 있는 행에 새로운 컬럼을 추가할 때는 not null로 추가할 수가 없다. 무조건 null값이 들어감.
ALTER TABLE TB_CUST
ADD COLUMN CONTACT_NM VARCHAR NULL; #null값으로 먼저 넣어준다.
UPDATE TB_CUST
SET CONTACT_NM = ‘홍길동’
WHERE CUST_ID = 1; #값 입력
COMMIT;
SELECT * FROM TB_CUST;
ALTER TABLE TB_CUST #다시 설정을 not null로 바꿔줌
ALTER COLUMN CONTACT_NM SET NOT NULL;
ALTER TABLE BOOKS DROP COLUMN CATEGORY_ID;#다른 엔터티에서 category_id를 참조하고 있지 않으면 삭제 가능, 즉 자기가 다른 엔터티를 참조하는건 삭제가 가능하다.
ALTER TABLE BOOKS DROP COLUMN PUBLISHER_ID; #book_info라는 데에서 publisher_id를 참조하고 있어서 삭제 불가능
ALTER TABLE BOOKS DROP COLUMN PUBLISHER_ID CASCADE; #이러면 삭제 가능 book_info도 사라짐
타입변경
ALTER TABLE ASSETS ALTER COLUMN NAME TYPE VARCHAR(50);
#타입 안바뀔 때
ALTER TABLE ASSETS
ALTER COLUMN ASSET_NO TYPE INT USING ASSET_NO::INTEGER;
ALTER TABLE CUSTOMER_GROUPS
RENAME COLUMN NAME TO GROUP_NAME; #rename을 사용하면 fk도 변경되서 다 반영된다. 참조를 하는데 문제가 생기지 않는다.
DROP TABLE PAGE; #부모 테이블은 못날린다. cascade를 사용해서 부모를 날리면 fk관계(참조 무결성 제약조건)이 사라짐.
임시테이블 : 세션이 끊어지면 날라간다.
CREATE TEMP TABLE TB_CUST_TEMP_TEST(CUST_ID INT);
TRUNCATE : 대용량의 테이블을 빠르게 지우는 방법
TRUNCATE TABLE BIG_TABLE;
ROLLBACK; 복구가능 #POSTGRE SQL에서만 가능
-
References
- 패스트캠퍼스 모두를 위한 SQL강의
Comments