- 함수를 왜 배워야하는가? 

ex)
우리반 테이블에서 전공, 전공별 인원수를 출력하시오!

우리반 테이블에세 가장 나이가 어린 학생의 이름을 출력하시오!

메일 도메인, 메일 도메인별 건수를 출력하시오! 

- 함수란 무엇인가?



- 함수의 종류 2가지? 


1. 단일행 함수
   - 문자
   - 숫자
   - 날짜
   - 변환
   - 일반 

1) 문자 함수 
   (1) 대소문자 변환 함수 
       - lower : 소문자로 출력하는 함수
       - upper : 대문자로 출력하는 함수
       - initcap: 첫번째 철자는 대문자 나머지는 소문자로 출력하는 함수 

   (2) 문자 조작 함수 
       - concat : 두개의 컬럼의 값을 연결하는 함수
       - substr : 특정 철자를 잘라내는 함수
       - length : 철자의 길이를 출력하는 함수 
       - instr : 특정 철자의 위치를 출력하는 함수
       - lpad : 왼쪽에 특정값을 채워넣는 함수 
       - rpad : 오른쪽에 특정값을 채워넣는 함수 
       - trim : 특정 철자나 값을 잘라내는 함수 
       - replace : 특정 철자로 변경하는 함수 

2) 숫자 함수 
      - round : 반올림하는 함수
      - trunc : 잘라내는 함수
      - mod : 나눈 나머지값을 출력  

3) 날짜 함수 
     - between month : 해당 기간 동안의 몇달이 있었는지 출력 
     - add-months: 기준 날짜에서 입력한 달 수 만큼 지난 날짜를 출력
     - next-day: 기준 날짜에서 해당 요일이 오늘 날짜를 출력 
     - last-day: 기준 날짜에서 해당 달의 끝까지 몇일이 남았는지 출력

4)변환 함수 / data type 을 변환
    
   (1) data type 
         - 숫자
         - 문자
         - 날짜 
   (2) 형변환 2가지 (하나의 데이터가 아니라 형식을 바꾼다고 생각해라)
        1. 암시적 형변환 : 오라클이 알아서 형변환 수행 
           예시) select ename, sal 
                     from emp
                     where sal = '3000'
                               숫자   문자 
                     - 이는 원래 실행 되어서는 안된지만 오라클 내부적으로 data type을 자동 변환하여 실행된다.
                     - 오라클은 숫자를 문자보다 더 높은 우선 순위에 두기 때문에 문자를 숫자로 변환한다.  (숫자>문자)
                     - BUT. 이런 식의 코드는 실행은 되지만 효율이 떨어져 수정해야 한다. 

        2. 명시적 형변환:
           - to_char :문자로 형변환하는 함수 
                            날짜 ---> 문자 
                            숫자 ---> 문자 

           - to_number : 숫자로 형변환하는 함수 
           - to_date :날짜로 형변환하는 함수 
  
  5) 일반 함수 
     - NVL 함수: null 값이 숫자를 변화하여 출력하라 
     - NVL2
     - decode 함수
     - case 함수 

2. 복수행 함수
   - max
   - min
   - count
   - avg
   - sum


문제 92. 나이대가 20대인 학생들의 이름과 나이와 주소를 출력하는데, 나이가 높은 학생부터 출력하시오!

SQL> SELECT ename, age, address
           FROM EMP2
           WHERE age BETWEEN 20 AND 29
           ORDER BY age DESC;


문제 93. 서울에서 살지 않는 학생들의 이름과 학원까지의 시간을 출력하는데 시간이 가장 오래 걸리는 학생부터 출력하시오! 

SQL> SELECT ename, distance
           FROM EMP2
           WHERE address NOT LIKE '%서울%'
           ORDER BY distance DESC;


문제 94. 이름에 EN 또는 IN이 포함되어져 있는 사원의 이름과 월급을 출력하시오!(EMP 테이블) 
   
  SQL> SELECT ename, sal
             FROM EMP
             WHERE ename LIKE '%EN%' OR
                        ename LIKE '%IN%';

*Regexp_substr 활용하여 더 간편하게 검색 가능

SQL> select ename, sal 
         from emp
         where regexp_like(ename,'(EN|IN)');
  - 이 쿼리에서 '|'는 또는을 의미하며 계속 추가할 수 있다. 
  - regexp_like 는 '%'(와일드 카드)를 쓸 필요가 없다.  

* MS_SQL에서는 regexp를 사용할 수 없다.



문제 95. 이름, 월급을 출력하는데 월급을 암호화해서 출력하시오! 월급의 숫자 234를 각각 *로 출력하시오 

SQL> SELECT ename,regexp_REPLACE(sal,'[2-4]','*') 
           FROM EMP;

* regexp/정규 표현식 
  
* 이 경우 이런 코드도 가능하다. 
  SELECT ename,regexp_REPLACE(sal,'(2|3|4)','*') 
  FROM EMP;

만약 연속 된 숫자가 아니였다면, 이런 식으로 입력가능 할듯 하다.

* MS_SQL 에서는 replace에 정규표현식을 사용할 수 없어서 위와 같은 결과를 내려면 아래와 같이 중첩으로 사용해야 한다. 

select ename,replace(replace(replace(sal,'2','*'),'3','*'),'4','*')
 from emp ;


문제 96. 이름, 월급, 보너스(sal,*02) 를 출력하시오! 
             컬럼별칭을 사용해서 월급*0.2가 보너스로 컬럼명이 출력되게하시오! 
             (보너스가 일의 자리에서 반올림되게 하시오!)

SELECT ename, sal, ROUND (sal*0.2,-1) AS 보너스
  FROM EMP;

*ROUND / 반올림 하는 keyword
  TRUNC / 버림하는 ketword

예시) select round(756.57,1), trunc (756.57,1)
         여기서 '.'은 기준으로 '0'이 된다. 
         뒤로 가면서 1,2, ... 
         앞으로 가면서 -1, -2, -3, 으로 된다. 

Tip. dual 이란?
  - dumy table 인데 select절의 결과 값을 보기 위한 가상의 테이블 
   (실제 테이블을 일력하면 같은 숫자가 대체 되어 나온다.)
 

주의! 별칭을 정해주기 전에 ROUND로 묶어준다. 

* MS_SQL도 반올림과 버림을 할 수 있지만 Oracle과 차이가 있다. 
  - round는 소수점 몇 번째까지 지정해 줄 수 있지만 버림음 floor 함수를 사용해서 정수만 나타낸다.  
   예시 ) select round(756.57,1) ;
            - 이 문장은 756.5 으로 결과가 나타남 

     
          select FLOOR(756.57 ,1) ;
            - 이 문장은 뒤에 1 때문에 문자 오류가 발생하고, 1을 없애면 756 만 출력된다. 



문제 97. 우리반 테이블에서 이름과 나이를 출력하는데 이름과 나이컬럼 옆에 나이가 짝수인지 홀수인지를 출력되게 하시오!

SQL> SELECT ename, age, MOD(age,2) AS 짝수홀수여부
           FROM EMP2;

*MOD/ 해당 숫자로 나누어서 나머지를 구하는 keyword

예시) select mod(10,3)
          from dual;
     - 10을 3으로 나눈 나머지 값 
      (실무에서는 해당 숫자가 짝수인지 홀수인지 판별할때 주로 사용한다.)

* MS_SQL 은 Oracle의 Mod 함수를 지원하지 않는다. 
   - 그래서 위의 Oracle 쿼리처럼 구현하기 위해서는 %를 사용해야 한다. 
    예시 ) SQL> SELECT ename, age, age%2 AS 짝수홀수여부
                     FROM EMP2;



문제 98.  오늘날짜를 출력하시오! 

SQL> select sysdate
           from daul;

*날짜 - 숫자 =   날짜 (date)
*날짜 + 숫자 =  날짜 (date)
*날짜  - 날짜 =   숫자 (for)


* MS_SQL에서 오늘의 날짜 출력 법 
  SQL> select SYSDATETIME() ;



문제 99 우리반 테이블에서 이름, 내가 태어날 날부터 오늘까지 총 몇일 살았는지 출력하시오!

SQL> SELECT ename, ROUND((sysdate - birth),0)
            FROM EMP2;

* '0'을 쓰지 않아도 default 값이 0으로 자동 출력된다. 

* MS_SQL에서는 이런식의 날짜 계산은 사용할 수 없다. 
  - 날짜 변환 시 문자 형식으로 변환되는데 문자끼리는 연산이 되질 않는다. 
  - 그래서 dateadd, datediff 같은 날짜 계산 함수를 써서만 날짜 계산이 가능하다. 



문제 100. 우리반 테이블에서 이름, 내가 태어난 날부터 오늘까지 총 몇주를 살았는지 출력하시오! 

SQL> SELECT ename, ROUND((sysdate - birth)/7,0)
           FROM EMP2;



문제 101. 우리반 테이블에서 이름, 내가 태어난 날부터 오늘까지 총 몇달을 살았는지 출력하시오!

SQL> SELECT ename, MONTHS_BETWEEN(SYSDATE, birth)
            FROM EMP2;

* 날짜 함수 
      1. months_between / 주의 사항은 앞에 변수 값에 최신 날짜를 입력해야 한다. 

* MS_SQL에서 날짜 계산 함수 형식
  - datediff( 시간단위구분자, 시작시간, 종료시간 )

select DATEDIFF ( mi , getdate() , getdate()+1 ) ==> 분
select DATEDIFF ( s , getdate() , getdate()+1 ) ==> 초 
select DATEDIFF ( hour , getdate() , getdate()+1 ) ==> 시간 (1일)
select DATEDIFF ( day , getdate() , getdate()+1 ) ==>  일 (1일)
select DATEDIFF ( month , getdate() , getdate()+31 ) ==> 개월 (31일)
select DATEDIFF ( year , getdate() , getdate()+730 ) ==>  년 (730일)

예시) (위와 같이 출력하고자 할때) 
     SQL> select datediff(month, hirth, getdate())
               from emp2 ;



문제 102. 사원 테이블에서 이름,  입사후 부터 그동안 받았던 총 급여를 출력하시오! (sal이 월급이라고 할 때)


SQL> SELECT ename, sal*ROUND(MONTHS_BETWEEN(SYSDATE,hiredate))
           FROM EMP;

* MS_SQL에서 출력 시 

  SQL> select ename, sal*datediff(month, HIREDATE, getdate())
           from emp ;



문제 103. 오늘부터 100달 뒤에 돌아오는 날짜를 출력하시오! 
 
SQL> select add_months(sysdate, 100)
           from dual;

* add_months/ 앞으로 해당 달 수 이후의 날짜 

* MS_SQL에서 앞으로 해당 달 수 이후의 날짜 구하는 법
  - MS_SQL에서는 Oracle 의 add_month 와 같은 dateadd 함수가 있다. 
    예시 )  select ename,dateadd(month,100,hiredate)
               from emp ;



문제 104. 오늘부터 앞으로 돌아올 금요일에 날짜를 출력하시오! 

SQL> select next_day(sysdate,'friday')
           from dual;

주의! 지정 요일에는 ' ' 표시를 꼭 해야 한다. 

* MS_SQL에서는 next_day와 같은 기능이 없다. 
   - 그래서 특정 날짜의 요일을 찾고 추론해야 한다. 
     예시 )   select datename(dw,getdate());
              
               OR 

               select datename(weekday,getdate());
             
             위의 쿼리를 돌리면 해당 요일이 나온다 거기서 원하는 요일까지 추론해야 한다. 




문제 105. 오늘부터 200달 뒤에 돌아오는 목요일의 날짜를 출력하시오 

SQL>  select next_day(add_months(sysdate, 200),'thursday')
           from dual;

* MS_SQL 에서 몇 달 후 돌아오는 날짜 출력하기 
   - 이번에도 위와 같이 특정 날짜를 찾고 추론해야 한다. 

SQL > select datename(dw,dateadd(month,200,getdate()))


문제 106. 오늘부터 요번달 말일까지 총 몇일 남았는지 출력하시오! 

SQL> SELECT LAST_DAY(SYSDATE)-SYSDATE
            FROM dual;


* MS_SQL은 LAST_DAY를 지원하지 않는다. 
   - 그래서 날짜 비교함수를 이용해서 해당 말일까지 몇일이 남았는지 출력해야 한다.
     
     예시 ) select datediff(day, getdate(), dateadd(month,1,getdate())-day(getdate()));
                   ( dateadd(month,1,getdate())-day(getdate()) 는 해당달의 마지막 날을 표시해준다.) 


문제 107. 이름과 월급을 출력하는데 월급을 출력할때에 천단위를 표시하시오! 

 SQL> select ename, to_char(sal), to_char(sal,'999,999')
   from emp;

* to_char(sal) / sal 의 type 이 문자로 바뀜
    따라서.
   select ename, to_char(sal) AS aaa
     from emp 
     ORDER BY aaa ASC;
    이 코드는 숫자의 크기로 정렬되지 않는다. 

* to_char(sal, '999,999') 
   - 이는 천단위로 끊어주게 해준다. 
   - 여기서 '9'는 0~9까지 무슨 수가 와도 관계 없다는 의미 

* MS_SQL은 천단위 표시를 하기 위해서는 2번의 형변환이 필요하다 
   - 첫번째 money로 형변화, 두번째 문자로 형변환이다. 
     예시 ) select ename, replace (convert(varchar,cast(sal as money),1) , '.00','')
              from emp ;
      
           위의 예시를 설명하자면 
              1) 먼저 숫자를 money 형으로 바꾸어 주어야 한다. 
              2) 두번째는 money형을 문자로 바꾸어 주어야 한다. 
                 (이때 convert에 3번째 인자 값은 money 형의 형식을 구분한다. '1' 의 형식은 천의자리에 콤마이다. )
              3) 필요 없는 소수점을 없애주기 위해서 replace를 사용한다. 
 
* money의 문자로 변환하기 위한 style 값의 차이 비교 

출력

0(기본값)

소수점 왼쪽의 세 자릿수마다 쉼표를 사용하지 않으며, 소수점 오른쪽에 두자리가 나타난다
(
: 1234.56)

1

소수점 왼쪽의 세 자릿수마다 쉼표를 사용하며, 소수점 오른쪽에 두자리가 나타납니다.
(
:1,234.56)

2

소수점 왼쪽의 세 자릿수마다 쉼표를 사용하지 않으며, 소수점 오른쪽에 네 자리가 나타납니다.
(
:1234,5678)



문제 108. 이름과 총급여 (SAL*25000000) 을 출력하는데, 총급여를 출력할때에 천단위와 백만단위를 출력되게하시오!

SQL> SELECT ename, TO_CHAR((sal*25000000),'999,999,999,999')
           FROM EMP; 

주의! 숫자를 끊어줄 때 범위를 실제 값보다 적게 잡아주면 모든 숫자가 '#'로 표시 된다.

* 숫자에 to_char 함수 사용 


문제 109. 이름, 입사일, 입사한 요일을 출력하시오! 

  SQL> SELECT ename, hiredate, TO_CHAR(hiredate,'day')
              FROM EMP;

* 지난 10년 동안 살인 사간이 가장 많이 일어난 요일이 무엇인가?
* 날짜 형식 
  - YYYY , RRRR, YY, RR : 숫자 년도 
  - YEAR : 영문으로 년도 출력
  - MM : 달
  - MONTH : 달을 영문으로 출력
  - DD : 일
  - DAY, DY : 요일 (DY는 요일이 요약해서 출력 됨)


문제 110. 현재 세션의 날짜 형식을 확인하시오! 

SQL>SELECT *
           FROM nls_session_parameters;


문제 111. 81년 12월 11일에 입사한 사원의 이름과 입사일을 출력하시오! 

SQL> SELECT ename, hiredate
            FROM EMP
             WHERE hiredate = '11/dec/81';

*현재 세션의 날짜 형식을 RR/MM/DD 로 변경
   ALTER SESSION SET nls_date_format='RR/MM/DD';


문제 112. 현재 세션의 날짜 형식을 아래와 같이 변경하고, 81년 12월 11일에 입사한 사원들의 이름과 입사일을 출력하시

SQL> SELECT ename, hiredate
            FROM EMP
            WHERE hiredate = '81/12/11';


 * RR  과 YY 의 차이
                 RR                                   YY
                 81                                    81
         1981       2081                 1981          2081
                2015                               2015
        현재 연도에서 가장           현재 세기의 연도
        가까운 연도 선택

*주로 RR 을 사용한다. 

문제 113. 현재 세션의 날짜 형식이 어떻게 되는 상관없이 81년 12월 11일에 입사한 사원들의 이름과 입사일을 출력하시오 !


1. to_char
         
        select ename, hiredate
            from emp
            where to_char(hiredate, 'RR/MM/DD')='81/12/11';

* 그러나 이럴 경우 모든 데이타를 변화해야 하기 때문에 성능이 떨어지게 된다. 

2. to_date
         
         select ename, hiredate
            from emp
            where hiredate = to_date('81/12/11','RR/MM/DD');

* 이럴 경우 성능에 영향을 주지 않으면서 정확하게 검색할 수 있다.


문제 114. 87년 5월 6일 부터 93년 3월 4일 사이에 태어난 학생들의 이름과 생일을 출력하시오!

SQL> SELECT ename, birth
           FROM EMP2
           WHERE birth BETWEEN TO_DATE('87/05/06','RR/MM/DD')
                                      AND TO_DATE('93/03/04','RR/MM/DD');


* MS_SQL은 to_data 함수를 사용할 수 없다. 
  - 그래서 실제 날짜 데이터 형식과 다른 형식으로 검색해서 결과를 보고 싶다면 convert 함수를 이용해야 한다. 

    예시 )  select ename, hirth 
               from emp2 
            where hiredate between convert(varchar,'1987/05/06',111) and convert(varchar,'1993/03/04',111) ;

  
* convert 시 날짜 형식 변화 시 style 식

세기 포함 안함(yy)

세기 포함(yyyy)

표준

입력/출력**

-

0 또는 100 (*)

기본값

mon dd yyyy hh:miAM(또는 PM)

1

101

USA

mm/dd/yy

2

102

ANSI

yy.mm.dd

3

103

영국/프랑스

dd/mm/yy

4

104

독일

dd.mm.yy

5

105

이탈리아

dd-mm-yy

6

106

-

dd mon yy

7

107

-

Mon dd, yy

8

108

-

hh:mm:ss

-

9 또는 109 (*)

기본값 + 밀리초

mon dd yyyy hh:mi:ss:mmmAM(또는 PM)

10

110

USA

mm-dd-yy

11

111

일본

yy/mm/dd

12

112

ISO

yymmdd

-

13 또는 113 (*)

유럽 기본값 + 밀리초

dd mon yyyy hh:mm:ss:mmm(24h)

14

114

-

hh:mi:ss:mmm(24h)

-

20 또는 120 (*)

ODBC 표준

yyyy-mm-dd hh:mi:ss(24h)

-

21 또는 121 (*)

ODBC 표준(밀리초)

yyyy-mm-dd hh:mi:ss.mmm(24h)

-

126(***)

ISO8601

yyyy-mm-dd Thh:mm:ss.mmm(스페이스 없음)

-

130*

회교식****

dd mon yyyy hh:mi:ss:mmmAM

-

131*

회교식****

dd/mm/yy hh:mi:ss:mmmAM

             


문제 115. 오늘 부터 100달 뒤에 돌아오는 날짜가 어떻게 되는가?

SQL> SELECT ADD_MONTHS(SYSDATE,100)
            FROM dual;



문제 116. 오늘 부터 100달뒤에 돌아오는 날짜의 요일을 출력하시오! 

SQL> SELECT to_char(ADD_MONTHS(SYSDATE,100),'day')
            FROM dual;



문제 117. 이름과 커미션을 출력하는데 커미션이 NULL 인 사원들은 0으로 출력되게 하시오! 

SQL> SELECT ename,comm, NVL(comm,'0')
           FROM EMP;



문제 118. 이름, 커미션을 출력하는데 커미션이 null인 사원들은 no comm이란 글씨로 출력되게 하시오! 

SQL>  select ename, comm, nvl(TO_CHAR(comm), 'no comm')
             from emp;

주의 ! select ename, nvl(comm, 'no comm') 
           from emp;
         - 이 경우  comm은 number이고  치환하는 값이 string 이기 때문에 오류가 난다. 

Tip.
   nvl 은 data가 없는 상태, data를 문자 type을 바꾸어도 null 값은 data가 없다.
   그래서 변경, 치환된다.
   즉, 자신이 변환하고 싶은 모양으로 미리 데이터를 변환 시켜놓아야 한다. 

* MS_SQL은 Oracle 의 nvl 함수에 대응하는 isnull 이 있다. 
   - 그래서 Oracle의 nvl 함수와 동일한 효과를 MS_SQL에서 얻고 싶다면 isnull 함수를 사용해야 한다. 

   예시 ) SQL> select ename, isnull(cast(comm as varchar), 'no comm') 
                   from emp ;




문제 119. 이름, mgr을 출력하는데 mgr이 null인 사원들은 no manager란 글씨로 출력되게하시오!

 SQL> SELECT ename, NVL(TO_CHAR(mgr),'no manager')
             FROM EMP;  



문제 120. 이름, 월급, 커미션, 월급+커미션을 출력하시오! 

SQL> SELECT ename, sal, comm, sal+NVL(comm,0)
            FROM EMP;

SQL> SELECT ename, sal, comm, sal+NVL(comm,0),NVL2(comm,sal+comm,sal)
          FROM EMP;
 
* nvl2 (comm, sal+comm,sal) 
   1. 만약 comm 이 null 이 아니면 sal+comm 값을 출력하고 
   2. 만약 comm 이 null 이면 sal 값을 출력해라 
   (자바스크립트의 if/else 와 비슷한듯 하다.) 


주의!
 - nvl 에서 '0'이 숫자 이기 때문에 ' '이 필요 없다. 



문제 121. 이름, 직업, 보너스를 출력하는데 보너스가
             직업이 SALESMAN이면 3000으로 출력되게하고
             직업이 SALESMAN이 아니면 0으로 출력되게하시오 !

SQL> select ename, job, decode(job,'SALESMAN',3000,0) bonus
           from emp;


*decode/ null 값이 아닌 data가 있는 값 중 특정 data를 선택해야 할 때 

* MS_SQL은 decode를 지원하지 않는다. 
  - 그래서 Oracle의 decode 식을 MS_SQL에서 구현하기 위해서는 case 문을 사용해야 한다. (But. Oracle에서도 case 문을 지원한다.) 

   예시) select ename, job, (case job when 'SALESMAN' then 3000
                                                  else 0 end ) as bonus
      from emp ;



문제 122. 이름 직업, 보너스를 출력하는데 보너스가 직업이 SALESMAN이면 3000이 출력되게하고
               직업이 ANALYST면 2500이 출력되게하고
               나머지 직업은 0으로 출력되게하시오!

  SQL>  select ename, job, decode(job,'SALESMAN',3000,
                                               'ANALYST',2500,0) bonus
               from emp; 



문제 123. 이름, 나이, 등급을 출력하는데 
              나이가 30살 이상이면 A 등급
              나이가 27살 이상이면서 30미만이면서 B등급 
              나이가 24살 이상이면서 27살 미만이면 C등급
              나머지 나이는 D 등급으로 출력하시오! 

SQL> SELECT ename, age, case when age >=30 then 'A'
                                      when age >=27 then 'B'
                                      when age >=24 then 'C'
                                             else 'D' end as 등급 
           from emp2;

* decode는 등호비교만 가능하다. 부등호 비교를 하려면 case 를 사용해야 한다.
* case는 등호 비교, 부등호 비교 모두 가능하다.
* 부등호 사용시 자동으로 그 이전까지의 범위로 제한되는 듯 하다. 
* 범위는 between and를 가지고도 설정 가능하다. 



문제 124. 이름, 월급, 부서번호, 보너스를 출력하는데
               부서번호 보너스가 부서번호가 10번이면 자신의 월급의 40%를 보너스로 출력하고
               부서번호가 20번이면 자신의 월급의 20%를 보너스로 출력하고
               나머지 부서번호는 그냥 0으로 출력하시오!

 SQL> select ename, sal, empno, case when empno = 10 then sal*0.4
                                             when empno = 20 then sal*0.2
                                                         else 0 end as bonus
   from emp; 
         
주의! case는 한 번만 쓰자! 


* 점심시간 문제: ( 라인 검사) 

내가 태어난 생일의 요일을 출력하시오! 

SQL> SELECT ename,TO_CHAR(birth,'Day')
           FROM EMP2
           WHERE ename = '송수신';

* to_char 앞 부분에는 해당 날짜만 지정해주면 자동으로 요일을 찾아서 변환해준다. 



* 마지막 문제 :
 
   점심시간 면담순서 (연장자 부터) 일주일 목, 금
   
   월, 화,  수 

   이름, 나이, 분류 (A,B,C,D)
   A는 성별이 남자이고 서울에 거주하는 학생 
   B는 성별이 여자이고 서울에 거주 하는 학생 
   C는 성별이 남자이고 서울이 아닌 학생 
   D는 성별이 여자이고 서울이 아닌 학생 

    나이가 높은 순서대로 출력하시오! 

SQL> SELECT ename, age, CASE WHEN (gender='남자' AND address LIKE '%서울%') THEN 'A'
                                        WHEN (gender='여자' AND address LIKE '%서울%') THEN 'B'
                                        WHEN (gender='남자' AND address NOT LIKE '%서울%') THEN 'C'
                                        WHEN (gender='여자' AND address NOT LIKE '%서울%') Then 'D'
                                          END AS 분류
           FROM EMP2
           ORDER BY age DESC;

SQL> SELECT ename, age, CASE WHEN (gender='남자' AND address LIKE '%서울%') THEN 'A'
                                        WHEN (gender='여자' AND address LIKE '%서울%') THEN 'B'
                                        WHEN (gender='남자' AND address NOT LIKE '%서울%') THEN 'C'
                                          else 'D' END AS 분류
           FROM EMP2
           ORDER BY age DESC;

* 괄호는 안 넣어주어도 괜찮다. 






























문제 59. 직업이 SALESMAN이 아닌 사원들의 이름과 월급과 직업과 입사일을 출력하는데,
              먼저 입사한 사원순으로 출력하시오  

SQL> 3 SELECT ename, sal, JOB, hiredate
           1 FROM EMP
            2 WHERE JOB != 'SALESMAN'
            4 ORDER BY hiredate ASC;

*keyword 앞에 번호들은 실행 순서 


문제 60. 20번 부서번호에서 근무하는 사원들의 이름과 월급과 연봉(sal*12)을 출력하는데
              연봉이 높은 사원부터 출력하시오 

SQL> SELECT ename, sal, sal*12 as "연봉"
           FROM EMP
           WHERE deptno = 20
           ORDER BY "연봉" DESC;



문제 61. 우리반 테이블에서 이름과 나이를 출력하는데 나이가 높은 사람부터 출력하시오!

SQL >SELECT ename, age
            FROM emp2
            ORDER BY age DESC;



문제 62. 우리반 테이블에서 여학생의 이름과 주소와 나이를 출력하는데
                 나이가 높은 순서대로 출력하시오! 

SQL>SELECT ename, address, age
          FROM emp2
          WHERE gender = '여자'
          ORDER BY age DESC;



문제 63. 우리반 테이블에서 성씨가 김씨인 학생의 이름과 나이를 출력하시오! 

SQL>SELECT ename, age
          FROM emp2
          WHERE ename LIKE '김%';



문제 64. 나이가 30대인 학생들의 이름과 성별과 나이를 출력하시오!

SQL>SELECT ename, gender, age
           FROM emp2
           WHERE age BETWEEN 30 AND 39;



문제 65. 서울에 사는 학생들에 이름과 주소를 출력하시오!   

SQL>SELECT ename, address
           FROM emp2
           WHERE address LIKE '%서울%';



문제 66. 전공이null인 학생들의 이름과 전공을 출력하시오!

SQL> SELECT ename, major
            FROM EMP2
            WHERE major is NULL;

주의! null 같은 '='가 아닌 is 를 사용



문제 67. 전공을 출력하는데 중복제거해서 출력하시오!

SQL> SELECT DISTINCT major
            FROM EMP2;



문제 68. 전공이 컴퓨터 공학이 아닌 학생들의 이름과 전공을 출력하시오!

SQL > SELECT ename, major
            FROM EMP2
            WHERE major <> '컴퓨터공학'; 

* null 이 아닌 이상  'is'를 쓰지 않는다. 



문제 69. 주소가 서울이 아닌 학생들의 이름과 주소를 출력하시오! 

SQL > SELECT ename, address
            FROM EMP2
            WHERE address NOT LIKE '%서울%';

* 'not like' 도 사용가능



문제 70. 학원까지 오는 시간이 가장 적게 걸리는 학생부터 이름과 주소와 시간을 출력하시오! 

SQL > SELECT ename, address, distance
            FROM EMP2
            ORDER BY distance ASC;



문제 71.  전공이 컴퓨터 공학이고 성별이 여학생인 학생들의 이름과 전공과 주소를 출력하는데,
               집과의 걸리가 먼 학생순으로 출력하시오 

SELECT ename, major, address
  FROM EMP2
  WHERE major ='컴퓨터공학' AND gender ='여자'
  ORDER BY distance DESC;



문제 72. 같은 라인에 있는 학생들의 결과가 아래와 같이 출력되게하시오! 

            곽민영 학생의 나이는 34이고 전공이 컴퓨터 공학이며 집에서 학원으로 오는 시간은 3분 입니다. 

SELECT ename||' 학생의 나이는'||age||'이고 전공이 '||major||'이며 집에서 학원으로 오는 시간은 '||distance||'분 입니다.'
  FROM EMP2
  WHERE empno BETWEEN 16 AND 19;

* MS_SQL 구현시 

  SELECT concat( ename,' 학생의 나이는',age,'이고 전공이 ',major,'이며 집에서 학원으로 오는 시간은 ',distance,'분 입니다.')
  FROM EMP2
  WHERE empno BETWEEN 16 AND 19;



3장 함수 



- 함수를 왜 배워야하는가? 
  아래와 같은 정보을 알기 위하여 배워야 한다. 

ex)
우리반 테이블에서 전공, 전공별 인원수를 출력하시오!

우리반 테이블에세 가장 나이가 어린 학생의 이름을 출력하시오!

메일 도메인, 메일 도메인별 건수를 출력하시오! 



- 함수의 종류 2가지? 


1. 단일행 함수
   - 문자
   - 숫자
   - 날짜
   - 변환
   - 일반 

1) 문자 함수 
1. 대소문자 변환 함수 
     - lower : 소문자로 출력하는 함수
     - upper : 대문자로 출력하는 함수
     - initcap: 첫번째 철자는 대문자 나머지는 소문자로 출력하는 함수 

2) 문자 조작 함수 
      - concat : 두개의 컬럼의 값을 연결하는 함수
      - substr : 특정 철자를 잘라내는 함수
      - length : 철자의 길이를 출력하는 함수 
      - instr : 특정 철자의 위치를 출력하는 함수
      - lpad : 왼쪽에 특정값을 채워넣는 함수 
      - rpad : 오른쪽에 특정값을 채워넣는 함수 
      - trim : 특정 철자나 값을 잘라내는 함수 
      - replace : 특정 철자로 변경하는 함수 

2. 복수행 함수
   - max
   - min
   - count
   - avg
   - sum



문제 73.  아래와 같이 결과를 출력하시오! 

SQL> select upper(ename), lower(ename), initcap(ename)
           from emp;

* MS_SQL 로 작성시 
  - MS_SQL은 inticap 함수가 없어서 Oracle의  inticap 함수 처럼 나타내기 위해서는 아래와 같이 사용해야 한다. 

    SQL> select upper(ename), lower(ename), concat(upper(left(ename,1)),lower(substring(ename,2,10)))
           from emp;



문제 74. 이름이 smith인 사원의 이름과 월급을 출력하시오! 
              아래 ? 부분을 채워 넣으시오!

     where ? = 'smith'

SQL> SELECT ename, sal
           FROM EMP
           WHERE LOWER(ename) = 'smith';

* 자료가 대문자 인지 소문자 인지 확실히 모를 때 유용하게 사용할 수 있다.



문제 75. 이름과 월급을 붙여서 출력하시오! 
 
 SQL> select concat(ename, sal)
            from emp;
 
* concat은 2개의 컬럼만 붙일 수 있다. 

* MS_SQL 에서 concat 함수 
  - MS_SQL에서는 concat 안에 여러개의 컬럼은 붙일 수 있다. 



문제 76. 우리반 테이블에서 이름과 나이를 붙여서 출력하시오!

 SQL> SELECT CONCAT(ename, age)
            FROM EMP2;



문제 77. 이름을 출력하는데 이름의 첫번째 철자만 출력하시오! 

SQL> select ename, substr(ename,1,1)
           from emp;

* substr(컬럼명, 숫자1, 숫자2) 
- 숫자1 : 시작점을 의미한다. 
- 숫자 2: 시작점 부터 몇개를 출력할 것인지 입력한다. 

* MS_SQL 에서 해당 철자만 사용하기 
  - Oracle substr 함수에 해당 하는 MS_SQL 함수는 substring 이다. 

  SQL> select ename, substring(ename,1,1)
           from emp;



문제 78. 이름의 세번째 철자만 출력하는데 소문자로 출력하시오! 

SQL>SELECT LOWER(substr(ename,3,1))
           FROM EMP;

* MS_SQL 에서 출력 방법 
SQL> SELECT LOWER(substring(ename,3,1))
          FROM EMP;



문제 79. 아래의 쿼리의 결과를 initcap 사용하지 말고,
              upper, lower, substr || 를 사용해서 출력하시오!

예시) select initcap(ename)
           from emp;

SQL> SELECT UPPER(substr(ename,1,1))||LOWER(substr(ename,2,8))
            FROM EMP;



문제 80. 우리반 테이블에서 성씨가 김씨, 이씨, 박씨인 학생들의 이름과 주소를 출력하시오!
              (like 사용하지 말고)

SQL> SELECT ename, address
           FROM EMP2
           WHERE substr(ename,1,1) IN ('김','이','박');

* MS_SQL에서 출력 방법 

SQL> SELECT ename, address
           FROM EMP2
           WHERE substring(ename,1,1) IN ('김','이','박');



문제 81. 이름과 이름의 철자의 갯수를 출력하시오 !

 SQL> select ename, length(ename)
            from emp;

* MS_SQL 에서 철자의 갯수 출력 방법 
- Oracle length에 해당하는 MS_SQL 의 함수는 len 이다 

SQL> select ename, len(ename)
         from emp;



문제 82. 이름, 이메일, 이메일의 철자의 갯수를 출력하는데, 
             이메일의 철자의 갯수가 가장 많은 학생부터 출력하시오! 

SQL>SELECT ename,email, length(email)
          FROM EMP2
          ORDER BY LENGTH(email) DESC;

Tip.
  select 절에서 length에 alias 를 주고 order by에 alias를 활용하여도 됨

* MS_SQL에서 위와 같은 사용 법
SQL>SELECT ename,email, len(email)
          FROM EMP2
          ORDER BY LEN(email) DESC;



문제 83. 이름 이메일의 도메인만 출력하시오!

SQL> SELECT substr(email,instr(email,'@')+1,(instr(email,'.')-instr(email,'@')-1))
           FROM EMP2;

* 다른 방법들도 있다. length를 사용해서 뒤에서 부터 빼주는 방법도 있다. 
   
   SQL> SELECT substr(email,instr(email,'@')+1, length(email)-instr(email,'@')-4 )
              FROM EMP2;

* MS_SQL 로 위의 쿼리 변환 시 
 - 함수 변화가 필요하다.  
 SQL> SELECT substring(email,patindex('%@%',email)+1,(patindex('%.%',email)-patindex('%@%',email)-1))
          FROM EMP2 ;



문제 84. 이름을 출력하고 그 옆에 이름에 철자 A가 몇번째 있는지 출력하시오! 

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

*instr/ 해당 문자가 몇 번째에 위치하는지 알수 있게 해주는 keyword

* MS_SQL에서 instr 대체 사용법 
   - MS_SQL에서 instr을 대체하는 함수는 patindex 이다 
 SQL> select ename, patindex('%A%',ename)
             from emp;



문제 85. 우리반 테이블에서 이메일을 출력하고
              그 옆에 이메일의 @ 몇번째 자리에 있는지 출력하시오!

SQR> SELECT email, instr(email,'@')
            FROM EMP2; 



문제 86. 이메일을 출력하는데 @ 다음의 철자부터 출력하시오! 

SQR> SELECT substr(email,instr(email,'@')+1)
            FROM EMP2;

*substr에서 두번째 자리에 아무것도 쓰지 않으면 끝까지 출력 된다.

* MS_SQL에서 substring 사용법 
   - MS_SQL에서 substring은 무조건 3개의 인자가 있어야지 쿼리가 실행된다. 
   - 아래의 쿼리는 필요 인자 부족으로 error가 발생한다. 

SQL> SELECT substring(email,patindex('%@%',email)+1)
         FROM EMP;



문제 87. 이름과 월급을 출력하는데 월급을 10자리로 출력하고, 
             월급이 출력되는 나머지 자리에*를 출력하시오! 

  select ename, lpad(sal, 10, '*')
     from emp;

*lpad/rpad
  - 자리 개수를 선정하고 나머지는 다른 것으로 채우겠다. 
  - ex) lpad(컬럼명, 자리개수, 채울 내용)

* MS_SQL 에서 lpad 대체법 
 - MS_SQL은 lpad가 사용되지 않는다. 그래서 replicate를 사용해서 쿼리를 작성해야 한다. 
   또한, 숫자와 같은 경우 형변환이 일어나서 기존에 숫자 값도 형변환을 해줘야 한다. 

SQL> select replicate('*',10-len(sal))+cast(sal as varchar) 
         from emp ;



문제 88. 아래의 data를 입력하고 이름이 JACK인 사원의 이름과 월급을 출력하시오! 

SQL> insert into emp(empno, ename, sal)
           values(1235,'  JACK  ', 3600);

         select ename, sal
           from emp
           where trim(ename) = 'JACK';

*trim 
 - 앞, 뒤의 공백을 지워준다. (단, 중간에 공백은 지워주지 못한다.)

* MS_SQL 의 Trim 함수 대체 방법 
 - MS_SQL은 trim 함수를 사용할 수 없어서 ltrim 과 rtrim을 중첩 사용하여 Oracle의 trim 함수와 같은 효과를 낼 수 있다. 

SQL> select ename, sal
         from emp
       where rtrim(ltrim(ename)) = 'JACK';



문제 89. 이름과 전공을 출력하는데 전공을 출력할때에 과 가 안나오게 하시오! 

SQL> SELECT ename, TRIM('과' FROM major)
           FROM EMP2;

* MS_SQL 에서 Trim 함수 대체 방법 2 
  - MS_SQL 에서는 Trim 함수를 사용할 수 없어서 replace를 활용하여서 쿼리를 작성해야 한다. 

SQL> SELECT ename, replace(substring(major,1,1),'과','') + substring(major,2,(len(major)-2)) + replace(substring(mjor,len(ename),1),'과','')
          FROM EMP2 ;



문제 90. 이름과 월급을 출력하는데 월급을 출력할때에 0을 *로 출력하시오! 

SQL> select ename, replace(sal, 0, '*')
          from emp;

* replace
   - 대체하는 keyword
   - replace(컬럼명, 대체하고 싶은 문자 or 숫자, 대체할 숫자 or 문자)
   - regexp_replace(sal, '[0-2]', '*')를 사용해서 좀 더 확장할 수 있다. 



문제 91. 우리반 테이블에서 20대인 학생들 중에 naver 메일을 사용하는 학생들의 이름과 주소와 나이와 메일주소를 출력하는데, 나이가 높은순서대로 출력을 하고 그리고 컬럼명이 아래와 같이 출력되게 하시오! 

      학생이름, 사는 곳, 메일주소, 나이 

SQL> SELECT ename AS "학생이름", address AS "사는곳", email AS "메일주소", age AS "나이"
            FROM EMP2
            WHERE age BETWEEN 20 AND 29
               AND email LIKE '%naver%'
           ORDER BY age DESC;

 




문제 26. 커미션이 null 이 아닌 사원들의 이름과 월급과 커미션을 출력하시오!
 
SQL>  select ename, sal, comm
          from emp
       where comm is not null;



문제 27. 직업이 SALESMAN이고 월급이 1000 이상인 사원들의 이름과 월급과 직업을 출력하시오!

 SQL> select ename, sal, job
           from emp 
           where job = 'SALESMAN' and sal >= 1000

Tip.
  컬럼 별칭을 정할 수 있다.
  ex) sal as 월급

주위! 아래와 같은 경우는  오라클 실행 순서에 의해서 에러가 남

    SQL>  select ename, sal as 월급, job
              from emp 
            where job = 'SALESMAN' and 월급 >= 1000
 


문제 28. EMP 테이블의 모든 컬럼을 출력하시오! 

SQL > select *
          from emp;


문제 29. dept 테이블의 모든 컬럼을 출력하시오! 

SQL > select * 
          from dept;

'*'의 의미 
 - 'asterisk'가 불리며 select 절에 사용 시 해당 테이블의 모든 컬럼을 출력한다.  


문제 30. SQL 작성 규칙이 어떻게 되는가?
    
   1. SQL은 대소문자를 구분하지 않는다. (주로 keyword를 대문자로 구분)
   2. 한줄 또는 여러줄에 입력할 수 있다. (아래로 작성할 수 있다는 것이 중요)
   3. 키워드는 약어로 표시하거나 여러줄에 나뉠 수 없다. (keyword는 select, from 과 같은 것들)
   4. 절은 별도의 절에 입력해야 하는 것이 좋다 
   5. 가독성을 높이기 위해서 들여쓰기를 사용해라 
 

문제 31. 아래의 쿼리의 컬럼명은 대문자로 출력되는가 소문자로 출력되는가?

SQL > select ename, sal, deptno
            from emp; 

answer) 대문자로 출력 됨 


문제 32. 위의 컬럼명을 소문자로 출력되게하시오! 

SQL > select ename, sal, deptno
            from emp; 

answer > select ename as "ename", sal as "sal", deptno
            from emp; 

* " "(더블쿼테이션 마크)를 사용해야 하는 때는

  1. 컬럼별칭 사용시 대소문자를 구분하고 싶을때 
  2. 컬럼별칭 사용시 공백문자나 특수문자를 출력하고 싶을때  


문제 33. 사원이름과 월급을 출력하는데 컬럼 별칭을 이용해서 아래와 같이 결과가 출력되게 하시오! 

컬럼명  ---> Employee, Salary

SQL > select ename as "Employee", sal as "Salary"
            from emp;

* 여기서 'as'는 생략 가능


문제 34. 연봉이 36000이상인 이름과 연봉(sal*12)을 출력하는데 컬럼명이 한글로 이름, 연봉으로 출력되게 하시오  !

SQL > select ename as 이름, sal*12  as 연봉 
           from emp
           where sal*12 >= 36000;

주의! 연산 순서도 중요하다 
sal*12+300 은 sal+300*12와 다르다.


문제 35. 이름과 직업을 출력하는데 아래와 같이 컬럼명을 사원의 이름, 사원의 직업이라고 출력하시오!
   
            - 사원의 이름, 사원의 직업 

SQL > select ename as "사원의 이름", job as "사원의 직업"
            from emp;


문제 36. 직업을 출력하는데 중복을 제거해서 출력하시오!

SQL > select distinct job
            from emp;


문제 37. 부서번호를 출력하는데 중복제거해서 출력하시오!

SQL > select distinct deptno
            from emp;


문제 38. 이름과 월급을 연결해서 출력하시오!

SQL >  select ename ||'의 월급은' ||sal
             from emp; 


*연결 연산자  :  '||'(수직바 2개)

* MS SQL 은 concat을 사용해서 연결한다 
  SQL> select concat (ename, '의 월급은', sal) 
            from emp ;

문제 39. 아래와 같이 결과를 출력하시오!

    KING 의 직업은 PRESIDENT 입니다. 

SQL > select ename||' 의 직업은 '||job||' 입니다.'
           from emp;


문제 40. 1-23쪽 (대체 인용 연산자)을 참고해서 문제를 해결하시오!

             아래와 같이 결과를 출력하시오 !

             SMITH의 부서번호는 '20'번 이고 직업은 CLERK 입니다. 

 SQL > select ename||'의'|| q'['부서번호'는]'||deptno||'번 이고 직업은'||job||'입니다'
           from emp;

* MS SQL 에서 싱글쿼테이셥 select 방법 
 SQL> select concat (ename, '''의 월급은''', sal) 
          from emp ;


문제41. DEPT 테이블의 구조를 확인하시오!

 SQL > desc dept 

* MS SQL 에서 테이블 컬럼 구조 확인 

 SQL> sp_columns dept ;




2장. data 검색 제한과 정렬 



1. where 절
2. order by 절

문제 42. 20번 부서번호에서 근무하는 사원들의 이름과 월급과 부서번호를 출력하시오!

SQL > select ename, sal, deptno
          from emp
          where deptno = 20;


문제 43. 부서번호가 20, 30번에서 근무하는 사원들의 이름과 부서번호를 출력하시오! 

SQL > select ename, deptno
          from emp
          where deptno in (20,30);


문제 44. 80년 12월 11일에 입사한 사원들의 이름과 입사일을 출력하시오! 

SQL > select ename, hiredate
          from emp
          where hiredate = '81/12/11'; (or '81-12-11' , '81.12.11')
                                    '년/달/일'

*양쪽에 싱글 쿼테이션 마크를 사용해야 하느 경우는?
 1) 문자 
 2) 날짜 

 * 날짜를 검색하기 전에 반드시 확인해봐야할 사항 
       - 현재 재가 접속한 세션의 날짜 형식을 확인해야한다. 
*NLS_DATE_FORMAT      RR/MM/DD
                                       년/월/일
         
Tip. 날짜 형식을 확인 하는 방법
          SQL> select* 
                     from nls_session_parameters;
                     (nls/ National Language Support) 
         
 Tip. 컬럼 출력 포맷 변경 방법
        column parameter(column 명) format a20(a숫자) 
        keyword 'column'은 SQL*PLUS  명령어

* MS SQL 에서 날짜 형식 확인 방법 
   SQL> select GETUTCDATE() ;


문제 45. 현재 세션의 날짜 형식중 년도를 4자리로 표시되게 하시오!

SQL> alter session set nls_date_format='RRRR/MM/DD';

Tip.
    접속하고 나서 접속을 끊을때까지가 하나의 'session'
    so. 그래서 현재 상태는 하나의 세션에서만 유요함 (=종료하기 전까지만) 

*MS SQL도 날짜 형식 변환은 가능하지만 현재까지의 자료로는 시스템의 날짜 형식의 변환은 안되는 것으로 보인다. 
   - 추후 더 알아봐야 함 


문제 46. 1983년 1월 15일에 입사한 사원들의 이름과 입사일을 출력하시오!

SQL> select ename, hiredate
          from emp
          where hiredate = '1983/01/15'

* MS SQL 에서는 날짜 변환의 개념이 오라클과 약간 다르다. 

1) 아래의 명령을 사용하면 조회시 사용하고자 하는 날짜 형식을 바꿀 수 있다.  
  SQL> select CONVERT(char(10),current_timestamp,111) ;

  SQL> select ename, hiredate
           from emp 
         where hiredate = '1981/11/17' ;

2) 그러나, select 시 나오는 날짜 형식은 변하지 않았다. 
   아래의 문장 출력 시 기존에 입력된 날짜 형식으로 출력되어서 나온다. 

  SQL> select ename, hiredate
           from emp 
         where hiredate = '1981/11/17' ;

3) 또한, 날짜 형식을 바꿔도 시스템 현재의 날짜 형식은 바뀌지 않는다. 
 
  SQL> select GETUTCDATE() ;


문제 47. 1981년도에 입사한 사원들의 이름과 입사일을 출력하시오 !

SQL> select ename, hiredate
         from emp
         where hiredate like '1981%' or('1981/%/%'로 하면 날짜까지 가능함)

SQL> select ename, hiredate
         from emp
         where hiredate between '1981/01/01' and '1981/12/31';
         (이것이 좋은, 효율적인 SQL 이다.)

* '=' 은 완벽하게 같을 때만 사용한다.


문제 48. 이름에 끝글자가 T로 끝나는 사원들의 이름을 출력하시오!

SQL> select ename
         from emp
         where ename like '%T'


문제 49. 이름의 두번째 철자가 %인 사원의 이름을 출력하시오!

SQL> select ename
         from emp
         where ename like '_m%%'  escape 'm'
        

문제 50. 아래의 data를 입력하고 이름의 두번째 철자와 세번째 철자가 %인 사원의 이름을 출력하시오!

             insert into emp(empno, ename, sal)
               values(3456,'A%%B',4500);

           commit;

SQL > select ename
            from emp
            where ename like '_m%m%%' escape 'm'


문제 51. 직업이 SALESMAN이고 30번 부서번호에서 근무하는사원들 중 월급이 1000아상인 사원들의 이름과 월급과 직업과 부서번호를 출력하시오! 

SQL > select ename, sal, job, deptno
           from emp
           where job ='SALESMAN' and deptno = 30 and sal >= 1000;

*우선 순위 규칙이 있다. 
  (참고 and 는 or 보다 우선작동한다, or를 먼저 우선하고 싶으면 괄호를 사용한다.)


문제 52.  이름과 월급을 출력하는데 월급이 낮은 사원부터 높은 사원순으로 출력하시오! 

SQL > select ename, sal
           from emp
           order by sal asc;

*order by 절 사용법 
  - order by 절은 코딩 & 실행 순서 모두 맨 마지막에 실행된다. 

Tip. asc는 ascend의 약자 


문제 53. 이름과 월급을 출력하는데 월급이 높은 사원부터 출력하시오!

SQL > select ename, sal
           from emp
           order by sal desc

Tip. desc는 descend의 약자 


문제 54. 직업이 SALESMAN인 사원들의 이름과 직업과 월급을 출력하는데 월급이 높은 사원부터 출력하시오! 

 SQL>  SELECT ename, JOB, sal
              FROM EMP
              WHERE job='SALESMAN'
             ORDER BY sal DESC;

(이 문제 부터 SQL Gate 2010 사용)


문제 55. 3번 부서번호인 사원들의 이름과 입사일을 출력하는데 최근에 입사한 사원부터 출력하시오! 

 SQL> SELECT ename, hiredate
            FROM EMP
            WHERE deptno = 30
            ORDER BY hiredate DESC;


문제 56. 자살데이터를 입력받기 위한 테이블을 생성하시오!

SQL > create table sucide
            (country varchar2(40),
              male number(10),
              female number(10),
              average number(10) ); 

* create talbe '테이블명'


문제 57. 나라이름과 남자 자살 데이터를 출력하는데 남자 자살 데이터가 많은 순서대로 출력하시오! 

SQL > SELECT country, male
             FROM sucide
             ORDER BY male DESC nulls last;

Tip. 
nulls last를 쓰면 null data를 가장 뒤로 보낸다. 


문제 58. 우리나라의 평균 자살수가 어떻게 되는지 출력하시오! 

SQL > SELECT average
            FROM sucide
            WHERE country ='South Korea6 ';
 


* 추가할 내용 _ SQL gate에서 데이터 추가하는 법*

1. '도구' 옵션 클릭 
2. '데이터 가져오기' 클릭
3. 테이블 찾기 (미리 생성한)
4. 데이터 종류 선택
5. 데이터를 찾아서 선택
6. 필드 구분 기호 (쉼표)
7. 첫열 '2'로 변경  













문제1. SQL의 종류에는 무엇이 있는가?
 
    (1) query (질의, 검색어)
         ~> select 문의 6가지 절

   (2) DML문 (Data manage Language)
        - insert /입력
        - update /수정
        - delete / 삭제
        - merge / 입력&수정&삭제
   
  (3) DDL문 (Data definition Language)
       - create /생성
       - alter /수정
       - drop /삭제
       - truncate /삭제
       - rename/이름 변경

  (4) DCL문 (Data control Language)
       - grant / 권한부여
       - revoke /권한취소
 
  (5) TCL문 (Transaction control Language)
       - commit / 변경된 내용을 영구히 저장
       - rollback /취소
       - savepoint /특정시점으로 취소
 

문제2. emp테이블 구조를 살펴보시오

SQL > describe emp

EMPNO      사원번호
ENAME      사원이름
JOB           직업
MGR          관리자의 사원번호
HIREDATE   입사일
SAL           월급
COMM       커미션
DEPTNO     부서번호



문제3. 이름과 월급을 출력하시오 !

SQL > select ename, sal  --- 컬럼명
          from emp;       --- 테이블 명

';' = 실행해 달라는 의미


문제4. 사원번호, 이름, 월급, 직업을 출력하시오!

SQL > select empno, ename,sal,job
          from emp;



문제5. 이름, 월급, 커미션을 출력하시오!

SQL > select ename, sal, comm
          from emp;



문제6. 이름, 월급, 커미션, 월급+커미션을 출력하시오

SQL > select ename, sal, comm, sal+nvl(comm,0)
          from emp;


* 출력시 커미션 값이 null이면 월급+커미션 값이 출력되지 않음

null 값인 경우 
 1) data가 없는 상태 
 2) 알 수 없는 상태 (unknown)


문제7. 월급이 3000인 사원들의 이름과 월급을 출력하시오 !

SQL > select ename,sal
          from emp
          where sal = 3000;

*where 절에 검색 조건을 준다


문제 8. 사원번호가 7788번인 사원의 사원번호, 이름, 월급을 출력하시오

SQL > select empno,ename,sal
          from emp
          where empno = 7788;


문제 9. 사원이름이 SMITH인 사원의 이름과 직업을 출력하시오!

SQL > select ename, job
          from emp
          where ename = 'SMITH';

* 이름은 ' ' 을 사용하여 문자 type이 string 임을 표시 해줌


문제 10. 직업이 SALESMAN인 사원들의 이름과 직업을 출력 하시오

SQL > select ename, job
          from emp
          where job = 'SALESMAN';


문제 11. 월급이 3000 이상인 사원들이 이름과 월급을 출력하시오!

SQL > select ename, sal
          from emp
          where sal >= 3000;

* 연산자의 종류 3가지
1. 산술 연산자 : * , /, +,-
2. 비교 연산자 : >,<,>=,<=,=
                     !=, <>,^= (같이 않거나)
3. 논리 연산자 : and, or, not


문제 12. 직업이 SALESMAN이 아닌 사원들의 이름과 직업을 출력하시오!

SQL > select ename, job
          from emp
          where job != 'SALESMAN';


문제 13. 월급이 1000에서 3000 사이인 사원들의 이름과 월급을 출력하시오!

SQL > select ename, sal
          from emp
          where sal between 1000 and 3000;

* 연산자의 종류 3가지
1. 산술 연산자
2. 비교 연산자
3. 논리 연산자
       - 기타 비교 연산자/  between and


문제 14. 월급이 1000에서 3000 사이가 아닌 사원들의 이름과 월급을 출력하시오

SQL > select ename, sal
          from emp
          where sal not between 1000 and 3000;


문제 15. 사원번호가 7788, 7902 인 사원들의 사원번호와 이름을 출력하시오 !

SQL > select empno, ename
          from emp
          where empno in(7788,7902);

SQL > select empno, ename
          from emp
          where empno = 7788 or empno = 7902;

* 기타 비교 연산자
1. between and
2. in (여러가지 동시에 검색)


문제 16. 직업이 SALESMAN, ANALYST, CLERK이 아닌 사원들의 이름과 직업을 출력하시오!

SQL > select ename, job
          from emp
          where job not in ('SALESMAN', 'ANALYST', 'CLERK');


문제 17. 커미션이 Null인 사원들의 이름과 커미션을 출력하시오!

SQL > select ename, comm
          from emp
          where comm is null;

*기타 비교 연산자
1. between and
2. in
3. is null


문제 18. 커미션이 null이 아닌 사원들의 이름과 커미션을 출력하시오!

SQL > select ename, comm
          from emp
          where comm is not null;


문제 19. 이름의 첫글자가 S(대문자)로 시작하는 사원들의 이름을 출력하시오!

SQL > select ename
          from emp
          where ename like 'S%';

*like 와 같이 쓰이는 것들 (1)
% : wildcard
    이자리에 뭐가 와도, 갯수가 몇개이든 관계없다.


문제 20. 이름의 끝글자가 T로 끝나는 사원들의 이름을 출력하시오!

SQL > select ename
          from emp
          where ename like '%T';


문제 21 이름의 두번째 철자가 M인 사원들의 이름을 출력하시오!

SQL > select ename
          from emp
          where ename like '_M%';

**like 와 같이 쓰이는 것들 (2)
% : 이자리에 뭐가 와도 관계없고 갯수가 몇개든 관계없다.
_ :  이자리에 뭐가 와도 관계 없는 자리 수 1개 이어야 한다.


문제 22. 이름의 세번째 철자가 A인 사원들의 이름을 출력하시오!

SQL > select ename
          from emp
          where ename like '__A%';


문제 23. 이름에 EN 또는 IN을 포함하고 있는 사원들의 이름을 출력하시오!

SQL > select ename
          from emp
          where ename like '%EN%' or ename like '%IN%';


문제 24. 아래의 DATA를 EMP 테이블에 입력하시오

SQL > insert into emp(empno, ename, sal)
          values(1234, 'A%B', 3500);

SQL > select ename, sal
          from emp;


문제 25. 이름의 두번째 철자가 %인 사원의 이름을 출력하시오

SQL > select ename
          from emp
        where ename like '_m%%' escape 'm';

*like 와 같이 쓰이는 것들 (3)
escape



* 생각해봐야할 문제 *

select ename, sal
from emp
where sal between 1000 and 3000;

둘 中 어떤것과 같은가?

1) where sal >= 1000 and sal <=3000; 
2) where sal > 1000 and sal <3000;


답은 1번 

추가로 알게 된 내용 

1. set page 400 / 보이는 페이지를 늘릴 때 사용 (점선이 사라진다.) 

2. ed+Enter키 / 메모장이 열린 후 수정이 가능하다. (닫은 후 -> '/'+Enter키) 


+ Recent posts