출처 : http://naver.kaist.ac.kr/oracle_sql/s02.htm
1. 기본적인 Query문
♣ Syntax
SELECT [DISTINCT] {*,column [alias]…..}
FROM 테이블명
WHERE Query조건(들)
[ORDER BY {column, 표현식} {ASC|DESC}];
◈ 4개의 기본적인 절로 구성
절 | 설 명 |
SELECT절 | 적어도 한 개의 column으로 구성된 리스트이다. |
FROM절 | 대상 테이블을 적는다. |
WHERE절 | Query조건을 만족하는 행들만을 Return하도록 한다. |
ORDER BY | Query된 행들이 Display되는 순서를 명시한다. |
♣ SQL 명령 작성 규칙
◈SQL 명령어들은 여러 라인에 걸쳐 입력 가능하다.
◈절들은 보통 판독성과 편집의 용이를 추구하기 위해 각기 다른 라인에 적는다.
◈명령어는 여러 라인에 걸쳐 분리할 수 없으며 약식표기 할 수 없다.
◈키워드 및 명령어는 전형적으로 대문자로 입력하며 모든 다른 단어들은 예를 들자면 테이블 명,
column 명 등은 소문자로 입력한다.
◈SQL 명령어들은 대소문자 구별이 불필요하다.
◈SQL 명령은 SQL 프롬프트에서 입력하며 뒤에 오는 라인들은 번호가 부여되는데
이를 SQL 버퍼라고 부른다.
♣ 버퍼내에서 SQL 문장을 실행시키는 방법
◈마지막 절 끝에 세미콜론(;)을 찍는다.
◈버퍼 내에 있는 마지막 라인에 세미콜론을 찍거나 슬래쉬(/)를 입력한다.
◈프롬프트에서 슬래쉬를 입력한다.
◈SQL 프롬프트에서 SQL *Plus의 RUN 명령을 입력한다.
♣ 모든 column, 모든 행 선택
◈가장 기본적인 SELECT 문장은 아래사항을 포함해야 한다.
◈Display 시킬 column들을 명시하기 위한 SELECT절
◈SELECT절에서 명시한 column들을 갖고 있는 테이블을 명시하기 위한 FROM절.
♠실습 : DEPT테이블로부터 모든 행과 모든 column을 출력 하시오
SQL> SELECT * FROM S_DEPT; |
♣ 특정 column 선택
◈SELECT절에서 column명들을 명시하고 콤마에 의해 분리 함으로서 특정 column들만 출력되게
Query를 제한할 수 있다.
◈테이블의 column명을 알기 위해 SQL*Plus의 DESCRIBE명령을 사용한다.
◈DESCRIBE 명령을 사용하여 column명을 확인할 수 있다.
◈SELECT 절에 column명들을 입력한다.
◈콤마를 사용하여 column들을 분리한다.
◈보기 원하는 순서대로 column명을 적는다.
※ Default column Heading
◈ 레이블 정렬
-좌측 정렬 : 날짜 및 문자 데이터
-우측 정렬 : 숫자 데이터
◈ 레이블은 기본적으로 대문자로 보여진다.
♠실습 : DEPT테이블를 DESCRIBE 명령으로 column들을 조회한 후 부서명과 부서번호를 출력 하시오.
SQL> desc s_dept; |
2. 산술표현식
◈데이터가 출력 되는 방식을 변경하거나, 계산을 수행하고자 할 때 사용할 수 있다.
◈산술 표현식은 column명, 상수 숫자 값 및 산술 연산자를 포함한다.
♣ 산술 연산자
◈SQL에서 이용 가능한 산술 연산자는 +, -, *, / 이며
◈FROM절을 제외한 모든 SQL 문장에서 산술연산자를 사용할 수 있다
♠실습 : 모든 사원의 연봉액수 및 commission percentage를 보여주기 위해 곱셈 연산자를 사용하라.
SQL> select last_name, salary*12, commission_pct from s_emp; |
※Column SALARY*12의 계산 결과는 원래 테이블의 새로운 column이 아니라 단지 출력 용도로만
사용되고 있음을 주시하라.
♣ 연산자 우선순위
◈곱셈 및 나눗셈이 덧셈 및 뺄셈보다 우선한다.
◈괄호는 우선순위 평가를 변경 시 또는 문장들을 명확하게 하기 위해 사용된다.
◈같은 우선순위의 연산자들은 왼쪽에서 오른쪽으로 수행된다.
♠실습 : 사원의 이름, 급여, 연봉(급여의 12달분과 $100의 보너스의 합)을 출력 하시오.
SQL> select last_name, salary, 12*salary+100 from s_emp; |
♠실습 : 사원의 이름, 급여, 연봉을 출력 하시오. 단, 월 보너스가 $100이다.
SQL> select last_name, salary, 12*(salary+100) from s_emp; |
♣ 합성 연산자
◈사용자는 합성 연산자( || )를 사용하여 column을 다른 column, 산술 표현식 또는 상수 값에
연결하여 문자 형태로 표현할 수 있다.
◈연산자 양편의 column들은 단일 결과 column으로 출력된다.
◈문자 표현식의 결과에 의해 새로운 column을 생성한다.
♠실습 : Column Heading Employees로 하여 사원의 완전한 이름(Full name)을 Display 하라.
SQL> select first_name||last_name AS "사원이름" from s_emp; |
♣ 리터럴 문자열
◈리터럴이란 column명, alias가 아닌 SELECT리스트에 포함된 문자,표현식 또는 숫자.
◈리터럴이란 column명, alias가 아닌 SELECT 리스트에 포함된 문자, 표현식 또는 숫자이다.
◈날짜 및 문자 값은 단일 인용부호(‘‘)로 둘러 쌓여야 하지만, 숫자 리터럴은 그럴 필요가 없다.
◈각 문자 column은 되돌려지는 각 행 당 하나씩 출력된다.
♠실습 : Column heading을 ’로 하고 사원의 이름(Full name)과 직급을 출력 하시오.
이때 구두점을 추가하여 이름과 직급이 구별되도록 하라.
SQL> select first_name||last_name||'.'||title "사원명/직급" from s_emp; |
3. Column Aliases
◈Column alias는 column의 Heading을 새로이 변경한다.
◈column명 바로 뒤에 온다.(column명과 alias사이에 AS키워드를 사용할 수도 있다.)
◈이중 인용부호(Double quotation)는 alias가 공백, 특수문자를 포함할 경우와 대소문자 구분이
필요할 경우 사용된다.
◈검색결과를 Display할 때, SQL*Plus는 보통 선택한 column명을 heading으로 사용한다.
◈column alias을 사용하여 column heading을 변경할 수 있다.
◈alias는 SELECT 리스트상에서 column명 뒤 공백을 사용하여 구분하고 alias를 적는다.
◈기본값으로 alias heading은 대문자로 출력되고 공백을 포함할 수 없는데 alias가 이중 인용부호
안에 적혀 있을 시는 예외이다.
♠실습 : 사원의 성,월급여 및 연봉을 Display 하라. 연봉은 월급여에다 월보너스금액인 $100을
더한 데다 12를 곱하여 구하라. 그 column의 heading을 ANNUAL_SALARY로 출력하라
SQL> select last_name, salary, 12*(salary+100) AS ANNUAL_SALARY |
※ Note 사용자는 ANSI SQL92의 표준을 준수하기 위해 alias앞에 AS 키워드를 포함시킬 수 있다.
♣ 이중인용 부호(“ “)를 갖고 있는 column alias
◈alias가 공백,특수문자(예 #또는_)를 포함하거나 또는 대소문자를 구분해 한다면
alias은 이중 인용부호(" ")로 에워싸라.
♠실습 : 위 예에서 heading을 ’로 출력 하시오.(이중인용 부호 사용)
SQL> select last_name, salary, 12*(salary+100) "Annual Salary" |
4. NULL 값 관리와 NVL 함수
◈column에 데이터 값이 없으면 그 값 자체가 NULL 또는 NULL 값을 포함하고있다.
◈NULL 값은 이용할 수 없거나 할당되지 않은 값이며, NULL 값이란 공백이란 문자이다.{0은 숫자}
◈NULL 값은 1바이트의 내부저장 장치를 오버헤드로 사용하고 있으며 어떠한 datatype column들이라도
NULL 값을 포함할 수 있다
◈ [column이 not NULL로 정의되어 있거나 테이블 생성시 primary key로 정의되어 있을 시는 예외]
◈산술 표현식에서의 NULL 값 표현식에서 column값이 NULL 값이면 결과는 NULL이 된다.
♠실습 : 성, 월급여, 직급, 및 계산된 상여금을 출력.
SQL> select last_name, title, salary*commission_pct/100 COMM |
♣ NVL함수
◈null값을 다른 값으로 대치하기 위해 NVL함수를 사용한다.
◈Syntax
NVL (expr1, expr2)
expr1 : NULL값을 포함할 수 있는 값이거나 표현식이다.
expr2 : NULL값을 대치 시 사용할 값
◈NULL값을 전환하기 위한 NVL함수 예
datatype | 전환 예 |
NUMBER | NVL(number_column,9) |
DATE | NVL(date_column, '01-JAN-95') |
CHAR or VARCHAR2 | NVL(characrter_column, 'Unavailable') |
♠실습 : 위의 예에서 사원에 대한 상여금 계산시 NULL값을 0으로 대치하시오.
SQL> select last_name,title, salary*NVL(commission_pct,0)/100 COMM |
5. 중복 행 선택 방지(DISTINCT 키워드)
◈기본적으로 질의문은 중복된 행을 출력.
◈SELECT 절에서 SELECT 명령어 바로 뒤에 DISTINCT 키워드를 입력하면 중복 행을 모두 제거한다.
◈DISTINCT는 SELECT 모든 선택된 column에 영향을 준다.
♠실습 : s_emp테이블의 모든 직급을 출력.
SQL> select DISTINCT title FROM s_emp; |
♠실습 : S_EMP 테이블에서 직급과 부서번호가 다른 모든 사원을 출력 하시오.
SQL> SELECT DISTINCT dept_id, title FROM s_emp; |
6. ORDER BY 절에 의한 사용한 행들의 정렬
◈ORDER BY절은 SELECT 명령에서 마지막에 위치.
◈기본적인 정렬순서는 올림차순.
◈사용자는 표현식 또는 alias에 의하여 정렬.
◈NULL값은 다음과 같이 출력.
- 올림차순시 가장 마지막에 옴.
- 내림차순시 가장 먼저옴.
◈Syntax
SELECT expr
FROM table Default
[ORDER BY {column, expr} [ASC||DESC]];
♣ 기본적인 데이터의 정렬
♠실습 : 모든 사원의 이름 부서 번호, 입사일의 정보를 사원의 이름을 기준으로 출력.
SQL> SELECT last_name, dept_id, start_date FROM s_emp |
◈나열한 column의 위치를 이용하여 결과를 정렬할 수 있다.()
◈이는 긴 표현식에 의한 정렬 시 유용하다. 즉, SELECT 상에서 표현식의 위치만 명시하면 된다.
♠실습 : 사원명세를 Display 시키되 가장 연봉이 적은 순으로 정렬하라.
SQL> SELECT last_name, salary*12 FROM s_emp |
♣ Multiple Column에 의한 정렬
◈한 개 이상의 column에 의해 Query 결과를 정렬할 수 있다.
◈이는 ORDER BY절에서 column명을 명시하고 콤마를 사용하여 column명을 구분한다
♠실습 : 모든 사원을 부서번호부터 정렬하고, 급여가 제일 많은 사람부터 되도록 하라.
SQL> SELECT last_name, dept_id, salary FROM s_emp |
7. 조건 Query(선택할 행의 제한)
◈WHERE절을 사용하여 행들을 제한할 수 있다
◈WHERE절은 FROM절 다음에 온다.
◈조건은 아래의 것으로 구성된다.
- column 명, 표현식, 상수, 비교 연산자, 문자(Literal)
♣ Syntax
SELECT expr
FROM table
[ORDER BY condition]
[ORDER BY {column, expr} [ASC||DESC]];
◈ condition은 column명, 표현식, 상수 및 비교연산자로 구성된다
♣ 비교연산자
◈비교 연산자들은 2가지 범주로 나누어지는데 즉 논리 연산자와 SQL 연산자이다.
◈이런 비교 연산자들은 하나의 표현식을 다른 하나의 표현식과 비교하기 위해 WHERE절에서 사용한다.
◈Syntax
...WHERE expr operator value
◈논리 연산자는 =, >, >=, <, <= 조건을 check한다.
♣ SQL 연산자
연산자 | 의미 |
BETWEEN...AND... | 두 개의 값 사이(두개의 값도 포함) |
IN(list) | 리스트의 값중 어느 하나라도 일치 |
LIKE | 문자 형태와 일치 |
IS NULL | 널값인 경우 |
◈모든 Datatype에 대해 연산가능한 4가지의 SQL연산자가 있다.
◈LINK연산자는 어떤 경우 BETWEEN비교 연산자와 유사하게 이용된다.
♣논리 연산자 : AND, OR, NOT
♣부정 논리 연산자
연산자 | 설명 |
!= | 같지 않는(VAX,UNIX,PC) |
^= | 같지 않는(IBM) |
<> | 같지 않는(모든 운영체제) |
NOT colname = | 같지 않는 |
NOT colname > | ∼보다 크지 않는 |
♣ 부정 SQL 연산자
연산자 | 설명 |
NOT BETWEEN...AND... | 두 개의 명시된 값 사이가 아닌 |
NOT IN(list) | 명시된 값의 리스트에 없는 |
NOT LIKE | 비교 스트링과 같지 않는 |
IS NOT NULL | 널값이 아닌 |
◈ 만약 사용자가 알려진 값을 널값과 비교하자면 IS 또는 IS NOT NULL 비교 연산자를 사용한다.
널값을 다른 연산자를 사용해 비교하면 결과는 항상 FALSE이다.
◈예를 들자면 COMM!=NULL은 항상 거짓이다. 왜냐하면 널값은 어떤 다른값과 같거나 같지 않을
수가 없기 때문이다.
♠실습 : WHERE 조건의 예
연산자 사용 예 | 설 명 |
WHERE BR_CODE 〓 501 | BR_CODE가 501인것 |
WHERE BR_CODE != 501 또는(<> 501) | BR_CODE가 501이 아닌것 |
WHERE BR_CODE 〉 501 | BR_CODE가 501보다 큰것 |
WHERE BR_CODE 〈〓 501 | BR_CODE가 501이하인것 |
WHERE BR_CODE BETWEEN 510 AND 520 | BR_CODE가 510과 520사이 |
WHERE BR_CODE NOT BETWEEN 510 AND 520 | BR_CODE가 510과 520사이가 아닌것 |
WHERE BR_CODE IN (510, 520) | BR_CODE가 510과 520인것 |
WHERE JOB_DATE LIKE '%95' | JOB_DATE가 '95년도 인것※ LIKE 는 CHAR나 DATE TYPE에만 사용이 가능하다 |
WHERE CHUL_ID IS NULL | CHUL_ID가 NULL인것 |
WHERE CHUL_ID IS NOT NULL | CHUL_ID가 NULL이 아닌것 |
◈WHERE문 내에서 AND와OR를 조합하여 여러가지 조건문을 만들어 사용할수 있다.
◈LINK연산자는 어떤 경우 BETWEEN비교 연산자와 유사하게 이용된다.
◈만약 사용자가 알려진 값을 널값과 비교하자면 IS 또는 IS NOT NULL 비교 연산자를 사용한다.
◈널값을 다른 연산자를 사용해 비교하면 결과는 항상 FALSE이다.
예를 들자면 COMM!=NULL은 항상 거짓이다.
왜냐하면 널값은 어떤 다른값과 같거나 같지 않을 수가 없기 때문이다.
♣ 문자 스트링과 날짜
◈문자 스트링과 날짜는 단일 인용부호(Single quotation)에 의해 둘러 쌓인다.
◈숫자값은 인용부호가 필요 없다.
◈문자값은 대소문자 구분이 필요하다.
◈기본 날짜 형신은 'DD-MON-YY'이다.
◈문자 스트링과 날짜는 WHERE절을 단일 인용 부호('')에 의해 에워 쌓여야 한다.
♠실습 : 사원 성이 ‘김’인 사원의 이름과, 성, 직책을 출력 하시오.
SQL> SELECT first_name, last_name, title FROM s_emp |
♣ BETWEEN 연산자
◈어떤 범위내의 값에 포함되었는지를 CHECK하기 위해 BETWEEN 연산자를 사용한다.
◈사용자는 BETWEEN 연산자를 사용하여 어느 범위의 값을 가진 행들을 Display 할 수 있다.
◈사용자가 명시하는 범위는 하한값과 상한값을 포함한다.
♠실습 : 입사일자가 1991년 5월 9일에서 1991년 6월 17일 사이에 있는 사원의 성,이름 및 입사일자를
Display 한다.
/* DATE type이 영문인 경우 */ |
♣ IN 연산자
◈리스트 상의 값에 포함되었는지를 CHECK하기 위해 IN을 사용한다.
♠실습 : 지역번호가 1이거나 3인 부서들의 부서번호,부서명,지역번호를 출력 하시오.
SQL> SELECT id,name,region_id FROM s_dept |
♣ LIKE 연산자
◈유효한 Query 스트링값으로 와일드카드 사용시 LIKE 연산자를 사용한다.
◈LIKE 연산자는 BETWEEN 비교연산자와 유사하게 이용된다.
◈Query 조건은 리터럴 문자 또는 숫자를 포함할 수 있다.
◈%(와0개 이상의 어떤 문자를 의미한다.) “_”(단일문자를 의미한다.)
기호는 리터럴 문자와 어떤 조합으로도 이용 가능하다.
◈사용자가 “_” 문자를 검색하고자할 경우에는 ESCAPE 명령어를 사용한다.
♠실습 : 성이 “M”자로 시작하는 모든 사원의 성을 출력 하시오.
SQL> SELECT DEPT_ID, FIRST_NAME, LAST_NAME |
♠실습 : 1991년도에 입사한 사원의 입사일자를 출력 하시오.
SQL> SELECT last_name, start_date |
♠실습 : 고객이름에 “X_Y”를 갖는 고객 이름을 출력 하시오.
(Test를 위하여 다음에 배울 Update문을 먼저 사용하였다)
SQL> update s_customer SQL> SELECT name |
♣ IS NULL 연산자
◈IS NULL 연산자를 사용해 NULL값을 Check한다.
◈반드시 = 연산자를 사용하여서는 안된다.
♠실습 : 담당 영업사원를 갖고 있지 않는 모든 고객들의 고객번호, 고객이름 및 신용도를 출력 하시오.
SQL> SELECT id,name,credit_rating |
8. 다중 조건에 의한 Query와 우선순위
◈여러개의 질문조건들을 묶어 복잡한 질문조건을 명시할 필요가 있는데 이때 AND와 OR연산자가
복합논리 표현식을 만들기 위해 사용된다.
◈AND연산자는 모든 조건이 참일시 참이고 OR연산자는 어느 하나의 조건이라도 참일시 참이다.
♠실습 : 부서번호 41에 근무하는 모든 재고 담당 사원의 성, 월급여, 부서번호 및 직급을 출력한다.
SQL> SELECT last_name, salary, dept_id, title |
♠실습 : 부서번호 41에 근무하거나 직급이 Stock Clerk인 사원의 성, 월급여, 부서번호 및 직급을
출력한다.
SQL> SELECT last_name, salary, dept_id, title |
♣ 우선 순위 규칙
◈여러분은 같은 논리 표현식에 AND와 OR연산자를 합성할 수가 있다.
◈모든 조건들의 결과는 연결연산자의 우선순위에 의해 결정되는 순서로 조합된다.
◈동등한 우선순위의 연산자가 바로 옆에 사용될시 좌측에서 우측으로 수행된다. 각 AND는 먼저
수행되고 그 다음에 각 OR가 수행된다. AND는 OR보다 더 높은 우선순위를 가지고 있다.
◈괄호를 사용하여 우선 순위를 변경 할 수 있다.
◈여러 연산자들이 나열되었을때 우선순위 규칙
1 순위 : 모든 비교 연산자(=, <>, >, >=, <. <=, in, LIKE, IS NULL, BETWEEN)
2 순위 : AND
3 순위 : OR
♠실습 : 부서번호 44인 부서 사원 중에서 월급여가 1000이상이 되는 사원과 42부서에 속하는
전사원을 출력 하시오.
SQL> SELECT last_name,salary, dept_id |
♠실습 : 44부서나 42부서 사원 중에서 월급여가 1000이상이 되는 사원들을 출력 하시오.
SQL> SELECT last_name,salary, dept_id |