Oracle SQL 강좌
SELECT문 및 연산자 46 70 99,999+

by 구루비 SELECT IN NOT IN LIKE ESCAPE ORDER BY BETWEEN AND [2002.01.20]


SELECT문은 데이터베이스로부터 저장되어 있는 데이터를 검색하는데 사용 한다.

SELECT 문법

INSERT

  • - DISTINCT : 중복되는 행을 제거하는 옵션.
  • - * : 테이블의 모든 column을 출력.
  • - alias : 해당 column에 대해서 다른 이름을 부여할 때 사용.
  • - table_name : 질의 대상 테이블 명
  • - WHERE : 조건을 만족하는 행들 만 검색
  • - condition : column, 표현식, 상수 및 비교 연산자
  • - ORDER BY : 질의 결과 정렬을 위한 옵션(ASC:오름차순(Default),DESC내림차순)

SQL문의 작성 방법
  • - SQL 문장은 대소문자를 구별하지 않는다.
  • - SQL 문장은 한 줄 또는 여러 줄에 입력될 수 있다.
  • - 일반적으로 키워드는 대문자로 입력한다. 다른 모든 단어, 즉 테이블 이름, 열 이름은 소문자로 입력한다.(권장)
  • - 가장 최근의 명령어 한 개가 SQL buffer에 저장 된다.
  • - SQL문 마지막 절의 끝에 ";"를 기술하여 명령의 끝을 표시 한다.
 
-- empno와 ename 은 각각 사번과 성명이라는 컬럼 별칭(alias)으로 만들어 출력
-- alias를 사용할 때 as라는 키워드를 사용해도 되고, 생략 할 수도 있다.
SQL> SELECT empno 사번, ename 성명
      FROM   emp
     WHERE  deptno = 10

      사번      성명
---------- ---------------
 7782      CLARK
 7839      KING
 7934      MILLER
    

WHERE절에 사용될 수 있는 SELECT 연산자
연산자 설 명
BETWEEN a AND b a와 b사이의 데이터를 출력.(a, b값 포함)
IN (list) list의 값 중 어느 하나와 일치하는 데이터를 출력
LIKE 문자 형태로 일치하는 데이터를 출력(%, _사용)
IS NULL NULL값을 가진 데이터를 출력 합니다.
NOT BETWEEN a AND b a와 b사이에 있지않은 데이터를 출력(a, b값 포함하지 않음)
NOT IN (list) list의 값과 일치하지 않는 데이터를 출력
NOT LIKE 문자 형태와 일치하지 않는 데이터를 출력
IS NOT NULL NULL값을 갖지 않는 데이터를 출력

IN, NOT IN 연산자

IN 연산자
  
-- 사번이 7900, 7934번인 사원의 사번과 성명 출력
SQL> SELECT empno, ename
     FROM  emp
     WHERE empno IN (7900, 7934) ;

    EMPNO    ENAME
 --------- -------------
    7934      MILLER
    7900      JAMES
    

NOT IN 연산자
  
-- 사번이 7900, 7934번이 아닌 사원의 사번과 성명 출력
SQL> SELECT empno, ename
     FROM  emp
     WHERE  empno NOT IN (7900, 7934);

  EMPNO   ENAME
-------- --------------
  7369    SMITH
  7499    ALLEN
  7698    BLAKE
  .... 
    

BETWEEN 연산자

AND를 이용해 두 조건을 결합한 검색과 같은 결과값을 보여 준다.

-- 급여가 3000에서 5000사이인 사원만 조회      
SQL> SELECT empno, ename
     FROM  emp
     WHERE  sal BETWEEN  3000 AND 5000;

  EMPNO ENAME
------- ------
   7788 SCOTT
   7839 KING
   7902 FORD  
    

LIKE 연산자

  • - 검색 STRING 값에 대한 와일드 카드 검색을 위해서 LIKE 연산자를 사용.
  • - % : 여러 개의 문자열을 나타내는 와일드 카드
  • - _ : 단 하나의 문자를 나타내는 와일드 카드
  • - ESCAPE : 와일드 카드 문자를 일반문자 처럼 사용하고 싶은 경우에 사용.
  •   ex) WHERE name LIKE '%a\_y%' ESCAPE '\'
  • - LIKE 연산자는 대소문자를 구분 한다.
  • - UPPER() 함수를 이용해 대소문자 구분없이 출력 할 수 있다.(인덱스 성능문제 발생, 함수기반 인덱스 사용..)
구 분 설 명
LIKE 'A%' 'A'로 시작하는 데이터만 검색
LIKE '%A' 'A'로 끝나는 테이터들만 검색
LIKE '%KIM%' 'KIM' 문자가 있는 데이터 들만 검색
LIKE '%K%I%' 'K' 문자와 'I'문자가 있는 데이터 들만 검색
LIKE '_A%' 'A'문자가 두 번째 위치한 데이터 들만 검색

LIKE 연산자 예제
-- 'K' 문자가 들어있는 사원 정보 조회
-- UPPER() 함수는 k를 대문자로 변환하여 'K'로 인식    
SQL> SELECT empno, ename
     FROM  emp
     WHERE  UPPER(ename) LIKE '%K%';

EMPNO   ENAME
------- -----------
 7698   BLAKE
 7782   CLARK
 7839   KING

-- '_'를 이용한 LIKE검색
SQL> SELECT empno, ename
     FROM  emp
     WHERE UPPER(ename) LIKE '_I%'

  EMPNO ENAME
------- ----------
   7839 KING
   7934 MILLER
    

ORDER BY

ORDER BY 절은 데이터의 정렬을 위해 사용합니다.(ASC[오름차순], DESC[내림차순])

-- 아래 두 개의 쿼리는 동일한 결과를 반환 한다.
-- 이름을 ASC로 정렬     
SQL> SELECT empno, ename
     ROM  emp
     WHERE  deptno = 30
     ORDER BY ename ASC;

-- 두 번째 컬럼을 디폴트(ASC) 순으로 정렬
SQL> SELECT empno, ename
     FROM  emp
     WHERE  deptno = 30
     ORDER BY 2
         
   EMPNO ENAME
-------- ---------
    7499 ALLEN
    7698 BLAKE
    7900 JAMES
... 
    

참고링크

- 강좌 URL : http://www.gurubee.net/lecture/1017

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by 김영석 [2005.06.23 15:21:22]
감사합니다.

by 박종욱 [2005.10.08 15:17:22]
order by 2라는 뜻은 2번째 칼럼을 기준으로 정렬하라는 뜻입니다. 내림 차순은 칼럼 뒤에 desc 써준면 됩니다. ㅡㅡㅋ

by 유선현 [2005.10.17 14:04:30]
Order by default 속성 - ASC(오름차순)

by smile [2005.11.09 19:55:15]
퍼갑니다. ^^

by 시근땀 [2006.03.14 16:53:44]
내용을 복사하실때는 마우스로 선택 후 Ctrl+C로 복사하세요.
라는 말까지 하시며 친절하게 퍼가도록 허용해 주심을 매우 감사드립니다.

SELECT girlfriend
FROM ALL_WOMEN
WHERE style = 'my style'; 하면 여친을 구할 수 있나요?

by 이연두 [2006.03.16 15:40:05]
안됩니다. 님은 권한이 부족합니다.

by 시근땀 [2006.03.20 13:11:02]
뭘 근거로 권한이 부족하다고 그러시는거죠? 권한이 부족한게 문제라면,

GRANT SELECT
ON ALL_WOMEN
TO 시근땀

이렇게 하면 되지 않겠어요?

by 이경호 [2006.03.20 14:28:55]
시근땀님 충분히 권한이 있으시내요~ 좋은여친만나세요

by 이연두 [2006.03.20 15:03:26]
근땀님 진짜 웃기시다.
외로우신가봐요. ㅋㅋ

by 이단아 [2006.03.20 16:08:25]
이연두님 재밌으신거 같아요 ㅋㅋㅋ

by 이단아 [2006.03.20 16:11:14]
그리고 제가 생각해도 시끈땀님은 못구하실거 같아요, 왜냐면
style의 값 중에서 'my style'이라는 값은 존재하지 않을거 같네요~
style엔 'cuty', 'pretty', 'beautiful' << 요정도로만 존재할거 같네요 ㅋㅋ

by 시근땀 [2006.03.21 11:27:11]
이경호님 감사합니다. ^^
근데, 단아님이 제가 좌절감을 안겨주시는군요. OTL=3
여친을 구하기 위해서는 제가 원하는 스타일을
'cuty', 'pretty', 'beautiful' 같은 유형으로 한정시켜야 되는군요....
근데 단아님.
where 를 사용해 그런 조건을 주면, 너무 많은 여성이 select될 것 같아요.
저보고 바람둥이가 되라는 말씀이신가요?

by 박영규 [2006.03.21 12:57:39]
REVOKE SELECT
ON ALL_WOMEN
FROM 시근땀;

ALTER USER 시근땀 ACCOUNT LOCK;

by 이연두 [2006.03.21 16:06:27]
시근땀님 큰일났다 이제. ㅎㅎ

by merry [2006.03.21 17:14:11]
shutdown immediate

by 시근땀 [2006.04.07 10:09:51]
헉... 어뜩하믄 좋죠? REVOKE 당해버렸네...
이젠 할 수 없이 베트남 DB나 우크라이나 DB에 접속해야되는건가요? ㅠㅠ

by 낭이 [2006.04.17 17:46:54]
혼자 사세요!!! 여자분이 먼저 select 해오길 바라세요.!

by 사이키 [2006.04.19 18:33:59]
INSERT INTO VALUES (1.'베트남'.'MISS'.'20'.'초혼'.'귀여움'.'080XXX1234');

by 쵸파디비 [2006.04.24 21:43:44]
와우~~!! ㅋㅋㅋㅋ

by 양재상 [2006.05.02 22:32:03]
사이키님 구문에 빠진게 있어서 추가요~
INSERT INTO SIGUNDDAM VALUES (1.'베트남'.'MISS'.'20'.'초혼'.'귀여움'.'080XXX1234');

by 허걱 [2006.05.17 17:34:02]
근땀님 땜에 넘 웃었어여
저렇게 유머러스 하시다면야 제가 SELECT 해오겠음다~
SELECT * FROM ALL_BOYS WHERE BOYNAME = '시근땀'

by 시근땀 [2006.05.26 12:21:42]
오랜만에 왔는데,
그사이 저에게 프로프즈 하신 분도 계시는군요.
영광입니다. ㅋㅋ
저에게도 UNION 할 수 있는 기회가 생긴건가요? *^^*

by 관리자 [2006.07.24 17:58:24]
오라클 서버가 다운되었습니다.

by 궁금이 [2006.08.18 18:14:03]
SELECT empno, ename
FROM emp
WHERE ename like '%t_a%'

'_' 가 한 문자를 나타내지 않고 실제 t_a 라는 문자열이 들어있는 데이터를
찾고자 한다면 어떻게 조회해야 되나요??
궁금~ (ㅅ ㅜㅅ)

by 몬다위 [2006.08.23 10:20:02]
SELECT EMPNO, ENAME FROM EMP WHERE ENAME LIKE '%T\_A%'ESCAPE'\';
이런식으로 하시면 됩니다. 참고로 전 윈도우라 \이렇게 표시가 되구요
리눅스에서는 \ 기호를 쓰시면 될듯 싶네요..

by 레오나 [2006.08.29 16:08:11]
그려면 아이디중복체크에도 사용할수 있는거죠 where절에서요 ?
select * from emp
where ename = '문자열' 해서 plsql로 가능한거죠

by 연 [2006.10.10 20:14:40]
INSERT INTO VALUES('한국','잠실','여','19','왕눈이','착함','01026758366','songhj8827@hotmail.com);
MSN친구 할 사람^^...
친해지면 아주 좋구^^*
오라클 지금 배우고 있는데 재밌네요...ㅋ



by 녹스 [2006.10.20 18:02:01]
select empno
,ename
from emp
where upper(ename) like '_i%'

오라9 쓰는데 오라9 에서는 대소문자 구분해야 되나요
위와 같이 실행 시키면 선택 되는게 없네요~

by 이현석 [2006.10.23 19:13:55]
upper(ename)에서 upper는 다 대문자로 바꾸겠단 의미잖아요? 그러니 조건안에 있는 '_i%'도 대문자인 '_I%' 로 바꾸셔야 합니다.

by 녹스 [2006.10.31 15:11:14]
아 다 대문자로 바꾸겠단 의미였군요~~
제가 강좌 내용을 잘못 이해했나봅니다~~~
감사합니다~~~^^*

by 윤현근 [2006.11.22 08:47:13]
upper은 모든문자를 대문자로 인식한다는 의미니까 조건안이 소문자더라도 별 상관없는거 아닌가요.. 그 문자도 대문자로 인식만 하면되니까 ㄷㄷ

by 테크 [2007.01.31 11:24:33]
정말 좋은 내용이예요 ^^

by 김덕헌 [2007.02.23 13:22:01]
upper는 모든 문자를 대문자로 인식하는건 맞는데 조건에서 소문자이면 당연히 대문자랑 비교하는데 비교할 대상이 없어서 상관이 있겠죠..^^
대문자로 인식만 하면 되는것이 아니고 명시를 해놓아야 비교를 할 수 있습니다.^^

by 리테 [2007.04.03 15:58:05]
한참지나서야..리플을..크헐...리플 퍼가요..^-^)b

by xian [2007.04.27 18:16:35]
배워 보려고 하는 초보자여서 도통 무슨 말인지 잘 이해가 안가지만
좋은 자료 감사합니다.열심히 익혀야겠네요!!

by 샹지 [2007.05.03 14:51:21]
댓글읽으면서 공부하니 머리에 더 쑥쑥 들어 오는거 같네요 흐흐~

by 지나가는놈 [2007.05.14 11:30:26]
시근땀님..
SELECT girlfriend
FROM ALL_WOMEN
WHERE style = 'my style'
and rownum =1;
을 하셔야 바람둥이가 안 됩니다..

by 좋은느낌 [2007.06.15 13:09:57]
SELECT girlfriend
FROM ALL_WOMEN
WHERE style = 'my style'
and rownum =1
ORDER BY MIMO ;
라고 하시면 젤 예쁜 사람을 구할 수 있지요..

by 웅 [2007.06.17 10:49:16]
SELECT girlfriend
FROM (SELECT girlfriend
FROM ALL_WOMEN
WHERE style = 'my style'
ORDER BY MIMO)
WHERE ROWNUM = 1
요로코롬 해야되지 않을까요? ^^

by 질문 [2007.06.19 20:39:38]
이중으로 오름차순 정리는 어떻게 하죠?
1 10
1 20
1 30
2 15
2 17....
이런식으로 첫번째는 1, 2 순서로 오름차순 정리하고..
1에서 10,20,30으로 오름차순, 2에서도 15,17로 오름차순...

by 답변 [2007.07.10 14:51:23]
order by 첫번째칼럼, 두번째칼럼

by 돌팡 [2007.10.09 14:00:13]
고맙습니다.
좋은 강좌입니다.~~~

by 돼랑 [2007.11.19 15:48:46]
시근땀님의 리플이 더 없는것을 보아하니 오라클 하산하셨군요... 은근히 리플 기대했는데 휴ㅅ휴

by 병돌이 [2008.01.02 11:00:44]
SUBSTR(테이블 항목,1,10)
는 무슨뜻이예요?

by 오늘시작초보 [2008.01.02 16:19:06]
substr("abcdef",1,4) 라고할때 "bcde"를 반환합니다.
문자열 adcdef에서 a(0), b(1), c(2), d(3), e(4), f(5) 가됩니다.
-출처:네이버지식검색

by 오늘시작초보 [2008.01.02 16:24:09]
오라클클럽의 상단메뉴바에서 Oracle >> 오라클 용어사전에 검색해도 자세한 기능이 나오더군요~!!

by 속보 [2008.01.08 00:47:26]
SELECT country, wife, wife_mimo
FROM earth
WHERE name='시근땀';


COUNTRY WIFE WIFE_MIMO
------- ---------- ----------
우크 있음 GOOD


by 오진안 [2008.01.29 13:22:47]
진짜 덧글보는게 더 공부가 되네@@

by 방지용 [2008.02.18 11:46:06]
date문으로 선언해주고 입력값에서.. sysdate 안하고 따로 날짜를 선언해줄때..
선언 방식이 어떻게 되나요? '81/3/1' 아님...'17-nov-81' 아님 어떻게?
ㅠ,.ㅠ 갈켜주세용

by 마농 [2008.02.20 15:38:25]
TO_DATE('20080220','yyyymmdd')

by 바부잠팅이 [2008.05.14 09:33:19]
oracle과 vb.net 연동을 하고 있는데요
프로시저에서 select문을 사용하는데요
뭐가 틀린지 잘 몰라서요 알려주세요

create or replace procedure "KYC".s_GetInfo
(v_id out number, v_name out VARCHAR2, v_dept out VARCHAR2)
is
BEGIN
select v_name=name,v_dept=dept from Employee where id=v_id ;
commit;
END s_GetInfo;

by 한동희 [2008.08.01 13:45:12]
재미있어요 ㅎㅎㅎ

by 고니 [2008.08.20 10:01:52]
혹시 이번 강좌 예제로 나오는 데이터들은 언제 insert 한건가요? 찾아봐도 없는 것 같은데요.. 알려주세요^^

by 최진도 [2008.10.14 13:49:46]
'_A%' 절에서
'__A%' 라고 한다면 컬럼에서 A문자가 세번째 위치로도 검색이 가능한건가요?

by 왕초보 [2008.11.18 15:20:19]
오늘시작초보님 substr("abcdef",1,4) 라고하면 처음자리부터 4자리까지 반환을 하니깐 abcd가 반환될듯하네요 ^^;;.

by 김경수 [2008.12.05 09:09:25]
감사요.... 잘 보고 공부할수 있네요..

by 김태희 [2009.04.02 14:01:14]
저도 이제 배우는데 어렵지만 정리가 잘되어서 배우기가 쉽네요 ^^ 좋은 강의 감사함니다 ^^

by 손님 [2010.04.02 13:03:29]
between 예제에서 "사원만을 보여줍니다" 했는데 사원번호(empno)까지 꼭 써야 되는 건지?? 그냥 select ename 하면 잘못된건지~ 고수님들 알려주세용^^

by 김창환 [2010.10.08 11:25:33]
감사합니다.

by 셀렉트 [2011.03.24 18:11:24]
between 예제에서 "사원만을 보여줍니다" 했는데 사원번호(empno)까지 꼭 써야 되는 건지?? 그냥 select ename 하면 잘못된건지~ 고수님들 알려주세용^^
고수까지는 필요없고요.
말그대로 ..empno는 컬럼입니다. 조건이 아니고요. 단지.. 사원에 사원번호까지 확인을 위해서 컬럼을 추가한듯합니다.

by 김용한 [2011.07.04 12:37:13]
- WHERE : 조건을 만족하는 행들 만 검색
번역이잘못됀거같습니다

조건을 만족하는 열이아닐까요?

where a='1' 여기서 a라는 컬럼의 조건이 '1' 을 만족하는 열들만 검색이 맞다고 생각합니다

영어사전에도 column 행, row 열 이라고나와있습니다

by xo [2011.07.15 14:36:44]
행이 맞습니다.
열은 select절에 기술된 컬럼에 의해서 결정됩니다.

by 손님 [2012.03.13 14:19:27]
강좌에 연관된 스터디 내용도 링크되어져 있군요.

자잘한 노가다였을텐데...수고하셨고 감사합니다.

꾸준히 우리를 놀라게 하네요.

by 손님 [2012.04.16 10:40:45]
SELECT  *
FROM    DEPT
WHERE   DEPTNO NOT IN (10,10,10,NULL) 

안녕하세요. DB초보입니다. 
위의 쿼리문이 왜 결과가 0개 출력 되는지 잘 모르겠습니다. 

이유가 무엇인지 알 수 있을가요 ??

by 잭순 [2012.05.03 10:05:11]

DBA 의 시작 select 문!! 감사합니다 ㅎ

by 손님 [2012.05.08 15:16:02]
SELECT * FROM DEPT WHERE DEPTNO NOT IN (NULL) ;
글쎄요.. PK라서 그런걸까요?
저도 잘 모르겠네요..



by 까망소 [2012.12.14 16:16:52]

와~~~ 여기까지 댓글 정독했습니다!
강좌만큼 댓글도 재미있네요 ㅋ

by 손님 [2013.04.26 17:22:38]

NULL값이 빈 값이 아니고 확인되지 않은 값일 뿐이지 값은 값이라서 그런거 아닐까요..
그 확인되지 않은 값이 DEPTNO=10이 될 수도, 20 30 40이 될 수도 있어서..
NULL 말고 0이나 아무 숫자나 넣어보니 잘 되는데요

by 쥐잡종 [2014.06.24 16:37:34]

허허허...

우연히 보게된 사이트에서 order by 2 이런식으로 입력하면 컬럼 순서 번호로 정렬된다니..

MSSQL 에서 해보니 MSSQL에서도 되긴하네요.. 2008버전.... mssql 약 2년 동안하면서 몰랐던 내용임 ㅋㅋㅋㅋ


by 쇠똥구리 [2023.12.27 09:07:46]

선배님들 댓글 너무 재밌네요.. 식은땀님 결혼은 하셨는지요 ??

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입