Database

SQL 예제 4일차, 로그인&회원가입- 2020-05-29

2020. 5. 29. 12:42

html -> javascript -> java(Servlet, DAO, DTO, Oracle Database) -> html

memberServlet 프로젝트와 guestbookServlet 프로젝트.

두 프로젝트로 나눠서 로그인 회원가입 글 작성을 구현했다.

https://codepen.io/hj-rich/collections/public?grid_type=list

 

Richard JEON on CodePen

 

codepen.io

 

 

 

 

 

 

ex1) 사원테이블에서 급여의 평균을 구하시오

조건) 소수 이하는 절삭, 세자리 마다 콤마(,) 표시

 사원급여평균
---------------
      6,461

더보기
1
2
select to_char(trunc(avg(salary), 0),'9,999') as 사원급여평균
      from employees;
Colored by Color Scripter
cs

 

 

 

 

ex2)부서별 급여평균을 구하시오

조건1) 소수 이하는 반올림
조건2) 세자리 마다 콤마, 화폐 단위(₩)로 표시


  부서코드 평균급여
------------------------
         ₩8,600


조건4) 부서별로 오름차순 정렬하시오
조건5) 평균급여가 5000이상인 부서만 표시하시오

더보기
1
2
3
4
5
6
select department_id as 부서코드,
        to_char(round(avg(salary),0),'L999,999') as 평균급여
            from employees
                group by department_id
                having avg(salary)>=5000
                order by department_id asc;
 

 

 

 

 

ex3) 부서별 급여평균을 구해서 사원명(last_name),부서 별 급여평균을 출력하시오 - X

더보기
1
2
3
4
select last_name as 사원명,
    avg(salary) as 평균급여
        from employees
            group by department_id;
cs

그룹 문에서 사용된 컬럼이 셀렉되지 않아서 오류난다 오류코드는
ORA-00979: GROUP BY 표현식이 아닙니다. 00979. 00000 - "not a GROUP BY expression"

해결: 1) last_name을 department_id로 변경 

       2) department_id를 last_name으로 변경

 

 

 

ex4) 비효율적인 having절
10과 20 부서에서 최대급여를 받는 사람의 최대급여를 구하여 정렬하시오
department_id    max_salary
----------------------------------
       10               4400
       20              13000

더보기
1
2
3
4
5
6
select department_id,
    max(salary)
        from employees
            where department_id in(10,20)
            group by department_id
            order by department_id;
cs

 

 

 

ex5) inner join : 같은 것끼리만 조인

사원테이블과 부서테이블에서 부서가 같을 경우 사원번호, 부서번호, 부서이름을 출력하시오

더보기

오라클 전용

1
2
3
4
5
SELECT e.employee_id as 사원번호,
        e.department_id as 부서번호,
        d.department_name as 부서이름
            from employees e, departments d
            where e.department_id = d.department_id;
cs

Ansi 표준

1
2
3
4
5
SELECT employee_id as 사원번호,
        department_id as 부서번호,
        department_name as 부서이름
            from employees join departments 
            using(department_id);
cs

 

 

 

ex6) outer join(left) : 왼쪽 테이블은 모두 포함하여 조인
사원테이블과 부서테이블에서 부서번호가 같은 사원의 사원이름을 출력하시오 → 107레코드

더보기

오라클 전용

1
2
3
SELECT e.first_name||' '||e.last_name AS 사원이름
            FROM employees e, departments d
            WHERE e.department_id = d.department_id(+);
cs

Ansi표준

1
2
SELECT first_name||' '||last_name AS 사원이름
            FROM employees LEFT JOIN departments USING(department_id);
cs

 

 

 

ex7) outer join(right) : 오른쪽 테이블은 모두 포함하여 조인
사원테이블과 부서테이블에서 부서번호가 같은 사원을 조인하시오 → 122 레코드

더보기

오라클 전용

1
2
3
SELECT e.first_name||' '||e.last_name AS 사원이름
            FROM employees e, departments d
            WHERE e.department_id(+) = d.department_id;
cs

Ansi 표준

1
2
3
SELECT first_name||' '||last_name AS 사원이름
            FROM employees RIGHT JOIN departments 
                  USING(department_id);
cs

 

 

 

 ex8) full join(right) : 왼쪽, 오른쪽 테이블을 모두 포함하여 조인
사원테이블과 부서테이블에서 부서번호가 같은 사원을 조인하시오 → 123레코드

 

더보기

오라클 전용

1
2
3
4
5
SELECT last_name, 
        department_id, 
        department_name
            FROM employees
            FULL JOIN departments USING(department_id);
cs

Ansi 표준

1
2
3
SELECT first_name||' '||last_name AS 사원이름
        FROM employees 
        FULL JOIN departments USING(department_id);
cs

 

 

 

ex9) inner join : 두 개의 컬럼이 일치 하는 경우
 부서ID와 매니저ID가 같은 사원을 연결 하시오 ( departments, employees) : 32 레코드

더보기

오라클 전용

1
2
3
4
5
6
SELECT e.last_name, 
        d.department_id, 
        d.manager_id
    FROM departments d, employees e
        WHERE d.department_id = e.department_id 
                AND d.manager_id = e.manager_id;
cs


Ansi 표준

1
2
3
4
5
SELECT last_name, 
        department_id, 
        manager_id
            FROM departments JOIN employees 
                USING(department_id, manager_id);
cs

 

 

 

ex10) 내용은 같은데 컬럼명이 다른 경우에 조인으로 연결하기
 departments(location_id) , locations2(loc_id)

더보기

오라클 전용

1
2
3
4
SELECT d.department_id, 
        l.city
            FROM departments d, locations2 l
                WHERE d.location_id = l.loc_id;
cs

Ansi 표준

1
2
3
4
SELECT department_id, 
        city
            FROM departments JOIN locations2 
                ON(location_id = loc_id);
cs

 

 

 

ex11) self 조인 : 자기자신의 테이블과 조인하는 경우 사원과 관리자를 연결하시오
사원번호 사원이름 관리자
---------------------------------
 101 Kochhar King

 EMPLOYEES EMPLOYEES
-------------------------------------------------------------------
employee_id, last_name(사원이름) last_name(관리자)
조건 employee_id = manager_id

더보기

오라클 전용

1
2
3
4
5
SELECT  e.employee_id AS 사원번호, 
        e.last_name AS 사원이름, 
        m.last_name AS 관리자
            FROM employees e, employees m
                WHERE m.employee_id=e.manager_id; 
cs

Ansi 표준

1
2
3
4
5
SELECT e.employee_id AS 사원번호, 
        e.last_name AS 사원이름, 
        m.last_name AS 관리자
            FROM employees e 
            JOIN employees m on(m.employee_id=e.manager_id);  
cs

 

 

ex12) cross join : 모든 행에 대해 가능한 모든 조합을 생성하는 조인

더보기
1
2
3
4
--오라클, Ansi 모두 가능
SELECT * FROM countries, locations;
--Ansi 표준
SELECT * FROM countries CROSS JOIN locations;
cs

 

 

ex13) Non Equijoin (넌 이큐조인)
컬럼값이 같은 경우가 아닌 범위에 속하는지 여부를 확인 할 때
on ( 컬럼명 between 컬럼명1 and 컬럼명2)

더보기
1
2
3
4
5
6
7
8
9
10
--오라클 전용
SELECT e.last_name, e.salary, s.salvel
            FROM employees e, salgrade s
                WHERE e.salary>=s.lowst and e.salary<=s.highst
                ORDER BY salary DESC;
--Ansi 표준
SELECT last_name, salary, salvel
            FROM employees
            JOIN salgrade ON(salary BETWEEN lowst AND highst)
                ORDER BY salary DESC;
cs

 

 

ex14) n(여러)개의 테이블은 조인
업무ID 같은 사원들의 사원이름, 업무내용, 부서이름을 출력하시오
(EMPLOYEES, JOBS, DEPARTMENTS 테이블을 조인)

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
--오라클 전용
SELECT last_name AS 사원이름,
        job_title AS 업무내용,
        department_name AS 부서이름
        FROM employees e, jobs j, departments d
            WHERE e.department_id=d.department_id and e.job_id=j.job_id;
--Ansi 표준            
SELECT last_name AS 사원이름,
        job_title AS 업무내용,
        department_name AS 부서이름
        FROM employees
            JOIN jobs USING(job_id)
            JOIN departments USING(department_id);
cs

 

 

 

 

[문제1] job_id별 급여의 합계를 구해서 job_id, 급여합계를 출력하시오

더보기
1
2
3
4
5
SELECT job_id AS 직위,
        TO_CHAR(SUM(salary), '$9,999,999') AS 급여합계
            FROM employees
                GROUP BY job_id
                ORDER BY 2 DESC;
cs

 

 

 

[문제2] 부서테이블(DEPARTMENTS d)과 위치테이블(LOCATIONS l)을 연결하여
부서가 위치한 도시를 알아내시오
 department_id city
--------------------------------
       10       Seattle

더보기

오라클 전용

1
2
3
4
SELECT d.department_id,
        l.city
            FROM departments d, locations l
            WHERE d.location_id = l.location_id;
cs

Ansi 표준

1
2
3
4
5
SELECT department_id,
        city
            FROM DEPARTMENTS JOIN LOCATIONS 
                USING(location_id)
                ORDER BY department_id;
cs

 

 

 

[문제3] 위치ID, 부서ID을 연결해서 사원이름, 도시, 부서이름을 출력하시오
 (관련 테이블 : EMPLOYEES, LOCATIONS2, DEPARTMENTS)
조건1 : 사원이름, 도시, 부서이름으로 제목을 표시하시오
조건2 : Seattle 또는 Oxford 에서 근무하는 사원
조건3 : 도시 순으로 오름차순 정렬하시오

사원이름      도    시     부서이름 
------------------------------------------- 
Hall          Oxford       Sales 

더보기
1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
--오라클 전용
SELECT e.first_name||' '||e.last_name AS 사원이름,
        l2.city AS 도시,
        d.department_name AS 부서이름
            FROM employees e, locations2 l2, departments d
                WHERE (d.location_id = l2.loc_id) AND (e.department_id = d.department_id) AND (l2.city IN ('Seattle', 'Oxford'))
                ORDER BY l2.city ASC;
--Ansi 표준
SELECT first_name||' '||last_name as 사원이름,
        city AS 도시이름,
        department_name AS 부서이름
            FROM employees 
            JOIN departments USING(department_id)
            JOIN locations2 ON(location_id = loc_id)
                WHERE city in ('Seattle', 'Oxford')
                ORDER BY city ASC;
Colored by Color Scripter
cs

 

 

 

[문제4] 부서ID, 위치ID, 국가ID를 연결해서 다음과 같이 완성하시오
(관련 테이블 : EMPLOYEES, LOCATIONS2, DEPARTMENTS, COUNTRIES)

조건1 : 사원번호, 사원이름, 부서이름, 도시, 도시주소, 나라이름으로 제목을 표시하시오
조건2 : 도시주소에 Ch 또는 Sh 또는 Rd가 포함되어 있는 데이터만 표시하시오
조건3 : 나라이름, 도시별로 오름차순 정렬하시오
조건4 : 모든 사원을 포함한다

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
--오라클 전용
SELECT e.employee_id AS 사원번호,
       e.first_name||' '||last_name AS 사원이름,
       d.department_name AS 부서이름,
       l.city AS 도시,
       l.street_address||' '||l.postal_code||' '||l.state_province AS 도시주소,
       c.country_name AS 나라이름
            FROM employees e, locations2 l, departments d, countries c
            WHERE (l.street_address LIKE '%Ch%' OR l.street_address LIKE '%Sh%' OR l.street_address LIKE '%Rd%') 
            AND e.department_id = d.department_id 
            AND l.loc_id = d.location_id 
            AND l.country_id = c.country_id
            ORDER BY 6,4;
 
--Ansi 표준            
SELECT employee_id AS 사원번호,
       first_name||' '||last_name AS 사원이름,
       department_name AS 부서이름,
       city AS 도시,
       street_address||' '||postal_code||' '||state_province AS 도시주소,
       country_name AS 나라이름
            FROM employees
            JOIN departments USING(department_id)
            JOIN locations2 ON(loc_id=location_id)
            JOIN countries USING(country_id)
                WHERE (street_address LIKE '%Ch%') OR (street_address LIKE '%Sh%') OR (street_address LIKE '%Rd%')
                ORDER BY 6,4;
Colored by Color Scripter
cs



 

수업을 위해 추가한 테이블

더보기
create table locations2 as select * from locations; 
select * from locations2; 
alter table locations2 rename column location_id to loc_id; 

create table salgrade( 
salvel varchar2(2), 
lowst number, 
highst number);   

insert into salgrade values('A', 20000, 29999); 
insert into salgrade values('B', 10000, 19999); 
insert into salgrade values('C', 0, 9999); 
commit; 
select * from salgrade;

'Database' 카테고리의 다른 글

SQL 2020-06-08 : rownum, subquery, ceil, view  (0) 2020.06.08
SQL Union, lombok적용, github octotree+t+netlify - 2020-06-02  (0) 2020.06.02
SQL 예제 3일차, html -> javascript -> java서블릿 응답 - 2020-05-28  (0) 2020.05.28
SQL 예제 8문제, 이클립스EE+톰캣 연동- 2020-05-27  (0) 2020.05.27
오라클 hr계정 SQL문 예제, Servlet Context 생성 - 2020-05-26  (2) 2020.05.26
'Database' 카테고리의 다른 글
  • SQL 2020-06-08 : rownum, subquery, ceil, view
  • SQL Union, lombok적용, github octotree+t+netlify - 2020-06-02
  • SQL 예제 3일차, html -> javascript -> java서블릿 응답 - 2020-05-28
  • SQL 예제 8문제, 이클립스EE+톰캣 연동- 2020-05-27
리차드
리차드
화음을 좋아하는 리차드🎶리차드 님의 블로그입니다.
리차드
화음을 좋아하는 리차드🎶
리차드
전체
오늘
어제
  • 전체 게시글 보기 (200)
    • Portfolio (0)
    • Thoughts & Records (17)
    • 우아한테크코스 4기 (43)
    • Java & Spring (36)
    • JPA & QueryDSL (2)
    • Database (18)
    • Server & Infra (21)
    • Network (0)
    • Algorithm (11)
    • IDE (12)
    • HTML & CSS (4)
    • JavaScript (11)
    • Life (13)

블로그 메뉴

  • Github

공지사항

인기 글

태그

  • 스프링부트
  • git
  • java
  • javascript
  • 리차드
  • SQL
  • 자바
  • 오라클
  • 화음을 좋아하는
  • 알고리즘
  • aws
  • 자바스크립트
  • 웹 백엔드 4기
  • IntelliJ
  • 스프링
  • EC2
  • Spring
  • 우아한테크코스
  • oracle
  • 우테코

최근 댓글

최근 글

hELLO · Designed By 정상우.
리차드
SQL 예제 4일차, 로그인&회원가입- 2020-05-29
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.