카테고리 없음

2025.03.05 SQL 공부

3452 2025. 3. 5. 17:58

SQL 프로그래밍

 

SQL에서 프로그래밍을 할수있게 하는 방법이다.

 

 

DELIMITER $$

CREATE PROCEDURE 프로시저_이름()

BEGIN

-- 이 부분에 SQL 프로그래밍 코딩

END $$

DELIMITER ;

CALL 프로시저_이름();

 

자바에서 함수를 선언하고 호출하던걸 SQL 내에서 비슷하게 사용할수 있게 구현한것이다.

 

하나씩 살펴보면

 

우선 SQL에서 함수를 선언할때는 DELIMITER를 이용해서 감싼다.

 

이 DELIMITER는 안쪽으로 $$를 가지고 있다.

 

그리고 CREATE PROCEDURE 프로시저_이름()으로 프로시저에게 이름을 붙이고, 선언한다. 이때 ()안에는 자바의 함수처럼 매개변수를 넣을수 있다.

 

BEGIN과 END는 시작과 끝을 의미하며, 자바로 치면 {} 중괄호와 같다고 생각하면 된다.

 

결국 자바의

 

void 함수명() {

 

}

과 사실은 같은 형태라는거다.

 

호출할때는 CALL 프로시저_이름();

 

마찬가지로 자바의 함수이름() 과 동일하다.

 

이렇게 접근하면 자바와 크게 다르지 않은 구조라는걸 알수있다.

 

 

또한 함수 안에서는 DECLARE를 이용해서 지역변수를 선언하고, SET을 이용해서 값을 초기화 할수 있다.

 

DECLARE A INT; -- 정수타입의 변수 A 선언

SET A = 10; -- A의 값 초기화

 


 

 

IF문

 

IF 조건식 THEN 내용 END IF;

 

IF 뒤에 조건식이 참이면 THEN 뒤의 내용을 실행한다.

 

 

IF 조건식 THEN 내용 ELSE 내용 END IF;

 

IF 뒤에 조건식이 참이면 THEN을 실행하고, 아니면 ELSE를 실행한다.

 

 

CASE문

 

IF문과 크게 다를것 없다.

 

CASE

WHEN 조건1 THEN 내용1

WHEN 조건2 THEN 내용2

WHEN 조건3 THEN 내용3

ELSE 내용4

END CASE;

 

구성은 자바의 스위치와 비슷하지만 스위치는 값이 딱 정해져 있는 반면에 CASE는 값이 범위를 가지고 있어서 사실상 IF와 더 가깝다.

 

마찬가지로 조건이 만족되면 THEN 뒤에 내용을 실행하는 구조이다.

 

 

WHILE문

 

WHILE은 반복문인데 자바의 WHILE 보다는 FOR문에 가깝다.

 

WHILE 조건식 DO

내용

END WHILE;

 

보통 지역변수로 i를 선언하고 WHILE 문에서 SET i = i + 1;등의 식을 활용해서 FOR문 처럼 사용한다.

 

또한 ITERATE와 LEAVE도 있는데 자바의 continue와 break와 동일한 역할을 한다.

 


 

테이블 만들기

 

CREATE TABLE 테이블이름(칼럼1 데이터타입 제약사항, 칼럼2 데이터타입 제약사항, ...);

 

위의 방법으로 테이블을 만들수 있고 만들때 기본키와 외래키를 설정할수 있다.

 

기본키는

PRIMARY KEY(칼럼);

 

외래키는

FOREIGN KEY(칼럼) REFERENCES 테이블명(칼럼);

 

위의 방법으로 설정해줄수 있다. 외래키는 테이블에 존재하지 않던 키이기 때문에 어떤 테이블의 어떤 칼럼에서 가져온 것인지를 따로 표기해주어야한다.

 


 

 

제약조건

 

데이터의 무결성(중복 방지)을 지키기 위해 제한하는 조건이다.

 

제약조건의 종류로는

 

기본키 : NULL 허용안함 + UNIQUE

 

외래키 : 특정 테이블 칼럼에 입력 데이터가 있는지 확인

 

UNIQUE : 중복 불가

 

CHECK : 입력값을 조건식으로 확인

 

DEFAULT : NULL일 경우 기본값 입력

 

NULL : NULL을 허용할지 안할지 결정 / NOT NULL

 

 

위와 같은 종류가 있고, 주된 사용목적은 공백여부 검사, 유일여부 검사, 값 검사 이다.

 

체크의 경우에는 테이블을 생성할때 칼럼에 제약조건으로 height int null check(height >= 170) 이런식으로 추가해서 값이 조건에 맞지 않으면 데이터 삽입을 거부한다.

 

ALTER TABLE 테이블명 ADD CONSTRAINT PRIMARY KEY(칼럼명); 을 통해서 이미 생성된 테이블 칼럼에 기본키를 부여할수도 있다.


 

뷰(VIEW)

 

뷰는 가상의 테이블로써 사용하는 이유는 사용자로부터 sql문을 받았을때 보안에 민감한 사항을 미리 뷰 선에서 필터링 해서 DB에 데이터를 요청하게끔 만들수 있기 때문에 보안에 좋다.

 

또한 사용자는 뷰의 존재를 알수없다.

 

CREATE VIEW 뷰이름 AS SELECT문;

 

CREATE VIEW v_member AS SELECT mem_id, mem_name, addr FROM member;

 

뷰를 저렇게 생성하면 뷰가 가진 권한은 아이디, 이름, 주소에 대한 정보만 취급하기 때문에 사용자가 select *을 하더라도 아이디, 이름, 주소를 제외한 다른 정보에 대해서는 조회할수 없다.

 

이와같은 방법으로 민감할수 있는 주민등록번호라거나 계정의 비밀번호를 사용자로 부터 조회할수 없게 만들어서 보안에 도움이 된다.

 

뷰를 삭제할때는 DROP VIEW 뷰이름; 으로 삭제한다.

 

뷰를 삭제하더라도 뷰는 실제로 데이터를 가지고 있지 않기 때문에 기존의 데이터는 삭제되지 않는다.

 


 

인덱스(INDEX)

 

인덱스는 간단히 말하면 책갈피로 SELECT 문을 이용해서 데이터를 조회할때 WHERE 절에서 인덱스가 있는 칼럼을 선택하면 더 빠른 속도로 조회가 가능하다.

 

대신 인덱스를 생성하면 데이터를 추가 수정 삭제 할때마다 인덱스가 변경되고, 많은 용량을 차지하므로 오히려 더 느려질수있다.

 

인덱스를 사용하는 이유는 반응속도가 빨라지는것이고, 단점은 데이터 변경작업을 자주하면 오히려 더 느려진다는 것이다.

 

 

인덱스는 2가지로 나뉘는데 클러스터형 인덱스와 보조 인덱스이다.

 

클러스터형 인덱스는 PK키를 생성하면 자동으로 생성되고, 조회한 값에 대해서 정렬 기능이 있다.

 

보조 인덱스는 칼럼에 UNIQUE를 설정하면 생성되고, 자동정렬 기능은 없다.