2025.03.05 SQL 공부
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를 설정하면 생성되고, 자동정렬 기능은 없다.