천천히 빛나는

MySQL : SELECT 문 + 기본 예제 (2) 본문

STUDY/MYSQL

MySQL : SELECT 문 + 기본 예제 (2)

까만콩 •ᴥ• 2023. 10. 20. 14:16
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