Skip to content

Latest commit

 

History

History
555 lines (424 loc) · 18.5 KB

2021-01-15_SELECT.md

File metadata and controls

555 lines (424 loc) · 18.5 KB

SQL을 이용한 데이터 조작

- 데이터 검색

1. SELECT

  • 기본 검색

    • SELECT 키워드와 함께 검색하고 싶은 속성의 이름을 나열
    • FROM 키워드와 함께 검색하고 싶은 속성이 있는 테이블의 이름을 나열
    • 검색 결과는 테이블 형태로 반환된다.
  • 기본 구문(가장 많이 사용하는 형태로 요약한 구조)

    SELECT [ALL | DISTINCT] select_expr
    	FROM table_references
    	[WHERE where_condition]
      [GROUP BY {col_name | expr | position}]
    	[HAVING where_condition]
    	[ORDER BY {col_name | expr | position}];
    • [ALL | DISTNCT] : 중복의 허용 여부 결정(Default : ALL - 중복 허용)

- 적용 예제

1) SELECT 1

Query : 고객 테이블에서 고객 아이디, 이름, 등급을 검색
MariaDB [판매]> SELECT 고객아이디, 고객이름, 등급
    -> FROM 고객 ;
+------------+----------+--------+
| 고객아이디 | 고객이름 | 등급   |
+------------+----------+--------+
| apple      | 정소화   | gold   |
| banana     | 김선우   | vip    |
| carrot     | 고명석   | gold   |
| melon      | 성원용   | gold   |
| orange     | 김용욱   | silver |
| peach      | 오형준   | silver |
| pear       | 채광주   | silver |
| strawberry | 최유경   | vip    |
| tomato     | 정은심   | gold   |
+------------+----------+--------+
9 rows in set (0.002 sec)
  • 실행 순서

    • 테이블을 먼저 확인(FROM)하고, 필요한 필드를 선택함(SELECT 절)

2) SELECT 2

Query : 고객 테이블에 존재하는 모든 속성 검색
  • *(asterisk)는 모든 column을 의미함.

    -- 모든 열을 일일이 다 나열해줘도 됨
    MariaDB [판매]> SELECT 고객아이디, 고객이름, 나이, 등급, 직업, 적립금
        -> FROM 고객 ;
    +------------+----------+------+--------+--------+--------+
    | 고객아이디 | 고객이름 | 나이 | 등급   | 직업   | 적립금 |
    +------------+----------+------+--------+--------+--------+
    | apple      | 정소화   |   20 | gold   | 학생   |   1000 |
    | banana     | 김선우   |   25 | vip    | 간호사 |   2500 |
    | carrot     | 고명석   |   28 | gold   | 교사   |   4500 |
    | melon      | 성원용   |   35 | gold   | 회사원 |   5000 |
    | orange     | 김용욱   |   22 | silver | 학생   |      0 |
    | peach      | 오형준   | NULL | silver | 의사   |    300 |
    | pear       | 채광주   |   31 | silver | 회사원 |    500 |
    | strawberry | 최유경   |   30 | vip    | 공무원 |    100 |
    | tomato     | 정은심   |   36 | gold   | NULL   |    100 |
    +------------+----------+------+--------+--------+--------+
    9 rows in set (0.000 sec)
    
    -- asterisk를 사용하면 더욱 쉽게 접근 가능
    MariaDB [판매]> SELECT *
        -> FROM 고객 ;
    +------------+----------+------+--------+--------+--------+
    | 고객아이디 | 고객이름 | 나이 | 등급   | 직업   | 적립금 |
    +------------+----------+------+--------+--------+--------+
    | apple      | 정소화   |   20 | gold   | 학생   |   1000 |
    | banana     | 김선우   |   25 | vip    | 간호사 |   2500 |
    | carrot     | 고명석   |   28 | gold   | 교사   |   4500 |
    | melon      | 성원용   |   35 | gold   | 회사원 |   5000 |
    | orange     | 김용욱   |   22 | silver | 학생   |      0 |
    | peach      | 오형준   | NULL | silver | 의사   |    300 |
    | pear       | 채광주   |   31 | silver | 회사원 |    500 |
    | strawberry | 최유경   |   30 | vip    | 공무원 |    100 |
    | tomato     | 정은심   |   36 | gold   | NULL   |    100 |
    +------------+----------+------+--------+--------+--------+
    9 rows in set (0.000 sec)
    • 위 아래의 쿼리는 동일한 결과를 반환한다.
    • 테이블의 컬럼이 적은 경우에는 일일이 나열해도 되지만, 많아지면 *를 사용하는 것이 더 편하다.

3) ALL / DISTINCT

Query : 제품 테이블에서 제조업체 속성을 검색, 거래하는 제조업체를 확인하기.
  • ALL과 DISTINCT를 사용해 차이를 비교해보기
-- ALL(생략 가능)은 중복을 허용하여 결과를 반환함
MariaDB [판매]> SELECT ALL 제조업체
    -> FROM 제품;
+----------+
| 제조업체 |
+----------+
| 대한식품 |
| 민국푸드 |
| 한빛제과 |
| 한빛제과 |
| 대한식품 |
| 민국푸드 |
| 한빛제과 |
+----------+
7 rows in set (0.001 sec)

-- DISTINCT 옵션은 중복을 제거하고 결과를 반환한다.
MariaDB [판매]> SELECT DISTINCT 제조업체
    -> FROM 제품;
+----------+
| 제조업체 |
+----------+
| 대한식품 |
| 민국푸드 |
| 한빛제과 |
+----------+
3 rows in set (0.000 sec)

2. ALIAS

  • 출력되는 필드(속성)의 이름을 바꾸어서 출력하는 방법으로 Alias를 사용할 수 있다.

  • AS 키워드를 통해 속성이름을 바꾸어 출력할 수 있다.

    • AS 키워드는 생략이 가능하지만, 가독성을 위해 쓰는 것을 추천
  • 적용 예시

    • 제품 테이블에서 제품명과 단가 검색, 단, 단가를 기존단가로 변경
    MariaDB [판매]> SELECT 제품명, 단가 AS 기존단가
        -> FROM 제품;
    +------------+----------+
    | 제품명     | 기존단가 |
    +------------+----------+
    | 그냥만두   |     4950 |
    | 매운쫄면   |     6050 |
    | 쿵떡파이   |     2860 |
    | 맛난초콜릿 |     2750 |
    | 얼큰라면   |     1320 |
    | 통통우동   |     1705 |
    | 달콤비스킷 |     1650 |
    +------------+----------+
    7 rows in set (0.000 sec)

3. 산술식을 이용한 검색

  • SELECT 키워드와 함께 산술식을 사용 가능하다.

  • 속성 산술연산자('+', '-', '*', '/' ) 상수와 같이 사용 가능(Ex. 단가 * 1.1)

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

  • 새 별명에 공백이 있는 경우, 작은 따옴표 OR 큰 따옴표로 묶어줘야한다.(실험 결과 backtick도 가능)

    • TABLE을 만들 때는 메모리 공간과 관련된 문제이므로 backtick을 사용해야하지만,
    • 결과 출력에는 단순 출력에 관한 문제이므로 작은(큰)따옴표 사용 가능

- 적용 예제

Query 1 : 제품 테이블에서 제품명과 단가 속성을 출력하되, 단가에 500원을 더해 '조정단가'라는 새 이름으로 출력
MariaDB [판매]> SELECT 제품명, 단가 AS 기존단가, 단가+500 AS 조정단가
    -> FROM 제품;
+------------+----------+----------+
| 제품명     | 기존단가 | 조정단가 |
+------------+----------+----------+
| 그냥만두   |     4950 |     5450 |
| 매운쫄면   |     6050 |     6550 |
| 쿵떡파이   |     2860 |     3360 |
| 맛난초콜릿 |     2750 |     3250 |
| 얼큰라면   |     1320 |     1820 |
| 통통우동   |     1705 |     2205 |
| 달콤비스킷 |     1650 |     2150 |
+------------+----------+----------+
7 rows in set (0.000 sec) 

Query 2 : 제품 테이블에서 제품명과 단가 속성을 출력하되, 단가에 500원을 더해 '조정 단가'라는 새 이름으로 출력(이름에 공백 포함)
-- 공백 단어를 묶지 않는 경우
MariaDB [판매]> SELECT 제품명, 단가 AS 기존단가, 단가+500 AS 조정 단가
    -> FROM 제품;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '단가
FROM 제품' at line 1
-- syntax 오류 발생

-- 공백 단어를 묶는 경우
MariaDB [판매]> SELECT 제품명, 단가 AS 기존단가, 단가+500 AS '조정 단가'
    -> FROM 제품;
+------------+----------+-----------+
| 제품명     | 기존단가 | 조정 단가 |
+------------+----------+-----------+
| 그냥만두   |     4950 |      5450 |
| 매운쫄면   |     6050 |      6550 |
| 쿵떡파이   |     2860 |      3360 |
| 맛난초콜릿 |     2750 |      3250 |
| 얼큰라면   |     1320 |      1820 |
| 통통우동   |     1705 |      2205 |
| 달콤비스킷 |     1650 |      2150 |
+------------+----------+-----------+
7 rows in set (0.000 sec)

4. WHERE

  • WHERE를 통해 조건을 만족하는 데이터만 검색할 수 있다.
  • WHERE 키워드와 함께 비교, 논리 연산자 등을 이용한 검색 조건을 제시한다.
    • 숫자, 문자, 날짜 값 등을 비교 가능하다.
    • 조건에서 문자나 날짜값은 작은따옴표로 묶어서 표현한다.

- 적용 예제

Query 1 : 제품 테이블에서 한빛제과가 제조한 제품명, 재고량 단가를 확인
MariaDB [판매]> SELECT 제품명, 재고량, 단가
    -> FROM 제품
    -> WHERE 제조업체 = '한빛제과';
+------------+--------+------+
| 제품명     | 재고량 | 단가 |
+------------+--------+------+
| 쿵떡파이   |   3000 | 2860 |
| 맛난초콜릿 |   1250 | 2750 |
| 달콤비스킷 |   1650 | 1650 |
+------------+--------+------+
3 rows in set (0.001 sec)
  • FROM -> WHERE -> SELECT 순으로 실행된다.

- 관계 연산자의 사용

1) AND / OR
  • 두 가지 조건 모두 충족하거나(AND), 둘 중 하나만 충족(OR)하는 결과를 반환한다.

  • 적용 예제

    • 검색 전 전체 테이블 확인
    -- 전체 테이블 확인
    MariaDB [판매]> SELECT * FROM 주문;
    +----------+----------+----------+------+-----------------+------------+
    | 주문번호 | 주문고객 | 주문제품 | 수량 | 배송지          | 주문일자   |
    +----------+----------+----------+------+-----------------+------------+
    | o01      | apple    | p03      |   10 | 서울시 마포구   | 2019-01-01 |
    | o02      | melon    | p01      |    5 | 인천시 계양구   | 2019-01-10 |
    | o03      | banana   | p06      |   45 | 경기도 부천시   | 2019-01-11 |
    | o04      | carrot   | p02      |    8 | 부산시 금정구   | 2019-02-01 |
    | o05      | melon    | p06      |   36 | 경기도 용인시   | 2019-02-20 |
    | o06      | banana   | p01      |   19 | 충청북도 보은군 | 2019-03-02 |
    | o07      | apple    | p03      |   22 | 서울시 영등포구 | 2019-03-15 |
    | o08      | pear     | p02      |   50 | 강원도 춘천시   | 2019-04-10 |
    | o09      | banana   | p04      |   15 | 전라남도 목포시 | 2019-04-11 |
    | o10      | carrot   | p03      |   20 | 경기도 안양시   | 2019-05-22 |
    +----------+----------+----------+------+-----------------+------------+
    10 rows in set (0.000 sec)
    • AND
      • 주문 테이블에서 apple 고객이 15개 이상 주문한 주문 제품, 수량, 주문일자를 확인하라
    -- AND 적용 예제 (두 조건 모두 참인 결과를 반환)
    MariaDB [판매]> SELECT 주문제품, 수량, 주문일자
        -> FROM 주문
        -> WHERE 주문고객 = 'apple' AND 수량 >= 15;
    +----------+------+------------+
    | 주문제품 | 수량 | 주문일자   |
    +----------+------+------------+
    | p03      |   22 | 2019-03-15 |
    +----------+------+------------+
    1 row in set (0.000 sec)
    • OR
      • 주문 테이블에서 apple 고객이 주문했거나, 15개 이상 주문된 제품의 주문제품, 수량, 주문고객, 주문일자를 확인하라
    -- OR 적용 예제
    MariaDB [판매]> SELECT 주문제품, 수량, 주문고객, 주문일자
        -> FROM 주문
        -> WHERE 주문고객 = 'apple' OR 수량 >= 15;
    +----------+------+----------+------------+
    | 주문제품 | 수량 | 주문고객 | 주문일자   |
    +----------+------+----------+------------+
    | p03      |   10 | apple    | 2019-01-01 |
    | p06      |   45 | banana   | 2019-01-11 |
    | p06      |   36 | melon    | 2019-02-20 |
    | p01      |   19 | banana   | 2019-03-02 |
    | p03      |   22 | apple    | 2019-03-15 |
    | p02      |   50 | pear     | 2019-04-10 |
    | p04      |   15 | banana   | 2019-04-11 |
    | p03      |   20 | carrot   | 2019-05-22 |
    +----------+------+----------+------------+
    8 rows in set (0.000 sec)
2) BETWEEN ~ AND / IN
  • 단가가 2,000원 이상이면서 3,000원 이하인 제품의 제품명, 단가, 제조업체를 확인하고자 하는 경우, AND 연산자를 활용하면 아래와 같이 작성할 수 있다.

    -- AND 연산자를 활용
    MariaDB [판매]> SELECT 제품명, 단가, 제조업체
        -> FROM 제품
        -> WHERE 단가 >= 2000 and 단가 <= 3000;
    +------------+------+----------+
    | 제품명     | 단가 | 제조업체 |
    +------------+------+----------+
    | 쿵떡파이   | 2600 | 한빛제과 |
    | 맛난초콜릿 | 2500 | 한빛제과 |
    +------------+------+----------+
    2 rows in set (0.000 sec)
  • 동일한 방식으로 BETWEEN ~ AND를 사용할 수 있다.

    -- BETWEEN 연산자를 활용
    MariaDB [판매]> SELECT 제품명, 단가, 제조업체
        -> FROM 제품
        -> WHERE 단가 BETWEEN 2000 and 3000;
    +------------+------+----------+
    | 제품명     | 단가 | 제조업체 |
    +------------+------+----------+
    | 쿵떡파이   | 2600 | 한빛제과 |
    | 맛난초콜릿 | 2500 | 한빛제과 |
    +------------+------+----------
    • 단가의 경우 숫자로 구성되어 있고, 연속적인 값을 가지고 있어서 BETWEEN ~ AND를 사용했지만, 문자열과 같이 연속된 값이 아닌 경우에는 사용할 수 없다.
    • 연속적인 값이 아닌 이산적인 값을 위해 IN( )을 사용할 수 있다.
    • 제조업체가 한빛제과, 대한식품인 제품번호와 제품명 확인
    -- OR를 사용한 결과
    MariaDB [판매]> SELECT 제품번호, 제품명, 제조업체
        -> FROM 제품
        -> WHERE 제조업체 = '한빛제과' OR
        -> 제조업체 = '대한식품';
    +----------+------------+----------+
    | 제품번호 | 제품명     | 제조업체 |
    +----------+------------+----------+
    | p01      | 그냥만두   | 대한식품 |
    | p03      | 쿵떡파이   | 한빛제과 |
    | p04      | 맛난초콜릿 | 한빛제과 |
    | p05      | 얼큰라면   | 대한식품 |
    | p07      | 달콤비스킷 | 한빛제과 |
    +----------+------------+----------+
    5 rows in set (0.000 sec)
    
    -- IN()을 사용한 결과
    MariaDB [판매]> SELECT 제품번호, 제품명, 제조업체
        -> FROM 제품
        -> WHERE 제조업체 IN ('한빛제과', '대한식품');
    +----------+------------+----------+
    | 제품번호 | 제품명     | 제조업체 |
    +----------+------------+----------+
    | p01      | 그냥만두   | 대한식품 |
    | p03      | 쿵떡파이   | 한빛제과 |
    | p04      | 맛난초콜릿 | 한빛제과 |
    | p05      | 얼큰라면   | 대한식품 |
    | p07      | 달콤비스킷 | 한빛제과 |
    +----------+------------+----------+
    5 rows in set (0.000 sec)
    
3) LIKE
  • 문자열의 내용을 검색하기 위해서 LIKE연산자를 사용 가능함.
  • % : 0개 이상의 문자(문자의 내용과 개수는 상관없음)
  • _ : 1개의 문자
  • Example 1) '데이터%'
    • 데이터로 시작하는 문자열(데이터로 시작하면 길이는 상관없음)
    • 김데이터(X), 데이터(O), 데이터 사무소(O)
  • Example 2) '%데이터'
    • 데이터로 끝나는 문자열
    • 김데이터(O), 데이터(O), 데이터사무소(X)
  • Example 3) '%데이터%'
    • 데이터가 포함된 문자열
    • 김데이터(O), 데이터(O), 데이터사무소(O), 빅데이터사무소(O)
  • Example 4) '데이터___'
    • 데이터로 시작하는 6자 길이의 문자열
    • 데이터사무소(O), 강남 데이터(X)
  • Example 5) '__한%'
    • 세번재 글자가 '한'인 문자열
- 적용 예제
1) 고객 테이블에서 성이 김씨인 고객이름, 나이, 등급, 적립금을 확인
MariaDB [판매]> SELECT 고객이름, 나이, 등급, 적립금
    -> FROM 고객
    -> WHERE 고객이름 LIKE '김%';
+----------+------+--------+--------+
| 고객이름 | 나이 | 등급   | 적립금 |
+----------+------+--------+--------+
| 김선우   |   25 | vip    |   2500 |
| 김용욱   |   22 | silver |      0 |
+----------+------+--------+--------+
2 rows in set (0.000 sec)
2) 고객 테이블에서 고객 아이디가 5자인 고객의 고객 아이디, 고객이름, 등급을 검색
MariaDB [판매]> SELECT 고객아이디, 고객이름, 등급
    -> FROM 고객
    -> WHERE 고객아이디 LIKE '_____';
+------------+----------+--------+
| 고객아이디 | 고객이름 | 등급   |
+------------+----------+--------+
| apple      | 정소화   | gold   |
| melon      | 성원용   | gold   |
| peach      | 오형준   | silver |
+------------+----------+--------+
3 rows in set (0.000 sec)
4) NULL
  • 검색 조건에서 NULL 값은 다른 값과 크기를 비교하면 결과가 모두 거짓이 된다. 따라서 아래 키워드를 사용함.

  • IS NULL : 값이 NULL인지 확인

  • IS NOT NULL : 값이 NULL이 아닌지 확인

  • 적용 예시

    • 검색 전 전체 테이블 확인
    -- 전체 테이블 확인
    MariaDB [판매]> SELECT * FROM 고객;
    +------------+----------+------+--------+--------+--------+
    | 고객아이디 | 고객이름 | 나이 | 등급   | 직업   | 적립금 |
    +------------+----------+------+--------+--------+--------+
    | apple      | 정소화   |   20 | gold   | 학생   |   1000 |
    | banana     | 김선우   |   25 | vip    | 간호사 |   2500 |
    | carrot     | 고명석   |   28 | gold   | 교사   |   4500 |
    | melon      | 성원용   |   35 | gold   | 회사원 |   5000 |
    | orange     | 김용욱   |   22 | silver | 학생   |      0 |
    | peach      | 오형준   | NULL | silver | 의사   |    300 |
    | pear       | 채광주   |   31 | silver | 회사원 |    500 |
    +------------+----------+------+--------+--------+--------+
    7 rows in set (0.000 sec)
    • 고객테이블에서 나이가 아직 입력되지 않은 고객의 고객 이름을 검색
    MariaDB [판매]> SELECT 고객이름
        -> FROM 고객
        -> WHERE 나이 IS NULL ;
    +----------+
    | 고객이름 |
    +----------+
    | 오형준   |
    +----------+
    1 row in set (0.000 sec)
    • 이미 나이가 입력된 고객의 고객이름을 검색
    MariaDB [판매]> SELECT 고객이름
        -> FROM 고객
        -> WHERE 나이 IS NOT NULL;
    +----------+
    | 고객이름 |
    +----------+
    | 정소화   |
    | 김선우   |
    | 고명석   |
    | 성원용   |
    | 김용욱   |
    | 채광주   |
    +----------+
    6 rows in set (0.000 sec)
    • IS NULL의 결과인 오형준을 제외한 모든 사람의 이름이 반환