SELECT 1
23년 이전 글/데이터베이스

SELECT 1

SELECT 개요

  • 관계 데이터베이스에서 정보를 검색하는 SQL 문
  • 관계 대수의 실렉션과 의미가 완전히 다름
  • 관계 대수의 실렉션, 프로젝션, 조인, 카티션 곱 등을 결합한 것
  • 관계 데이터베이스에서 가장 자주 사용됨

 

SELECT문

질의에서 사용하는 데이터베이스 상태

 

SELECT문 형식

  • SELECT절과 FROM절만 필수적인 절이고 나머지는 선택
  • 순서는 변경 불가
  • SQL문은 대문자와 소문자 구분하지 않음
  • '[]'은 '선택사항', '|' 는 '또는'을 의미

SELECT문 형식

SELECT [DISTINCT] 속성

SELECT EMPNAME, SALARY FROM EMPLOYEE;
  • 질의 결과에서 자동적으로 중복된 튜플을 제거하지 않음
  • 'DISTINCT'를 명시하면 중복 값을 제거함

FROM 릴레이션

  • 질의에서 필요로 하는 릴레이션들의 리스트를 열거
  • SELECT에서 열거한 속성을 포함하는 릴레이션 열거
  • WHERE절의 프레디키트에 사용된 속성을 포함하는 릴레이션 열거

WHERE 

  • 관계 대수의 실렉선 연산의 프레디키트(조건식)
  • FROM절에 열거한 릴레이션에 속하는 속성들만 사용
  • WHERE절의 조건은 결과 릴레이션의 튜플들이 만족시켜야 하는 조건
  • WHERE절의 프레디키트는 다음을 포함

- 비교 연산자 : =, <>, <, <=, >, >=

- 부울 연산자 : AND, ON, NOT

- 집합 연산자: IN, NOT IN, ANY, ALL

 

중첩질의

다른 질의의 WHERE절에 포함된 SELECT 문

 

  • GROUP BY : GROUP BY로 명시된 속성에 동일한 값을 갖는 튜플들을 한 그룹으로 만듦
  • HAVING : GROUP BY로 생성된 그룹들이 만족해야하는 조건을 명시
  • ORDER BY : 결과 튜플들의 정렬 순서를 지정

 

별칭(ALIAS)

  • 서로 다른 릴레이션에 동일한 이름을 가진 속성이 속해 있을 때  속성 이름을 구분하는 방법
  • 속성 앞에 릴레이션의 명칭을 명시  EX) EMPLOYEE.DNO
  • 튜플 변수 사용(별칭이라고 함)
  • 질의 내에서 릴레이션 이름 대신 별칭을 사용
SELECT E.EMPNAME, D.DEPTNAME
FROM EMPLOYEE AS E, DEPARTMENT AS D
WHERE E.DNO = D.DEPTNO;

 

테이블에서 속성 검색

 

테이블의 모든 속성이나 일부 속성들을 검색

 

모든 속성 검색

SELECT * FROM DEPARTMENT;

일부 속성을 검색

SELECT DEPTNO, DEPTNAME
FROM DEPARTMENT;

 

중복 값들을 제외한 검색(DISTINCT)

중복된 행을 제거 후 결과 출력

# DISTINCT 사용하지 않았을 때
SELECT TITLE FROM EMPLOYEE;

출력결과

# DISTINCT 사용 했을 때
SELECT DISTINCT TITLE FROM EMPLOYEE;

출력결과

열 이름 변경하여 표시(AS)

결과 릴레이션에서 속성 이름을 변경하여 표시

SELECT DEPTNO AS 부서번호, DEPTNAME AS 부서이름 FROM DEPARTMENT

출력 결과

SELECT SUM(SALARY) AS 총급여, AVG(SALARY) AS 평균급여
FROM EMPLOYEE;

 

조건 부여 및 여러 연산자의 사용

 

조건 부여 검색

  • WHERE절의 조건을 만족하는 튜플들만 검색
  • 숫자 이외의 상수는 단일 인용기호 (')로 에워싸야 함
SELECT * FROM DEPARTMENT WHERE DNO = 2;

출력 결과

SELECT * FROM EMPLOYEE
WHERE SALARY >= 3000000;

출력 결과

문자열의 비교

 

LIKE

  • LIKE 비교연산자는 문자열의 일부에 대하여 비교 조건을 명시
  • LIKE 연산자는 도메인이 문자열 타입인 속성에 사용
SELECT EMPNAME, TITLE, DNO
FROM EMPLOYEE
WHERE EMPNAME LIKE '이%';

출력 결과

LIKE 부정은 NOT LIKE

SELECT EMPNAME, TITLE, DNO
FROM EMPLOYEE
WHERE EMPNAME NOT LIKE '이%';

출력 결과

패턴 매칭에 사용되는 기호들

기 호 사용 의미 보 기
_ 하나의 문자를 대치 한_ (한종, 한1, 한2...)
% 한 문자도 없거나 하나 이상 모든 문자 한% (한종진, 한, 한123,...)
[ ] []내에 있는 문자만 한[AB] (한A, 한B)
[ ^ ] [ ] 내에 있는 문자 제외 L[^O]VE (LAVE, LIVE)
SELECT DEPTNO, DEPTNAME FROM DEPARTMENT
WHERE DEPTNAME LIKE '기_';

출력 결과

사용 예시들

SELECT EMPNAME, TITLE
FROM EMPLOYEE
WHERE TITLE LIKE '[과부]%';

출력 결과

SELECT EMPNAME, TITLE
FROM EMPLOYEE
WHERE TITLE LIKE '[^과부]%';

출력 결과

 

다수의 검색 조건

WHERE절에 여러 조건들을 논리 연산자로 결합해 표시

연산자의 우선 순위

  1. 비교 연산자
  2. NOT
  3. AND
  4. OR

잘못 사용된 예

SELECT FLOOR
FROM DEPARTMENT
WHERE DEPTNAME = '영업' AND DEPTNAME = '개발';

 

부울 연산자 사용

# 직급이 과장이면서 1번 부서에 근무하는 사원들의 이름과 급여를 검색
SELECT EMPNAME, SALARY
FROM EMPLOYEE
WHERE TITLE = '과장' AND DNO = 1;

출력 결과

비교 연산자 사용

SELECT * FROM EMPLOYEE WHERE SALARY > 2500000

비교 연산자와 논리 연산자 사용

SELECT * FROM EMPLOYEE
WHERE TITLE = '과장' AND SALARY > 2500000

부정 검색 조건, 사용자가 원하지 않는 튜플 제외

# 직급이 과장이면서 1번 부서에 근무하지 않는 사원들의 이름과 급여를 검색
SELECT EMPNAME, SALARY
FROM EMPLOYEE
WHERE TITLE = '과장' AND DNO <> 1;

출력 결과

 

범위를 사용한 검색

# 급여가 3000000원 이상이고 4500000원 이하인 사원들의 이름, 직급, 급여를 검색

SELECT EMPNAME, TITLE, SALARY
FROM EMPLOYEE
WHERE SALARY BETWEEN 3000000 AND 4500000;

SELECT EMPNAME, TITLE, SALARY
FROM EMPLOYEE
WHERE SALARY >= 3000000 AND SALARY <= 4500000;

 

리스트를 사용한 검색

집합연산자 IN은 리스트내의 값과 비교

# 1번 부서나 3번 부서에 소속된 사원들의 모든 정보를 검색

SELECT *
FROM EMPLOYEE
WHERE DNO IN (1,3);

출력 결과

IN 연산자의 부정   NOT IN

# 직급이 과장, 부장이 아닌 모든 사원 정보 검색

SELECT *
FROM EMPLOYEE
WHERE TITLE NOT IN ('과장', '부장');

출력 결과

SELECT절에서 산술 연산자(+, -, *, /) 사용

  • SELECT에 산술 연산자를 사용 수식을 표현
  • 실제 테이블 튜플이 변경되지는 않음
# 직급이 과장인 사원들의 이름과 현재 급여, 10% 인상된 급여를 검색

SELECT EMPNAME, SALARY, SALARY * 1.1 AS NEWSALARY
FROM EMPLOYEE
WHERE TITLE = '과장';

출력 결과

 

NULL 값의 검색

  • NULL 값과 다른 값을 +, -등을 사용하여 연산하면 결과는 NULL이 됨
  • COUNT(*)를 제외한 집단 함수들은 NULL 값을 무시함
  • 특정 속성에 들어 있는 값이 NULL인가 비교하기 위해서 'DNO=NULL'를 사용해선 안됨
# 금지
SELECT EMPNO, EMPNAME
FROM EMPLOYEE
WHERE DNO = NULL;

NULL값의 비교 연산자는 'IS NULL'

SELECT EMPNO, EMPNAME
FROM EMPLOYEE
WHERE DNO IS NULL;

모두 FALSE 결과

SALARY가 NULL인 튜플은 검색되지 않음

SELECT EMPNAME, SALARY
FROM EMPLOYEE
WHERE SALARY < 2000000 OR SALARY >= 2000000;

출력 결과

SALARY가 NULL인 튜플 검색하려면

SELECT EMPNAME, SALARY
FROM EMPLOYEE
WHERE SALARY < 2000000 OR SALARY >= 2000000 OR SALARY IS NULL;

 

NULL 값의 검색

UNKNOWN에 대한 OR 연산
UNKNOWN에 대한 AND 연산
UNKNOWN에 대한 NOT 연산

 

 

반응형