천천히 빛나는
MySQL : SELECT 문 + 기본 예제 (2) 본문
SELECT FNAME, LNAME
FROM EMPLOYEE
WHERE SUPER_SSN IS NULL;
IS NULL 또는 IS NOT NULL을 이용하여 속성 값이 NULL인지 검사할 수 있다
중첩질의(Nested query)
SELECT DISTINCT ESSN
FROM WORKS_ON
WHERE (PNO, HOURS) IN (SELECT PNO, HOURS
FROM WORKS_ON
WHERE ESSN=‘333445555’);
SSN이 3344555인 사원이 일하는 프로젝트와 일한 시간의 조합이 동일한 사원의 SSN을 검색하는 쿼리이다. 중첩질의에서는 속성의 이름이 모호해질 수 있으므로 AS 를 사용하여 별명을 작성하는 것이 좋다.
여기서 내부 질의는 IN 이후 SELECT 문이 되고, 내부질의 -> 외부질의 순이 된다.
SELECT E.FNAME, E.LNAME
FROM EMPLOYEE AS E, DEPENDENT AS D
WHERE E.SSN=D.ESSN AND E.FNAME=D.DEPENDENT_NAME AND E.SEX=D.SEX;
SELECT E.FNAME, E.LNAME
FROM EMPLOYEE AS E
WHERE EXISTS (SELECT *
FROM DEPENDENT AS D
WHERE E.SSN=D.ESSN AND E.SEX=D.SEX
AND E.FNAME=D.DEPENDENT_NAME) ;
자신의 부양가족과 이름, 성별이 같은 종업원들의 이름을 검색하는 경우 두가지로 나타낼 수 있다.
먼저 첫번째는 앞서 설명했던 것들과 같은 방식이다.
두번째 쿼리에서는 EXISTS 함수를 사용하였는데 내부질의의 결과가 공집합인지를 검사한다. EXSIT 뒤에 최소 하나 이상의 투플이 있다면 참을 반환한다.
EXIST 함수는 외부질의 -> 내부질의 순으로 실행된다. 먼저 외부질의가 검색되고 그 이후에 존재여부를 따지게 된다.
SELECT LNAME, FNAME
FROM EMPLOYEE
WHERE SALARY > ALL ( SELECT SALARY
FROM EMPLOYEE
WHERE DNO=5) ;
ALL연산자는 하나의 값 v가 집합 V내의 모든 값들과 같으면 참이 된다.
또한 ANY 연산자를 사용하여 하나라도 같으면 참이 되도록 설정할 수도 있다. ANY는 IN과 동일한 의미를 나타낸다.
집단함수 (Aggregate functions)
SELECT COUNT(*)
FROM EMPLOYEE ;
COUNT 함수는 투플이나 값의 개수를 반환한다
SELECT SUM(SALARY), MAX(SALARY), MIN(SALARY), AVG(SALARY)
FROM EMPLOYEE ;
SUM, MAX, MIN, AVG 함수는 합, 최대값, 최소값, 평균값을 반환한다.
그룹화 (Grouping)
특정 속성의 값이 같은 투플들을 모아 그룹을 생성하고, 이 그룹에 대하여 집단 함수를 적용한다
SELECT DNO, COUNT(*), AVG(SALARY)
FROM EMPLOYEE
GROUP BY DNO ;
각 부서에 대해서 부서 번호, 부서 내에 있는 종업원의 수, 평균 봉급을 나타냈다
가장 먼저 그룹핑이 되고 각 그룹의 투플에 대하여 count 함수와 avg 함수가 적용된다
Having
Group BY 절에 대한 조건을 제시할 수 있다
SELECT PNUMBER, PNAME, COUNT(*)
FROM PROJECT, WORKS_ON
WHERE PNUMBER=PNO
GROUP BY PNUMBER, PNAME
HAVING COUNT(*) >= 3 ;
가장 먼저 그룹핑이 되고 Having에 따라 조건에 맞는 그룹들이 필터링 된 후 그 그룹을 기준으로 집단 함수들이 적용된다.
SELECT문 요약
1. SELECT <애트리뷰트 목록>
SELECT 절은 질의 결과에 포함될 애트리뷰트들이나 함수를 나열함
2. FROM <테이블 목록>
FROM 절은 질의의 대상을 명시하는 곳으로 조인된 릴레이션이나 릴레이션(들)을 지정함
3. [WHERE <조건>]
WHERE 절은 투플들에 대한 조건을 명시함
4. [GROUP BY <집단화 애트리뷰트>]
GROUP BY절은 그룹화 애트리뷰트들을 지정함
5. [HAVING <집단 조건>]
HAVING 절은 그룹들에 대한 조건을 지정함
6. [ORDER BY <애트리뷰트 목록>]
ORDER BY 절은 정렬 기준이 되는 애트리뷰트(들)을 지정함
질의의 평가 순서
FROM → WHERE절 → GROUP BY → HAVING → SELECT → ORDER BY
SELECT문 기본 예제
예제 1) 부양가족이 없는 종업원들의 이름을 검색하시오
SELECT FNAME, LNAME
FROM EMPLOYEE
WHERE NOT EXISTS ( SELECT *
FROM DEPENDENT
WHERE SSN=ESSN) ;
예제 2) 'Research'부서에 속해 있는 종업원의 수를 검색하시오
SELECT COUNT(*)
FROM EMPLOYEE, DEPARTMENT
WHERE DNO=DNUMBER AND DNAME=‘Research’ ;
예제 3) 중복되지 않은 salary 값이 몇 개인지 검색하시오
SELECT COUNT(DISTINCT Salary)
FROM EMPLOYEE;
예제 4) 둘 이상의 부양가족이 있는 모든 사원의 이름을 검색하시오
SELECT LNAME, FNAME
FROM EMPLOYEE
WHERE (SELECT COUNT(*)
FROM DEPENDENT
WHERE SSN=ESSN ) >= 2 ;
'STUDY > MYSQL' 카테고리의 다른 글
MySQL : IS NULL 문 고득점 Kit (0) | 2023.10.21 |
---|---|
MySQL : GROUP BY 문 고득점 Kit (0) | 2023.10.21 |
MySQL : SUM, MAX, MIN 문 고득점 Kit (1) | 2023.10.20 |
MySQL : SELECT 문 고득점 Kit (1) | 2023.10.20 |
MySQL : SELECT 문 + 기본 예제 (1) (0) | 2023.10.20 |