-
기본 검색
- 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 - 중복 허용)
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 절)
-
*
(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)
- 위 아래의 쿼리는 동일한 결과를 반환한다.
- 테이블의 컬럼이 적은 경우에는 일일이 나열해도 되지만, 많아지면
*
를 사용하는 것이 더 편하다.
- 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)
-
출력되는 필드(속성)의 이름을 바꾸어서 출력하는 방법으로 Alias를 사용할 수 있다.
-
AS 키워드를 통해 속성이름을 바꾸어 출력할 수 있다.
- AS 키워드는 생략이 가능하지만, 가독성을 위해 쓰는 것을 추천
-
적용 예시
- 제품 테이블에서 제품명과 단가 검색, 단, 단가를 기존단가로 변경
MariaDB [판매]> SELECT 제품명, 단가 AS 기존단가 -> FROM 제품; +------------+----------+ | 제품명 | 기존단가 | +------------+----------+ | 그냥만두 | 4950 | | 매운쫄면 | 6050 | | 쿵떡파이 | 2860 | | 맛난초콜릿 | 2750 | | 얼큰라면 | 1320 | | 통통우동 | 1705 | | 달콤비스킷 | 1650 | +------------+----------+ 7 rows in set (0.000 sec)
-
SELECT 키워드와 함께 산술식을 사용 가능하다.
-
속성 산술연산자('+', '-', '*', '/' ) 상수와 같이 사용 가능(Ex. 단가 * 1.1)
-
속성 값이 실제 변경되는 것이 아니고, 결과 테이블에서만 계산된 결과값이 출력된다.
-
새 별명에 공백이 있는 경우, 작은 따옴표 OR 큰 따옴표로 묶어줘야한다.(실험 결과 backtick도 가능)
- TABLE을 만들 때는 메모리 공간과 관련된 문제이므로 backtick을 사용해야하지만,
- 결과 출력에는 단순 출력에 관한 문제이므로 작은(큰)따옴표 사용 가능
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)
-- 공백 단어를 묶지 않는 경우
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)
WHERE
를 통해 조건을 만족하는 데이터만 검색할 수 있다.WHERE
키워드와 함께 비교, 논리 연산자 등을 이용한 검색 조건을 제시한다.- 숫자, 문자, 날짜 값 등을 비교 가능하다.
- 조건에서 문자나 날짜값은 작은따옴표로 묶어서 표현한다.
MariaDB [판매]> SELECT 제품명, 재고량, 단가
-> FROM 제품
-> WHERE 제조업체 = '한빛제과';
+------------+--------+------+
| 제품명 | 재고량 | 단가 |
+------------+--------+------+
| 쿵떡파이 | 3000 | 2860 |
| 맛난초콜릿 | 1250 | 2750 |
| 달콤비스킷 | 1650 | 1650 |
+------------+--------+------+
3 rows in set (0.001 sec)
- FROM -> WHERE -> SELECT 순으로 실행된다.
-
두 가지 조건 모두 충족하거나(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,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)
- 단가의 경우 숫자로 구성되어 있고, 연속적인 값을 가지고 있어서
- 문자열의 내용을 검색하기 위해서
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) '__한%'
- 세번재 글자가 '한'인 문자열
MariaDB [판매]> SELECT 고객이름, 나이, 등급, 적립금
-> FROM 고객
-> WHERE 고객이름 LIKE '김%';
+----------+------+--------+--------+
| 고객이름 | 나이 | 등급 | 적립금 |
+----------+------+--------+--------+
| 김선우 | 25 | vip | 2500 |
| 김용욱 | 22 | silver | 0 |
+----------+------+--------+--------+
2 rows in set (0.000 sec)
MariaDB [판매]> SELECT 고객아이디, 고객이름, 등급
-> FROM 고객
-> WHERE 고객아이디 LIKE '_____';
+------------+----------+--------+
| 고객아이디 | 고객이름 | 등급 |
+------------+----------+--------+
| apple | 정소화 | gold |
| melon | 성원용 | gold |
| peach | 오형준 | silver |
+------------+----------+--------+
3 rows in set (0.000 sec)
-
검색 조건에서 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
의 결과인 오형준을 제외한 모든 사람의 이름이 반환