ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • select( join전까지)
    oracle 2020. 8. 12. 10:25

    테이블 목록 조회하기

    --현재 접속한 데이터베이스내의 테이블 조회

    select * from tab;

    테이블 정보 조회하기

    --원하는 테이블의 구조를 조회한다
    desc board;

     

    모든 컬럼의 데이터 가져오기

    select * from 테이블명

    특정 컬럼의 데이터 가져오기

    select 컬럼명1, 컬럼명2 from 테이블명

     

     

     

    ●NVL

    https://coding-factory.tistory.com/296

     

    [Oracle] Null값을 치환해주는 (NVL,NVL2) 함수 사용법 & 예제

    오라클을 사용하다보면 NULL값을 다른 함수로 치환해주어야하는 경우가 많습니다. 이럴경우 오라클에서 제공하는 NVL함수를 써서 쉽게 처리할 수 있는데요. NVL함수는 매우편리하지만 오라클에서

    coding-factory.tistory.com

     

    ●CONCAT

    --문자열을 합치는 연산자이다.

    --문자열 || 컬럼 || 문자열 || 컬럼

    EX)

    --사원들의 이름과 직무를 다음 양식으로 가져온다
    --000
    사원의 직무는 ㅁㅁㅁ입니다

     

    select ename ||'사원의 직무는'||job||'입니다.' 
    from emp;

     

    ●DISTINCT

    --select문을 통해 가져온 모든 row중에서 중복된 row를 제거하는 키워드

    --select distinct 칼럼명 from 테이블명

     

    EX)

    사원들이 근무하고 있는 근무부서의 번호를 가져온다.

    select distinct deptno 
    from emp;

     

    ●BETWEEN AND

    EX)

    --입사년도가 1981년인 사원중에 급여가 1500이상인 사원의 
    --
    사원번호이름급여입사일을 가져온다
    select empno, ename, sal, hiredate  
    from emp  
    where hiredate >= '1981/01/01' and hiredate <= '1981-12-31' and sal >= 1500; 
    또는
    select empno, ename, sal, hiredate 
    from emp 
    where hiredate between '1981/01/01' and '1981/12/31' and sal >= 1500;

     

    EX)

    --급여가 2000보다 크거나 1000보다 작은사원의 사원번호이름급여를 가져온다
    select empno, ename, sal 
    from emp 
    where sal > 2000 or sal < 1000;  
    또는
    select empno, ename, sal 
    from emp 
    where not(sal >= 1000 and sal <= 2000); 
    또는
    select empno, ename, sal 
    from emp 
    where not(sal between 1000 and 2000); 

     

    ●IN 특정 칼럼안에서 조건이 여러개일때

    EX)

    --직무가 CLERK, SALESMAN, ANALYST 사원의 사원번호이름직무를 가져온다 
    select empno, ename, job 
    from emp 
    where job = 'CLERK' or job = 'SALESMAN' or job = 'ANALYST'; 
    또는
    select empno, ename, job 
    from emp  
    where job in('CLERK','SALESMAN','ANALYST');

     

    --사원 번호가 7499, 7566, 7839 아닌 사원들의 사원번호이름을 가져온다
    select empno, ename 
    from emp 
    where empno != 7499 and empno != 7566 and empno != 7839; 

    select empno, ename 
    from emp 
    where not(empno = 7499 or empno = 7577 or empno = 7839); 


    select empno, ename 
    from emp 
    where empno not in(7499,7566,7839);

     

    ●like연산자

    select 컬럼명

    from 테이블명

    where 컬럼명 like '와일드카드';

     

    _ : 글자하나를 의미한다.

    % : 글자 0개 이상을 의미한다.

    EX)

    --이름이 F 시작하는 사원의 이름과 사원 번호를 가져온다
    select ename, empno 
    from emp 
    where ename like 'F%'; 
    --
    이름이 s 끝나는 사원의 이름과 사원번호를 가져온다
    select ename, empno 
    from emp 
    where ename like '%S'; 

    --
    이름에 A 포함되어 있는 사원의 이름과 사원 번호를 가져온다
    select ename, empno 
    from emp 
    where ename like '%A%'; 

    --
    이름의 두번째 글자가 A 사원의 사원 이름사원 번호를 가져온다
    select ename, empno 
    from emp 
    where ename like '_A%'; 

    --
    이름이 4글자인 사원의 사원이름사원번호를 가져온다
    select ename,empno 
    from emp 
    where ename like'____';

     

    ●null비교

    -null은 정해져 있지 않은 값 혹은 무한대의 의미를 갖는 값이다.

    -이 때문에  - !=를 통해 컬럼의 값이 null인지 연산을 할수가 없다.

    -이 때, is null 이나 is not null을 통해 null 비교가 가능하다.

    EX)

    --사원중에 커미션을 받지 않는 사원의 사원번호이름커미션을 가져온다
    select empno, ename, comm 
    from emp 
    where comm is null;

     

    주의 

    select empno, ename, comm 
    from emp 
    where comm != null;

    이렇게 하게되면 값이 안뜸. 널값은 비교를 할 수 없기 때문에.

    비교할 때는 is null이나 is not null을 사용해야 한다.

     

    정렬

    order by

    --사원의 사원번호이름급여를 가져온다급여를 기준으로 오름차순 정렬을 한다
    select empno, ename, sal 
    from emp 
    order by sal asc; 

    select empno, ename, sal 
    from emp 
    order by sal; 

    --
    사원의 사원번호이름급여를 가져온다사원번호를 기준으로 내림차순 정렬을 한다
    select empno, ename, sal 
    from emp 
    order by empno desc; 

    --
    사원의 사원번호이름을 가져온다사원의 이름을 기준으로 오름차순 정렬을 한다
    select empno, ename 
    from emp 
    order by ename; 

    --
    사원의 사원번호이름입사일을 가져온다입사일을 기준으로 내림차순 정렬을 한다
    select empno, ename, hiredate 
    from emp 
    order by hiredate desc; 

    --
    직무가 SALESMAN 사원의 사원이름사원번호급여를 가져온다급여를 기준으로 오름차순 정렬을 한다
    select ename, empno, sal 
    from emp 
    where job='SALESMAN' 
    order by sal; 

    --1981
    년에 입사한 사원들의 사원번호사원 이름입사일을 가져온다사원 번호를 기준으로 내림차순 정렬을 한다
    select empno, ename, hiredate 
    from emp 
    where hiredate >= '1981/01/01' and hiredate <= '1981/12/31'  
    order by empno desc; 

    --
    사원의 이름급여커미션을 가져온다커미션을 기준으로 오름차순 정렬을 한다
    select ename, sal, comm 
    from emp 
    order by nvl(comm,5000) asc; 

     

    정렬기준이 2개일때
    --
    사원의 이름사원번호급여를 가져온다급여를 기준으로 내림차순 정렬이름을 기준으로 오름차순 정렬 
    select ename, empno, sal 
    from emp 
    order by sal desc, ename asc;

     

    숫자함수

    컬럼에 저장되어 있는 숫자 값에 대해 처리를 하여 값을 가져올 수 있는 함수들을 의미

    https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions001.htm

     

    --절대값 구하기 
    select -10, abs(-10) from dual; 

    --
    전직원의 급여를 2000삭감하고 삭감한 급여액의 절대값을 구한다
    select sal, (sal-2000),abs(sal-2000) 
    from emp; 

    --
    소수점 이하 버림 
    select 12.3456, floor(12.3456) from dual; 

    --
    급여가 1500 이상인 사원의 급여를 15%삭감한다 소수점 이하는 버린다
    select sal, sal*0.85, floor(sal*0.85) 
    from emp 
    where sal >= 1500; 

    --
    반올림 
    select 12.3456, round(12.3456) from dual; 

    select 12.8888, round(12.8888) from dual; 

    select 888.8888, round(888.8888), round(888.8888,2), round(888.8888,-2) from dual; 

    --
    급여가 2천이하인 사람들의 급여를 20% 인상한다 10 자리를 기준으로 반올림한다
    select sal, sal*1.2, round(sal*1.2,-2) 
    from emp 
    where sal <= 2000; 

    --
    버림자리수를 정할  있다
    select 1112.3456, trunc(1112.3456), trunc(1112.3456,2), trunc(1112.3456,-2) from dual; 

    --
     직원의 급여를 10의자리 이하를 삭감한다

    select sal, trunc(sal, -2) from emp; 

    --
    나머지 구하기. 10 3으로 나눈 나머지, 10 4 나눈 나머지 
    select mod(10,3), mod(10,4) from dual

     

    문자열 함수

    -컬럼에 저장되어 있는 문자열에 대해 처리를 하여 값을 가져올 수 있는 함수들을 의미한다.

     

    --대문자 -> 소문자 
    select 'abcDEF', lower('abcDEF') from dual; 

    --
    사원들의 이름을 소문자로 가져온다
    select lower(ename) 
    from emp; 

    --
    소문자 --> 대문자 
    select 'abcDEF', upper('abcDEF') from dual; 

    --
     글자만 대문자로 나머지는 소문자로 
    select 'aBCdeF', initcap('aBCdeF') from dual; 

    --
    사원이름을 첫글자는 대문자로 나머지는 소문자로 가져온다 
    select initcap(ename) 
    from emp; 

    --
    문자열 연결 
    select concat('abc','def') from dual; 

    select concat(concat('ccc',concat('aaa','bbb')),'ddd') from dual; 

    --
    사원들의 이름과 직무를 다음과 같이 가져온다
    --
    사원의 이름은 ㅇㅇㅇ이고직무는 ㅁㅁㅁ입니다

    select '
    사원의 이름은'||ename||'이고직무는'||job||'입니다.' 
    from emp; 

    --
    문자열의 길이 length 길이, lengthb 길이바이트 
    select length('abcd'),lengthb('abcd'),length('
    안녕하세요'),lengthb('안녕하세요') from dual; 

    --
    문자열 잘라내기 
    select substr('abcd',3) from dual;  --3
    번째 글자 이후로 가져오겠다오라클 문자열은 1부터 시작 

    select substrb('abcd',3) from dual; 

    select substr('
    안녕하세요',3), substrb('안녕하세요',3) from dual; 

    select substr('abcdefghi',3,4),substr('
    동해물과 백두산이',3,4) from dual; --3번째 글자부터 4개의 글자 

    --
    문자열 찾기 
    select instr('abcdabcdabcd', 'bc') from dual;   --
    두번째 글자에서 'bc' 일치한다따라서 출력값이 2 

    select instr('abcdabcdabcd','bc',3)from dual;   --3
    글자 뛰고 bc 나오는 위치 

    select instr('abcdabcdabcd','bc',3,2) from dual;    --3
    글자 뛰고 2번째 bc 나오는 위치 

    select instr('abcdefg','aaa') from dual;    --
    없는 글자는 0 

    --
    사원의 이름중에 A라는 글자가 두번째에 나타나는 사원의 이름을 가져온다
    select ename 
    from emp 
    where instr(ename,'A') = 2; 

    select ename 
    from emp 
    where ename like'_A%'; 

    --
    사원의 이름중에 A라는 글자가 두번째 이후에 나타나는 사원의 이름을 가져온다


    select ename 
    from emp 
    where instr(ename,'A') > 1; 

    --
    특정 문자열로 채우기 
    select '
    문자열',  
            lpad('
    문자열',20),      
            rpad('
    문자열',20), 
            lpad('
    문자열',20,'a'), 
            rpad('
    문자열',20,'a') 
            from dual; 

    --
    공백제거 
    select '    
    문자열    ',ltrim('    문자열    '),rtrim('    문자열    '), 
    trim('    
    문자열    ') from dual; 

    --
    문자열 변경 
    select 'abcdefg', replace('abcdefg','abc','kkkkk')from dual;    --
    문자열 'abcdefg'에서 'abc' 'kkkkk' 바꿨다

     

    날짜 함수

    --현재 날짜 구하기 
    select sysdate from dual; 

    --
    날짜 데이터 연산 
    select sysdate, sysdate -10 from dual;      --
    일수를 기준으로 -10 해준  

    --
     사원이 입사한 날짜로 부터 1000 후가 되는 날짜를 가져온다
    select ename, hiredate, hiredate + 1000 
    from emp; 

    --
    직무가 SALESMAN 사원의 입사일 100일전 날짜를 가져온다 
    select hiredate, hiredate - 100 
    from emp 
    where job = 'SALESMAN'; 

    --
     사원의 근무 일을 가져온다
    select sysdate - hiredate 
    from emp; 

    --
    반올림 
    select sysdate, round(sysdate, 'CC') as "
    년도 두자리", round(sysdate, 'YYYY')as "월기준", 
                round(sysdate, 'DDD') as "
    시기준", round(sysdate, 'HH') as "분기준",round(sysdate,'MM')as"일기준", 
                round(sysdate,'DAY')as "
    주기준", round(sysdate, 'MI') as "초기준
    from dual; 

    --
     사원의 입사일을  기준으로 반올림한다
    select hiredate, round(hiredate, 'YYYY') 
    from emp; 

    --
    버림 
    select sysdate, trunc(sysdate, 'CC') as "
    년도 두자리", trunc(sysdate, 'YYYY') as "", trunc(sysdate,'DDD') as "", 
                    trunc(sysdate, 'HH') as "
    ", trunc(sysdate,'MM') as "", trunc(sysdate, 'DAY') as "", 
                    trunc(sysdate, 'MI') as "

    from dual; 

    --1981
    년에 입사한 사원들의 사원번호사원이름급여입사일을 가져온다
    select empno, ename, sal, hiredate 
    from emp 
    where hiredate >= '1981/01/01' and hiredate <= '1981/12/31'; 

    select empno, ename, sal, hiredate 
    from emp 
    where hiredate between '1981/01/01' and '1981/12/31'; 

    select empno,ename, sal, hiredate 
    from emp 
    where trunc(hiredate,'YYYY') = '1981/01/01'; 

    --
     날짜 사이의 일수를 구한다
    select sysdate - hiredate 
    from emp; 

    --
    모든 사원이 근무한 개월 수를 구한다
    select months_between(sysdate, hiredate) 
    from emp; 

    --
    개월 수를 더한다
    select add_months(sysdate, 100) from dual; 

    --
     사원들의 입사일  100개월 되는 날짜를 구한다
    select hiredate, add_months(hiredate,100) from emp; 

    --
    지정된 날짜를 기준으로 지정된 요일이 몇일인지... 
    select sysdate, next_day(sysdate, '
    월요일') from dual; --오늘 날짜를 기준으로 다음 월요일이 몇일인지 

    --
    지정된 날짜의 월의 마지막 날짜를 구한다
    select sysdate, last_day(sysdate) from dual; 

    --to_char : 
    주로 오라클 -> 프로그램으로 이동시킬때 
    select sysdate, to_char(sysdate, 'YYYY-MM-DD HH:MI:SS AM') from dual; 
    select sysdate, to_char(sysdate, 'YYYY
    MMDD HHMISS AM')from dual;  --오류가 발생한다. date form에는 한글이 들어갈  없다

    --to_date : 
    주로 프로그램 -> 오라클 : 프로그램에서 얻은 데이터를 오라클로 이동시킬  
    select to_date('2020/08/11 11:37:30 
    오후', 'YYYY-MM-DD HH:MI:SS AM')from dual; 

    --
    사원들의 입사일을 다음과 같은 양식으로 가져온다
    --1900-10-10 
    select hiredate, to_char(hiredate, 'YYYY-MM-DD')from emp;

     

    ●DECODE

    -값에 따라 반환값이 결정되는 구문이다.

     

    -- 사원의 부서 이름을 가져온다
    --10 : 
    인사과, 20 : 개발부, 30 : 경영지원팀, 40 : 생산부 
    select empno, ename,  
            decode(deptno, 10, '
    인사과',  
                            20, '
    개발부',  
                            30, '
    경영지원팀',  
                            40, '
    생산부') 
    from emp; 

    --
    직급에 따라 인상된 급여액을 가져온다
    --CLERK : 10%, SALESMAN : 15%, PRESIDENT : 200%, MANAGER : 5%, ANALYST : 20% 

    select ename,job, sal, decode(job,'CLERK',SAL * 1.1, 
                        'SALESMAN',SAL * 1.15, 
                        'PRESIDENT',SAL * 2, 
                        'MANAGER',SAL * 1.05, 
                        'ANALYST', SAL * 1.2 
                        ) 
            from emp; 

     

    ●CASE

    -조건에 따라 반환값이 결정되는 구문이다

    EX)

    --급여액  등급을 가져온다
    --1000
    미만 : C등급, 1000이상 2000미만 : B등급, 2000이상 : A등급 
    select empno, ename, 
            case when sal < 1000 then 'c
    등급
                 when sal >= 1000 and sal <2000 then 'b
    등급
                 when sal >= 2000 then 'a
    등급
                 end 
    from emp; 

    --
    직원들의 급여를 다음과 같이 인상한다
    -- 1000
    이하 : 100%, 1000초과 2000미만 : 50%, 2000이상 : 200% 
    select empno, ename, 
        case when sal <= 1000 then sal *2 
            when sal > 1000 and sal < 2000 then sal * 1.5 
            when sal >= 2000 then sal * 3 
            end 
    from emp; 

     

    그룹함수

    select문을 통해 가져올 결과를 그룹으로 묶고 그룹내에서 지정된 컬럼의 총합, 평균등을 구할 수 있는 함수

    sum : 총합

    avg : 평균

    count : 로우의 수

    max : 최대 값

    min : 최소 값

    --사원들의 급여 총합을 구한다
    select sum(sal) 
    from emp; 

    select sum(sal) 
    from emp; 

    --
    사원들의 커미션의 총합을 가져온다
    select sum(comm) 
    from emp; 

    --
    급여가 1500이상인 사원들의 급여 총합을 구한다
    select sum(sal) 
    from emp 
    where sal >= 1500; 

    --20
     부서에 근무하고 있는 사원들의 급여 총합을 구한다
    select  sum(sal) 
    from emp 
    where deptno = 20; 

    --
    직무가 SALESMAN 사원들의 급여 총합을 구한다
    select sum(sal) 
    from emp 
    where job = 'SALESMAN'; 

    --
     사원의 급여 평균을 구한다
    select avg(sal) 
    from emp; 

    --
    커미션을 받는 사원들의 커미션 평균을 구한다
    select avg(comm) 
    from emp 
    where comm is not null; 
    --
    그룹함수를 쓸때는 어차피 null값을 전부 제거해준다
    select avg(comm) 
    from emp;    

    --
    전사원의 커미션 평균을 구한다
    select avg(nvl(comm,0)) 
    from emp;   --
    그룹함수를 그냥 쓰면 null값을 자동으로 제거하고 계산하기 때문에 커미션이 null(커미션을 받지 않는사원들은 제외하고 계산하기 때문에 전사원을 대상으로 한다면 null값에 0 넣어주도록 nvl함수를 사용해야 한다

    --
    커미션을 받는 사원들의 급여 평균을 구한다
    select avg(sal) 
    from emp 
    where comm is not null; 

    --30
     부서에 근무하고 있는 사원들의 급여 평균을 구한다
    select avg(sal) 
    from emp 
    where deptno = 30; 

    --
    직무가 SALESMAN 사원들의 급여 + 커미션 평균을 구한다
    select avg(sal+comm) 
    from emp 
    where job = 'SALESMAN'; 

    --
    사원들의  수를 가져온다
    select count(*) 
    from emp; 
    ------- 
    select count(empno) 
    from emp;   --
    결과 : 12 


    select count(comm) 
    from emp; --
    결과 : 4. 그룹함수는 null 부분을  빼버리고 count하기 때문이다 커미션을 받는 사원들의  수가 된다

    --
    사원들의 급여 최대최소값을 가져온다
    select max(sal), min(sal) 
    from emp; 

     

    ●Group By

    -그룹 함수를 사용할 경우 select~from~where절까지 모두 수행하여 가져온 결과를 하나의 그룹으로 묶어 총합, 평균등을 구할 수 있다.

    -Group By절을 사용하면 select문을 수행하여 가져온 하나의 결과를 여러 그룹으로 나눠 그룹 각각의 총합과 평균등을 구할 수 있다.

     

    -- 부서별 사원들의 급여 평균을 구한다
    select deptno, avg(sal) 
    from emp 
    group by deptno; 

    --group by
     컬럼에서 중복된 값들을 하나의 값으로 묶는다.(위의 예에서는 deptno 10 애들끼리 하나의 그룹, 20 얘들끼리 하나의 그룹, 30 얘들끼리 하나의 그룹
    --group by
     사용해 그룹으로 묶을 , group by 조건이  칼럼을 같이 사용할  있다

    --
     직무별 사원들의 급여 총합을 구한다
    select job, sum(sal) 
    from emp 
    group by job; 

    --1500
    이상 급여를 받는 사원들의 부서별 급여 평균을 구한다
    select deptno, avg(sal) 
    from emp 
    where sal >= 1500 
    group by deptno;

     

    ●Having

    -Group by로 묶인 각 그룹들 중에 실제 가져올 그룹을 선택할 조건을 having절에 작성한다.

    -Having Group By절의 조건이 된다.

    EX)

    --부서별 평균 급여가 2000이상인 부서의 급여 평균을 가져온다
    select deptno,avg(sal) 
    from emp 
    group by deptno 
    having avg(sal) > 2000; 

    --
    부서별 최대 급여액이 3000이하인 부서의 급여 총합을 가져온다
    select deptno, sum(sal) 
    from emp 
    group by deptno 
    having max(sal) <= 3000; 

    --
    부서별 최소 급여액이 1000이하인 부서에서 직무가 CLERK 사원들의 급여 총합을 구한다
    select deptno,sum(sal) 
    from emp 
    where job = 'CLERK' 
    group by deptno 
    having min(sal) <= 1000; 

    --
     부서의 급여 최소가 900이상 최대가 10000이하인 부서의 사원들  1500이상의  
    --
    급여를 받는 사원들의 평균 급여액을 가져온다
    select deptno,avg(sal) 
    from emp 
    where sal > 1500 
    group by deptno 
    having min(sal) >= 900 and max(sal) <=10000;

     

    ※where row의 조건, having group의 조건

     

     

    --인프런 - 윤재성의 Oracle SQL Database 11g PL/SQL Developer

     

     

     

    'oracle' 카테고리의 다른 글

    requestScope Bean주입  (0) 2020.09.15
    Update  (0) 2020.08.27
    select (join부터)  (0) 2020.08.13

    댓글

Designed by Tistory.