[Database] - 데이터 조작어(DML)

오동훈·2021년 4월 3일
0

Database

목록 보기
5/39

1. 데이터 검색 - SELECT 📕

1.1 select 기본 형식

- SELECT 문의 기본 형식은 다음과 같다.

SELECT [ALL | DISTINCT] 속성이름() 
FROM 테이블이름()
WHERE 검색조건()
GROUP BY 속성이름
HAVING 검색조건()
ORDER BY 속성이름 [ASC | DESC]

1.2 example 1

  • Table 이름이 Customer인 다음과 같은 릴레이션이 존재할 때, select의 간단한 쓰임을 정리해 보려 한다.

    Custidnameaddressphone
    1박지성영국 맨체스터010-0000-0001
    2김연아대한민국 서울010-1000-0001
    3장미란대한민국 강원도010-2000-0001
    4추신수미국 클리블랜드010-3000-0001
    5박세리대한민국 대전NULL

ex1). 김연아 고객의 전화번호를 찾아보세요!

example 1

SELECT phone 
FROM Customer 
WHERE name='김연아';
phone
010-0000-0001

1.3 example 2

  • Table 이름이 Book인 다음과 같은 릴레이션이 존재할 때, select의 간단한 쓰임을 정리해 보려 한다.

    bookidbooknamepublisherprice
    1축구의 역사굿스포츠7000
    2축구아는 여자나무수13000
    3축구의 이해대한미디어22000
    4골프 바이블대한미디어35000
    5피겨 교본굿스포츠8000
    6역도 단계별 기술이상미디어6000
    7야구의 추억이상미디어20000
    8야구를 부탁해대한미디어13000
    9올림픽 이야기삼성당7500
    10Olymic ChampionsPearson13000

ex2). 모든 도서의 도서번호, 도서이름, 출판사, 가격을 검색하세요!

ex2.1

SELECT bookid, bookname, publisher, price
FROM Book

ex2.2

SELECT *
FROM Book

# 둘의 결과값은 같습니다 

1.4 example 3

ex3). 도서 테이블에 있는 모든 출판사를 검색하세요!

# 중복있이 모든 출판사가 검색됨

SELECT publisher
FROM Book;
# 중복을 없애고 싶으면 DISTINCT라는 키워드 사용

SELECT DISTINCT publisher
FROM Book;

2. 데이터 검색 - WHERE 📙

- 조건 검색: 조건을 만족하는 데이터만 검색

# 기본 형식

SELECT [ALL | DISTINCT] 속성이름()
FROM 테이블이름()
WHERE 검색조건()

- WHERE 절에 조건으로 사용할 수 있는 술어는 다음과 같다.

술어연산자
비교=, <>, <, <=, >, >=price < 20000
범위BETWEENprice BETWEEN 10000 AND 20000
집합IN, NOT INprice IN(10000, 20000, 30000)
패턴LIKEbookname LIKE '축구의 역사'
NULLIS NULL, IS NOT NULLprice IS NULL
복합조건AND, OR, NOT(price < 20000) AND (bookname LIKE '축구의 역사')

2.1 example 4

ex4). 가격이 20,000원 미만인 도서를 검색하세요

# example 4

SELECT *
FROM Book
WHERE price < 20000;

2.2 example 5

ex5). 가격이 10,000원 이상 20,000원 이하인 도서를 검색하세요

# example 5

SELECT *
FROM Book
WHERE price BETWEEN 10000 AND 20000;

# BETWEEN은 논리 연산자인 AND를 사용할 수 있다.
# 위의 답과 동일합니다.

SELECT *
FROM Book
WHERE price >= 10000 AND price <= 20000;

2.3 example 6

ex6). 출판사가 '굿스포츠' 혹은 '대한미디어'인 도서를 검색하시오

# example 6

SELECT *
FROM Book
WHERE publisher IN('굿스포츠', '대한미디어');

2.4 example 7

ex7). 출판사가 '굿스포츠' 혹은 '대한미디어'가 아닌 도서를 검색하시오

# example 7

SELECT *
FROM Book
WHERE publisher NOT IN('굿스포츠', '대한미디어');

2.5 LIKE를 이용한 검색

  • LIKE 키워드를 이용해 부분적으로 일치하는 데이터를 검색
    문자열을 이용하는 조건에만 LIKE 키워드 사용 가능

와일드 문자의 종류는 다음과 같습니다.

와일드 문자의미사용 예
+문자열을 연결'골프' + '바이블' = '골프 바이블'
%0개 이상의 문자열과 일치'%축구%' = 축구를 포함하는 문자열
[]1개의 문자와 일치'[0-5]%' = 0-5 사이 숫자로 시작하는 문자열
[^]1개의 문자와 불일치'[^0-5]%' = 0-5 사이 숫자로 시작하지 않는 문자열
_특정 위치의 1개의 문자와 일치'_구%' = 두 번째 위치에 '구'가 들어가는 문자열

2.6 example 8

ex8). '축구의 역사'를 출간한 출판사를 검색하세요

# example 8

SELECT bookname, publisher
FROM Book
WHERE bookname LIKE '축구의 역사';

2.7 example 9

ex9). 도서 이름에 '축구'가 포함된 출판사를 검색하세요

# example 9

SELECT bookname, publisher
FROM Book
WHERE bookname LIKE '%축구%';

2.8 example 10

ex10). 도서 이름의 왼쪽 두 번째 위치에 '구'라는 문자열을 갖는 도서를 검색하세요

# example 10

SELECT *
FROM Book
WHERE bookname LIKE '_구%';

2.9 NULL을 이용한 검색

  • IS NULL 키워드를 이용해 특정 속성의 값이 NULL값 인지를 비교
  • IS NOT NULL 키워드를 이용해 특정 속성의 값이 NULL 값이 아닌지를 비교
  • 검색 조건에서 NULL 값은 다른 값과 크기를 비교하면 결과는 모두 거짓으로 나옴
# exam 1. 전화번호가 아직 입력되지 않은 고객의 이름을 검색

SELECT name
FROM Customer
WHERE phone IS NULL;

>> 박세리
# exam 2. 전화번호가 입력된 고객의 이름을 검색

SELECT name
FROM Customer
WHERE phone IS NOT NULL;

>> 박지성, 김연아, 장미란, 추신수

2.10 example 11

ex11). 축구에 관한 도서 중 가격이 20,000원 이상인 도서를 검색하세요

# example 11

SELECT *
FROM Book
WHERE bookname LIKE '%축구%' AND price >= 20000;

2.11 example 12

ex12). 출판사가 '굿스포츠' 혹은 '대한미디어'인 도서를 검색하세요

# example 12

SELECT *
FROM Book
WHERE publisher='굿스포츠' OR publisher='대한미디어';

2.12 ORDER BY

  • 오름차순(기본): ASC / 내림차순: DESC
  • NULL값은 오름차순에서는 맨 마지막에, 내림차순에서는 맨 먼저 출력
SELECT [ALL | DISTINCT] 속성이름()
FROM 테이블이름()
ORDER BY 속성이름 [ASC | DESC]

2.13 example 13

ex13). 도서를 이름순으로 검색하세요

# example 13

SELECT *
FROM Book
ORDER BY bookname;

2.14 example 14

ex14). 도서를 가격순으로 검색하고, 가격이 같으면 이름순으로 검색하세요

# example 14

SELECT *
FROM Book
ORDER BY price, bookname;

2.15 example 15

ex15). 도서를 가격순으로 검색해 내림차순으로, 가격이 같으면 출판사순으로 검색하세요

# example 15

SELECT *
FROM Book
ORDER BY price DESC, publisher ASC;

3. 집계 함수 📒

  • 특정 속상 값을 통계적으로 계산한 결과를 검색하기 위해 집계 함수를 이용
    - 개수, 합계, 평균, 최댓값, 최솟값의 계산 기능을 제공

  • 집계 함수 사용 시 주의 사항
    - NULL인 속성 값은 제외하고 계산함
    - WHERE 절에서는 사용할 수 없고, SELECT 절이나 HAVING 절에서만 사용 가능

함수의미문법사용 가능한 속성의 타입
SUM속성 값의 합계SUM([ALL | DISTINCT]속성이름)숫자 데이터
AVG속성 값의 평균AVG([ALL | DISTINCT]속성이름)숫자 데이터
COUNT속성 값의 개수COUNT([ALL | DISTINCT]속성이름 | *)모든 데이터
MAX속성 값의 최댓값MAX([ALL | DISTINCT]속성이름)모든 데이터
MIN속성 값의 최솟값MIN([ALL | DISTINCT]속성이름)모든 데이터

3.1 example 16

ex16). 고객이 주문한 도서의 총 판매액을 구하시오

# example 16

SELECT SUM(saleprice)
FROM Orders;

AS 키워드 : 속성이름의 별칭을 지칭할 수 있음

  • AS 키워드는 생략 가능합니다.
# 위와 같은 문제입니다.

SELECT SUM(saleprice) AS '총매출'
FROM Orders;

3.2 example 17

ex17). 2번 고객이 주문한 도서의 총 판매액을 구하시오

# example 17

SELECT SUM(saleprice) AS '총매출'
FROM Orders;
WHERE custid = 2;

3.3 example 18

ex18). 고객이 주문한 도서의 총 판매액, 평균값, 최저가, 최고가를 구하시오

# example 18

SELECT SUM(saleprice) AS Total,
	   AVG(saleprice) AS Average,
       MAX(saleprice) AS Minimum,
       MIN(saleprice) AS Maximum
FROM Orders;

3.4 example 19

ex19). 마당서점의 도서 판매 건수를 구하시오

# example 19

SELECT COUNT(*)
FROM Orders;

3.5 example 20

ex20). 마당서점의 판매 된(서로 다른) 도서의 수를 구하시오.

# example 20

SELECT COUNT(DISTINCT bookid) AS '판매 도서 수'
FROM Orders;

4. 산술식을 이용한 검색 📗

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

4.1 example 21

ex21). 도서 가격에 따른 5% 적립금을 검색하시오

# example 21

SELECT bookname, price, price * 0.05 AS '적립금'
FROM Book;

5. GROUP BY / HAVING 📘

# 기본 형식

SELECT [ALL | DISTINCT] 속성이름()
FROM 테이블이름()
WHERE 검색조건()
GROUP BY 속성이름
HAVING 검색조건()
  • 특정 컬럼을 그룹화 하는 GROUP BY
  • 특정 컬럼을 그룹화한 결과에 조건을 거는 HAVING

WHERE랑 HAVING의 차이는 WHERE은 그룹화 하기 전이고, HAVING은 그룹화 후에 조건입니다.

5.1 example 22

ex22). 고객별로 주문한 도서의 총 수량과 총 판매액을 구하시오.

# example 22

SELECT custid, COUNT(*) AS 도서수량, SUM(saleprice) AS 총액
FROM Orders
GROUP BY custid;

5.2 example 23

ex23). 가격이 8,000원 이상인 도서를 구매한 고객에 대하여 고객별 주문 도서의 총 수량을 구하시오. 단, 두 권 이상 구매한 고객만 구한다.

# example 23

SELECT custid, COUNT(*) AS 도서수량
FROM Orders
WHERE saleprice >= 8000
GROUP BY custid
HAVING count(*) >= 2;
profile
삽질의 기록들🐥

0개의 댓글