본문 바로가기
DataBase & DBMS

22.11.17 Oracle DB / PL-SQL 기본 쿼리 및 함수, DML 연습

by SoulMania 2023. 2. 15.

 

1day.txt
0.01MB
1day_ing.txt
0.01MB
2day 설명_me.txt
0.05MB

 

*DBMS란?
DBMS
-oracle, My-sql, MS-sql, Maria, .....

RDBMS
Relation DataBase Management System

※Oracle 접속※

1.프롬프트 접속
실행-cmd 입력
> sqlplus
Enter user-name: SYSTEM
Enter password:

  • "--" 오라클 1줄 주석문
    /* 여러줄 주석문 */ (멀티라인 코멘트)
  • 접속중인 user조회
    show user;
  • C:\WINDOWS\system32>sqlplus system/asdf123 -->cmd 한줄로 입력
    관리자 권한이 아닌 일반 cmd는 이방식으로 하면 cmd 위쪽 창에 비번이 다 찍힌다.

================================================================
2.SQL*PLUS 접속

  • Run SQL Command Line실행 --->시작부터 sql접속이 되어있음

*계정조회
SELECT *|컬럼명
From 테이블명

*oracle 계정
SYS :최상위관리자
SYSTEM :관리자

  • 또 다른 user로 접속
    connect user명/비번;
    connect system/asdf123exit or quit : 종료
  • SQL> show user
    USER is "SYSTEM"
  • user, 비번 조회
    connect system/asdf123
  • select username, password
    from dba_users; 조회~ 쿼리는 한줄로 작성하는것이 좋지 않다. select, from 이런 절 단위로 끊어서 작성!!
  • 비번 변경
    alter user user명
    identified by 새비번;

SQL> alter user system
2 identified by asdf;

  • 데이터 저장단위
    • 물리적 단위 / 논리적 단위
    • 논리적단위:(크기순)데이터블록 -> 익스텐드 -> 세그먼트 -> 테이블 스페이스(table들을 담을 커다란 공간)

*테이블스페이스란?
-table들을 담을 커다란 공간.
하나 또는 여러개의 파일로 구성된 논리적 데이터 저장 공간.
정의된 크기만큼 테이블스페이스가 생성되면
데이터가 그 크기를 넘길 때 까지
지정된 크기를 유지.
만약 데이터가 그 크기보다 많이 입력되면 자동으로 확장.

*테이블스페이스 생성하기 (p.27)
문법>
create tablespace 테이블스페이스명
datafile '/경로/테이블스페이스파일명.dbf'
size 초기용량(100m,1g 등)
[autoextend on] --자동확장여부
[next 자동증가용량]
[maxsize unlimited];

-- C:\DBStudy\oradata\myoracle 경로에
-- 기본크기는 100m
-- 자동확장
-- 용량증가시 5m단위인
-- myts라는 이름의 테이블스페이스를 생성하시오
create tablespace myts
datafile 'C:\DBStudy\oradata\myoracle\myts.dbf'
size 100m
autoextend on
next 5m
/

*계정생성시 기본tablespace를 미지정하면 System tablespace로 저장된다
참고>System tablespace란?
데이터베이스 운영에 필요한 기본 정보를 담는 Data Dictionary table이 저장되는 공간.
일반 user들의 오브젝트를 저장하지 않는 것을 권장

*tablespace 삭제
문법 > drop tablespace 테이블스페이스명;
drop tablespace myts; -->중복으로 안만들어지면 지워야한다. 지우는 문법!!!

*user 생성 (p28)
문법 >
create user 유저명
identified by 비밀번호;
[default tablespace 기본테이블스페이스명]
[temporary tablespace 임시테이블 스페이스명];

실행 >
create user ora_user
identified by hong
default tablespace myts
temporary tablespace temp

-- 기본테이블스페이스는 myts
-- 이름은 ora_user
-- 비번은 hong인
-- 유저를 생성하시오
create user main_user
identified by main_user
default tablespace myts
temporary tablespace temp
/

*권한부여
문법> grant 권한, 권한, ........
to 유저명[or role명];

-- main_user에게 connect. resource 롤 부여
grant connect, resource
to main_user;

*role:권한들의 집합.모음
-dba, connect, resource
참고>
-dba:dba권한
-connect : db연결관련 등
-resource : 객체 생성, 변경, 제거 등

SQL> conn main_user/main_user
Connected.
SQL>
SQL> show user
USER is "MAIN_USER"

-- C:\DBStudy경로에 있는 scott.sql을 실행
참고> scott.sql에는
scott유저 생성, 권한부여, 테이블삭제, 테이블생성, 데이터입력 쿼리문 작성
SQL> @C:\DBStudy\scott.sql

-- scott유저에 접속
참고> scott의 비번은 tiger
SQL> conn scott/tiger
Connected.

-- scott유저에 접속2
-- 참고>scott의 비번은 tiger
SQL> @C:\DBStudy\scott.sql
SQL>
SQL>
SQL> conn scott/tiger
Connected.

-- table 조회~ 밑에 테이블들은 scott/tiger 계정으로 접속해야 조회 가능.

selct * --> 이건 컬럼 싹다 출력!!!
from tab;

TNAME TABTYPE


BONUS TABLE
DEPT TABLE
EMP TABLE
SALGRADE TABLE

--HR(Human Resource) 인적자원데이터
BONUS(보너스)
DEPT(부서)
EMP(직원)
SALGRADE(급여등급)

*테이블 구조,골격 조회
테이블명
desc[ribe] 테이블명

SQL> describe emp;
Name Null? Type


EMPNO(사원번호) NOT NULL NUMBER(4)
ENAME(사원명) VARCHAR2(10)
JOB(업무) VARCHAR2(9)
MGR(상사사원번호) NUMBER(4)
HIREDATE(입사일) DATE
SAL(급여) NUMBER(7,2)
COMM(커미션) NUMBER(7,2)
DEPTNO(부서번호) NUMBER(2)

SQL> select *
2 from emp;

 EMPNO ENAME                JOB                       MGR HIREDATE        SAL       COMM     DEPTNO

  7369 SMITH                CLERK                    7902 80/12/17        800                    20
  7499 ALLEN                SALESMAN                 7698 81/02/20       1600        300         30
  7521 WARD                 SALESMAN                 7698 81/02/22       1250        500         30
  7566 JONES                MANAGER                  7839 81/04/02       2975                    20
  7654 MARTIN               SALESMAN                 7698 81/09/28       1250       1400         30
  7698 BLAKE                MANAGER                  7839 81/05/01       2850                    30
  7782 CLARK                MANAGER                  7839 81/06/09       2450                    10
  7839 KING                 PRESIDENT                     81/11/17       5000                    10
  7844 TURNER               SALESMAN                 7698 81/09/08       1500          0         30
  7900 JAMES                CLERK                    7698 81/12/03        950                    30
  7902 FORD                 ANALYST                  7566 81/12/03       3000                    20

 EMPNO ENAME                JOB                       MGR HIREDATE        SAL       COMM     DEPTNO

  7934 MILLER               CLERK                    7782 82/01/23       1300                    10

12 rows selected.

SQL> describe dept
Name Null? Type


DEPTNO(부서번호) NOT NULL NUMBER(2)
DNAME(부서명) VARCHAR2(14)
LOC(위치) VARCHAR2(13)
-> location

SQL> select *
2 from dept;

DEPTNO DNAME                        LOC

    10 ACCOUNTING                   NEW YORK
    20 RESEARCH                     DALLAS
    30 SALES                        CHICAGO
    40 OPERATIONS                   BOSTON

SQL> select deptno, dname, loc
2 from dept;

DEPTNO DNAME                        LOC

    10 ACCOUNTING                   NEW YORK
    20 RESEARCH                     DALLAS
    30 SALES                        CHICAGO
    40 OPERATIONS                   BOSTON

SQL> desc salgrade
Name Null? Type


GRADE(등급) NUMBER
LOSAL(최저급여) NUMBER
HISAL(최고급여) NUMBER

SQL> select grade, losal, hisal
2 from salgrade;
or
SQL> select *
2 from salgrade;

 GRADE      LOSAL      HISAL

     1        700       1200
     2       1201       1400
     3       1401       2000
     4       2001       3000
     5       3001       9999

SQL> describe bonus;
Name Null? Type


ENAME(사원명) VARCHAR2(10)
JOB VARCHAR2(9)
SAL NUMBER
COMM NUMBER

--bonus 테이블의 내용조회
select *
from bonus;

SQL> select *
2 from bonus;

no rows selected

데이터가 없다는 뜻!!!!
bonus만 insert를 하지 않았다.

--부서번호 오름차순 조회
1 select [deptno, dname, loc]
2
from dept order by deptno asc
SQL> /

DEPTNO DNAME                        LOC

    10 ACCOUNTING                   NEW YORK
    20 RESEARCH                     DALLAS
    30 SALES                        CHICAGO
    40 OPERATIONS                   BOSTON

--부서명 오름차순 조회
1 select [deptno, dname, loc]
2
from dept order by dname asc
SQL> /

DEPTNO DNAME                        LOC

    10 ACCOUNTING                   NEW YORK
    40 OPERATIONS                   BOSTON
    20 RESEARCH                     DALLAS
    30 SALES                        CHICAGO

--위치 오름차순 조회
1 select [deptno, dname, loc]
2
from dept order by loc asc
SQL> /

DEPTNO DNAME                        LOC

    40 OPERATIONS                   BOSTON
    30 SALES                        CHICAGO
    20 RESEARCH                     DALLAS
    10 ACCOUNTING                   NEW YORK

-- 사원명, 입사일 조회
1 select ename, hiredate
2* from emp
SQL> /

ENAME HIREDATE


SMITH 80/12/17
ALLEN 81/02/20
WARD 81/02/22
JONES 81/04/02
MARTIN 81/09/28
BLAKE 81/05/01
CLARK 81/06/09
KING 81/11/17
TURNER 81/09/08
JAMES 81/12/03
FORD 81/12/03
MILLER 82/01/23

-- 사원명, 입사일 조회하여 사원명 오름차순으로 정렬 출력
ENAME HIREDATE


ALLEN 81/02/20
BLAKE 81/05/01
CLARK 81/06/09
FORD 81/12/03
JAMES 81/12/03
JONES 81/04/02
KING 81/11/17
MARTIN 81/09/28
MILLER 82/01/23
SMITH 80/12/17
TURNER 81/09/08
WARD 81/02/22

--고참부터 사원명, 입사일 조회 (입사일 오름차순!!)
1 select ename, hiredate
2* from emp order by hiredate asc
SQL> /

ENAME HIREDATE


SMITH 80/12/17
ALLEN 81/02/20
WARD 81/02/22
JONES 81/04/02
BLAKE 81/05/01
CLARK 81/06/09
TURNER 81/09/08
MARTIN 81/09/28
KING 81/11/17
JAMES 81/12/03
FORD 81/12/03
MILLER 82/01/23

--사원명, 급여, 커미션 조회~
1 select ename, sal, comm
2* from emp
SQL> /

ENAME SAL COMM


SMITH 800
ALLEN 1600 300
WARD 1250 500
JONES 2975
MARTIN 1250 1400
BLAKE 2850
CLARK 2450
KING 5000
TURNER 1500 0
JAMES 950
FORD 3000
MILLER 1300

12 rows selected.

--급여 많이 받는 순으로 정렬 조회~(내림차순!!)
1 select ename, sal, comm
2* from emp order by sal desc
SQL> /

ENAME SAL COMM


KING 5000
FORD 3000
JONES 2975
BLAKE 2850
CLARK 2450
ALLEN 1600 300
TURNER 1500 0
MILLER 1300
MARTIN 1250 1400
WARD 1250 500
JAMES 950
SMITH 800

12 rows selected.

null은 알수 없는 값, 미확정 된 값 이기 때문에
아무리 정렬을 해도 null이 먼저 출력된 다음에 확정된 값, 입력된 값들 만 가지고 정렬을 한다.
null 은 즉 무한대를 뜻하기도 한다. 그래서 먼저 출력.
null = ∞
*null은 무한대
*값에 null이 포함된 상태에서 숫자 오름차순이면
숫자 작 -> 큰 순으로 무한대이므로 가장 마지막 출력

--커미션 많이 받는 사원부터 출력
1 select ename, sal, comm
2* from emp order by comm desc
SQL> /

ENAME SAL COMM


SMITH 800
BLAKE 2850
FORD 3000
JAMES 950
KING 5000
JONES 2975
MILLER 1300
CLARK 2450
MARTIN 1250 1400
WARD 1250 500
ALLEN 1600 300
TURNER 1500 0

12 rows selected.

--급여 + comm 합 조회~==>null이 포함된 계산결과는 null

1 select ename, sal, comm, sal+comm
2* from emp
SQL> /

ENAME SAL COMM SAL+COMM


SMITH 800
ALLEN 1600 300 1900
WARD 1250 500 1750
JONES 2975
MARTIN 1250 1400 2650
BLAKE 2850
CLARK 2450
KING 5000
TURNER 1500 0 1500
JAMES 950
FORD 3000
MILLER 1300

12 rows selected.

SQL> ed
Wrote file afiedt.buf
위에 결과에서 내림차순 추가.
1 select ename, sal, comm, sal+comm
2* from emp order by ename desc
SQL> /

ENAME SAL COMM SAL+COMM


WARD 1250 500 1750
TURNER 1500 0 1500
SMITH 800
MILLER 1300
MARTIN 1250 1400 2650
KING 5000
JONES 2975
JAMES 950
FORD 3000
CLARK 2450
BLAKE 2850
ALLEN 1600 300 1900

12 rows selected.

-- nvl(표현식, null 대체값)함수 이용 해서 null 데이터 대체 하기
1 select ename, sal, comm, nvl(comm, 0)
2* from emp
SQL> /

ENAME SAL COMM NVL(COMM,0)


SMITH 800 0
ALLEN 1600 300 300
WARD 1250 500 500
JONES 2975 0
MARTIN 1250 1400 1400
BLAKE 2850 0
CLARK 2450 0
KING 5000 0
TURNER 1500 0 0
JAMES 950 0
FORD 3000 0
MILLER 1300 0

12 rows selected.

-- 대체 한 후에 더한 값 조회하여 출력 (ex. 커미션이 미확정된 사원의 경우 0으로 가정하여 급여와 커미션의 합을 구하세요.)
1 select ename, sal, comm, nvl(comm, 0), sal+nvl(comm, 0)
2* from emp
SQL> /

ENAME SAL COMM NVL(COMM,0) SAL+NVL(COMM,0)


SMITH 800 0 800
ALLEN 1600 300 300 1900
WARD 1250 500 500 1750
JONES 2975 0 2975
MARTIN 1250 1400 1400 2650
BLAKE 2850 0 2850
CLARK 2450 0 2450
KING 5000 0 5000
TURNER 1500 0 0 1500
JAMES 950 0 950
FORD 3000 0 3000
MILLER 1300 0 1300

12 rows selected.

-- 대체 한 후에 더한 값에 대한 컬럼 내림차순으로

1 select ename, sal, comm, nvl(comm, 0), sal+nvl(comm, 0)
2* from emp order by sal+nvl(comm, 0) desc
SQL> /

ENAME SAL COMM NVL(COMM,0) SAL+NVL(COMM,0)


KING 5000 0 5000
FORD 3000 0 3000
JONES 2975 0 2975
BLAKE 2850 0 2850
MARTIN 1250 1400 1400 2650
CLARK 2450 0 2450
ALLEN 1600 300 300 1900
WARD 1250 500 500 1750
TURNER 1500 0 0 1500
MILLER 1300 0 1300
JAMES 950 0 950
SMITH 800 0 800

12 rows selected.

-- nvl(표현식, null 대체값)
-- nvl함수 응용
-- nvl2(표현식, null 아닌값 대체값, null 대체값)
comm의 값이 null이 아닌 값은 20으로 대체하고 null이면 10으로 대체하여 출력

1 select ename, sal, comm, nvl(comm, 0), nvl2(comm, 20, 10)
2* from emp
SQL> /

ENAME SAL COMM NVL(COMM,0) NVL2(COMM,20,10)


SMITH 800 0 10
ALLEN 1600 300 300 20
WARD 1250 500 500 20
JONES 2975 0 10
MARTIN 1250 1400 1400 20
BLAKE 2850 0 10
CLARK 2450 0 10
KING 5000 0 10
TURNER 1500 0 0 20
JAMES 950 0 10
FORD 3000 0 10
MILLER 1300 0 10

12 rows selected.

*NULL관련(P.143)
-- nvl(표현식, null 대체값)
-- nvl2(표현식, null 아닌값 대체값, null 대체값)
-- NULLIF(표현식1, 표현식2)
표현식 1이 표현식 2와 같다면 null을 리턴
같지않다면 표현식1을 리턴

1 select ename, sal, comm, NULLIF(sal, comm)
2* from emp
SQL> /

ENAME SAL COMM NULLIF(SAL,COMM)


SMITH 800 800
ALLEN 1600 300 1600
WARD 1250 500 1250
JONES 2975 2975
MARTIN 1250 1400 1250
BLAKE 2850 2850
CLARK 2450 2450
KING 5000 5000
TURNER 1500 0 1500
JAMES 950 950
FORD 3000 3000
MILLER 1300 1300

12 rows selected.

--COALESCE(표현식1, 표현식2,.....)
NULL이 아닌 최초의 표현식을 리턴
두 컬럼 비교해서 한쪽이 null이면 다른 null이 아닌 값 출력하고
둘 다 null이 아니면 최초의 값을 출력한다.(처음 조회한값, 먼저 출력된 컬럼)

1 select ename, comm, sal, COALESCE(comm, sal)
2* from emp
SQL> /

ENAME COMM SAL COALESCE(COMM,SAL)


SMITH 800 800
ALLEN 300 1600 300
WARD 500 1250 500
JONES 2975 2975
MARTIN 1400 1250 1400
BLAKE 2850 2850
CLARK 2450 2450
KING 5000 5000
TURNER 0 1500 0
JAMES 950 950
FORD 3000 3000

ENAME COMM SAL COALESCE(COMM,SAL)


MILLER 1300 1300

12 rows selected.

---------------------------------곱하기 연산 추가 예제--------------------------------------

1 select ename, sal, sal13
2
from emp
SQL> /

ENAME SAL SAL*13


SMITH 800 10400
ALLEN 1600 20800
WARD 1250 16250
JONES 2975 38675
MARTIN 1250 16250
BLAKE 2850 37050
CLARK 2450 31850
KING 5000 65000
TURNER 1500 19500
JAMES 950 12350
FORD 3000 39000

ENAME SAL SAL*13


MILLER 1300 16900

12 rows selected.

SQL> ed
Wrote file afiedt.buf

1 select ename, sal, comm, sal13, (sal*13)+comm
2
from emp
SQL> /

ENAME SAL COMM SAL13 (SAL13)+COMM


SMITH 800 10400
ALLEN 1600 300 20800 21100
WARD 1250 500 16250 16750
JONES 2975 38675
MARTIN 1250 1400 16250 17650
BLAKE 2850 37050
CLARK 2450 31850
KING 5000 65000
TURNER 1500 0 19500 19500
JAMES 950 12350
FORD 3000 39000

ENAME SAL COMM SAL13 (SAL13)+COMM


MILLER 1300 16900

12 rows selected.

--공백값 까지 고려한 조회!!!
1 select ename, sal, comm, sal13, (sal*13)+nvl(comm, 0)
2
from emp
SQL> /

ENAME SAL COMM SAL13 (SAL13)+NVL(COMM,0)


SMITH 800 10400 10400
ALLEN 1600 300 20800 21100
WARD 1250 500 16250 16750
JONES 2975 38675 38675
MARTIN 1250 1400 16250 17650
BLAKE 2850 37050 37050
CLARK 2450 31850 31850
KING 5000 65000 65000
TURNER 1500 0 19500 19500
JAMES 950 12350 12350
FORD 3000 39000 39000

ENAME SAL COMM SAL13 (SAL13)+NVL(COMM,0)


MILLER 1300 16900 16900

12 rows selected.

--워급에 3% 더 준다.
1 select ename, sal, comm, sal13, (sal13)+nvl(comm, 0)+(sal0.03)
2
from emp
SQL> /

ENAME SAL COMM SAL13 (SAL13)+NVL(COMM,0)+(SAL*0.03)


SMITH 800 10400 10424
ALLEN 1600 300 20800 21148
WARD 1250 500 16250 16787.5
JONES 2975 38675 38764.25
MARTIN 1250 1400 16250 17687.5
BLAKE 2850 37050 37135.5
CLARK 2450 31850 31923.5
KING 5000 65000 65150
TURNER 1500 0 19500 19545
JAMES 950 12350 12378.5
FORD 3000 39000 39090

ENAME SAL COMM SAL13 (SAL13)+NVL(COMM,0)+(SAL*0.03)


MILLER 1300 16900 16939

12 rows selected.

--연봉 많은 사람부터 정렬!!!!

1 select ename, sal, comm, sal13, (sal13)+nvl(comm, 0)+(sal0.03)
2 from emp
3
order by (sal13)+nvl(comm, 0)+(sal0.03) desc
SQL> /

ENAME SAL COMM SAL13 (SAL13)+NVL(COMM,0)+(SAL*0.03)


KING 5000 65000 65150
FORD 3000 39000 39090
JONES 2975 38675 38764.25
BLAKE 2850 37050 37135.5
CLARK 2450 31850 31923.5
ALLEN 1600 300 20800 21148
TURNER 1500 0 19500 19545
MARTIN 1250 1400 16250 17687.5
MILLER 1300 16900 16939
WARD 1250 500 16250 16787.5
JAMES 950 12350 12378.5
SMITH 800 10400 10424

12 rows selected.

--위와 같은데 4라고 표현한것. 컬럼이 4번째 컬럼이기 때문에 이런식으로 표현 가능.. 하지만 좋은 방식은 아니다.
1 select ename, sal, comm, sal13, (sal13)+nvl(comm, 0)+(sal0.03)
2 from emp
3
order by 4 desc
SQL> /

ENAME SAL COMM SAL13 (SAL13)+NVL(COMM,0)+(SAL*0.03)


KING 5000 65000 65150
FORD 3000 39000 39090
JONES 2975 38675 38764.25
BLAKE 2850 37050 37135.5
CLARK 2450 31850 31923.5
ALLEN 1600 300 20800 21148
TURNER 1500 0 19500 19545
MILLER 1300 16900 16939
MARTIN 1250 1400 16250 17687.5
WARD 1250 500 16250 16787.5
JAMES 950 12350 12378.5
SMITH 800 10400 10424

--입력된 컬럼 명 바꾸기, 또는 별칭 별명 붙이기(한글로붙이면 깨진다.)
"annual income" 공백을 넣을거면 따옴표로 묶어야 하고 공백을 안쓸거면 무조건 다 붙여 써야한다. annual_income 언더바는 인식 가능

1 select ename, sal, comm, sal13, (sal13)+nvl(comm, 0)+(sal0.03) "annual income"
2 from emp
3
order by (sal13)+nvl(comm, 0)+(sal0.03) desc
SQL> /

ENAME SAL COMM SAL*13 annual income


KING 5000 65000 65150
FORD 3000 39000 39090
JONES 2975 38675 38764.25
BLAKE 2850 37050 37135.5
CLARK 2450 31850 31923.5
ALLEN 1600 300 20800 21148
TURNER 1500 0 19500 19545
MARTIN 1250 1400 16250 17687.5
MILLER 1300 16900 16939
WARD 1250 500 16250 16787.5
JAMES 950 12350 12378.5
SMITH 800 10400 10424

12 rows selected.

--별칭을 붙이면 별칭으로 정렬하면 된다.

1 select ename, sal, comm, sal13, (sal13)+nvl(comm, 0)+(sal0.03) "annual income"
2 from emp
3
order by "annual income" desc
SQL> /

ENAME SAL COMM SAL*13 annual income


KING 5000 65000 65150
FORD 3000 39000 39090
JONES 2975 38675 38764.25
BLAKE 2850 37050 37135.5
CLARK 2450 31850 31923.5
ALLEN 1600 300 20800 21148
TURNER 1500 0 19500 19545
MARTIN 1250 1400 16250 17687.5
MILLER 1300 16900 16939
WARD 1250 500 16250 16787.5
JAMES 950 12350 12378.5
SMITH 800 10400 10424

--기호 대소문자 구분 가능!! as는 생략가능

1 select ename, sal, comm, sal13, (sal13)+nvl(comm, 0)+(sal0.03) as "Annual Income!!@@###"
2 from emp
3
/

SQL> /

ENAME SAL COMM SAL*13 Annual Income!!@@###


KING 5000 65000 65150
FORD 3000 39000 39090
JONES 2975 38675 38764.25
BLAKE 2850 37050 37135.5
CLARK 2450 31850 31923.5
ALLEN 1600 300 20800 21148
TURNER 1500 0 19500 19545
MARTIN 1250 1400 16250 17687.5
MILLER 1300 16900 16939
WARD 1250 500 16250 16787.5
JAMES 950 12350 12378.5
SMITH 800 10400 10424

"alias(별칭)
:컬럼의 별칭. 복잡한 컬럼을 명료하게 명명. 이해도를 높이고 간결하게 사용하고자 하는 목적
문법> 컬럼명 [as] 별칭 ---> order by 절에서 정렬을 해줄떄 사용된다!!!!!!!!!!!!!!!
큰 따옴표로 묶었을 때 ->"별칭" : 공백O, 대소문자 구분, 특수문자
큰 따옴표로 안 묶었을 때 -> 별칭:공백X, 대소문자 구분X, 특수문자X

-- 사원번호가 7369인 사원번호,사원명조회

select empno, ename
2 from emp
3* where empno=7369;

*조건
*비교연산자
a=b : 같다
a!=b, a<>b : 같지않다 (같지 않다는 것은 크거나 작다는 뜻)
a>b : a는 b보다 크다 (초과)
a>=b : a는 b보다 크거나 같다 (이상)
a<b : a는 b보다 작다 (미만)
a<=b : a는 b보다 작거나 같다 (이하)

주의. 문자는 ''(작은따옴표)로 감싸야 한다.

--81년 2월 20일에 입사한 사원번호, 이름, 입사일 조회

1 select empno, ename, hiredate
2* from emp where hiredate = '81/02/20'
2* from emp where hiredate = '81-02-20' --->이것도 되네????
SQL> /

 EMPNO ENAME                HIREDATE

  7499 ALLEN                81/02/20

--사원명이 FORD인 사원번호, 사원이름을 조회!!!
1 select empno, ename
2 from emp
3* where ename='FORD'
SQL> /

 EMPNO ENAME

  7902 FORD

1 select empno, ename
2 from emp
3* where empno!=7369
SQL> 사번이 7369와 같지 않은 것 출력

 EMPNO ENAME

  7499 ALLEN
  7521 WARD
  7566 JONES
  7654 MARTIN
  7698 BLAKE
  7782 CLARK
  7839 KING
  7844 TURNER
  7900 JAMES
  7902 FORD
  7934 MILLER

--같지 않다는 것은 크거나 작다는 뜻이므로!!!(위와 동일한 결과 출력)
1 select empno, ename
2 from emp
3* where empno<>7369
SQL> /

 EMPNO ENAME

  7499 ALLEN
  7521 WARD
  7566 JONES
  7654 MARTIN
  7698 BLAKE
  7782 CLARK
  7839 KING
  7844 TURNER
  7900 JAMES
  7902 FORD
  7934 MILLER

11 rows selected.

--문자데이터는 맞춤법, 스펠링, 대소문자가 정확히 일치해야한다.
--대소문자 구분 해서 정확히 쿼리문 입력 해야한다.
1 select empno, ename
2 from emp
3* where ename='Ford'
SQL> /

no rows selected

--UPPER()대문자로 변환해주는 함수 사용

SQL> ed
Wrote file afiedt.buf

1 select empno, ename
2 from emp
3* where ename=UPPER('Ford')
SQL> /

 EMPNO ENAME

  7902 FORD

--실제 출력되는건 셀렉트 절에 있는 empno, ename 이므로 ename을 LOWER()함수 처리하면 된다.

1 select empno, ename, LOWER(ename)
2 from emp
3* where ename=UPPER('Ford') --->>>안에 유저가 입력한 Ford는 입력값이라 보면된다
SQL> /

 EMPNO ENAME                LOWER(ENAME)

  7902 FORD                 ford

INITCAP(char) : char의 첫 문자는 대문자로, 나머지는 소문자로 반환​
첫 문자 인식 기준은 공백 그리고 알파벳과 숫자를 제외한 문자​
LOWER(char) : 소문자 변환 후 반환​
UPPER(char) : 대문자 변환 후 반환​

--대소문자 상관없이 사원명이 FORD인 사원의 이름 출력되는건
-- ename => 사원명컬럼에 입력된 그대로 출력
INITCAP(ename) => 첫 문자는 대문자로 출력
LOWER(ename) => 소문자 변환 후, 출력
UPPPER('Ford') => 대문자 변환 후, 출력

1 select ename, INITCAP(ename), LOWER(ename), UPPER('Ford')
2 from emp
3* where ename=UPPER('Ford')
SQL> /.

ENAME INITCAP(ENAME) LOWER(ENAME) UPPER('F


FORD Ford ford FORD

-- 별명쓰려면 정렬문 까지 써야한다.별 의미는 없다.

1 select ename, INITCAP(ename), LOWER(ename) as "ename"
2 from emp
3 where ename=UPPER('Ford')
4* order by "ename" desc
SQL> /

ENAME INITCAP(ENAME) ename


FORD Ford ford

--concat()
CONCAT(char1, char2) : 두 문자를 붙여 반환​
예) CONCAT('I Have', ' A Dream')  I Have A Dream​

1 select 'empName:', ename
2* from emp
SQL> /

'EMPNAME:' ENAME


empName: SMITH
empName: ALLEN
empName: WARD
empName: JONES
empName: MARTIN
empName: BLAKE
empName: CLARK
empName: KING
empName: TURNER
empName: JAMES
empName: FORD
empName: MILLER

12 rows selected.

SQL>
SQL>
SQL> ed
Wrote file afiedt.buf

1 select concat('empName: ', ename)
2* from emp
SQL> /

CONCAT('EMPNAME:',ENAME)

empName: SMITH
empName: ALLEN
empName: WARD
empName: JONES
empName: MARTIN
empName: BLAKE
empName: CLARK
empName: KING
empName: TURNER
empName: JAMES
empName: FORD
empName: MILLER

12 rows selected.

1 select concat(ename, job)
2* from emp
SQL> /

CONCAT(ENAME,JOB)

SMITHCLERK
ALLENSALESMAN
WARDSALESMAN
JONESMANAGER
MARTINSALESMAN
BLAKEMANAGER
CLARKMANAGER
KINGPRESIDENT
TURNERSALESMAN
JAMESCLERK
FORDANALYST
MILLERCLERK

--함수안에 함수가 있으면
=> 함수가 중첩되어있으면
=> 가장 안쪽에 위치한 함수부터 실행된다.
--아래에서는 안쪽에 위치한 concat(ename, ' : ')부터 실행된다.
'MILLER : '
--바깥쪽에 있는 concat('MILLER : ', job)이 실행되었다.

--concat함수 2번 쓰면 컬럼끼리 중간에 문자를 삽입하여 이을수 있다.
1 select concat(concat(ename, +' : '), job)
2* from emp
SQL> /

CONCAT(CONCAT(ENAME,+':'),JOB)

SMITH : CLERK
ALLEN : SALESMAN
WARD : SALESMAN
JONES : MANAGER
MARTIN : SALESMAN
BLAKE : MANAGER
CLARK : MANAGER
KING : PRESIDENT
TURNER : SALESMAN
JAMES : CLERK
FORD : ANALYST
MILLER : CLERK

12 rows selected.

★★★★★★★함수
★★★★★★★join, subquery
★★★★★★★DML
조회~
selct {
| 컬럼명, 컬럼명} -->컬럼명 여러개 가능 다 출력은 *조회~
selct {
| 컬럼명, [AS] alias} -->컬럼명 여러개 가능 다 출력은 *
from 테이블
[where 조건]
[]
[]
[ORDER BY 정렬방법];

*정렬방법 -->정렬방법을 기재하지 않으면 기본 오름차순!

  • 오름차순(기본) : 1100 작은수에서 큰수로 A->Z, ㄱ->ㅎ, 예전->최근
  • 내림차순 : 1001 큰수에서 작은수로 z->A, ㅎ->ㄱ, 최근->예전

*입력
INSERT into 테이블명(컬럼명, 컬럼명, ...컬럼명)
values(값, 값, ......값); [where 조건]

*수정
UPDATE
[where 조건]

*삭제
Delete
[where 조건]

*query문(질의어)

SQLPLUS 명령어
;생략가능
단어축약
show user : 접속중인 user명 조회
conn[ect]:다른 user로 접속
exit:종료
ed[it] : 버퍼에 저장된 쿼리문 불러와 편집
/:실행(run) 실행했던 쿼리문을 보여주지 않고 실행한다.
run : 실행했던 쿼리문을 보여주고 실행한다.
@
desc[ribe]

set linesize 400 행당 출력할 글자 수 설정
set pagesize 200 출력할 행 수 설정

----연습----

--부서번호 10 인 사람 출력
1 select *
2* from emp where deptno = '10'
SQL> /

 EMPNO ENAME                JOB                       MGR HIREDATE        SAL       COMM     DEPTNO

  7782 CLARK                MANAGER                  7839 81/06/09       2450                    10
  7839 KING                 PRESIDENT                     81/11/17       5000                    10
  7934 MILLER               CLERK                    7782 82/01/23       1300                    10



  emp에서 mgr이 7698 인 사람들을 내림차순으로 출력

1 select *
2* from emp where mgr = '7698' order by ename desc
SQL> /

 EMPNO ENAME                JOB                       MGR HIREDATE        SAL       COMM     DEPTNO

  7521 WARD                 SALESMAN                 7698 81/02/22       1250        500         30
  7844 TURNER               SALESMAN                 7698 81/09/08       1500          0         30
  7654 MARTIN               SALESMAN                 7698 81/09/28       1250       1400         30
  7900 JAMES                CLERK                    7698 81/12/03        950                    30
  7499 ALLEN                SALESMAN                 7698 81/02/20       1600        300         30

dept 테이블에 deptno를 내림차순으로 모두 출력 (2가지방법 )
SQL> select *
2 from dept order by deptno desc;

DEPTNO DNAME                        LOC

    40 OPERATIONS                   BOSTON
    30 SALES                        CHICAGO
    20 RESEARCH                     DALLAS
    10 ACCOUNTING                   NEW YORK

1 select deptno, dname, loc
2* from dept order by deptno desc
SQL> /

DEPTNO DNAME                        LOC

    40 OPERATIONS                   BOSTON
    30 SALES                        CHICAGO
    20 RESEARCH                     DALLAS
    10 ACCOUNTING                   NEW YORK




dept 테이블에 deptno를 오름차순으로 모두 출력    (2가지방법 )    --->asc 굳이 안해줘도 오름차순으로 출력 된다. 기본값이라.

1 select *
2* from dept order by deptno asc
SQL> /

DEPTNO DNAME                        LOC

    10 ACCOUNTING                   NEW YORK
    20 RESEARCH                     DALLAS
    30 SALES                        CHICAGO
    40 OPERATIONS                   BOSTON    

1 select deptno, dname, loc
2* from dept order by deptno asc
SQL> /

DEPTNO DNAME                        LOC

    10 ACCOUNTING                   NEW YORK
    20 RESEARCH                     DALLAS
    30 SALES                        CHICAGO
    40 OPERATIONS                   BOSTON

dept 테이블에 dname을 오름차순으로 모두 출력
1 select [deptno, dname, loc]
2
from dept order by dname asc
SQL> /

DEPTNO DNAME                        LOC

    10 ACCOUNTING                   NEW YORK
    40 OPERATIONS                   BOSTON
    20 RESEARCH                     DALLAS
    30 SALES                        CHICAGO

dept 테이블에 loc를 사전순으로 모두 출력(오름차순)
1 select *
2* from dept order by loc asc
SQL> /

DEPTNO DNAME                        LOC

    40 OPERATIONS                   BOSTON
    30 SALES                        CHICAGO
    20 RESEARCH                     DALLAS
    10 ACCOUNTING                   NEW YORK

-- 연산하는 테이블(더미데이터?)
1 select 1+1
2* from dual
SQL> /

   1+1

     2

SQL> desc dual
Name Null? Type


DUMMY VARCHAR2(1)

-- 현재 날짜 시간 조회 (얘도 더미테이블 이용.)아마 연산이나 날짜 계산할때 쓰이는 테이블 같음.
SQL> select sysdate
2 from dual;

SYSDATE

22/11/17