메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
편집 요약 없음
 
30번째 줄: 30번째 줄:
** students  : 학생 테이블  
** students  : 학생 테이블  
----
----
* `employees` 테이블 생성
* `employees` 사원 테이블 생성


::<source lang=sql>
::<source lang=sql>
49번째 줄: 49번째 줄:
</source>
</source>


* `sales` 테이블 생성  
* `sales` 판매 테이블 생성  
::<source lang=sql>
::<source lang=sql>
CREATE TABLE sales (
CREATE TABLE sales (
67번째 줄: 67번째 줄:
</source>
</source>


* `students` 테이블 생성  
* `students` 학생 테이블 생성  
::<source lang=sql>
::<source lang=sql>
CREATE TABLE students (
CREATE TABLE students (
86번째 줄: 86번째 줄:
</source>
</source>


* `customers`, `orders` 테이블 생성  
* `customers` 고객, `orders` 주문 테이블 생성  
::<source lang=sql>
::<source lang=sql>
CREATE TABLE customers (
CREATE TABLE customers (

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. 부서/사원 조회

  1. 부서별 평균 급여가 5000 이상인 부서 중
  2. 2005년 이후 입사한 사원만 조회하여
  3. 평균 급여가 높은 순으로 정렬
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. 제품 판매 분석

  1. 2023년 분기별, 카테고리별 판매액 집계
  2. 총 판매액이 100만원 이상인 그룹만 표시
  3. 분기와 카테고리 순으로 정렬
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. 학생 성적 조회

  1. 각 학과별로 성적이 80점 이상인 학생들만 집계
  2. 학과 평균이 85점 이상인 그룹만 선택
  3. 평균 점수 순으로 정렬
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)

  1. 연간 구매액 500만원 이상
  2. 2022년에 구매한 고객별 구매 통계
  3. 총 구매액 순으로 정렬
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;