편집 요약 없음 |
|||
(같은 사용자의 중간 판 21개는 보이지 않습니다) | |||
21번째 줄: | 21번째 줄: | ||
|| 정렬 명령어 (주로 속성값에 오름차순, 내림차순 속성을 지정) | || 정렬 명령어 (주로 속성값에 오름차순, 내림차순 속성을 지정) | ||
|} | |} | ||
=== | |||
=== | === SELECT 기본 예제 === | ||
=== | * <big>'''테스트용 테이블 생성 및 관련 데이터 입력 SQL '''</big> | ||
** employees : 사원 테이블 | |||
** sales : 판매 테이블 | |||
** customers : 고객 테이블 | |||
** orders : 주문 테이블 | |||
** students : 학생 테이블 | |||
---- | |||
* `employees` 사원 테이블 생성 | |||
::<source lang=sql> | |||
CREATE TABLE employees ( | |||
employee_id NUMBER PRIMARY KEY, | |||
department_id NUMBER, | |||
salary NUMBER, | |||
hire_date DATE | |||
); | |||
-- 샘플 데이터 입력 | |||
INSERT INTO employees VALUES (1, 10, 4800, TO_DATE('2006-03-15', 'YYYY-MM-DD')); | |||
INSERT INTO employees VALUES (2, 10, 5200, TO_DATE('2007-06-01', 'YYYY-MM-DD')); | |||
INSERT INTO employees VALUES (3, 20, 6000, TO_DATE('2005-08-20', 'YYYY-MM-DD')); | |||
INSERT INTO employees VALUES (4, 20, 5500, TO_DATE('2004-11-10', 'YYYY-MM-DD')); | |||
INSERT INTO employees VALUES (5, 30, 7000, TO_DATE('2006-12-25', 'YYYY-MM-DD')); | |||
commit; | |||
</source> | |||
* `sales` 판매 테이블 생성 | |||
::<source lang=sql> | |||
CREATE TABLE sales ( | |||
sale_id NUMBER PRIMARY KEY, | |||
sale_date DATE, | |||
product_category VARCHAR2(50), | |||
sale_amount NUMBER | |||
); | |||
INSERT INTO sales VALUES (1, TO_DATE('2023-01-15', 'YYYY-MM-DD'), '전자제품', 300000); | |||
INSERT INTO sales VALUES (2, TO_DATE('2023-02-10', 'YYYY-MM-DD'), '전자제품', 400000); | |||
INSERT INTO sales VALUES (3, TO_DATE('2023-04-05', 'YYYY-MM-DD'), '가전', 500000); | |||
INSERT INTO sales VALUES (4, TO_DATE('2023-07-20', 'YYYY-MM-DD'), '가전', 600000); | |||
INSERT INTO sales VALUES (5, TO_DATE('2023-10-03', 'YYYY-MM-DD'), '도서', 200000); | |||
INSERT INTO sales VALUES (6, TO_DATE('2023-10-15', 'YYYY-MM-DD'), '도서', 850000); | |||
commit; | |||
</source> | |||
* `students` 학생 테이블 생성 | |||
::<source lang=sql> | |||
CREATE TABLE students ( | |||
student_id NUMBER PRIMARY KEY, | |||
department VARCHAR2(100), | |||
score NUMBER | |||
); | |||
::<source lang=sql> | |||
INSERT INTO students VALUES (1, '컴퓨터공학과', 90); | |||
INSERT INTO students VALUES (2, '컴퓨터공학과', 85); | |||
INSERT INTO students VALUES (3, '전자공학과', 88); | |||
INSERT INTO students VALUES (4, '전자공학과', 82); | |||
INSERT INTO students VALUES (5, '심리학과', 78); -- 제외됨 (80 미만) | |||
INSERT INTO students VALUES (6, '경영학과', 95); | |||
INSERT INTO students VALUES (7, '경영학과', 90); | |||
commit; | |||
</source> | |||
* `customers` 고객, `orders` 주문 테이블 생성 | |||
::<source lang=sql> | |||
CREATE TABLE customers ( | |||
customer_id NUMBER PRIMARY KEY, | |||
customer_name VARCHAR2(100) | |||
); | |||
CREATE TABLE orders ( | |||
order_id NUMBER PRIMARY KEY, | |||
customer_id NUMBER, | |||
order_amount NUMBER, | |||
order_date DATE, | |||
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) | |||
); | |||
-- 고객 | |||
INSERT INTO customers VALUES (1, '홍길동'); | |||
INSERT INTO customers VALUES (2, '김영희'); | |||
INSERT INTO customers VALUES (3, '이철수'); | |||
-- 주문 | |||
INSERT INTO orders VALUES (101, 1, 2000000, TO_DATE('2022-02-15', 'YYYY-MM-DD')); | |||
INSERT INTO orders VALUES (102, 1, 3500000, TO_DATE('2022-06-10', 'YYYY-MM-DD')); | |||
INSERT INTO orders VALUES (103, 2, 1500000, TO_DATE('2022-07-20', 'YYYY-MM-DD')); | |||
INSERT INTO orders VALUES (104, 2, 2000000, TO_DATE('2022-09-12', 'YYYY-MM-DD')); | |||
INSERT INTO orders VALUES (105, 3, 500000, TO_DATE('2022-03-01', 'YYYY-MM-DD')); | |||
commit; | |||
</source> | |||
---- | |||
==== 예제 1. 부서/사원 조회 ==== | |||
# 부서별 평균 급여가 5000 이상인 부서 중 | |||
# 2005년 이후 입사한 사원만 조회하여 | |||
# 평균 급여가 높은 순으로 정렬 | |||
:<source lang=sql> | |||
SELECT department_id AS 부서번호 | |||
, COUNT(*) AS 사원수 | |||
, ROUND(AVG(salary), 0) AS 평균급여 | |||
, MAX(hire_date) AS 최근입사일 | |||
FROM employees | |||
-- 2005년 이후 입사한 사원만 조회 | |||
WHERE hire_date > TO_DATE('2005-01-01', 'YYYY-MM-DD') | |||
-- 부서별 평균 급여가 5000 이상인 부서 | |||
GROUP BY department_id | |||
HAVING AVG(salary) >= 5000 | |||
-- 평균 급여가 높은 순으로 정렬 | |||
ORDER BY 평균급여 DESC; | |||
</source> | |||
==== 예제 2. 제품 판매 분석 ==== | |||
# 2023년 분기별, 카테고리별 판매액 집계 | |||
# 총 판매액이 100만원 이상인 그룹만 표시 | |||
# 분기와 카테고리 순으로 정렬 | |||
:<source lang=sql> | |||
SELECT TO_CHAR(sale_date, 'Q') AS 분기 | |||
, product_category AS 카테고리 | |||
, COUNT(*) AS 판매건수 | |||
, SUM(sale_amount) AS 총판매액 | |||
, AVG(sale_amount) AS 평균판매액 | |||
FROM sales | |||
-- 2023년 분기별, | |||
WHERE sale_date BETWEEN TO_DATE('2023-01-01', 'YYYY-MM-DD') AND TO_DATE('2023-12-31', 'YYYY-MM-DD') | |||
-- 판매액 별,카테고리별 그룹 | |||
GROUP BY TO_CHAR(sale_date, 'Q'), product_category | |||
-- 총 판매액이 100만원 이상 | |||
HAVING SUM(sale_amount) >= 1000000 | |||
ORDER BY 분기 ASC, 총판매액 DESC; | |||
</source> | |||
==== 예제 3. 학생 성적 조회 ==== | |||
# 각 학과별로 성적이 80점 이상인 학생들만 집계 | |||
# 학과 평균이 85점 이상인 그룹만 선택 | |||
# 평균 점수 순으로 정렬 | |||
:<source lang=sql> | |||
SELECT department AS 학과 | |||
, COUNT(*) AS 학생수 | |||
, ROUND(AVG(score), 1) AS 평균점수 | |||
, MAX(score) AS 최고점수 | |||
, MIN(score) AS 최저점수 | |||
FROM students | |||
-- 성적이 80점 이상인 | |||
WHERE score >= 80 | |||
-- 학과 평균이 85점 이상인 그룹만 | |||
GROUP BY department | |||
HAVING AVG(score) >= 85 | |||
-- 평균 점수 순으로 정렬 | |||
ORDER BY 평균점수 DESC; | |||
</source> | |||
==== 예제 4. 고객 구매 패턴 조회(ANSI SQL)==== | |||
# 연간 구매액 500만원 이상 | |||
# 2022년에 구매한 고객별 구매 통계 | |||
# 총 구매액 순으로 정렬 | |||
:<source lang=sql> | |||
SELECT c.customer_id AS 고객ID | |||
, c.customer_name AS 고객명 | |||
, COUNT(o.order_id) AS 주문횟수 | |||
, SUM(o.order_amount) AS 총구매액 | |||
, MAX(o.order_date) AS 최근구매일 | |||
FROM customers c | |||
JOIN orders o | |||
ON c.customer_id = o.customer_id | |||
-- 2022년에 연간 | |||
WHERE o.order_date BETWEEN TO_DATE('2022-01-01', 'YYYY-MM-DD') AND TO_DATE('2022-12-31', 'YYYY-MM-DD') | |||
-- 구매액이 500만원이상 구매한 고객아이디,고객명 그룹별 | |||
GROUP BY c.customer_id, c.customer_name | |||
HAVING SUM(o.order_amount) >= 5000000 | |||
-- 총 구매액 순으로 정렬 | |||
ORDER BY 총구매액 DESC; | |||
</source> | |||
[[category:oracle]] | [[category:oracle]] | ||
[[category: | [[category:select 구문]] | ||
2025년 6월 6일 (금) 15:03 기준 최신판
SELECT 기본 구문
명령어 | 설명 |
---|---|
SELECT | 테이블에 있는 속성을 지정하여 데이터를 조회하는 명령어 (주로 속성(컬럼)을 기술) |
FROM | 데이터가 있는 테이블이나 뷰를 지정하는 명령어 (주로 테이블, 뷰, 인라인뷰 등을 기술) |
WHERE | 데이터를 조회하는 조건을 지정하는 명령어 (주로 조건을 기술) |
GROUP BY | 특정 속성을 기준으로 그룹화하여 검색할 때 사용하는 명령어 (주로 SELECT 절에 사용된 속성을 그룹핑할 때 기술) |
HAVING | 그룹화된 속성에 조건을 지정하는 명령어 (주로 ~보다 크거나 작은 경우, 같은 경우를 지정) |
ORDER BY | 정렬 명령어 (주로 속성값에 오름차순, 내림차순 속성을 지정) |
SELECT 기본 예제
- 테스트용 테이블 생성 및 관련 데이터 입력 SQL
- employees : 사원 테이블
- sales : 판매 테이블
- customers : 고객 테이블
- orders : 주문 테이블
- students : 학생 테이블
- `employees` 사원 테이블 생성
CREATE TABLE employees ( employee_id NUMBER PRIMARY KEY, department_id NUMBER, salary NUMBER, hire_date DATE ); -- 샘플 데이터 입력 INSERT INTO employees VALUES (1, 10, 4800, TO_DATE('2006-03-15', 'YYYY-MM-DD')); INSERT INTO employees VALUES (2, 10, 5200, TO_DATE('2007-06-01', 'YYYY-MM-DD')); INSERT INTO employees VALUES (3, 20, 6000, TO_DATE('2005-08-20', 'YYYY-MM-DD')); INSERT INTO employees VALUES (4, 20, 5500, TO_DATE('2004-11-10', 'YYYY-MM-DD')); INSERT INTO employees VALUES (5, 30, 7000, TO_DATE('2006-12-25', 'YYYY-MM-DD')); commit;
- `sales` 판매 테이블 생성
CREATE TABLE sales ( sale_id NUMBER PRIMARY KEY, sale_date DATE, product_category VARCHAR2(50), sale_amount NUMBER ); INSERT INTO sales VALUES (1, TO_DATE('2023-01-15', 'YYYY-MM-DD'), '전자제품', 300000); INSERT INTO sales VALUES (2, TO_DATE('2023-02-10', 'YYYY-MM-DD'), '전자제품', 400000); INSERT INTO sales VALUES (3, TO_DATE('2023-04-05', 'YYYY-MM-DD'), '가전', 500000); INSERT INTO sales VALUES (4, TO_DATE('2023-07-20', 'YYYY-MM-DD'), '가전', 600000); INSERT INTO sales VALUES (5, TO_DATE('2023-10-03', 'YYYY-MM-DD'), '도서', 200000); INSERT INTO sales VALUES (6, TO_DATE('2023-10-15', 'YYYY-MM-DD'), '도서', 850000); commit;
- `students` 학생 테이블 생성
CREATE TABLE students ( student_id NUMBER PRIMARY KEY, department VARCHAR2(100), score NUMBER ); ::<source lang=sql> INSERT INTO students VALUES (1, '컴퓨터공학과', 90); INSERT INTO students VALUES (2, '컴퓨터공학과', 85); INSERT INTO students VALUES (3, '전자공학과', 88); INSERT INTO students VALUES (4, '전자공학과', 82); INSERT INTO students VALUES (5, '심리학과', 78); -- 제외됨 (80 미만) INSERT INTO students VALUES (6, '경영학과', 95); INSERT INTO students VALUES (7, '경영학과', 90); commit;
- `customers` 고객, `orders` 주문 테이블 생성
CREATE TABLE customers ( customer_id NUMBER PRIMARY KEY, customer_name VARCHAR2(100) ); CREATE TABLE orders ( order_id NUMBER PRIMARY KEY, customer_id NUMBER, order_amount NUMBER, order_date DATE, FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ); -- 고객 INSERT INTO customers VALUES (1, '홍길동'); INSERT INTO customers VALUES (2, '김영희'); INSERT INTO customers VALUES (3, '이철수'); -- 주문 INSERT INTO orders VALUES (101, 1, 2000000, TO_DATE('2022-02-15', 'YYYY-MM-DD')); INSERT INTO orders VALUES (102, 1, 3500000, TO_DATE('2022-06-10', 'YYYY-MM-DD')); INSERT INTO orders VALUES (103, 2, 1500000, TO_DATE('2022-07-20', 'YYYY-MM-DD')); INSERT INTO orders VALUES (104, 2, 2000000, TO_DATE('2022-09-12', 'YYYY-MM-DD')); INSERT INTO orders VALUES (105, 3, 500000, TO_DATE('2022-03-01', 'YYYY-MM-DD')); commit;
예제 1. 부서/사원 조회
- 부서별 평균 급여가 5000 이상인 부서 중
- 2005년 이후 입사한 사원만 조회하여
- 평균 급여가 높은 순으로 정렬
SELECT department_id AS 부서번호 , COUNT(*) AS 사원수 , ROUND(AVG(salary), 0) AS 평균급여 , MAX(hire_date) AS 최근입사일 FROM employees -- 2005년 이후 입사한 사원만 조회 WHERE hire_date > TO_DATE('2005-01-01', 'YYYY-MM-DD') -- 부서별 평균 급여가 5000 이상인 부서 GROUP BY department_id HAVING AVG(salary) >= 5000 -- 평균 급여가 높은 순으로 정렬 ORDER BY 평균급여 DESC;
예제 2. 제품 판매 분석
- 2023년 분기별, 카테고리별 판매액 집계
- 총 판매액이 100만원 이상인 그룹만 표시
- 분기와 카테고리 순으로 정렬
SELECT TO_CHAR(sale_date, 'Q') AS 분기 , product_category AS 카테고리 , COUNT(*) AS 판매건수 , SUM(sale_amount) AS 총판매액 , AVG(sale_amount) AS 평균판매액 FROM sales -- 2023년 분기별, WHERE sale_date BETWEEN TO_DATE('2023-01-01', 'YYYY-MM-DD') AND TO_DATE('2023-12-31', 'YYYY-MM-DD') -- 판매액 별,카테고리별 그룹 GROUP BY TO_CHAR(sale_date, 'Q'), product_category -- 총 판매액이 100만원 이상 HAVING SUM(sale_amount) >= 1000000 ORDER BY 분기 ASC, 총판매액 DESC;
예제 3. 학생 성적 조회
- 각 학과별로 성적이 80점 이상인 학생들만 집계
- 학과 평균이 85점 이상인 그룹만 선택
- 평균 점수 순으로 정렬
SELECT department AS 학과 , COUNT(*) AS 학생수 , ROUND(AVG(score), 1) AS 평균점수 , MAX(score) AS 최고점수 , MIN(score) AS 최저점수 FROM students -- 성적이 80점 이상인 WHERE score >= 80 -- 학과 평균이 85점 이상인 그룹만 GROUP BY department HAVING AVG(score) >= 85 -- 평균 점수 순으로 정렬 ORDER BY 평균점수 DESC;
예제 4. 고객 구매 패턴 조회(ANSI SQL)
- 연간 구매액 500만원 이상
- 2022년에 구매한 고객별 구매 통계
- 총 구매액 순으로 정렬
SELECT c.customer_id AS 고객ID , c.customer_name AS 고객명 , COUNT(o.order_id) AS 주문횟수 , SUM(o.order_amount) AS 총구매액 , MAX(o.order_date) AS 최근구매일 FROM customers c JOIN orders o ON c.customer_id = o.customer_id -- 2022년에 연간 WHERE o.order_date BETWEEN TO_DATE('2022-01-01', 'YYYY-MM-DD') AND TO_DATE('2022-12-31', 'YYYY-MM-DD') -- 구매액이 500만원이상 구매한 고객아이디,고객명 그룹별 GROUP BY c.customer_id, c.customer_name HAVING SUM(o.order_amount) >= 5000000 -- 총 구매액 순으로 정렬 ORDER BY 총구매액 DESC;