[데이터베이스] SQL

zunzero·2022년 8월 21일
0

CS

목록 보기
4/8

데이터베이스 설계만큼이나 중요한 것이 데이터베이스 언어이다.
회의를 통해서 함께 설계하거나, 이미 설계된 데이터베이스를 사용할 일이 많기 때문에 SQL 문을 잘 알아두어야 한다.
그 중에서도 SELECT문이 가장 중요하다고 생각하기 때문에, 이번 포스팅에서는 SELECT 문을 집중적으로 알아볼 것이다.

DDL

DDL: 데이터 정의어

  • 테이블 생성
    CREATE TABLE
CREATE TABLE 테이블_이름 (
	1. 속성_이름 데이터_타입 [NOT NULL] [DEFAULT 기본_값]
    2. [PRIMARY KEY (속성_리스트)]
    3. [UNIQUE (속성_리스트)]
    4. [FOREIGN KEY (속성_리스트) REFERENCES 테이블_이름(속성_리스트)]
    	[ON DELETE 옵션] [ON UPDATE 옵션]
    5. [CONSTRAINT 제약조건_이름] [CHECK(조건)]    
);
  1. 테이블을 구성하는 각 속성의 이름, 데이터 타입, 기본 제약 사항 정의
  2. 기본키 정의
  3. 대체키 정의 (유일성을 가지며, 기본키와 달리 NULL값이 허용됨)
  4. 외래키 정의
    ON DELETE 및 UPDATE 조치 옵션 -> 참조 무결성 제약조건 유지를 위해 참조되는 테이블에서 투플 삭제 혹은 변경 시 처리 방법을 지정
    - NO ACTION(디폴트 설정): 투플을 삭제 혹은 변경하지 못하게 함
    - CASCADE: 관련 투플을 함께 삭제 혹은 변경함
    - SET NULL: 관련 투플의 외래키 값을 NULL로 변경
    - SET DEFAULT: 관련 투플의 외래키 값을 미리 지정한 기본값으로 변경
  5. 데이터 무결성을 위한 제약조건 정의
  • 테이블 변경
    ALTER TABLE
ALTER TABLE 테이블_이름 ADD 속성_이름 데이터_타입 [NOT NULL] [DEFAULT 기본_깂];
ALTER TABLE 테이블_이름 DROP COLUMN 속성_이름 [CASCADE | RESTRICT];
ALTER TABLE 테이블_이름 ADD CONSTRAINT 제약조건_이름 제약조건_내용;
ALTER TABLE 테이블_이름 DROP CONSTRAINT 제약조건_이름;

cascade와 restrict: 기존 속성 삭제 시, 삭제할 속성과 관련된 제약조건이 있는 경우
전자는 관련된 제약조건도 모두 삭제하고, 후자는 속성 삭제를 수행하지 않는다.

  • 테이블 삭제
    DROP TABLE
DROP TABLE 테이블_이름 [CASCADE | RESTRICT];

cascade와 restrict: 삭제할 테이블을 참조하는 테이블이 있는 경우,
전자는 관련된 테이블도 모두 삭제하고, 후자는 테이블 삭제를 수행하지 않는다.

DML

DML: 데이터 조작어

INSERT

  • 데이터 삽입: INSERT
INSERT INTO 테이블_이름[(속성_리스트)] VALUES (속성값_리스트);
INSERT INTO 테이블_이름[(속성_리스트) SELECT;

UPDATE

  • 데이터 수정: UPDATE
UPDATE 테이블_이름 SET 속성_이름1 =1, 속성_이름2 =2, ... [WHERE 조건];

DELETE

  • 데이터 삭제: DELETE
DELETE FROM 테이블_이름 [WHERE 조건];

데이터 수정과 데이터 삭제를 위한 조건문에는 모두 부속질의문을 사용할 수 있다.

SELECT

  • 데이터 검색: SELECT
    SQL의 핵심이다.
    원하는 데이터를 DB에서 찾아와 활용하는 것이 메인이다.

기본

SELECT [ALL | DISTINCT] 속성_리스트 FROM 테이블_리스트;

기본 설정은 ALL로 되어있으며, 이는 결과 테이블이 투플의 중복을 허용하도록 지정하는 것이다.
DISTINCT 설정은 결과 테이블이 투플의 중복을 허용하지 않도록 지정한다.

산술식과 AS 키워드

SELECT [ALL | DISTINCT] 속성1 [산술식], 속성2 [AS 별명], 속성3, ...  FROM 테이블_리스트;

산술식은 속성의 이름과 산술연산자와 상수로 구성되어있다.
AS 키워드를 통해 결과 테이블에서 속성의 이름을 변경하여 출력할 수 있다.

SELECT 단가 + 500 AS "조정 단가" FROM 제품;

위와 같은 SQL 문의 작성이 가능한 것이다.

WHERE 조건문

SELECT [ALL | DISTINCT] 속성_리스트 FROM 테이블_리스트 [WHERE 조건];

WHERE을 통한 조건문은 비교연산자와 논리연산자를 이용한 검색 조건을 제시한다.
이때 문자열을 이용하는 조건에는 LIKE 키워드 또한 사용할 수 있다.

SELECT 고객이름 FROM 고객 WHERE 고객이름 LIKE '__한%' 
-> 세 번째 글자가 '한'인 문자열

값이 입력되어 있는지 혹은 입력되어 있지 않은지에 대한 검색은 IS NULL 혹은 IS NOT NULL 키워드를 통해 검색할 수 있다.

SELECT 고객이름 FROM 고객 WHERE 나이 IS NOT NULL;

WHERE 절에는 집계함수를 이용한 조건을 작성할 수 없으며, 이후에 나오는 HAVING 절에서 작성가능하다.

ORDER BY

ORDER BY 키워드는 정렬을 이용하고 싶을 때 사용할 수 있다.

SELECT [ALL | DISTINCT] 속성_리스트 FROM 테이블_리스트 
[WHERE 조건] 
[ORDER BY 속성_리스트 [ASC | DESC];

기본 설정은 ASC로 오름차순을 의미한다. 반대로 DESC는 내림차순을 의미한다.
NULL 값은 오름차순에서는 맨 마지막에 출력되고, 내림차순에서는 맨 먼저 출력된다.

집계 함수

SQL 집계 함수로는 COUNT, MAX, MIN, SUM, AVG가 있다.
SUM과 AVG함수를 사용할 수 있는 속성의 타입은 숫자 데이터 뿐이며, 나머지는 모든 데이터 타입에 대해 사용가능하다.
NULL인 속성값은 제외하고 계산하며, 집계함수 안에 ALL과 DISTINCT 키워드를 사용할 수 있다.

GROUP BY 그룹별 검색

SELECT [ALL | DISTINCT] 속성_리스트 FROM 테이블_리스트
[WHERE 조건]
[GROUP BY 속성_리스트 [ HAVING 조건 ] ]
[ORDER BY 속성_리스트 [ ASC | DESC ] ];

GROUP BY 키워드는 특정 속성의 값이 같은 투플을 모아 그룹을 만들고 그룹별로 검색을 할 수 있게 한다.
HAVING 키워드는 해당 그룹에 대한 조건을 작성한다.

SELECT 주문제품, SUM(수량) AS 총주문수량 FROM 주문 GROUP BY 주문제품;


앞서 얘기한 것과 같이 HAVING 절에는 집계함수를 이용한 조건을 작성할 수 있다.

고객 테이블에서 적립금 평균이 1,000원 이상인 등급에 대해 등급별 고객수와 적립금 평균을 검색해보자
SELECT 등급, COUNT(*) AS 고객수, AVG(적립금) AS 평균적립금 FROM 고객
GROUP BY 등급 HAVING AVG(적립금) >= 1000;

GROUP BY 키워드에 여러 속성을 작성하면, 해당 속성들이 하나의 그룹이 되어 동작한다.
속성1과 속성2의 값이 같은 투플을 모아 그룹을 만든다는 의미이다.

조인

조인 검색은 여러 개의 테이블을 연결하여 데이터를 검색하는 것을 의미한다.
조인 속성이란 조인 검색을 위해 테이블을 연결해주는 속성으로, 일반적으로 외래키를 이용한다.

FROM 절에는 검색에 필요한 모든 테이블을 나열하고, WHERE 절에는 조인 속성의 값이 같아야 함을 의미하는 조인 조건을 제시해야 한다.

판매 데이터베이스에서 고명석 고객이 주문한 제품의 제품명을 검색해보자.
SELECT 제품.제품명 FROM 고객, 제품, 주문 
WHERE 고객.고객이름 = '고명석' 
	AND 고객.고객아이디 = 주문.주문고객 AND 제품.제품번호 = 주문.주문제품;

부속 질의문

부속 질의문을 이용하면 SELECT 문 안에 또 다른 SELECT 문을 포함하는 질의문을 작성할 수 있다.
부속 질의문에는 ORDER BY 절을 사용할 수 없다.
단일 행 부속 질의문에는 <, >, = 과 같은 비교 연산자를 사용할 수 있고,
다중 행 부속 질의문에는 비교연산자가 아닌 IN, NOT IN, EXISTS, NOT EXISTS 등과 같은 키워드를 사용할 수 있다.

조인을 사용하거나 부속 질의문을 사용하거나, 질의 내용은 다양하게 표현 가능하므로 사용자가 자유롭게 선택하면 된다.!

DCL

VIEW

뷰란 다른 테이블을 기반으로 만들어진 가상의 테이블을 의미한다.
데이터를 실제로 저장하지는 않고 논리적으로만 존재하는 테이블이지만, 일반 테이블과 동일한 방법으로 사용이 가능하다.
다른 뷰를 기반을 새로운 뷰를 만드는 것 또한 가능하다.
뷰를 통해 기본 테이블 검색은 가능하나 수정은 제한적이다.

  • 뷰의 장점
  1. 질의문을 좀 더 쉽게 작성할 수 있다.
    GROUP BY, 집계함수, 조인 등을 이용해 뷰를 미리 만들어 놓으면 복잡한 SQL 문을 작성하지 않아도 SELECT 절과 FROM 절만으로도 원하는 데이터를 검색할 수 있다.
  2. 데이터의 보안 유지에 도움이 된다.
    자신에게 제공된 뷰를 통해서만 데이터에 접근하도록 권한 설정이 가능하다.
  3. 데이터를 좀 더 편리하게 관리할 수 있다.
    제공된 뷰와 관련이 없는 다른 내용에 대해 사용자가 신경 쓸 필요가 없다.

뷰에 대한 자세한 SQL 문은 포스팅에서 생략하겠다.
필요할 때 알아서 찾아서 보는 걸로!!

profile
나만 읽을 수 있는 블로그

0개의 댓글