SQL 데이터조작
SQL을 이용한 데이터 조작
데이터 검색: SELECT문
기본 검색
- SELECT키워드와 함께 검색하고 싶은 속성의 이름 나열
- FROM키워드와 함께 검색하고 싶은 속성이 있는 테이블의 이름 나열
- 검색 결과는 테이블 형태로 반환된다.
-
SELECT [ALL | DISTINCT] 속성리스트 FROM 테이블리스트;
- ALL
결과 테이블이 튜플의 중복을 허용하도록 지정, 생략 가능하다. - DISTINCT
결과 테이블이 튜플의 중복을 허용하지 않도록 지정
중복은 하나로만 표현되며 데이터 연산에서 프로젝트의 개념이다. - 예시
- 고객 테이블에서 고객아이디, 고객이름, 등급 속성을 검색
SELECT 고객아이디, 고객이름, 등급 FROM 고객;
- 고객 테이블에 존재하는 모든 속성을 검색
SELECT * FROM 고객;
- 제품 테이블에서 제조업체 속성을 중복 없이 검색
SELECT DISTINCT 제조업체 FROM 제품;
- 고객 테이블에서 고객아이디, 고객이름, 등급 속성을 검색
- AS 키워드를 이용해 결과 테이블에서 속성의 이름을 바꾸어 출력 가능하다.
- 예시
제품 테이블에서 제품명과 단가를 검색하되 단가를 가격이라는 새 이름으로 출력SELECT 제품명, 단가 AS 가격 FROM 제품;
- 예시
산술식을 이용한 검색
- SELECT키워드와 함께 산술식 제시
산술식은 속성의 이름과 산술 연산자(+, -, /, * 등)와 상수로 구성된다. - 속성의 값이 실제로 변경되는 것은 아니고 결과 테이블에서만 계산된 값이 출력된다.
- 예시
제품 테이블에서 제품명과 단가 속성을 검색하되, 단가에 500원을 더해 조정단가라는 새 이름으로 출력SELECT 제품명, 단가 + 500 AS 조정단가 FROM 제품;
조건 검색
- 조건을 만족하는 데이터만 검색
SELECT [ALL | DISTINCT] 속성리스트 FROM 테이블리스트 [WHERE 조건];
- WEHRE키워드와 함께 비교 연산자(=, !=, <, >, <=, >=)와 논리 연산자(AND, OR, NOT)를 이용한 조건 제시
조건에서 문자나 날짜 값은 작은 따옴표로 묶어서 표현 - 예시
주문 테이블에서 애플 고객이 15개 이상 주문한 주문제품, 수량, 주문일자를 검색SELECT 주문제품, 수량, 주문일자 FROM 주문 WHERE 주문고객 = '애플' AND 수량 >= 15;
LIKE를 이용한 검색
- LIKE키워드를 이용해 부분적으로 일치하는 데이터를 검색
- 문자열을 이용하는 조건에만 LIKE키워드를 사용 가능하다.
- ‘_‘는 한개의 문자, ‘%’는 임의의 길이(0자도 포함)를 나타낸다.
- 예시
- 임의의 값 3자와 서울로 끝나는 데이터 조회
SELECT 주소 FROM 고객 WHERE 주소 LIKE'___서울'
- 서울로 시작해 임의의 길이로 끝나는 데이터 조회
SELECT 주소 FROM 고객 WHERE 주소 LIKE'서울%'
- 고객 테이블에서 고객아이디가 5자인 고객의 고객아이디, 고객이름, 등급을 검색
SELECT 고객아이디, 고객이름, 등급 FROM 고객 WHERE 고객아이디 LIKE '_____';
- 임의의 값 3자와 서울로 끝나는 데이터 조회
NULL을 이용한 검색
- IS NULL키워드를 이용해 검색 조건에서 특정 속성의 값이 널 값인지를 비교
- IS NOT NULL키워드를 이용해 검색 조건에서 특정 속성의 값이 널 값이 아닌지를 비교
- 예시
고객 테이블에서 나이가 아직 입력되지 않은 고객의 고객이름을 검색SELECT 고객이름 FROM 고객 WHERE 나이 IS NULL;
정렬검색
- ORDER BY 키워드를 이용해 결과 테이블 내용을 사용자가 원하는 순서로 출력
- ASC(오름차순), DESC(내림차순)
여러 기준에 따라 정렬하려면 정렬 기준이 되는 속성을 차례대로 제시 -
SELECT [ALL | DISTINCT] 속성리스트 FROM 테이블리스트 [WHERE 조건] [ORDER BY 속성리스트 [ASC | DESC]];
- 예시
주문 테이블에서 수량이 10개 이상인 주문의 주문고객, 주문제품, 수량, 주문일자를 검색하라. 단, 주문제품을 기준으로 오름차순 정렬하고, 동일 제품은 수량을 기준으로 내림차순 정렬SELECT 주문고객, 주문제품, 수량, 주문일자 FROM 주문 WHERE 수량 >= 10 ORDER BY 주문제품 ASC, 수량 DESC;
집계 함수를 이용한 검색
- 특정 속성 값을 통계적으로 계산한 결과를 검색하기 위해 집계 함수를 이용
- 집계 함수는 NULL인 속성 값은 제외하고 계산한다.
- 집계 함수는 WHERE 절에서는 사용할 수 없고 SELECT절이나 HAVING절에서만 사용한다.
- 종류
- COUNT
속성 값의 개수
사용 가능한 속성: 모든 데이터
NULL값이 존재할 경우 기준에 따라 값이 달라질 수 있으므로 정확한 개수를 계산하기 위해서는 ‘*‘나 기본키로 계산한다. - MAX
속성 값의 최대값
사용 가능한 속성: 모든 데이터 - MIN
속성 값의 최솟값
사용 가능한 속성: 모든 데이터 - SUM
속성 값의 합계
사용 가능한 속성: 숫자 데이터 - AVG
속성 값의 평균
사용 가능한 속성: 숫자 데이터
- COUNT
- 예시
- 한빛제과에서 제조한 제품의 재고량 합계를 제품 테이블에서 검색
SELECT SUM(재고량) FROM 제품 WHERE 제조업체 = '한빛제과';
- 제품 테이블에서 제조업체 수를 검색
SELECT COUNT(DISTINCT 제조업체) FROM 제품;
- 한빛제과에서 제조한 제품의 재고량 합계를 제품 테이블에서 검색
그룹별 검색
-
SELECT [ALL | DISTINCT] 속성리스트 FROM 테이블리스트 [WHERE 조건] [GROUP BY 속성리스트 [HAVING 조건]] [ORDER BY 속성리스트 [ASC | DESC]];
- GROUP BY 키워드를 이용해 특정 속성의 값이 같은 튜플을 모아 그룹을 만들고 그룹별로 검색한다.
- GROUP BY 키워드와 함께 그룹을 나누는 기준이 되는 속성을 지정한다.
- HAVING 키워드를 함께 이용해 그룹에 대한 조건을 작성한다.
- 그룹을 나누는 기준이 되는 속성을 SELECT 절에도 작성하는 것이 좋다.
- 예시
- 주문 테이블에서 주문제품별 수량의 합계를 검색
SELECT 주문제품, SUM(수량) FROM 주문 GROUP BY 주문제품;
그룹핑한 속성을 SELECT절에도 작성해야 식별할 수 있다.
- 제품 테이블에서 제조업체별로 제조한 제품의 개수와 제품 중 가장 비싼 단가를 검색하되, 제품의 개수는 제품수라는 이름으로 출력하고 가장 비싼 단가는 최고가라는 이름으로 출력
SELECT 제조업체, COUNT(*) AS 제품수, MAX(단가) AS 최고가 FROM 제품 GROUP BY 제조업체;
- 제품 테이블에서 제품을 3개이상 제조한 제조업체별로 제품의 개수와, 제품 중 가장 비싼 단가를 검색
SELECT 제조업체, COUNT(*), MAX(단가) FROM 제품 GROUP BY 제조업체 HAVING COUNT(*) >= 3;
집계 함수를 이용한 조건은 WHERE절에는 작성할 수 없고 HAVING절에 작성!
- 주문 테이블에서 각 주문고객이 주문한 제품의 총주문수량을 주문제품별로 검색
SELECT 주문제품, 주문고객, SUM(수량) FROM 주문 GROUP BY 주문제품, 주문고객;
- 주문 테이블에서 주문제품별 수량의 합계를 검색
여러 테이블에 대한 조인 검색
- 조인 검색
여러 개의 테이블을 연결하여 데이터를 검색하는 것 - 조인 속성
조인 검색을 위해 테이블을 연결해주는 속성- 연결하려는 테이블 간에 조인 속성의 이름은 달라도 되지만 도메인은 같아야 한다.
- 일반적으로 외래키가 조인 속성으로 이용된다.
- FROM절에 검색에 필요한 모든 테이블을 나열한다.
- WHERE절에 조인 속성의 값이 같아야 함을 의미하는 조인 조건을 제시한다.
- 같은 이름의 속성이 서로 다른 테이블에 존재할 수 있기 때문에 속성 이름 앞에 해당 속성이 소속된 테이블의 이름을 표시한다.
- 예시
- 판매 데이터베이스에서 바나나 고객이 주문한 제품의 이름을 검색
SELECT 제품.제품명 FROM 주문, 제품 WHERE 주문.주문고객 = '바나나' AND 제품.주문제품 = 주문.제품번호;
- 판매 데이터베이스에서 나이가 30세 이상의 고객이 주문한 제품의 주문제품과 주문일자를 검색
SELECT 주문.주문제품, 주문.주문일자 FROM 고객, 주문 WHERE 고객.나이 >= 30 AND 고객.고객아이디 = 주문.주문고객;
- 판매 데이터베이스에서 철수 고객이 주문한 제품의 제품명을 검색
SELECT 제품.제품명 FROM 고객, 주문, 제품 WHERE 고객.고객이름 = '철수' AND 고객.고객아이디 = 주문.주문고객 AND 제품.제품번호 = 주문.주문제품;
- 판매 데이터베이스에서 바나나 고객이 주문한 제품의 이름을 검색
- 여러 테이블에 대한 조인 검색
SELECT * FROM 고객, 주문 WHERE 고객.고객아이디 = 주문.주문고객
아래와 같이 작성 가능
SELECT * FROM 고객 INNER JOIN 주문 ON 고객.고객아이디 = 주문.주문고객
부속 질의문을 이용한 검색
- SELECT문 안에 또 다른 SELECT문을 포함하는 질의
- 상위 질의문(주 질의문)
다른 SELECT문을 포함하는 SELECT문 - 하위 질의문(서브 질의문)
다른 SELECT문 안에 내포된 SELECT문- 괄호로 묶어서 작성한다. ORDER BY절을 사용할 수 없다.
- 단일 행 부속 질의문
하나의 행을 결과로 반환 - 다중 행 부속 질의문
하나 이상의 행을 결과로 반환
- 상위 질의문(주 질의문)
- 부속 질의문을 먼저 수행하고 그 결과를 이용해 상위 질의문을 수행
- 부속 질의문과 상의 질의문을 연결하는 연산자가 필요
- 단일 행 부속 질의문은 비교 연산자 사용 가능
- 다중 행 부속 질의문은 비교 연산자 사용 불가능
-
다중 행 부속 질의문에 사용 가능한 연산자
연산자 설명 IN 부속 질의문의 결과 값 중 일치하는 것이 있으면 검색 조건이 참 NOT IN 부속 질의문의 결과 값 중 일치하는 것이 없으면 검색 조건이 참 EXISTS 부속 질의문의 결과 값이 하나라도 존재하면 검색 조건이 참 NOT EXISTS 부속 질의문의 결과 값이 하나도 존재하지 않으면 검색 조건이 참 ALL 부속 질의문의 결과 값 모두와 비교한 결과가 참이면 검색 조건을 만족(비교 연산자와 함께 사용) ANY(SOME) 부속 질의문의 결과 값 중 하나라도 비교한 결과가 참이면 검색 조건을 만족(비교 연산자와 함께 사용) - 예시
- 판매 데이터베이스에서 달콤비스킷과 같은 제조업체에서 제조한 제품의 제품명과 단가를 검색
SELECT 제품명, 단가 FROM 제품 WHERE 제조업체 = ( SELECT 제조업체 FROM 제품 WHERE 제품명 = '달콤비스킷' );
- 판매 데이터베이스에서 적립금이 가장 많은 고객의 고객이름과 적립금을 검색
SELECT 고객이름, 적립금 FROM 고객 WHERE 적립금 = ( SELECT MAX(적립금) FROM 고객 );
- 판매 데이터베이스에서 바나나 고객이 주문한 제품의 제품명과 제조업체를 검색
SELECT 제품명, 제조업체 FROM 제품 WHERE 제품번호 IN ( SELECT 주문제품 FROM 주문 WHERE 주문고객 = '바나나' );
- 판매 데이터베이스에서 대한식품이 제조한 모든 제품의 단가보다 비싼 제품의 제품명, 단가, 제조업체를 검색
SELECT 제품명, 단가, 제조업체 FROM 제품 WHERE 단가 > ALL ( SELECT 단가 FROM 제품 WHERE 제조업체 = '대한식품' );
- 판매 데이터베이스에서 달콤비스킷과 같은 제조업체에서 제조한 제품의 제품명과 단가를 검색
INSERT문
데이터 직접 삽입
INSERT
INTO 테이블이름[(속성리스트)]
VALUES (속성값리스트);
- INTO키워드와 함께 튜플을 삽입할 테이블의 이름과 속성의 이름을 나열
속성 리스트를 생략하면 테이블을 정의할 때 지정한 속성의 순서대로 값이 삽입된다. - VALUES키워드와 함께 삽입할 속성 값들을 나열
- INTO절의 속성 이름과 VALUES절의 속성 값은 순서대로 일대일 대응되어야 한다.
- 예시
판매 데이터베이스의 고객 테이블에 고객아이디가 딸기, 고객이름이 민수, 나이가 30세, 등급이 vip인 새로운 고객의 정보롤 삽입.INSERT INTO 고객(고객아이디, 고객이름, 나이, 등급) VALUES ('딸기', '민수', 30, 'vip');
해당 테이블의 모든 속성에 값을 넣을거면 아래와 같이 작성 가능
INSERT INTO 고객 VALUES ('딸기', '민수', 30, 'vip');
INSERT INTO 고객 VALUES ('딸기', '민수', NULL, 'vip');
나이 속성을 NULL로 넣기
INSERT INTO 고객(고객아이디, 고객이름, 등급) VALUES ('딸기', '민수', 'vip');
이렇게도 가능
부속 질의문을 이용한 데이터 삽입
SELECT문을 이용해 다른 테이블에서 검색한 데이터를 삽입
INSERT
INTO 테이블이름[(속성리스트)]
SELECT 문;
- 예시
INSERT INTO 한빛제품(제품명, 재고량, 단가) FROM 제품 WHERE 제조업체 = '한빛제과';
UPDATE문
- 테이블에 저장된 튜플에서 특정 속성의 값을 수정
UPDATE 테이블이름 SET 속성이름1 = 값1, 속성이름2 = 값2, ... [WHERE 조건];
- SET 키워드 다음에 속성 값을 어떻게 수정할 것인지를 지정
- WHERE 절에 제시된 조건을 만족하는 튜플에 대해서만 속성 값을 수정
WHERE절을 생략하면 테이블에 존재하는 모든 튜플을 대상으로 수정 - 예시
- 제품 테이블에서 제품번호가 a1인 제품의 제품명을 파이로 수정
UPDATE 제품 SET 제품명 = '파이' WHERE 제품번호 = 'a1';
- 제품 테이블에 있는 모든 제품의 단가를 10% 인상
UPDATE 제품 SET 단가 = 단가 * 1.1;
- 판매 데이터베이스에서 철수 고객이 주문한 제품의 주문수량을 5개로 수정
UPDATE 주문 SET 수량 = 5 WHERE 주문고객 = ( SELECT 고객아이디 FROM 고객 WHERE 고객이름 = '철수' );
- 제품 테이블에서 제품번호가 a1인 제품의 제품명을 파이로 수정
DELETE문
- 테이블에 저장된 데이터를 삭제
DELETE FROM 테이블이름 [WHERE 조건];
- WHERE절에 제시한 조건을 만족하는 튜플만 삭제
WHERE절을 생략하면 테이블에 존재하는 모든 튜플을 삭제해 빈 테이블이 된다.
테이블 자체가 삭제되는 것이 아니다. - 예시
판매 데이터베이스의 주문 테이블에 존재하는 모든 튜플을 삭제DELETE FROM 주문;
Leave a comment