Notice
Recent Posts
Recent Comments
관리 메뉴

Developer Gonie

[6주차] 5. SELECT, 테이블 조회(Where 절)** 본문

K-DigitalTraining 강의/2. Oracle + PLSQL

[6주차] 5. SELECT, 테이블 조회(Where 절)**

이대곤 2022. 6. 13. 10:50

Select

select * from 테이블명;
select 필드1, 필드2 from 테이블명;

Select + where

select * from 테이블명
where 조건;
select 필드1, 필드2 from 테이블명
where 조건;

Select + where + order by

select * from 테이블명
where 조건
order by 필드명 -- 디폴트로 오름차순 정렬 
order by 필드명 정렬방식
order by 필드명1 정렬방식1, 필드명2 정렬방식2, 
order by 필드명1, 필드명2,, 정렬방식;
order by 컬럼번호1, 컬럼번호2,, 정렬방식; -- 잘 사용 안하는 방식

<정렬방식>
asc : 오름차순(숫자, 날짜, 문자) -- 날짜는 asc 하면 오래된 날짜부터 나옴
desc : 내림차순 -- desc : 테이블 구조를 보는 명령어로 같지만 기능이 다름

-- email 필드를 기준으로 오름차순으로 조회하니 abc 순으로 출력됨
select * from members
order by email asc;

-- name 기준으로 오름차순으로 정렬하되, 같은 name이 존재하면 salary가 높은 것이 먼저 나오도록 조회
select * from members
order by name asc, salary desc;

--salary가 낮은 레코드부터 나오도록 조회하고, 같은 salary가 있으면 생일이 빠른 레코드가 먼저 나오도록 조회
select * from members
order by salary, birth;

--결과는 위와 같음(asc는 생략가능)
select * from members
order by salary asc, birth asc;

--email이 naver인 레코드를 급여 높은것부터 나오도록 조회
select * from members
where email like '%@naver.com'
order by salary desc;

--80년대생 중에 급여가 500이하인 레코드를 이름 오름차순으로 조회
select * from members
where birth like '8%'and salary <= 500
order by name asc;

-- 결과는 바로 위와 같음
select * from members
where birth >= '80-1-1'and birth <= '89-12-31' and salary <= 500
order by name asc;

-- 결과는 바로 위와 같음
select * from members
where birth between '80-1-1'and '89-12-31' and salary <= 500
order by name asc;

SELECT 문 사용시, 출력되는 테이블의 필드 폭 변경

- col 필드명 for 지정포멧

  이후에 select * from 테이블명 해주면 변경된 사항이 반영된 것을 확인 가능

-- 폭 설정 6자리
col name for a6;

-- 폭 설정 14자리
col email for a14;

-- 폭 설정 3자리, 숫자필드는 숫자 9로 폭 설정함
col id for 999;

Select 문 사용시, 필드명에 별칭 부여 방법(as 사용)

- 실제 테이블의 필드명이 바뀌는건 아니고, 보여지는 것만 변경되는 것임

-- 별칭에 공백이 존재할 땐 큰 따옴표로 감싸야 한다.
select id as 번호, name as 이름, eamil as "이메일 주소" from members

-- as 키워드는 생략이 가능하다.
select id 번호, name 이름, eamil "이메일 주소" from members

Select 문 사용시, 결과가 테이블이 아닌 문장으로 출력되게 하는 방법(|| 사용)

* 이걸 할 땐 큰따옴표가 아닌 작은따옴표로 문자열을 감싸줘야 한다.

SQL> select name || '의  급여는 ' || salary || '원 입니다.' from members;

NAME||'의급여는'||SALARY||'원입니다.'
--------------------------------------------------------------------------------
제시카의  급여는 100원 입니다.
티파니의  급여는 700원 입니다.
수영의  급여는 300원 입니다.
효연의  급여는 800원 입니다.
효연의  급여는 200원 입니다.
제시카의  급여는 500원 입니다.
써니의  급여는 600원 입니다.
유리의  급여는 500원 입니다.
윤아의  급여는 300원 입니다.
수영의  급여는 1000000원 입니다.
제카의  급여는 200원 입니다.

그동안 내가 만들었던 테이블의 목록을 보고싶을 때

-- tab 테이블에는 내가 지금까지 만든 테이블의 정보가 담겨있음
select * from tab;

1. WHERE 조건 : 필드값 and, or, between, in, not in연산으로 레코드 조회

- Oracle에서의 조건 연산시 and, or 를 사용한다. (java에서는 &&, ||)

-- id 필드가 1보다 크거나 같고 5보다 작거나 같은 행만 필터링
select * from 테이블명 
where id >= 1 and id <= 5;

-- 결과가 바로 위의 where 절과 같음
select * from 테이블명 
where id between 1 and 5;

-- id 필드가 1보다 작거나 5보다 큰 행만 필터링
select * from 테이블명 
where id < 1 or 필드 > 5;

-- id 필드가 1 또는 4또는 7인 행만 필터링
select * from 테이블명
where id in(1,4,7);

-- id 필드가 1 또는 4또는 7가 아닌 행만 필터링
select * from 테이블명
where id not in(1,4,7);

-- name 필드가 '수영' 또는 '효연'인 행만 필터링
select * from 테이블명
where name in('수영','효연');

-- 결과가 바로 위의 where 절과 같음
select * from 테이블명
where name = '수영' or name = '효연');

2. WHERE 조건 : 필드값이 특정 값이 아닌 레코드 조회

-- salary가 300이 아닌 레코드 조회
select * from 테이블
where salary <> 300;

-- name이 '태연'이 아닌 레코드 조회
select * from 테이블
where name <> '태연';

3. WHERE 조건 : 필드값이 null이거나 null이 아닌 레코드 조회

-- eamil 필드의 값이 null인 레코드 조회, "= 연산자로 비교불가"
select * from 테이블명
where email is null;

-- eamil 필드의 값이 null이 아닌 레코드 조회
select * from 테이블명
where email is not null;

4. WHERE 조건 : date 타입 필드에 대한 where절

- '90-1-1' 과 같이 date 타입의 필드값 입력시 자동으로 지정되는 세부 년도가 달라지는데 50을 기준으로 세기가 달라진다.
  50, 51, 52는 1950, 1951, 1952년 이지만 49, 48는 2049, 2048년 이런식임. 
  만약, 2090년도에 해당하는 값을 넣고 싶다면 insert 연산시 2090-7-6 이런식으로 좀더 세부적으로 명시해줘야 한다.
  select 문으로 출력하면 90-7-6 으로 보여지겠지만 where 절을 적용해보면 2090년으로 잘 인식하는 것을 확인할 수 있다.

-- date 타입의 birth필드에 대해 90년 1월 1일 이후인 경우만 나오게 필터링 -> 보다 최근인 것의 의미
select * from 테이블명
where birth > '90-1-1';

-- date 타입의 birth필드에 대해 90년생인 경우만 나오게 필터링
select * from 테이블명
where birth >= '90-1-1' and birth <= '99-12-31';

-- 결과는 바로 위와 같음
select * from 테이블명
where birth between '90-1-1' and '99-12-31';

-- 결과는 바로 위와 같음
select * from members
where birth like '8%';

5. WHERE 조건 : 문자열 패턴일치

* 특정 패턴과 불일치하는 경우를 뽑아내고 싶은 경우 like 앞에 not 을 위치시키면 된다.

 

- 패턴일치 조회 : "_ : 1글자가 꼭 와야함", "% : 0~무한대"

 

김_ -> 김정, 김밥, 김호

_니 -> 써니, 마니 -> (티파티X)

김_ _ -> 김수호,김혜민 -> 김밥(X)

_김_ -> 이김박, 윤김정 -> 김호(X), 정김(X)

 

%은% -> 은, 최은, 은희, 김세은, 가나다은후요

김_% -> 김석, 김선호, 김아무개  -> 김(X)

%니 : 니, 써니, 티파니 -> '니'로 끝나는 모든문자열O

-- name 필드의 값이 '니' 로 끝나는 모든 행
select * from members
where name like '%니';

-- email 필드의 값이 다음인 모든 행
select * from members
where email like '%@daum.net';

-- 90년대생 레코드 조회를 이 방식으로도 가능
select * from members
where birth like '9%';

-- 그냥 문자열과 일치하는 경우를 필터링 하고 싶다면
select * from members
where name = '신돈';
Comments