School/데이터베이스

SQL-SELECT 문

응엉잉 2022. 4. 18. 22:40

SQL : 관계 데이터베이스를 위한 표준 질의어, 비절차적 데이터 언어로 분류

데이터 정의 ,데이터 조작, 데이터 제어 에 사용할 수 있음

데이터 조작 기능으로는 데이터 검색, 데이터 삽입, 데이터 수정, 데이터 삭제 가 있음

데이터 검색 기능은 SELECT 문 이용

 

SELECT 문

기본검색

SELECT [ ALL / DISTINCT ] 검색하고 싶은 속성 이름

FROM 검색하고 싶은 속성이 있는 테이블의 이름 ;

 

ALL : 결과 테이블이 투플의 중복을 허용하도록 지정 (디폴트값, 생략가능)

DISTINCT : 결과 테이블 투플의 중복 제거

검색결과는 테이블 형태로 반환

 

모든 속성 검색하기

모든 속성을 검색하고 싶은 경우 모든 속성의 이름을 나열하지 않고, * 이용 가능

EX)

SELECT * 

FROM (테이블 이름)

 

결과 테이블의 속성 이름 바꾸기 : AS

SELECT 검색하고 싶은 속성 이름 AS 새로운 이름

FROM 검색하고 싶은 속성이 있는 테이블 이름;

 

AS 키워드를 이용해 결과 테이블에서 속성 이름을 바꾸어 출력 가능

새로운 이름에 공백이 포함되어있다면 따옴표로 묶어줘야함 (MY SQL 에서는 작은따옴표)

 

산술식을 이용한 검색 

SELECT 키워드와 함께 산술식 제시할 수 있음

 * 산술식 : 속성의 이름, 산술연산자(+,-,*,/), 상수 로 구성

속성값이 실제로 변경되는건 아니고 쿼리의 결과 테이블에서만 계산된 결과값이 출력됨

EX) 

SELECT 단가 + 500 

 

조건 검색 : WHERE 

SELECT 속성

FROM 테이블

WHERE 조건;

WHERE + 비교/논리 연산자 이용한 검색 조건 제시

숫자뿐만 아니라 문자, 날짜 값 비교도 가능

문자, 날짜 값은 작은 따옴표로 묶어서 표현

EX) 'A' < 'C' , '2022-11-09' < '2022-11-10'

여러개의 조건을 제시하고싶을 때 논리 연산자 이용

EX) WHERE 제조업체 = '한빛제과' AND 수량 >= 15

 

 

LIKE 이용한 검색

WHERE 속성 LIKE 문자열 조건

LIKE 키워드를 이용해 부분적으로 일치하는 데이터 검색

문자열을 이용하는 조건에만 LIKE 키워드 이용 가능

 

% : 0개 이상의 문자 (문자 내용과 개수는 상관 없음)

_ : 1개의 문자 (문자의 내용은 상관 없음)

LIKE '데이터%'  데이터로 시작하는 문자열 (데이터로 시작하기만 하면 길이는 상관 없음)
LIKE '%데이터' 데이터로 끝나는 문자열 (데이터로 끝나기만 하면 길이는 상관 없음)
LIKE '%데이터%' 데이터가 포함된 문자열
LIKE '데이터_ _ _' 데이터로 시작하는 6자 길이의 문자열
LIKE'_ _정' 세번째 글자가 '정' 인 문자열

EX) WHERE 고객이름 LIKE '김%'

 

NULL 이용한 검색

WHERE 속성 IS NULL 

IS NULL 키워드를 이용해서 특정 속성의 값이 널 값인지를 비교

IS NOT NULL 키워드를 이용해 특정 속성의 값이 널 값이 아닌지를 비교

검색 조건에서 널값은 다른 값과 크기를 비교하면 결과값은 모두 거짓이 됨

 

 

정렬검색 : ORDER BY

ORDER BY 속성1 ASC, 속성2 DESC 

ORDER BY 키워드를 이용해 결과 테이블 내용을 사용자가 원하는 순서로 출력

ORDER BY 정렬기준이 되는 속성과 정렬 방식을 지정

ASC : 오름차순 (디폴트값)

DESC : 내림차순

NULL 값은 오름차순에서는 맨 마지막에 출력, 내림차순에서는 맨 먼저 출력

여러 기준에 따라 정렬하려면 정렬 기준이 되는 속성을 차례로 제시

정렬은 가장 마지막에 와야함

 

집계함수 이용한 검색

SELECT AVG(단가)

FROM 제품;

특정 속성 값을 통계적으로 계산한 결과를 검색하기 위해 집계함수를 이용

개수, 합계, 평균, 최댓값, 최솟값

NULL 속성 제외하고 계산

WHERE 절에서는 사용 불가능 , SELECT 절이나 HAVING 절에만 사용 가능

COUNT 이용해서 개수 체크하는 경우 정확한 계산을 위해 기본키 속성이나 주소 이용

 

그룹별 검색 : GROUP BY

GROUP BY  + 그룹을 나누는 기준이 되는 속성

특정 속성 값 같은 투플 모아 그룹 만들고 그룹별로 검색

HAVING 함께 이용해 그룹에 대한 조건 작성

그룹 나누는 기준이 되는 속성을 SELECT 절에도 작성하는 것이 좋음

 

EX) 주문제품별 수량 합계 구하기

주문제품을 SELECT 절에도 포함, 주문제품을 GROUP BY 기준으로 삼아 집계함수 적용

집계 함수를 이용한 조건은 WHERE 절에서 작성할 수 없고 HAVING 절에서 작성

집계 함수나 GROUP BY 절에 명시된 속성 외의 속성은 SELECT 절에 작성 불가

 

여러 테이블에 대한 조인 검색

조인 검색 : 여러 개의 테이블을 연결하여 데이터를 검색하는 것

조인 속성 : 조인 검색을 위해 테이블을 연결해주는 속성

 * 연결하려는 테이블 간의 조인 속성의 이름은 달라도 되지만 도메인은 같아야 함

 * 일반적으로 외래키를 조인 속성으로 이용

FROM + 검색에 필요한 모든 테이블

WHERE + 조인 속성의 값이 같아야 함을 의미하는 조인 조건

조인 하게되면 여러개의 테이블에서 정보를 가져오니까 테이블.속성

EX) 주문.주문고객

이름이 같은 속성이 없다면 테이블 이름 없이 속성 이름으로만 작성 가능

테이블의 이름을 약자로 명시하고 써도 좋음

EX)

FROM 주문 O

WHERE O.주문고객 ~

 

부속 질의문을 이용한 검색

SELECT 문 안에 또 다른 SELECT 문을 포함하는 질의

상위 질의문 : 다른 SELECT 문을 포함하는 SELECT 문

부속 질의문 : 다른 SELECT 문 안에 들어있는 SELECT 문

 - 괄호로 묶어서 작성, ORDER BY 절을 사용할 수 없음

 - 단일 행 부속 질의문 : 하나의 행을 결과로 반환

 - 다중 행 부속 질의문 : 하나 이상의 행을 결과로 반환

부속 질의문을 먼저 수행 -> 그 결과를 이용해 상위 질의문 수행

부속 질의문과 상위 질의문을 연결하는 연산자가 필요

단일 행 부속 질의문은 비교연산자 사용 가능

다중 행 부속 질의문은 비교연산자 사용 불가

 

다중행 부속 질의문에 사용 가능한 연산자

IN 부속 질의문 결과값 중 일치하는 것이 있으면 검색조건이 참
NOT IN 부속 질의문 결과값 중 일치하는 것이 없으면 검색 조건이 참
EXISTS 부속 질의문 결과값이 하나라도 존재하면 검색조건이 참
NOT EXISTS 부속 질의문 결과값이 하나라도 존재하지 않으면 검색조건이 참
ALL 부속 질의문의 결과값 모두와 비교한 결과가 참이면 검색조건을 만족 (비교 연산자와 함께 사용)
ANY (SOME) 부속 질의문 결과값 중 하나라도 비교한 결과가 참이면 검색 조건을 만족 (비교 연산자와 함꼐 사용)

 

<예시>

판매 데이터베이스에서 BANANA 고객이 주문한 제품의 제품명과 제조업체

SELECT 제품명, 제조업체

FROM 제품

WHERE 제품번호 IN (BANANA 가 주문*)

*

SELECT 주

 

BANANA 가 

1) 고객 테이블에서 고객 아이디, 고객 이름, 등급 속성 검색

2) 고객 테이블에 존재하는 모든 속성 검색

3) 제품 테이블에서 제조업체 검색 (ALL 이용)

4) 제품 테이블에서 제조업세 속성을 중복없이 검색

5) 제품 테이블에서 제품명과 단가를 검색하되, 단가를 가격이라는 새 이름으로 출력

6) 제품 테이블에서 제품명과 단가 속성을 검색하되, 단가에 500원을 더해 조정 단가라는 새이름으로 출력

7) 제품 테이블에서 한빛제과가 제조한 제품의 제품명, 재고량, 단가 검색

8) 주문 테이블에서 APPLE 고객이 15개 이상 주문한 주문제품, 수량, 주문일자를 검색

9) 제품 테이블에서 단가가 2000원 이상이면서 3000원 이하인 제품의 제품명, 단가, 제조업체를 검색

10) 고객 테이블에서 성이 김씨인 고객의 고객이름, 나이, 등급, 적립금 검색

11) 고객 테이블에서 고객아이디가 5자인 고객의 고객아이디, 고객이름, 등급 검색

12) 고객 테이블에서 나이가 아직 입력되지 않은 고객의 고객이름

13) 고객 테이블에서 나이가 이미 입력된 고객의 고객이름

14) 고객 테이블에서 고객이름, 등급, 나이를 검색하되, 나이 기준으로 내림차순

15) 주문테이블에서 수량이 10개 이상인 주문의 주문고객, 주문제품, 수량, 주문일자를 검색해보자. 

     주문제품은 오름차순으로 정렬하고, 동일 제품은 수량을 기준으로 내림차순

16) 한빛제과에서 제조한 제품의 재고량 합계를 제품 테이블에서 검색

17) 고객 테이블에 고객이 몇 명 등록되어있는지 검색

18) 제품 테이블에서 제조업체의 수 검색

19) 주문 테이블에서 주문제품별 수량 합계

20) 제품 테이블에서 제조업체별로 제조한 제품의 수와 제품 중 가장 비싼 단가를 검색하되, 제품 개수는 제품수라는 이름으로 출력하고, 가장 비싼 단가는 최고가라는 이름으로 출력

21) 제품 테이블에서 제품을 3개 이상 제조한 제조업체별로 제품의 개수, 제품 중 가장 비싼 단가

22) 고객 테이블에서 적립금 평균이 1000원 이상인 등급에 대해 등급별 고객수 적립금 평균

23) 주문 테이블에서 각 주문고객이 주문한 제품의 총주문수량을 주문제품별로 검색

24) 판매 데이터베이스에서 BANANA 고객이 주문한 제품의 이름

25) 판매 데이터베이스에서 나이가 30세 이상인 고객이 주문한 제품의 주문제품과 주문일자를 검색

26) 판매 데이터베이스에서 고명석 제품이 주문한 제품의 제품명

27) 판매 데이터베이스에서 달콤비스킷을 생산한 제조업체가 만든 제품들의 제품명과 단가

SELECT 제품명, 단가

FROM 제품

WHERE 제조업체 = ( 달콤비스킷을 생산한 제조업체 )

 

* 달콤비스킷을 생산한 제조업체는 하나 -> 단일 행 부속 질의문

SELECT 제조업체

FROM 제품

WHERE 제품명 = '달콤비스킷'

28) 판매 데이터베이스에서 적립금이 가장 많은 고객의 이름과 적립금

SELECT 고객이름, 적립금

FROM 고객

WHERE 적립금 = (부속질의문 -> 적립금이 가장 많은 -> 적립금이 MAX 인)

 

SELECT MAX(적립금)

FROM 고객

 

'School > 데이터베이스' 카테고리의 다른 글

정규화  (0) 2022.06.11
데이터베이스 언어 SQL_2  (0) 2022.06.11
관계 데이터 연산  (0) 2022.04.17
관계 데이터 모델  (0) 2022.04.16
데이터 모델링  (0) 2022.04.15