ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데이터 조작어 - 검색
    데이터베이스/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

    댓글