Oracle/SQL

2012.01.02 SQL 1일차(1) (literal,연결연산자,where,between,in,like,null,집합연산자,정렬)

에몽이ㅋ 2012. 1. 9. 22:32

literal 상수(literal 문자표현식)

 SQL> select name, '교수님 배고파요' from professor;


NAME       '교수님배고파요             ;  '교수님 배고파요' 부분을 literal상수(literal문자, 또는 표현식)이라고 한다.

---------- ---------------

이재우     교수님 배고파요

김도훈     교수님 배고파요

성연희     교수님 배고파요

염일웅     교수님 배고파요

권혁일     교수님 배고파요

이만식     교수님 배고파요

전은지     교수님 배고파요

남은혁     교수님 배고파요


8 rows selected.



연결연산자(||로 문자열 또는 컬럼을 이어줄 수 있다.)

 SQL> select deptno||'  '||dname from dept;


DEPTNO||''||DNAME

--------------------------------------------------------

10  ACCOUNTING

30  SALES

20  RESEARCH

40  OPERATIONS




실습문제 김도훈(교수) ,김도훈'교수' 처럼 professor테이블에서 자료를 뽑아보세요.

SQL> select name||'('||position||') , ' ||

  2  name||''''||position||''''             <---- 여기서 ''안에 '가 표시되게 하려면 '''' 라고 써줘야 표시됩니다.

  3  from professor;


NAME||'('||POSITION||'),'||NAME||''''||POSITION||''''

-------------------------------------------------------------------

김도훈(교수) , 김도훈'교수'

이재우(조교수) , 이재우'조교수'

성연희(조교수) , 성연희'조교수'

염일웅(전임강사) , 염일웅'전임강사'

권혁일(교수) , 권혁일'교수'

이만식(부교수) , 이만식'부교수'

전은지(전임강사) , 전은지'전임강사'

남은혁(부교수) , 남은혁'부교수'


8 rows selected.

조건검색 where
SQL> select studno, name, grade, deptno
  2  from student
  3  where grade=2;

    STUDNO NAME       G     DEPTNO
---------- ---------- - ----------
     10201 김진영     2        102
     10104 지은경     2        101
     10105 임유진     2        101
     20103 김진경     2        201
     10108 류민정     2        101
BETWEEN 연산자(두 값 사이를 검색할 때 사용, > and <쓴거와 같습니다.)
SQL> select name, studno, height
  2  from student
  3  where height between 160 and 170;

NAME           STUDNO     HEIGHT                 where tablename BETWEEN A AND B 형식으로 사용하며
---------- ---------- ----------                  A와 B를 포함해서 검색합니다.
박미경          10102        168
김영균          10103        170
김진영          10201        164
지은경          10104        161
하나리          10203        160
김진경          20103        166
류민정          10108        162
IN(a,b,c,..) 연산자 
: IN 연산자는 특정 칼럼의 데이터 값이 a,b,c,... 값 중에 하나라도 일치하면 참이 되는 연산자(or여러개 쓴거랑 동일)
SQL> select profno, name, position, deptno
  2  from professor
  3  where position in('조교수', '전임강사');

    PROFNO NAME       POSITION                 DEPTNO      where tablename in('조건1', '조건2', ....); 방법으로 사용합니다.
---------- ---------- -------------------- ----------
      9902 이재우     조교수                      201
      9903 성연희     조교수                      101
      9904 염일웅     전임강사                    102
      9907 전은지     전임강사                    101
LIKE 연산자 (비슷하다는 뜻으로 사용)
LIKE 연산자는 컬럼에 저장된 문자열 중에서 LIKE 연산자에서 지정한 문자패턴과 부분적으로 일치하면 참이 되는 연산자. 아래와 같은 특수문자를 이용할 수 있다.
‘%’: 윈도에서의 *와 동일, 임의의 길이의 문자열(길이가 0인 경우도 포함)
‘_’(언더바) : 윈도에서의 ? 와 동일, 임의의 한 문자에 대한 와일드 문자

 SQL> select name, grade, deptno

  2  from student
  3  where name like '김_영';

NAME       G     DEPTNO
---------- - ----------
김진영     2        102

 SQL> select name, grade, deptno

  2  from student
  3  where name like '김%';

NAME       G     DEPTNO
---------- - ----------
김영균     3        101
김진영     2        102
김진경     2        201



실습문제 : student테이블에서 성이 'ㅇ'으로 시작되는 사람을 뽑으세요.
SQL> select name from student
  2  where name between '아%' and '자%';

NAME
----------
이동훈
오유석
임유진
윤진욱
이광훈
NULL 연산자 : NULL 은 미확인 값이나 아직 적용되지 않은 값을 의미하는 것으로 0과는 다른 의미를 가진다. 
즉, 모른다는 뜻
어떤 연산자와 결합해도 결과값은 NULL
null 을 찾고 싶으면,  sal is null(sal = null 은 틀림) 방식으로 찾아야 된다.(null이 아닌 걸 찾고 싶으면 sal is not null)

 SQL> select name, position, comm

  2  from professor

  3  where comm is null;


NAME       POSITION                   COMM

---------- -------------------- ----------

이재우     조교수

염일웅     전임강사

이만식     부교수

전은지     전임강사


  1  select name, position, comm

  2  from professor

  3* where comm is not null

SQL> /


NAME       POSITION                   COMM

---------- -------------------- ----------

김도훈     교수                         20

성연희     조교수                       15

권혁일     교수                         25

남은혁     부교수                       17




집합연산자

집합 연산자

의 미

주의사항 : 컬럼이름은 달라도 상관없지만

데이터타입은 같아야한다.

UNION

두 집합에 대해 중복되는 행을 제외한 합집합

"+(첫 컬럼으로 정렬)"

정렬사용

UNION ALL

두 집합에 대해 중복되는 행을 포함한 합집합

"+(정렬안함)"

MINUS

두 집합간의 차집합

"-(순서중요)"

정렬사용

INTERSECT

두 집합간의 교집합

"교집합(속도느림)"

정렬사용


(정렬사용한다는 말은 데이터베이스에 행이 엄청 많을때, 이 쿼리 잘못쓰면 하루종일 걸린다는 말입니다. 쓸때 조심하세요)


 SQL> select name, position from professor

  2  union

  3  select name, grade from student;


NAME       POSITION

---------- --------------------

권혁일     교수

김도훈     교수

김영균     3

김진경     2

김진영     2

남은혁     부교수

류민정     2

박동진     1

박미경     1

서재진     1

성연희     조교수


NAME       POSITION

---------- --------------------

염일웅     전임강사

오유석     4

윤진욱     3

이광훈     4

이동훈     1

이만식     부교수

이재우     조교수

임유진     2

전은지     전임강사

전인하     4

조명훈     1


NAME       POSITION

---------- --------------------

지은경     2

하나리     1


 SQL> select deptno from professor

  2  minus

  3  select deptno from student;


    DEPTNO

----------

       202


다른건 안그런데 minus는 순서가 중요합니다.





SQL> select deptno from professor

  2  intersect

  3  select deptno from student;


    DEPTNO

----------

       101

       102

       201




정렬 : ORDER BY
시간이 많이 걸림, query에는 되도록 쓰면안된다, 대신 index사용(나중에배움)
기본적으로 오름차순 정렬이고, 
오름차순 : ASC, 내림차순 : DESC로 표기한다.

  1  select deptno, grade, studno, name, userid
  2  from student
  3* order by deptno desc, grade asc      ;  deptno 내림차순으로 정렬 후 , 
                                                          grade 오름차순으로 정렬해서 뽑아옴.(asc 생략가능)
SQL> /

    DEPTNO G     STUDNO NAME       USERID
---------- - ---------- ---------- ----------
       201 1      20101 이동훈     Dals
       201 1      20104 조명훈     Rader214
       201 1      20102 박동진     Ping2
       201 2      20103 김진경     lovely
       102 1      10203 하나리     hanal
       102 2      10201 김진영     simply
       102 3      10204 윤진욱     Samba7
       102 4      10202 오유석     yousuk
       101 1      10106 서재진     seolly
       101 1      10102 박미경     ansel414
       101 2      10104 지은경     Gomo00

    DEPTNO G     STUDNO NAME       USERID
---------- - ---------- ---------- ----------
       101 2      10105 임유진     YouJin12
       101 2      10108 류민정     cleanSky
       101 3      10103 김영균     mandu
       101 4      10107 이광훈     huriky
       101 4      10101 전인하     jun12