테이블 데이터 선택
주: 이 섹션의 자습서 및 예제를 완료하려면 SQL Developer에서 사용자 HR로 Oracle Database에 접속되어 있어야 합니다. 자세한 내용은 "SQL Developer에서 사용자 HR로 Oracle Database에 접속"을 참조하십시오.
질의 정보
질의 또는 SQL SELECT 문은 하나 이상의 테이블 또는 뷰에서 데이터를 선택합니다.
가장 단순한 형태의 질의는 다음 구문을 사용합니다.
SELECT select_list FROM source_list
select_list 값은 데이터를 선택할 열을 지정하고 source_list 값은 이러한 열이 있는 테이블 또는 뷰를 지정합니다.
다른 SQL 문에 중첩된 질의를 하위 쿼리라고 합니다.
SQL*Plus 환경에서는 SQL> 프롬프트 아래에 질의(또는 기타 SQL 문)를 입력할 수 있습니다.
SQL Developer 환경에서는 Worksheet에 질의(또는 기타 SQL 문)를 입력할 수 있습니다.
주: 질의 결과가 표시될 때 ORDER BY 절로 레코드 순서를 지정하지 않은 경우 임의의 순서로 레코드가 표시될 수 있습니다. 자세한 내용은 "선택한 데이터 정렬"을 참조하십시오.
참조:
-
질의 및 하위 질의에 대한 자세한 내용은 Oracle Database SQL Language Reference를 참조하십시오.
-
SELECT 문에 대한 자세한 내용은 Oracle Database SQL Language Reference를 참조하십시오
-
SQL*Plus 명령행 인터페이스에 대한 자세한 내용은 SQL*Plus User's Guide and Reference를 참조하십시오.
-
SQL Developer에서 워크시트 사용에 대한 자세한 내용은 Oracle SQL Developer User's Guide를 참조하십시오.
SQL Developer에서 질의 실행
이 섹션에서는 워크시트를 사용하여 SQL Developer에서 질의를 실행하는 방법에 대해 설명합니다.
주: 워크시트는 질의로 제한되지 않습니다. 이 워크시트를 사용하여 SQL 문을 실행할 수 있습니다.
SQL Developer에서 query를 실행하는 단계:
-
SQL Developer 오른쪽 프레임에 hr_conn 창이 표시되는 경우:
-
워크시트 하위 창이 표시되지 않으면 워크시트 탭을 선택합니다.
-
단계 4로 이동합니다.
-
-
SQL Worksheet 아이콘을 선택합니다.
-
[접속 선택] 창이 열리는 경우:
-
[접속] 필드의 값이
hr_conn이 아니면 메뉴에서 이 값을 선택합니다. -
확인을 선택합니다.
hr_conn이라는 탭과 Worksheet 및 Query Builder라는 두 개의 하위 창이 있는 창이 표시됩니다. Worksheet에서 SQL 문을 입력할 수 있습니다.
-
-
Worksheet에 query(SELECT 문)를 입력합니다.
-
명령문 실행 아이콘을 누릅니다.
질의가 실행됩니다. Worksheet 아래에 Query Result 창이 나타나고 query 결과가 표시됩니다.
-
hr_conn 탭에서 지우기 아이콘을 누릅니다.
query가 사라지고 Worksheet에 다른 SQL 문을 입력할 수 있습니다. 다른 SQL 문을 실행하면 그 결과가 Query Result 창에 나타나며 이전에 실행된 SQL 문의 결과가 바뀝니다.
참조: SQL Developer에서 워크시트 사용에 대한 자세한 내용은 Oracle SQL Developer User's Guide를 참조하십시오.
자습서: 테이블의 모든 열 선택
이 자습서에서는 EMPLOYEES 테이블의 열을 모두 선택하는 방법을 보여줍니다.
EMPLOYEES 테이블의 열을 모두 선택하는 단계:
-
탭이 hr_conn인 창이 표시되면 선택합니다. 그렇지 않은 경우 "Running Queries in SQL Developer"에서와 같이 SQL Worksheet 아이콘을 누릅니다.
-
Worksheet에 다음 query를 입력합니다.
SELECT * FROM EMPLOYEES; -
Run Statement 아이콘을 누릅니다.
질의가 실행됩니다. Worksheet 아래에 Query Result 창이 나타나고 EMPLOYEES 테이블의 모든 열이 표시됩니다.
주의: 비밀번호나 신용 카드 정보와 같이 중요한 데이터를 저장하는 열이 있는 테이블에 SELECT *를 사용할 때는 주의해야 합니다.
참조: SQL Developer를 사용하여 테이블 데이터를 보는 다른 방법에 대한 자세한 내용은 "자습서: SQL Developer를 사용하여 EMPLOYEES 테이블 속성 및 데이터 보기"를 참조하십시오.
자습서: 테이블의 특정 열 선택
이 자습서에서는 EMPLOYEES 테이블의 FIRST_NAME, LAST_NAME 및 DEPARTMENT_ID 열만 선택하는 방법을 보여 줍니다.
FIRST_NAME, LAST_NAME 및 DEPARTMENT_ID만 선택하는 단계:
-
탭이 hr_conn인 창이 표시되면 선택합니다. 그렇지 않은 경우 "Running Queries in SQL Developer"에서와 같이 SQL Worksheet 아이콘을 누릅니다.
-
워크시트 창에 질의가 포함된 경우 지우기 아이콘을 선택하여 질의를 지웁니다.
-
Worksheet에 다음 query를 입력합니다.
SELECT FIRST_NAME, LAST_NAME, DEPARTMENT_ID FROM EMPLOYEES; -
Run Statement 아이콘을 누릅니다.
질의가 실행됩니다. Worksheet 아래에 Query Result 창이 표시되며 query 결과는 다음 텍스트와 유사합니다.
FIRST_NAME LAST_NAME DEPARTMENT_ID
-------------------- ------------------------- -------------
Donald OConnell 50
Douglas Grant 50
Jennifer Whalen 10
Michael Hartstein 20
Pat Fay 20
Susan Mavris 40
Hermann Baer 70
Shelley Higgins 110
William Gietz 110
Steven King 90
Neena Kochhar 90
FIRST_NAME LAST_NAME DEPARTMENT_ID
-------------------- ------------------------- -------------
Lex De Haan 90
...
Kevin Feeney 50
107 rows selected.
선택한 열을 새 머리글 아래에 표시
표시된 query 결과에서 기본 열 머리글은 열 이름입니다. 새 머리글 아래에 열을 표시하려면 열 이름을 바로 다음에 새 머리글(별칭)을 지정합니다. 별칭은 질의 기간 동안 열 이름을 바꾸지만 데이터베이스에서 열 이름을 변경하지는 않습니다.
예제 2-5의 질의는 "자습서: 테이블의 특정 열 선택"의 질의와 동일한 열을 선택하되 해당 열의 별칭도 지정합니다. 별칭은 큰따옴표로 묶이지 않으므로 대문자로 표시됩니다.
열 별칭을 큰 따옴표로 묶으면 대/소문자가 유지되고 Example 2-6과 같이 별칭에 공백을 포함할 수 있습니다.
참조: 열 별칭(c_alias)을 비롯한 SELECT 문에 대한 자세한 내용은 Oracle Database SQL Language Reference를
예 2-5 선택한 열을 새 머리글 아래에 표시
SELECT FIRST_NAME First, LAST_NAME last, DEPARTMENT_ID DepT
FROM EMPLOYEES;
결과는 다음 텍스트와 유사합니다.
FIRST LAST DEPT
-------------------- ------------------------- ----------
Donald OConnell 50
Douglas Grant 50
Jennifer Whalen 10
Michael Hartstein 20
Pat Fay 20
Susan Mavris 40
Hermann Baer 70
Shelley Higgins 110
William Gietz 110
Steven King 90
Neena Kochhar 90
FIRST LAST DEPT
-------------------- ------------------------- ----------
Lex De Haan 90
...
Kevin Feeney 50
107 rows selected.
예 2-6 열 별칭에서 대소문자 유지 및 공백 포함
SELECT FIRST_NAME "Given Name", LAST_NAME "Family Name"
FROM EMPLOYEES;
결과는 다음 텍스트와 유사합니다.
Given Name Family Name
-------------------- -------------------------
Donald OConnell
Douglas Grant
Jennifer Whalen
Michael Hartstein
Pat Fay
Susan Mavris
Hermann Baer
Shelley Higgins
William Gietz
Steven King
Neena Kochhar
Given Name Family Name
-------------------- -------------------------
Lex De Haan
...
Kevin Feeney
107 rows selected.
지정한 조건에 맞는 데이터 선택
지정된 조건과 일치하는 데이터만 선택하려면 SELECT 문에 WHERE 절을 포함합니다.
WHERE 절의 조건은 SQL 조건일 수 있습니다. SQL 조건에 대한 자세한 내용은 Oracle Database SQL Language Reference를 참조하십시오..
예 2-7의 질의는 부서 90의 사원에 대해서만 데이터를 선택합니다.
부서 100, 110 및 120의 사원에 대해서만 데이터를 선택하려면 다음 WHERE 절을 사용합니다.
WHERE DEPARTMENT_ID IN (100, 110, 120);
예 2-8의 질의는 성이 "Ma"로 시작하는 직원에 대해서만 데이터를 선택합니다.
성에 "ma"가 포함된 사원에 대해서만 데이터를 선택하려면 다음 WHERE 절을 사용합니다.
WHERE LAST_NAME LIKE '%ma%';
예 2-9의 질의는 두 가지 조건(봉급이 11000 이상인지 여부와 수수료 비율이 널이 아닌지 여부)을 테스트합니다.
참조:
-
Oracle Database SQL Language Reference - WHERE 절을 비롯한 SELECT 문에 대한 자세한 내용
-
Oracle Database SQL Language Reference - SQL 조건에 대한 자세한 내용
예 2-7 한 부서에서 데이터 선택
SELECT FIRST_NAME, LAST_NAME, DEPARTMENT_ID
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 90;
결과는 다음 텍스트와 유사합니다.
FIRST_NAME LAST_NAME DEPARTMENT_ID
-------------------- ------------------------- -------------
Steven King 90
Neena Kochhar 90
Lex De Haan 90
3 rows selected.
예 2-8 동일한 하위 문자열로 시작하는 성에 대한 데이터 선택
SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE LAST_NAME LIKE 'Ma%';
결과는 다음 텍스트와 유사합니다.
FIRST_NAME LAST_NAME
-------------------- -------------------------
Jason Mallin
Steven Markle
James Marlow
Mattea Marvins
Randall Matos
Susan Mavris
6 rows selected.
예 2-9 두 조건에 맞는 데이터 선택
SELECT FIRST_NAME, LAST_NAME, SALARY, COMMISSION_PCT "%"
FROM EMPLOYEES
WHERE (SALARY >= 11000) AND (COMMISSION_PCT IS NOT NULL);
결과는 다음 텍스트와 유사합니다.
FIRST_NAME LAST_NAME SALARY %
-------------------- ------------------------- ---------- ----------
John Russell 14000 .4
Karen Partners 13500 .3
Alberto Errazuriz 12000 .3
Gerald Cambrault 11000 .3
Lisa Ozer 11500 .25
Ellen Abel 11000 .3
6 rows selected.
선택한 데이터 정렬
질의 결과가 표시될 때 ORDER BY 절로 레코드 순서를 지정하지 않으면 레코드가 임의의 순서로 표시 될 수 있습니다.
예 2-10의 질의 결과는 LAST_NAME를 기준으로 오름차순(기본값)으로 정렬됩니다.
또는 SQL Developer에서 ORDER BY 절을 생략하고 정렬할 열의 이름을 두 번 누를 수 있습니다.
예 2-11이 표시되므로 정렬 기준은 선택 목록에 포함되지 않아도 됩니다.
참조: Oracle Database SQL Language Reference - ORDER BY 절을 비롯한 SELECT 문에 대한 자세한 내용
예 2-10 LAST_NAME을 기준으로 선택한 데이터 정렬
SELECT FIRST_NAME, LAST_NAME, HIRE_DATE
FROM EMPLOYEES
ORDER BY LAST_NAME;
결과:
FIRST_NAME LAST_NAME HIRE_DATE
-------------------- ------------------------- ---------
Ellen Abel 11-MAY-04
Sundar Ande 24-MAR-08
Mozhe Atkinson 30-OCT-05
David Austin 25-JUN-05
Hermann Baer 07-JUN-02
Shelli Baida 24-DEC-05
Amit Banda 21-APR-08
Elizabeth Bates 24-MAR-07
...
FIRST_NAME LAST_NAME HIRE_DATE
-------------------- ------------------------- ---------
Jose Manuel Urman 07-MAR-06
Peter Vargas 09-JUL-06
Clara Vishney 11-NOV-05
Shanta Vollman 10-OCT-05
Alana Walsh 24-APR-06
Matthew Weiss 18-JUL-04
Jennifer Whalen 17-SEP-03
Eleni Zlotkey 29-JAN-08
107 rows selected
예 2-11 선택 해제된 열을 기준으로 선택한 데이터 정렬
SELECT FIRST_NAME, HIRE_DATE
FROM EMPLOYEES
ORDER BY LAST_NAME;
결과:
FIRST_NAME HIRE_DATE
-------------------- ---------
Ellen 11-MAY-04
Sundar 24-MAR-08
Mozhe 30-OCT-05
David 25-JUN-05
Hermann 07-JUN-02
Shelli 24-DEC-05
Amit 21-APR-08
Elizabeth 24-MAR-07
...
FIRST_NAME HIRE_DATE
-------------------- ---------
Jose Manuel 07-MAR-06
Peter 09-JUL-06
Clara 11-NOV-05
Shanta 10-OCT-05
Alana 24-APR-06
Matthew 18-JUL-04
Jennifer 17-SEP-03
Eleni 29-JAN-08
107 rows selected.
여러 테이블에서 데이터 선택
여러 테이블에서 데이터를 선택하려면 조인이라는 질의를 사용합니다. 조인의 테이블은 적어도 하나의 열 이름을 공유해야 합니다.
모든 사원의 FIRST_NAME, LAST_NAME 및 DEPARTMENT_NAME을 선택하려 한다고 가정합니다. FIRST_NAME 및 LAST_NAME은 EMPLOYEES 테이블에 있고 DEPARTMENT_NAME은 DEPARTMENTS 테이블에 있는 경우 두 테이블 모두에 DEPARTMENT_ID가 있습니다. 예 2-12에서 질의를 사용할 수 있습니다.
테이블 이름 식별자는 조인의 테이블 하나에만 나타나는 열 이름에는 선택 사항이지만 두 테이블 모두에 나타나는 열 이름에는 필수입니다. 다음 질의는 예 2-12의 질의와 동일합니다.
SELECT FIRST_NAME "First",
LAST_NAME "Last",
DEPARTMENT_NAME "Dept. Name"
FROM EMPLOYEES, DEPARTMENTS
WHERE EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID
ORDER BY DEPARTMENT_NAME, LAST_NAME;
전체 열 이름을 사용하는 질의를 더 읽기 쉽게 만들려면 다음 예제에 표시된 대로 테이블 별칭을 사용합니다.
SELECT FIRST_NAME "First",
LAST_NAME "Last",
DEPARTMENT_NAME "Dept. Name"
FROM EMPLOYEES e, DEPARTMENTS d
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID
ORDER BY d.DEPARTMENT_NAME, e.LAST_NAME;
FROM 절에서 별칭을 생성하지만 다음 예제에 표시된 것처럼 앞부분에서 사용할 수 있습니다.
SELECT e.FIRST_NAME "First",
e.LAST_NAME "Last",
d.DEPARTMENT_NAME "Dept. Name"
FROM EMPLOYEES e, DEPARTMENTS d
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID
ORDER BY d.DEPARTMENT_NAME, e.LAST_NAME;
참조: Oracle Database SQL Language Reference에서 조인에 대한 자세한 내용을 참조하십시오.
예제 2-12 두 테이블에서 데이터 선택(두 개의 테이블 조인)
SELECT EMPLOYEES.FIRST_NAME "First",
EMPLOYEES.LAST_NAME "Last",
DEPARTMENTS.DEPARTMENT_NAME "Dept. Name"
FROM EMPLOYEES, DEPARTMENTS
WHERE EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID
ORDER BY DEPARTMENTS.DEPARTMENT_NAME, EMPLOYEES.LAST_NAME;
결과:
First Last Dept. Name
-------------------- ------------------------- ------------------------------
William Gietz Accounting
Shelley Higgins Accounting
Jennifer Whalen Administration
Lex De Haan Executive
Steven King Executive
Neena Kochhar Executive
John Chen Finance
...
Jose Manuel Urman Finance
Susan Mavris Human Resources
David Austin IT
...
Valli Pataballa IT
Pat Fay Marketing
Michael Hartstein Marketing
Hermann Baer Public Relations
Shelli Baida Purchasing
...
Sigal Tobias Purchasing
Ellen Abel Sales
...
Eleni Zlotkey Sales
Mozhe Atkinson Shipping
...
Matthew Weiss Shipping
106 rows selected.
질의에 연산자 및 함수 사용
질의의 select_list에는 SQL 연산자 및 SQL 함수를 포함하는 SQL 표현식이 포함됩니다. 이러한 연산자 및 함수는 테이블 데이터를 피연산자와 인수로 사용할 수 있습니다. SQL 표현식이 계산되고 계산 값이 질의 결과에 나타납니다.
참조:
-
SQL 연산자에 대한 추가 정보는 Oracle Database SQL Language Reference를 참조하십시오.
-
SQL 함수에 대한 자세한 내용은Oracle Database SQL Language Reference를 참조하십시오.
질의에 산술 연산자 사용
기본 산술 연산자(+(추가), -(빼기), \*(곱하기) 및 /(나누기)는 열 값에서 작동합니다.
예 2-13의 질의에서는 SALARY의 내림차순으로 부서 90에 소속된 각 직원의 연봉을 LAST_NAME, SALARY(월급) 및 연간 급여를 표시합니다.
예제 2-13 질의에 산술 표현식 사용
SELECT LAST_NAME,
SALARY "Monthly Pay",
SALARY * 12 "Annual Pay"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 90
ORDER BY SALARY DESC;
결과:
LAST_NAME Monthly Pay Annual Pay
------------------------- ----------- ----------
King 24000 288000
De Haan 17000 204000
Kochhar 17000 204000
질의에 숫자 함수 사용
숫자 함수는 숫자 입력을 받고 숫자 값을 반환합니다. 각 숫자 함수는 계산되는 각 행에 대해 단일 값을 반환합니다.
SQL에서 지원하는 숫자 함수의 목록은 Oracle Database SQL Language Reference를 참조하십시오.
예 2-14의 질의에서는 숫자 함수 ROUND을 사용하여 부서 100에 소속된 직원의 일급을 가장 가까운 센트로 반올림하여 표시합니다.
예 2-15의 질의에서는 숫자 함수 TRUNC를 부서 100에 소속된 각 직원의 일급을 가장 가까운 달러로 잘라서 표시합니다.
참조: Oracle Database SQL Language Reference SQL 숫자 함수에 대한 자세한 내용은
예 2-14 반올림 숫자 데이터
SELECT LAST_NAME,
ROUND (((SALARY * 12)/365), 2) "Daily Pay"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY LAST_NAME;
결과:
LAST_NAME Daily Pay
------------------------- ----------
Chen 269.59
Faviet 295.89
Greenberg 394.52
Popp 226.85
Sciarra 253.15
Urman 256.44
6 rows selected.
예제 2-15 숫자 데이터 자르기
SELECT LAST_NAME,
TRUNC ((SALARY * 12)/365) "Daily Pay"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY LAST_NAME;
결과:
LAST_NAME Daily Pay
------------------------- ----------
Chen 269
Faviet 295
Greenberg 394
Popp 226
Sciarra 253
Urman 256
6 rows selected.
질의에 연결 연산자 사용
연결 연산자(||)는 첫번째 문자열에 두번째 문자열을 추가하여 두 문자열을 하나의 문자열로 결합합니다. 예를 들어, 'a'||'b'='ab'입니다. 이 연산자를 사용하면 두 열 또는 표현식의 정보를 조회 결과의 동일한 열에 결합할 수 있습니다.
예 2-16의 질의는 선택한 각 사원의 이름, 공백 및 성을 연결합니다.
참조: 연결 연산자에 대한 자세한 내용은 Oracle Database SQL Language Reference를 참조하십시오
예제 2-16 문자 데이터 연결
SELECT FIRST_NAME || ' ' || LAST_NAME "Name"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY LAST_NAME;
결과:
Name
----------------------------------------------
John Chen
Daniel Faviet
Nancy Greenberg
Luis Popp
Ismael Sciarra
Jose Manuel Urman
6 rows selected.
질의에 문자 함수 사용
문자 함수는 문자 입력을 받습니다. 그리고 대부분 문자 값을 반환하지만 일부는 숫자 값을 반환합니다. 각 문자 함수는 계산되는 각 행에 대해 단일 값을 반환합니다.
SQL에서 지원하는 문자 함수의 목록은 Oracle Database SQL Language Reference를 참조하십시오.
UPPER, INITCAP 및 LOWER 함수는 문자 인수를 각각 대문자로, 첫 글자를 대문자를 대문자로 및 소문자로 표시합니다.
Example 2-17의 질의에서는 LAST_NAME은 대문자로 표시하고, FIRST_NAME은 첫 글자 만 대문자로 표시하고 나머지를 모두 소문자로 표시하고, EMAIL은 소문자로 표시됩니다.
참조: Oracle Database SQL Language Reference SQL 문자 함수에 대한 자세한 내용
예 2-17 문자 데이터 대소문자 변경
SELECT UPPER(LAST_NAME) "Last",
INITCAP(FIRST_NAME) "First",
LOWER(EMAIL) "E-Mail"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY EMAIL;
결과:
Last First E-Mail
------------------------- -------------------- -------------------------
FAVIET Daniel dfaviet
SCIARRA Ismael isciarra
CHEN John jchen
URMAN Jose Manuel jmurman
POPP Luis lpopp
GREENBERG Nancy ngreenbe
6 rows selected.
질의에 날짜/시간 함수 사용
Datetime 함수는 DATE, 시간 기록 및 간격 값에 작동합니다. 각 날짜/시간 함수는 계산되는 각 행에 대해 단일 값을 반환합니다.
SQL에서 지원하는 날짜/시간 함수의 목록과 설명이 Oracle Database SQL Language Reference를 참조하십시오.
Oracle Database는 각 DATE 및 시간 기록 값에 대해 다음 정보를 저장합니다.
-
Year
-
Month
-
날짜
-
Hour
-
분
-
초
또한 Oracle Database는 각 시간 기록 값에 대해 초의 소수 부분도 저장합니다. 이 부분에서는 자릿수를 지정할 수 있습니다. 시간대도 저장하려면 TIMESTAMP WITH TIME ZONE 또는 TIMESTAMP WITH LOCAL TIME ZONE 데이터 유형을 사용합니다.
DATE 데이터 유형에 대한 자세한 내용은 Oracle Database SQL Language Reference를 참조하십시오.
TIMESTAMP 데이터 유형에 대한 자세한 내용은 Oracle Database SQL Language Reference를 참조하십시오.
기타 시간 기록 데이터 유형 및 간격 데이터 유형에 대한 자세한 내용은 Oracle Database SQL Language Reference를 참조하십시오.
예 2-18의 질의에서는 EXTRACT 및 SYSDATE 함수를 사용하여 부서 100에 소속된 각 직원이 고용된 년 수를 표시합니다. SYSDATE 함수는 시스템 시계의 현재 날짜를 DATE 값으로 반환합니다. SYSDATE 함수에 대한 자세한 내용은 Oracle Database SQL Language Reference를 참고하세요. EXTRACT 함수에 대한 자세한 내용은 Oracle Database SQL Language Reference를 참고하세요.
Example 2-19의 질의는 SYSTIMESTAMP 함수를 사용하여 현재 시스템 날짜 및 시간을 표시합니다. SYSTIMESTAMP 함수는 TIMESTAMP 값을 반환합니다. SYSTIMESTAMP 함수에 대한 자세한 내용은 Oracle Database SQL Language Reference를 참고하세요.
질의의 FROM 절에 있는 테이블 DUAL은 Oracle Database가 데이터 딕셔너리와 함께 자동으로 생성하는 한 행짜리 테이블입니다. SELECT 문이 포함된 상수 표현식을 계산하려면 DUAL에서 선택합니다. DUAL에는 행이 하나뿐이므로 상수가 한 번만 반환됩니다. DUAL에서 선택하는 방법은 Oracle Database SQL Language Reference를 참조하십시오.
참조: Oracle Database SQL Language Reference에서 SQL datetime 함수에 대한 자세한 내용을 참조하십시오.
예제 2-18 날짜 사이의 연도 수 표시
SELECT LAST_NAME,
(EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM HIRE_DATE)) "Years Employed"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY "Years Employed";
결과:
LAST_NAME Years Employed
------------------------- --------------
Popp 5
Urman 6
Chen 7
Sciarra 7
Greenberg 10
Faviet 10
6 rows selected.
예 2-19 시스템 날짜 및 시간 표시
SELECT EXTRACT(HOUR FROM SYSTIMESTAMP) || ':' ||
EXTRACT(MINUTE FROM SYSTIMESTAMP) || ':' ||
ROUND(EXTRACT(SECOND FROM SYSTIMESTAMP), 0) || ', ' ||
EXTRACT(MONTH FROM SYSTIMESTAMP) || '/' ||
EXTRACT(DAY FROM SYSTIMESTAMP) || '/' ||
EXTRACT(YEAR FROM SYSTIMESTAMP) "System Time and Date"
FROM DUAL;
결과는 현재 SYSTIMESTAMP 값에 따라 다르지만 다음 형식으로 표시됩니다.
System Time and Date
-------------------------------------------------------------------
18:17:53, 12/27/2012
질의에 변환 함수 사용
변환 함수는 한 데이터 유형을 다른 데이터 유형으로 변환합니다.
SQL에서 지원하는 변환 함수의 목록은 Oracle Database SQL Language Reference를 참조하십시오.
예 2-20의 질의에서는 TO_CHAR 함수를 사용하여 HIRE_DATE 값(유형 DATE)을 FMMonth DD YYYY 형식의 문자 값으로 변환합니다. FM은 월 이름에서 선행 및 후행 공백을 제거합니다. FMMonth DD YYYY은 날짜시간 형식 모델의 예입니다. 날짜/시간 형식 모델에 대한 자세한 내용은 Oracle Database SQL Language Reference를 참조하세요.
예 2-21의 질의에서는 TO_NUMBER 함수를 사용하여 POSTAL_CODE 값(VARCHAR2 유형의 값)을 계산에 사용하는 NUMBER 유형의 값으로 변환합니다.
참조:
-
SQL 변환 함수에 대한 자세한 내용은 Oracle Database SQL Language Reference를 참조하십시오.
예 2-20 형식 템플리트를 사용하여 날짜를 문자로 변환
SELECT LAST_NAME,
HIRE_DATE,
TO_CHAR(HIRE_DATE, 'FMMonth DD YYYY') "Date Started"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY LAST_NAME;
결과:
LAST_NAME HIRE_DATE Date Started
------------------------- --------- -----------------
Chen 28-SEP-05 September 28 2005
Faviet 16-AUG-02 August 16 2002
Greenberg 17-AUG-02 August 17 2002
Popp 07-DEC-07 December 7 2007
Sciarra 30-SEP-05 September 30 2005
Urman 07-MAR-06 March 7 2006
6 rows selected.
예 2-21 문자를 숫자로 변환
SELECT CITY,
POSTAL_CODE "Old Code",
TO_NUMBER(POSTAL_CODE) + 1 "New Code"
FROM LOCATIONS
WHERE COUNTRY_ID = 'US'
ORDER BY POSTAL_CODE;
결과:
CITY Old Code New Code
------------------------------ ------------ ----------
Southlake 26192 26193
South Brunswick 50090 50091
Seattle 98199 98200
South San Francisco 99236 99237
4 rows selected.
질의에 집계 함수 사용
집계 함수는 하나의 행 그룹을 가져와서 단일 결과 행을 반환합니다 행 그룹은 전체 테이블 또는 뷰일 수 있습니다.
SQL에서 지원하는 집계 함수의 목록 및 설명은 Oracle Database SQL Language Reference를 참조하십시오.
각 그룹에 대한 결과가 있는 하나 이상의 열을 기준으로 질의 결과를 그룹화하는 GROUP BY 절과 함께 사용하는 경우 집계 함수가 특히 유용합니다.
예 2-22의 질의는 COUNT 함수와 GROUP BY 절을 사용하여 각 관리자에게 보고하는 인원 수를 표시합니다. 와일드 카드 문자 *는 전체 레코드를 나타냅니다. 예제 2-22에서는 한 직원이 관리자에게 보고하지 않는다고 표시합니다. 다음 질의에서는 이 직원의 이름, 성 및 직책을 선택합니다.
COLUMN FIRST_NAME FORMAT A10;
COLUMN LAST_NAME FORMAT A10;
COLUMN JOB_TITLE FORMAT A10;
SELECT e.FIRST_NAME,
e.LAST_NAME,
j.JOB_TITLE
FROM EMPLOYEES e, JOBS j
WHERE e.JOB_ID = j.JOB_ID
AND MANAGER_ID IS NULL;
결과:
FIRST_NAME LAST_NAME JOB_TITLE
---------- ---------- ----------
Steven King President
질의에서 집계 값이 지정된 조건에 맞는 행만 반환하도록 하려면 질의의 HAVING 절에서 집계 함수를 사용합니다.
예 2-23의 질의에서는 각 부서가 매년 봉급으로 지출하는 금액가 1,000,000달러를 초과하는 부서의 금액만 표시합니다.
예 2-24의 질의에서는 여러 집계 함수를 사용하여 각 JOB_ID의 봉급에 대한 통계를 표시합니다.
참조: Oracle Database SQL Language Reference SQL 집계 함수에 대한 자세한 내용
예제 2-22 각 그룹의 행 수 계산
SELECT MANAGER_ID "Manager",
COUNT(*) "Number of Reports"
FROM EMPLOYEES
GROUP BY MANAGER_ID
ORDER BY MANAGER_ID;
결과:
Manager Number of Reports
---------- -----------------
100 14
101 5
102 1
103 4
108 5
114 5
120 8
121 8
122 8
123 8
124 8
145 6
146 6
147 6
148 6
149 6
201 1
205 1
1
19 rows selected.
예 2-23 조건을 충족하는 행으로 집계 함수를 제한
SELECT DEPARTMENT_ID "Department",
SUM(SALARY*12) "All Salaries"
FROM EMPLOYEES
HAVING SUM(SALARY * 12) >= 1000000
GROUP BY DEPARTMENT_ID;
결과:
Department All Salaries
---------- ------------
50 1876800
80 3654000
예제 2-24: 집계 함수를 사용하여 통계 정보 얻기
SELECT JOB_ID,
COUNT(*) "#",
MIN(SALARY) "Minimum",
ROUND(AVG(SALARY), 0) "Average",
MEDIAN(SALARY) "Median",
MAX(SALARY) "Maximum",
ROUND(STDDEV(SALARY)) "Std Dev"
FROM EMPLOYEES
GROUP BY JOB_ID
ORDER BY JOB_ID;
결과:
JOB_ID # Minimum Average Median Maximum Std Dev
---------- ---------- ---------- ---------- ---------- ---------- ----------
AC_ACCOUNT 1 8300 8300 8300 8300 0
AC_MGR 1 12008 12008 12008 12008 0
AD_ASST 1 4400 4400 4400 4400 0
AD_PRES 1 24000 24000 24000 24000 0
AD_VP 2 17000 17000 17000 17000 0
FI_ACCOUNT 5 6900 7920 7800 9000 766
FI_MGR 1 12008 12008 12008 12008 0
HR_REP 1 6500 6500 6500 6500 0
IT_PROG 5 4200 5760 4800 9000 1926
MK_MAN 1 13000 13000 13000 13000 0
MK_REP 1 6000 6000 6000 6000 0
PR_REP 1 10000 10000 10000 10000 0
PU_CLERK 5 2500 2780 2800 3100 239
PU_MAN 1 11000 11000 11000 11000 0
SA_MAN 5 10500 12200 12000 14000 1525
SA_REP 30 6100 8350 8200 11500 1524
SH_CLERK 20 2500 3215 3100 4200 548
ST_CLERK 20 2100 2785 2700 3600 453
ST_MAN 5 5800 7280 7900 8200 1066
19 rows selected.
질의에 NULL 관련 함수 사용
NULL 관련 함수를 사용하면 NULL 값을 쉽게 처리할 수 있습니다.
SQL에서 지원하는 NULL 관련 함수의 목록과 내용은 Oracle Database SQL Language Reference를 참조하십시오.
예 2-25의 질의에서는 성이 'B'로 시작하는 직원의 성 및 커미션을 반환합니다. 직원이 커미션을 받지 않으면 즉, COMMISSION_PCT가 NULL이면 NVL 함수는 NULL을 "Not Applicable"로 대체합니다.
Example 2-26의 질의에서는 NVL2 함수를 통해 성이 'B'로 시작하는 직원의 성, 급여 및 수입을 반환합니다. COMMISSION_PCT가 NULL이 아니면 수입은 급여와 커미션을 더한 금액이고 COMMISSION_PCT가 NULL이면 수입은 급여뿐입니다.
참조:
-
Oracle Database SQL Language Reference - NVL 함수에 대한 자세한 내용
-
NVL2 함수에 대한 자세한 내용은 Oracle Database SQL Language Reference를 참조하십시오
예제 2-25 NULL 값에 대한 문자열 대체
SELECT LAST_NAME,
NVL(TO_CHAR(COMMISSION_PCT), 'Not Applicable') "COMMISSION"
FROM EMPLOYEES
WHERE LAST_NAME LIKE 'B%'
ORDER BY LAST_NAME;
결과:
LAST_NAME COMMISSION
------------------------- ----------------------------------------
Baer Not Applicable
Baida Not Applicable
Banda .1
Bates .15
Bell Not Applicable
Bernstein .25
Bissot Not Applicable
Bloom .2
Bull Not Applicable
9 rows selected.
예제 2-26 NULL 값과 Not NULL 값에 대해 다른 표현식 지정
SELECT LAST_NAME, SALARY,
NVL2(COMMISSION_PCT, SALARY + (SALARY * COMMISSION_PCT), SALARY) INCOME
FROM EMPLOYEES WHERE LAST_NAME LIKE 'B%'
ORDER BY LAST_NAME;
결과:
LAST_NAME SALARY INCOME
------------------------- ---------- ----------
Baer 10000 10000
Baida 2900 2900
Banda 6200 6820
Bates 7300 8395
Bell 4000 4000
Bernstein 9500 11875
Bissot 3300 3300
Bloom 10000 12000
Bull 4100 4100
9 rows selected.
질의에 CASE 표현식 사용
CASE 표현식을 사용하면 SQL 문에서 서브 프로그램을 호출하지 않고도 IF ... THEN ... ELSE 논리를 사용할 수 있습니다 CASE 표현식에는 단순 및 검색의 두 종류가 있습니다.
예 2-27의 질의는 간단한 CASE 표현식을 사용하여 각 국가 코드에 대한 국가 이름을 표시합니다.
예 2-28의 질의는 검색된 CASE 표현식을 사용하여 근속 기간과 연관된 날짜 범위를 기준으로 제안된 임금 인상(15%, 10%, 5%, 0%)을 표시합니다.
참조:
-
CASE 표현식에 대한 자세한 내용은 Oracle Database SQL Language Reference를 참조하십시오.
-
CASE 표현식에 대한 자세한 내용은 Oracle Database PL/SQL Language Reference를 참조하십시오.
예제 2-27: Query에서 간단한 CASE 식 사용
SELECT UNIQUE COUNTRY_ID ID,
CASE COUNTRY_ID
WHEN 'AU' THEN 'Australia'
WHEN 'BR' THEN 'Brazil'
WHEN 'CA' THEN 'Canada'
WHEN 'CH' THEN 'Switzerland'
WHEN 'CN' THEN 'China'
WHEN 'DE' THEN 'Germany'
WHEN 'IN' THEN 'India'
WHEN 'IT' THEN 'Italy'
WHEN 'JP' THEN 'Japan'
WHEN 'MX' THEN 'Mexico'
WHEN 'NL' THEN 'Netherlands'
WHEN 'SG' THEN 'Singapore'
WHEN 'UK' THEN 'United Kingdom'
WHEN 'US' THEN 'United States'
ELSE 'Unknown'
END COUNTRY
FROM LOCATIONS
ORDER BY COUNTRY_ID;
결과:
ID COUNTRY
-- --------------
AU Australia
BR Brazil
CA Canada
CH Switzerland
CN China
DE Germany
IN India
IT Italy
JP Japan
MX Mexico
NL Netherlands
SG Singapore
UK United Kingdom
US United States
14 rows selected.
예제 2-28: Query에서 검색된 CASE 식 사용
SELECT LAST_NAME "Name",
HIRE_DATE "Started",
SALARY "Salary",
CASE
WHEN HIRE_DATE < TO_DATE('01-Jan-03', 'dd-mon-yy')
THEN TRUNC(SALARY*1.15, 0)
WHEN HIRE_DATE >= TO_DATE('01-Jan-03', 'dd-mon-yy') AND
HIRE_DATE < TO_DATE('01-Jan-06', 'dd-mon-yy')
THEN TRUNC(SALARY*1.10, 0)
WHEN HIRE_DATE >= TO_DATE('01-Jan-06', 'dd-mon-yy') AND
HIRE_DATE < TO_DATE('01-Jan-07', 'dd-mon-yy')
THEN TRUNC(SALARY*1.05, 0)
ELSE SALARY
END "Proposed Salary"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY HIRE_DATE;
결과:
Name Started Salary Proposed Salary
------------------------- --------- ---------- ---------------
Faviet 16-AUG-02 9000 10350
Greenberg 17-AUG-02 12008 13809
Chen 28-SEP-05 8200 9020
Sciarra 30-SEP-05 7700 8470
Urman 07-MAR-06 7800 8190
Popp 07-DEC-07 6900 6900
6 rows selected.
질의에 DECODE 함수 사용
DECODE 함수는 표현식을 여러 검색 값과 비교합니다. 표현식 값이 검색 값과 일치할 때마다 DECODE는 해당 검색 값과 연관된 결과를 반환합니다. DECODE가 일치를 찾지 못하면 기본값(지정된 경우) 또는 NULL(기본값이 지정되지 않은 경우)을 반환합니다.
예 2-29의 질의에서는 DECODE 함수를 사용해서 세 가지 다른 직무에 대한 제안된 임금 인상을 표시합니다. 표현식은 JOB_ID이고, 검색 값은 'PU_CLERK', 'SH_CLERK' 및 'ST_CLERK'이며, 기본값은 SALARY입니다.
주: DECODE 함수의 인수는 SQL 숫자 또는 문자 유형일 수 있습니다. Oracle은 비교하기 전에 표현식과 각 검색 값을 첫번째 검색 값의 데이터 유형으로 자동 변환합니다. Oracle은 반환 값을 첫번째 결과와 동일한 데이터 유형으로 자동 변환합니다. 첫번째 결과에서 데이터 유형이 CHAR이거나 첫번째 결과가 NULL인 경우 Oracle은 반환 값을 데이터 유형 VARCHAR2로 변환합니다.
참조:
-
DECODE 함수에 대한 자세한 내용은 Oracle Database SQL Language Reference를 참조하십시오
예제 2-29 질의에 DECODE 함수 사용
SELECT LAST_NAME, JOB_ID, SALARY,
DECODE(JOB_ID,
'PU_CLERK', SALARY * 1.10,
'SH_CLERK', SALARY * 1.15,
'ST_CLERK', SALARY * 1.20,
SALARY) "Proposed Salary"
FROM EMPLOYEES
WHERE JOB_ID LIKE '%_CLERK'
AND LAST_NAME < 'E'
ORDER BY LAST_NAME;
결과:
LAST_NAME JOB_ID SALARY Proposed Salary
------------------------- ---------- ---------- ---------------
Atkinson ST_CLERK 2800 3360
Baida PU_CLERK 2900 3190
Bell SH_CLERK 4000 4600
Bissot ST_CLERK 3300 3960
Bull SH_CLERK 4100 4715
Cabrio SH_CLERK 3000 3450
Chung SH_CLERK 3800 4370
Colmenares PU_CLERK 2500 2750
Davies ST_CLERK 3100 3720
Dellinger SH_CLERK 3400 3910
Dilly SH_CLERK 3600 4140
11 rows selected.