[광주직업학교] 데이터베이스 서브쿼리 - 복습3-2

ㅇ 본 수업은 "스마트인재개발원"에서 진행되었습니다.

https://www.smhrd.or.kr/


#스마트인재개발원 #국비지원코딩교육 #데이터베이스 #실습문제 #27번~31번 #조인조건 #그룹함수 #서브쿼리 #데이터베이스끝




<목차>
ㅇ 본 문제는 [광주직업학교] "스마트인재개발원"에서 제공되었습니다.(1)
ㅇ 실습문제 27
ㅇ 실습문제 28
ㅇ 실습문제 29
ㅇ 실습문제 30
ㅇ 실습문제 31




  • 안 좋은 습관 : 에러 메세지 그냥 넘기는 것
    • 에러 메세지에 답이 있어!! (자바 디버깅 할 때 처럼)
    • 공통적인 에러메세지가 싱글로우 어쩌고~ 서브쿼리에 더 많은 행이 떨어진다 ㅋㅋ



ㅇ 실습문제 27

SELECT employee_id, last_name
FROM employees
WHERE department_id IN ( SELECT department_id
			FROM employees
			WHERE last_name LIKE '%u%' )
  • 정답은 소문자만 찾음 : 90명

  • 알파벳 u로 치면 대문자도 넣어야 할 듯 해서 나는 이렇게 찾음

SELECT employee_id, last_name
FROM employees
WHERE department_id IN ( SELECT department_id
			FROM employees
			WHERE last_name LIKE '%U%' 
			OR last_name LIKE '%u%' )
  • 첫 글자가 U인 사람도 찾아짐: 96명

ㅇ 본 문제는 [광주직업학교] "스마트인재개발원"에서 제공되었습니다.(2)




ㅇ 실습문제 28

  • Locations라는 테이블에 city라는 컬럼 존재, 그 안에 seattle이라는 데이터 존재
  • e테이블의 d_id는 d테이블의 d_id
    d테이블의 location_id는 locations테이블의 location_id
  • 1 보고싶은 것 : 셀렉트절에 사원이름 디파트먼트네임 로케이션 아이디
    2 라스트네임은 임플로이, 디파트먼트네임과 로케이션 아이디 는 디파트먼트테이블
    로케이션스테이블 찾아와도 돼 - 이러면 코드 더 쉽게 이해될 수 있긴 해
  • 조인으로 풀면
SELECT last_name, department_name, location_id
FROM employees e, department d, location l
WHERE e.department_id=d.department_id
AND d.location_id=l.location_id
AND l.city='Seattle'
AND e.commission_pct IS NULL
  • 우리는 서브쿼리 배웠으니까 서브쿼리 써보자. 굳이 로케이션까지 가진 말자
  • 서브퀴리 : 시애틀의 도시번호를 알아내기
SELECT location_id
FROM locations
WHERE city='Seattle'
SELECT last_name, department_name, location_id
FROM employees e, department d
WHERE e.department_id=d.department_id
AND d.location_id = ( SELECT location_id
			FROM locations
			WHERE city='Seattle')
AND e.commission_pct IS NULL
  • 서브쿼리에 있는 시에틀은 매인쿼리의 테이블에서 가져온 것이 아니니까
    조인 접두어 쓸 필요 없어

ㅇ 본 문제는 [광주직업학교] "스마트인재개발원"에서 제공되었습니다.(3)




ㅇ 실습문제 29

SELECT last_name, hire_date
FROM employees
WHERE hire_date >ALL (SELECT hire_date
			FROM employees
			WHERE last_name = 'Davies' ) 
ORDER BY hire_date DESC
  • WHERE절 쓸 때 지켜야 할 조건
    • 문자와 날짜는 작은 따옴표 붙여라
    • 테이블의 데이터의 포맷을 그대로 따라가라 : D만 대문자. Davies
  • 1 현재 찾아야 할 값 : 사원의 이름 입사일 => 매인쿼리 셀렉트
    2 모르는 것 : 데이비스 입사일
    3 사원들의 입사일과 비교
  • 그냥 > 이거쓰면 단항연산자야 >all을 써야 해
  • 이름에서 = 안쓰고 like 써도 되긴 한데,
    굳이 이미 풀 네임을 아는데 데이비스 들어가 있는지 다 검색할 필요 없지

ㅇ 본 문제는 [광주직업학교] "스마트인재개발원"에서 제공되었습니다.(4)



ㅇ 실습문제 30

SELECT last_name, salary
FROM employees
WHERE manager_id IN (SELECT employee_id
		FROM employees
		WHERE last_name = 'King' )
  • =를 쓰면
  • 서브쿼리 결과가 한 행 이상일 수 있으니 IN을 사용해야 함
  • King을 매니저로 두고 있는 = 킹의 사원번호를 매니저 아이디로 두고 있는
  • 매니저아아디와 임플로이 아이디는 컬럼이름은 달라.
    하지만 데이터 타입이 같아서 서브쿼리로 연산자 사용 가능

ㅇ 본 문제는 [광주직업학교] "스마트인재개발원"에서 제공되었습니다.(5)



ㅇ 실습문제 31

SELECT EMPLOYEE_ID, LAST_NAME, SALARY
FROM EMPLOYEES
WHERE DEPARTMENT_ID IN ( SELECT DEPARTMENT_ID
                           FROM EMPLOYEES
                          WHERE LAST_NAME LIKE '%u%'
                           AND SALARY >= ( SELECT AVG(SALARY)
                                            FROM EMPLOYEES));
  • 1 회사평균보다 많은 사원 -> 2 그 사원들 중에 이름에 u가 있는 사원 -> 3 그 사원들이 근무하는 부서 -> 4 그 부서에 근무하는 부서의 사원들의 사번, 이름, 급여 찾기
  • 1 평균보다 많은 사원
salary > (SELECT AVG(salary)
	    FROM employees)
  • 1 평균보다 많고, 2 이름에 u 있는 사원들, 3 근무하는 부서
SELECT department_id
FROM employees
WHERE last_name LIKE '%u%'
AND salary > (SELECT AVG(salary)
		FROM employees)
  • 코드 해석할 때 안쪽의 서브쿼리를 먼저 읽는다고 생각해
    서브쿼리는 값의 역할을 하는거니까, 그 값을 근거로 웨어절이 실행되는 거니까.
  • 디스팅트를쓰면 성능이 떨어져
    멀티플 컬럼... 그룹화 작업이 발생해서
    테이블의 원래 데이터 값이 아니라 변경시키는 거니까
    (뭔가 변경되는 작업들이 성능이 떨어뜨린다)

ㅇ 본 문제는 [광주직업학교] "스마트인재개발원"에서 제공되었습니다.(6)

좋은 웹페이지 즐겨찾기