본문 바로가기
Backend/Oracle DB

04. Oracle DB, Select문 (Alias, WHERE, LIKE, Sort, NULL, 연산자, 서브쿼리)

by 개발개발빈이 2022. 5. 15.

sungjuk 테이블

 

○ SELECT 문

    - DB에 저장되어 있는 데이터를 조회

    - 형식)

             select 칼럼명1, 칼럼명2, 칼럼명3, ...
             from 테이블명;

--전체 레코드 조회
SELECT uname, kor, mat, eng, aver, addr, wdate
FROM sungjuk;

SELECT *	-- * :  모든 칼럼 조회
FROM sungjuk;

    - 전체 행 개수 구하기 :  select count(*) from 테이블명;

select count(*) from sungjuk;

○ 별칭(Alias) 설정

    - 형식)

             select 칼럼명1 as 별칭1, 칼럼명2 as 별칭2, 칼럼명3 as 별칭3, ...
             from 테이블명;

-- 칼럼명 임시 변경(보여지는 것만 잠시 바꿈)
select uname, kor as korea, eng as english, mat as math from sungjuk;

-- as는 생략가능
select uname, kor korea, eng english, mat math from sungjuk;

○ WHERE 절

    - SELECT문으로 데이터 조회할 떄 특정한 조건을 만족하는 칼럼만 찾고 싶을 때

    - 조건을 만족하는 행들만 검색
    - 조건에 만족하는 레코드만 대상으로 조회(select), 수정(update), 삭제(delete)하기 위해서 필요

    - 형식)

             select 칼럼명1 as 별칭1, 칼럼명2 as 별칭2, 칼럼명3 as 별칭3, ...
             from 테이블명

             where 조건;

--Q1) 국어점수가 50점이상인 행을 조회하시오 
select uname, kor 
from sungjuk 
where kor>=50;

--Q2) 영어 점수가 50점미만인 행을 조회하시오
select uname, eng 
from sungjuk 
where eng<50;

--Q3) 이름이 '곽윤기'인 행을 조회(출력)하시오 
select uname, kor, eng, mat 
from sungjuk 
where uname='곽윤기';

--Q4) 이름이 '곽윤기'가 아닌 행을 조회하시오
select * 
from sungjuk 
where uname!='곽윤기';    -- 좌우가 서로 같지 않다
select * 
from sungjuk 
where uname<>'곽윤기';    -- 좌우가 서로 같지 않다 

--Q5) 국어, 영어, 수학 세과목의 점수가 모두 90이상인 행을 조회하시오 
select * 
from sungjuk 
where kor>=90 and eng>=90 and mat>=90;

--Q6) 국어, 영어, 수학 중에서 한과목이라도 40미만 행을 조회하시오 
select * 
from sungjuk 
where kor<40 or eng<40 or mat<40;

--Q7) 국어점수가 80 ~ 89점 사이인 행을 조회하시오 
select uname, kor, eng, mat 
from sungjuk 
where kor>=80 and kor<=89;

--Q8) 이름이 '곽윤기', '조인성'인 행을 조회하시오
select uname, kor, eng, mat 
from sungjuk 
where uname='곽윤기' or uname='조인성';

 

○ LIKE 연산자

    - 문자열 데이터에서 비슷한 유형을 검색(조회)할 때
    - % : 글자 개수와 상관없음
    - _ (underbar) : 글자 개수까지 일치해야함

-- Q1) 이름이 '황'으로 시작하는 사람을 조회하시오
select uname
from sungjuk 
where uname like '황%'; 

-- Q2) 이름이 '서'로 끝나는 사람을 조회하시오
select uname
from sungjuk 
where uname like '%서'; 

-- Q3) 이름에 '기'가 있는 사람을 조회하시오
select uname
from sungjuk 
where uname like '%기%'; 

-- Q4) 두글자 이름 중 '서'로 끝나는 이름을 조회하시오
select uname
from sungjuk 
where uname like '_서';      -- 언더바 하나가 한 글자 

-- Q5) 이름 세 글자 중에서 가운데 글자가 '윤'인 행을 조회하시오
select uname
from sungjuk 
where uname like '_윤_';

 

○ Sort (정렬)

    - 어떤 특정값을 기준으로 순서대로 재배치
    - 오름차순 Ascending ASC 기본값 1→10 A→Z a→z ㄱ→ㅎ
    - 내림차순 Descending DESC
    - 형식) order by 칼럼1, 칼럼2, 칼럼3, ...

-- 전체 행을 이름순으로 정렬해서 조회하시오
select uname 
from sungjuk 
order by uname asc;     -- asc: 오름차순 정렬

select uname 
from sungjuk 
order by uname desc;    -- desc: 내림차순 정렬 / 최신글부터 보이는 게시판은 내림차순 정렬이다

select uname 
from sungjuk 
order by uname;         -- asc 생략가능


-- 국어점수 순으로 정렬해서 조회하시오
select uname, kor
from sungjuk
order by kor asc;

-- 1차정렬: 국어점수 순으로 정렬
-- 2차정렬: 국어점수가 같다면 이름을 기준으로 내림차순 정렬
select kor, uname
from sungjuk
order by kor asc, uname desc;


-- 문6) 국어점수가 50점 이상인 행에 대해서평균(avr)를 구하시오
update sungjuk 
set tot=kor+eng+mat, avr=(kor+eng+mat)/3
where kor>=50;


-- 문7) 문6에서 평균 70점 이하인 행을 이름순으로 조회하시오
select uname, avr
from sungjuk
where avr<=70
order by uname;

select uname, avr
from sungjuk
order by uname
where avr<=70;      -- 에러 ORA-00933 (정렬은 가장 마지막에)

 

○ NULL

    - 비어있는 값

-- 평균에 null이 있는 행의 개수를 구하시오
select count(*)
from sungjuk
where tot is null;			-- tot=null을 사용하지 않는다

-- 평균이 비어있지 않은 행의 개수를 구하시오(null이 아닌 값)
select count(*)
from sungjuk
where tot is not null;      -- !=이나 <>를 사용하지 않는다

 

○ 연산자

    ① between A and B 연산자

        - A부터 B까지 (A이상 B이하)

--국어점수가 80~89점 사이인 행을 조회하시오
select uname, kor
from sungjuk
where kor>=80 and kor<=89;      -- 1)

select uname, kor
from sungjuk
where kor between 80 and 89;    -- 1)번과 같은 결과 / 두가지 다 많이 사용

    ② in 연산자

        - 목록에서 찾기

-- 이름이 '곽윤기', '황대헌'인 사람을 조회하시오
select uname
from sungjuk
where uname='곽윤기' or uname='황대헌';

select uname
from sungjuk
where uname in ('무궁화', '봉선화');      -- like연산자에선 in 사용불가


-- 국어점수가 50, 60, 80점인 행을 국어점수 순으로 조회하시오.
select uname, kor
from sungjuk
where kor in (50, 60, 80)
order by kor asc;

    ③ not 연산자

        - 부정 연산자

-- 국영수 모두 100점이 아닌 행을 조회하시오
select uname, kor, eng, mat
from sungjuk
where kor<>100 or mat<>100 or eng<>100;

select uname, kor, eng, mat
from sungjuk
where not (kor=100 and mat=100 and mat=100);

    ④ 결합 연산자

        - || (쌍파이프) : 문자열과 컬럼을 합쳐줌

select uname || '의 평균은' || aver || '입니다'
from sungjuk;

 

○ 서브쿼리(Subquery)

    - 테이블 내에서 다시 한번 쿼리문에 의해 레코드 조회 및 검색

    - 쿼리문 안의  쿼리문

-- 문1) 국어점수가 평균(66)이상인 행을 조회하시오
select uname, kor
from sungjuk
where kor>=(select avg(kor) from sungjuk);

-- 문2) 국어 점수가 서울지역의 국어점수의 평균이상인 사람의 주소, 이름, 국어 점수를 조회하시오
select round(avg(kor), 0) from sungjuk where addr='Seoul';    -- 서울의 국어 점수 평균(73)
select addr, uname, kor
from sungjuk
where kor>=(select round(avg(kor), 0) from sungjuk where addr='Seoul');

-- 문3) 국어 점수가 서울지역의 국어점수 평균 이상인 사람이 서울과 다른 지역에 있는지 조회하시오
select addr, uname, kor
from sungjuk
where kor>=(select round(avg(kor), 0) from sungjuk where addr='Seoul') and addr!='Seoul';

-- 문4) 국어점수의 최소값 이하인 점수가 수학 또는 영어 점수 중에 있는지 조회하시오
select min(kor) from sungjuk;       -- 국어 점수 최소값(20)
select uname, eng, mat
from sungjuk
where eng<=(select min(kor) from sungjuk) or mat<=(select min(kor) from sungjuk);

 

댓글