> For the complete documentation index, see [llms.txt](https://docs.sysout.co.kr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.sysout.co.kr/database/oracle/structure-query-language/user-query/manage-data/read-data.md).

# 데이터 조회

## 데이터 조회

이 문서에서는 데이터를 조회하는 기본적인 방법에 대해서 살펴본다.

### 명령 형식

테이블 1개의 데이터를 조회하기 위한 구문의 기본 형식은 다음과 같다.

```sql
select 항목 from 테이블 [where 조건] [group 설정] [정렬 조건];
```

`[ ]`로 감싸진 부분은 생략이 가능하며, 이를 사용하여 기본적인 조회를 수행할 수 있다.

다음과 같은 테이블이 있다고 가정하고 데이터를 조회하는 구문을 작성해보도록 한니다.

### 상품 테이블(product) <a href="#table" id="table"></a>

생성 구문은 다음과 같다.

```sql
create table product(
no number primary key,
name varchar2(30) not null,
type varchar2(15) check(type in ('과자','아이스크림','주류','사탕','초콜릿')),
price number,
made date,
expire date
);

INSERT INTO product VALUES (1, '스크류바', '아이스크림', 1200, TO_DATE('2022-05-01 10:23:45', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2022-10-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (2, '마이쮸', '사탕', 900, TO_DATE('2022-01-01 08:15:30', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2023-01-01 09:30:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (3, '초코파이', '과자', 3000, TO_DATE('2022-01-01 14:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2023-01-01 16:45:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (4, '맛동산', '과자', 2200, TO_DATE('2022-02-01 09:30:15', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2022-10-20 10:45:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (5, '참이슬', '주류', 1000, TO_DATE('2022-01-05 11:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2022-04-05 13:30:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (6, '처음처럼', '주류', 1000, TO_DATE('2022-03-15 10:15:45', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2022-08-15 12:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (7, '바나나킥', '과자', 1500, TO_DATE('2022-05-03 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2022-06-03 09:45:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (8, '빠삐코', '아이스크림', 1000, TO_DATE('2023-12-01 10:23:45', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2024-06-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (9, '멘토스', '사탕', 1200, TO_DATE('2023-03-20 08:15:30', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2024-12-31 09:30:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (10, '오레오', '과자', 2100, TO_DATE('2023-06-01 14:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2024-06-01 16:45:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (11, '포카칩', '과자', 1500, TO_DATE('2022-05-05 09:30:15', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2023-05-05 10:45:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (12, '칸쵸', '과자', 1000, TO_DATE('2022-06-10 11:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2023-06-10 13:30:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (13, '허니버터칩', '과자', 1700, TO_DATE('2022-07-01 10:15:45', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2023-07-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (14, '새우깡', '과자', 1200, TO_DATE('2022-08-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2023-08-01 09:45:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (15, '칙촉', '과자', 2500, TO_DATE('2022-09-01 10:23:45', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2023-09-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (16, '가나초콜릿', '초콜릿', 2000, TO_DATE('2022-10-01 08:15:30', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2023-10-01 09:30:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (17, '빼빼로', '과자', 1500, TO_DATE('2022-11-11 14:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2023-11-11 16:45:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (18, '파이리', '사탕', 1000, TO_DATE('2022-12-31 09:30:15', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2023-12-01 10:45:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (19, '초코송이', '과자', 1200, TO_DATE('2023-01-01 11:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2024-01-01 13:30:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (20, '빈츠', '과자', 1300, TO_DATE('2023-02-01 10:15:45', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2024-02-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (21, '죠리퐁', '과자', 1400, TO_DATE('2023-03-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2024-03-01 09:45:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (22, '오징어집', '과자', 1500, TO_DATE('2023-04-01 10:23:45', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2024-04-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (23, '누네띠네', '과자', 1200, TO_DATE('2023-05-01 08:15:30', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2024-05-01 09:30:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (24, '포테토칩', '과자', 1600, TO_DATE('2023-06-01 14:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2024-06-01 16:45:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (25, '새콤달콤', '사탕', 1000, TO_DATE('2023-07-01 09:30:15', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2024-07-01 10:45:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (26, '카라멜콘', '과자', 1100, TO_DATE('2023-08-01 11:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2024-08-01 13:30:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO product VALUES (27, '오징어땅콩', '과자', 1500, TO_DATE('2023-09-01 10:15:45', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2024-09-01 12:00:00',


commit;
```

#### 항목 관련

등록된 상품의 이름을 조회하는 SQL

```sql
select name from product;
```

등록된 상품의 이름과 가격을 조회하는 SQL

```sql
select name, price from product;
```

등록된 상품의 모든 정보를 조회하는 SQL(\*는 모든 항목이라는 의미)

```sql
select no, name, type, price, made, expire from product;
--또는
select * from product;
```

#### 조건 관련

조건은 `where 조건식` 형태로 추가하여 사용한다.

**숫자 조건**

가격이 2000원 이상인 상품만 조회하는 SQL

```sql
select * from product where price >= 2000;
```

가격이 2000원 이상 3000원 이하인 상품만 조회하는 SQL(`between`은 구간을 지정할 때 사용할 수 있다)

```sql
select * from product where price >= 2000 and price <= 3000;
-- 또는
select * from product where price between 2000 and 3000;
```

**문자열 조건**

이름이 `스크류바`인 상품 조회하는 SQL

```sql
select * from product where name='스크류바';
```

이름이 `참`으로 시작하는 상품 조회하는 SQL(like를 이용하면 유사 검색을 수행할 수 있으나 속도가 느린 편이다)

```sql
-- %는 글자가 더 있을 수 있다는 표시이다.
select * from product where name like '참%';
```

이름에 `이`가 포함된 상품을 조회하는 SQL

```sql
select * from product where name like '%이%';
-- 또는 
select * from product where instr(name, '이') > 0;
```

**날짜 조건**

제조년도가 2022년인 제품을 조회하는 SQL

* 문자열을 날짜로 바꾸기 위해서는 to\_date라는 명령이 필요
  * to\_date(문자열, 바꿀형식) : 연도(YYYY), 월(MM), 일(DD), 시간(HH24), 분(MI), 초(SS)
* extract는 날짜의 특정 부분을 추출할 수 있도록 하는 명령
  * extract(추출항목 from 데이터) : 연도(YEAR), 월(MONTH), 일(DAY), 시간(HOUR), 분(MINUTE), 초(SECOND)

```sql
select * from product where made between to_date('20220101000000', 'YYYYMMDDHH24MISS') and to_date('20221231235959', 'YYYYMMDDHH24MISS');
-- 또는
select * from product where extract(year from made) = 2022;
```

날짜는 문자열이 아니기 때문에 문자열처럼 사용하면 위험하다.

제조일로부터의 유통기한이 6개월 이내인 제품을 조회하는 SQL

* 날짜간의 계산이 필요
* 날짜에서 +1은 1일 후를 의미

```sql
select * from product where expire - made <= 180;
```

상반기에 제조한 상품 조회하는 SQL

```sql
select * from product where extract(month from made) between 1 and 6;
```

2020년 1월 1일부터 현재까지 제조한 상품 조회하는 SQL

```sql
select * from product where made between to_date('20200101000000', 'YYYYMMDDHH24MISS') and sysdate;
```

#### 정렬 관련

정렬은 조건 등으로 추려진 데이터를 원하는 기준에 따라 나열하는 것을 말하며, 반드시 조건처럼 데이터 집합을 계산하는 명령보다 이후에 나와야 한다.

**형식**

```sql
select .... order by 항목 [asc]
-- 또는
select .... order by 항목 desc
```

**예시**

모든 상품을 가격순으로 정렬하는 SQL

```sql
select * from product order by price desc;
```

모든 상품을 제조일 최신순으로 정렬하는 SQL

```sql
select * from product order by made desc;
```

가격이 2000원 이상인 상품을 1차로 이름순, 2차로 제조일이 빠른 순으로 정렬하는 SQL

```sql
select * from product where price >= 2000 order by name asc, made asc;
-- 또는
select * from product where price >= 2000 order by name, made;
```
