-
데이터 조작어 - 검색데이터베이스/SQL 기초 2018. 1. 29. 20:29
SQL의 SELECT문은 데이터를 검색하는 데 사용되며 질의어 라고 한다.
SELECT 문은 검색한 결과를 테이블 형태로 출력한다.
SELECT문
SELECT,FROM
Q. 모든 도서의 이름과 가격을 검색하시오
SELECT bookname, price
FROM Book;
SELECT 절에서의 * 는 모든 열을 나타낸다.
SQL 문은 관계대수와 달리 기본적으로 중복을 제거하지 않는다. 따라서 결과에 같은 값이 두개 이상 나올 수 있다.
중복을 제거하고 싶다면 DISTINCT라는 키워드를 사용한다.
SELECT DISTINCT publisher
FROM Book;
WHERE
WHERE 절은 조건에 맞는 검색을 할 때 사용된다.
조건으로 사용할 수 있는 술어
술어
연산자
예
비교
=,<>,<,<=,>,>=
price < 20000
범위
BETWEEN
price BETWEEN 10000 AND 20000
집합
IN, NOT IN
price IN (10000,20000,30000)
패턴
LIKE
bookname LIKE '축구의 역사'
NULL
IS NULL, IS NOT NULL
price IS NOT NULL
복합 조건
AND, OR, NOT
(price < 20000) AND (bookname LIKE '축구의 역사')
비교
단순 비교는 =,<>,<,<=,>,>=등을 사용한다.
Q. 가격이 20000원 미만인 도서를 검색하시오
SELECT *
FROM Book
WHERE price < 20000;
범위
WHERE 절에서 BETWEEN 연산자를 사용하면 값의 범위를 지정할 수 있다.
Q. 가격이 10000원 이상 20000원 이하인 도서를 검색하시오
SELECT *
FROM Book
WHERE price BETWEEN 10000 AND 20000
( price>=10000 AND price<=20000;)
집합
IN 연산자는 집합의 원소인지 판단하는 연산자이다.
Q. 출판사가 '굿스포츠' 혹은 '대한미디어'인 도서를 검색하시오
SELECT *
FROM Book
WHERE publisher IN ('굿스포츠','대한미디어');
(publisher='굿스포츠' OR publisher='대한미디어')
패턴
문자열의 패턴을 비교 할 때는 LIKE 연산자를 사용함
와일드 문자
와일드 문자
의미
사용예
+
문자열을 연결
'골프' + '바이블' : '골프 바이블'
%
0개 이상의 문자열과 일치
'%축구%' : 축구를 포함하는 문자열
[ ]
1개의 문자와 일치
'[0-5]'%' : 0-5 사이 숫자로 시작하는 문자열
[^]
1개의 문자와 불일치
'[^0-5]'%' : 0-5 사이 숫자로 시작하지 않는 문자열
_
특정 위치의 1개 문자와 일치
'_구%' : 두 번째 위치에 '구'가 들어가는 문자열
Q. '축구의 역사'를 출간한 출판사를 검색하시오
SELECT bookname, publisher
FROM Book
WHERE bookname LIKE '축구의 역사';
복합 조건
WHERE 절에 논리 연산자 AND, OR, NOT을 사용하면 복합 조건을 명시할 수 있다.
Q. 축구에 관한 도서 중 가격이 20000원 이상인 도서를 검색하시오
SELECT *
FROM Book
WHERE bookname LIKE '%축구%' AND price >= 20000;
ORDER BY
SQL 문의 실행 결과를 특정 순서대로 출력하고 싶을 때 ORDER BY 절을 사용한다.
정렬의 기본값은 오름차순이다. 내림차순으로 정렬하려면 열 이름 다음에 DESC 키워드를 사용하면 된다.
Q. 도서를 이름순으로 검색하시오
SELECT *
FROM Book
ORDER BY bookname;
집계 함수와 GROUP BY
집계 함수
테이블의 각 열에 대해 계산을 하는 함수이다.
질의의 결과는 한 개의 속성, 한 개의 투플로 구성된 테이블이다.
의미 있는 열 이름을 출력하고 싶으면 AS 키워드를 사용하여 별칭을 설정할 수 있다.
집계 함수는 여러 개를 혼합하여 쓸 수 있다.
집계 함수의 종류
집계 함수
문법
사용 예
SUM
SUM ( [ALL | DISTINCT] 속성이름)
SUM(price)
AVG
AVG ( [ALL | DISTINCT] 속성이름)
AVG(price)
COUNT
COUNT ( { [ [ ALL | DISTINCT] 속성이름] | * } )
COUNT(*)
MAX
MAX ( [ALL | DISTINCT] 속성이름)
MAX(price)
MIN
MIN ( [ALL | DISTINCT] 속성이름)
MIN(price)
Q. 고객이 주문한 도서의 총 판매액을 구하시오
SELECT SUM(saleprice) AS 총매출
FROM Orders;
WHERE custid=2;
GROUP BY
GROUP BY 절을 사용하면 속성 값이 같은 값끼리 그룹을 만들 수 있다.
Q. 고객별로 주문한 도서의 총 수량과 총 판매액을 구하시오
SELECT custid COUNT(*) AS 도서수량, SUM(saleprice) AS 총액
FROM Orders
GROUP BY custid;
HAVING
HAVING 절은 GROUP BY 절의 결과로 나타내는 그룹을 제한하는 역할을 한다.
Q. 가격이 8000원 이상인 도서를 구매한 고객에 대하여 고객별 주문 도서의 총 수량을 구하시오.
단, 두 권 이상 구매한 고객만 구하시오
SELECT custid, COUNT(*) AS 도서수량
FROM Orders
WHERE saleprice >= 8000
GROUP BY custid
HAVING COUNT(*) >= 2;
GROUP BY와 HAVING 절의 문법과 주의 사항
문법
주의사항
GROUP BY
GROUP BY로 투플을 그룹으로 묶은 후 SELECT 절에는 GROUP BY에서 사용한 속성과 집계 함수만 나올 수 있다.
HAVING
WHERE 절과 HAVING 절이 같이 포함된 SQL 문은 검색 조건이 모호해질 수 있다.
HAVING 절은 반드시 GROUP BY 절과 같이 작성해야 하며 WHERE 절보다 뒤에 나와야 한다.
검색조건에는 집계 함수가 와야 한다.두 개 이상 테이블에서의 SQL 질의
SQL에서 여러 개의 테이블을 이용하여 질의하는 방법은 JOIN과 부속질의 두 가지가 있다.
조인
조인은 한 테이블의 행을 다른 테이블의 행에 연결하여 두 개 이상의 테이블을 결합하는 연산이다.
여러 개의 테이블을 연결하여 하나의 테이블을 만드는 과정을 테이블 조인이라고 한다.
동등 조건에 의해 테이블을 조인하는 것은 동등조인 이라고 한다.
Q. 고객의 이름과 고객이 주문한 도서의 이름을 구하시오
SELECT Customer.name, book.bookname
FROM Customer, Orders, Book
WHERE Customer.custid=Order.custid AND Orders.bookid=Book.bookid;
셀프 조인
하나의 테이블을 대상으로 조인하는 것
테이블을 중복으로 조인하게 되면 조인에 참여하는 속성명이 같아지기 때문에 별칭을 사용한다.
부속 질의
SELECT 문의 WHERE 절에 또 다른 테이블 결과를 이용하기 위해 다시 SELECT문을 괄호로 묶는 것
Q. 대한미디어에서 출판한 도서를 구매한 고객의 이름을 보이시오
SELECT name
FROM Customer
WHERE custid IN (
SELECT custid
FROM Orders
WHERE bookid IN (
SELECT bookid
FROM Book
WHERE publisher = '대한미디어'
)
);
집합 연산
SQL 문의 결과는 테이블로 나타난다. 테이블은 투플의 집합이므로 테이블간의 집합 연산이 가능하다.
Q. 도서를 주문하지 않은 고객의 이름을 보이시오
SELECT name
FROM Customer
MINUS
SELECT name
FROM Customer
WHERE custid IN (
SELECT custid
FROM Orders
);
집합 연산의 종류
UNION (합집합)
MINUS (차집합)
INTERSECT (교집합)
EXISTS
EXISTS : 행중에 하나라도 조건에 만족할 때 참
NOT EXISTS : 모든 행이 조건에 만족하지 않을 때만 참
Q. 주문이 있는 고객의 이름과 주소를 보이시오
SELECT name, address
FROM Customer cs
WHERE EXIST(
SELECT *
FROM Orders od
WHERE cs.custid=od.custid
);
'데이터베이스 > SQL 기초' 카테고리의 다른 글
데이터 조작어 - 삽입, 수정, 삭제 (0) 2018.01.29 데이터 정의어 (0) 2018.01.29 SQL 개요 (0) 2018.01.29 댓글