학원 33일차 - Oracle

·2021년 7월 10일
0

2021.05.13

ex03_select.sql

select문

  • DML, DQL
  • 데이터베이스로부터 원하는 데이터를 가져오는 명령어 (읽기)

select 구문

-- [] : 생략가능

[WITH <Sub Query>]    -- with절
SELECT column_list    -- seles절
FROM table_name       --  ...
[WHERE search_condition]
[GROUP BY group_by_expression]
[HAVING serach_condition]
[ORDER BY order_expression [ASC|DESC]];

★ ★ ★ ★ select를 구성하는 모든 절들은 실행 순서가 있다.(불변) -> 무조건 암기!!!!!!!★ ★ ★ ★

실행 순서

  1. FROM절
  2. SELECT절
-- SELECT 컬럼리스트 : 데이터를 가져올 컬럼을 지정한다.(지정된 컬럼(열)을 가져오는 역할)
SELECT column_list

-- FROM 테이블명 : 데이터를 가져올 테이블을 지정한다.(데이터 소스를 지정)
FROM table_name;
-- hr -> 미리 샘플 (테이블+데이터) 제공

-- 현재 계정이 소유하고 있는 테이블 목록 가져오기
select * from tabs;


-- 다양한 스타일로 코드 작성 가능
select * from employees;

select *
from employees;

select * 
    from employees;

select 
* 
from 
employees;


-- select문 작성 -> 실행 -> 서버전달 -> 처리 -> 결과값 반환 -> 클라이언트 반환 -> 결과값 -> ResultSet

-- full select 
select *         -- 2. 어떤 컬럼을 가져올거냐? -> *(wildcard) 모든 컬럼
from employees;  -- 1. employees 테이블로부터 데이터를 가져오겠다.


-- 원하는 컬럼만 가져오기
select first_name
from employees;

select first_name, last_name, salary, department_id, email
from employees;


-- ORA-00942: table or view does not exist
-- 테이블명에 오타가 났을 때 에러
select *
from employee; 

-- ORA-00936: missing expression
-- 컬럼명(식별자)에 오타가 났을 때 에러
select firstname *
from employees;
  • 모든 컬럼 가져오기

  • 원하는 컬럼만 가져오기

  • select 실행하면 나오는 결과를 결과 테이블(Result Table), 결과셋(ResultSet)


구조 확인

select *
from tblCountry;

-- 우리는 tblCountry를 처음 봤음 -> tblCountry 구조 모름.. 모르면 컬럼을 다룰 수 없음 -> 구조 확인!!!! -> 구조란? : 컬럼 구성 
-- 구조 확인하는 방법 1. 접속 - hr - 테이블목록 - TBLCOUNTRY클릭

desc tblCountry; -- 2. 표준 SQL(X), SQL(X), Sql*plus(전용 명령어), SQL Developer(Sqlplus 명령어 지원)
  • cmd창 - desc tblCountry;

-- 동일한 컬럼을 여러번 반복해도 된다.
select name, name, name, name
from tblcountry;

-- 동일한 컬럼을 가져 오는 경우 -> 가공을 한다.
-- || : 문자열 더하기 연산자(concat연산자)
select name, '나라명: ' || name
from tblcountry;

select *
from tblCountry; -- A (모든 컬럼 가져오기 -> 어떤 컬럼이 들어있는지 기억을 못함.)

select name, capital, population, continent, area
from tblCountry; -- B (권장 -> 어떤 컬럼이 들어있는지 확인하기 좋음.) ★

-- A와 B의 결과는 동일 > B권장 > 가독성 차이


desc tblcountry;

-- 원본 테이블의 컬럼 순서와 select절의 순서는 전혀 무관하다. -> 보통은 지키는 경우가 많다. > 가독성
select capital, population, continent, area, name 
from tblCountry;

ex04_operator.sql

연산자, Operator

  1. 산술 연산자
    • +, -, *, /
    • %(없음) -> 함수로 제공(mod() 함수)
  2. 문자열 연산자
    • concat
    • '문자열' + '문자열' (X)
    • '문자열' || '문자열' (O)
  1. 비교 연산자
    • 〉, >=, 〈, <=
    • = ( == X ), <> ( != X )
    • 논리값을 반환 > boolean 반환 > ANSI SQL은 논리형이 없다. > 표현이 불가능하다. > 결과셋에 담을 수 없다.
    • 조건에만 사용
산술, 비교 연산자
-- 산술 연산자 + 문자열 연산자 + 상수 컬럼
-- 수정x, 원본을 건드린 것이 아님..
select first, last, last || first, weight + 2, 10 + 1, '자바'
from tblcomedian;

select 10, '자바' -- 상수 컬럼
from tblcomedian;


select last || first from tblcomedian;
-- select last + first from tblcomedian; -- 에러 ORA-01722: invalid number (문자열 + 연산자 사용 불가)
select concat(first, last) from tblcomedian;  -- concat 연산자 (||랑 같은 연산자)


select *
from tblcomedian;

-- 비교 연산의 결과는 논리형인데.. 논리형이 없어서 결과셋에 담지를 못한다.(표현을 못한다.)
--  -> 비교 연산은 컬럼 리스트에 작성할 수 없다.(select절에 넣지 말 것!)
-- select first, weight > 65 from tblcomedian; -- 에러 
select first, weight from tblcomedian where weight > 65; -- 몸무게 65키로 이상인 항목만 가져온다.
별칭(Alias)
-- (null) : 비어있는 셀 
-- 컬럼명 -> 식별자 -> weight or weight-5 (컬럼명(식별자)에 - 사용 불가!!)
select name, weight, weight - 5 from tblMen;


-- 컬럼의 별칭(Alias) 만들기
-- 1. 중복된 컬럼명을 구분하기 위해서
-- 2. 가공된 컬럼명을 유효하기 위해서 
-- 3. 사용 불가능한 문자를 사용할 수 있게 > 사용하지 말 것
-- 4. 예약어를 사용할 수 있게.. > 절대 사용하지 말 것!!
-- 별칭 : 영어 + 숫자 + _ -> 조합으로만 쓸 것!

select name, name as nick from tblMen;
select last || first as name, weight - 5 as weight from tblComedian;
select name as 사용자이름 from tblMen;
select name as 사용자 이름 from tblMen;    -- 식별자에 공백을 넣을 수 없다.
select name as "사용자 이름" from tblMen;  -- 식별자에 공백을 넣고 싶으면 ""으로 묶으면 가능.. -> 쓰지 말기
select name as "select" from tblMen;       -- 식별자를 예약어 사용하지 말 것

이클립스에서 sql실행하기
  1. window - show view - other

  1. Data Management - Data Source Explorer

  1. Database Connection -마우스 우측버튼 - new

  • C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib\ojdbc6.jar

  • 이클립스에서 실행 단축키 : alt + x


ex05_where.sql

select문

[WITH <Sub Query>]
SELECT column_list
FROM table_name
[WHERE search_condition]
[GROUP BY group_by_expression]
[HAVING serach_condition]
[ORDER BY order_expression [ASC|DESC]];

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

SELECT column_list
FROM table_name
WHERE search_condition;

★★★★★select를 구성하는 모든 절들은 실행 순서가 있다.(불변) -> 무조건 암기(이해)★★★★★

  1. FROM절
  2. WHERE절
  3. SELECT절

SELECT 컬럼리스트
FROM 테이블명
WHERE 검색조건;

WHERE절

  • 가져올 레코드(행)를 지정할 조건을 명시한다.
  • 조건에 만족하는 행은 결과셋에 포함되고, 만족하지 못하는 행은 결과셋에 포함되지 않는다.
  • 행단위로 걸러낸다.
  • 주로 조건을 비교 연산자 or 논리 연산자를 사용해서 구성한다.
-- select절과 from절만 있는 코드 : 컬럼(열) 선택 가능 + 레코드(행) 선택 불가능 -> 항상 14개의 레코드(행) 반환
select *
from tblCountry
where capital = '서울'; -- 조건절(비교문, 논리문) 원하는 행을 걸러낸다. 


select *
from tblCountry
where area > 20;


select * from tblInsa where city = '서울'; -- 20/60
select * from tblInsa where buseo = '영업부'; -- 16/60
select * from tblInsa where basicpay >= 2500000; -- 6/20
select name, buseo, jikwi, basicpay from tblInsa where basicpay >= 2500000; -- 원하는 행 + 열

select * from tblInsa
    where city = '서울'; -- 동등비교연산자

select * from tblInsa
    where city <> '서울'; 

논리연산자

-- 논리 연산자
-- and(자바에선 &&), or(자바에선 ||), not(자바에선 !)

select * from tblInsa
    where city = '서울' and buseo = '영업부'; -- 둘 다 만족하는 것

select * from tblInsa
    where city = '서울' or buseo = '영업부'; -- 둘 중에 하나 또는 둘 다 만족하는 것

-- 서울이 아닌 사람
select * from tblInsa
    -- where city <> '서울';
    where not (city = '서울'); -- 이런식 잘 사용 안함.


-- tblComedian
-- 몸무게가 60kg  이상이고, 키가 170cm 미만인 사람을 가져오시오.
select * from tblComedian where weight >= 60 and height < 170;

-- tblInsa
-- 급여(basicpay)과 수당(sudang)을 모두 합한 금액이 250만원 이상인 직원을 가져오시오.
select * from tblInsa where (basicpay + sudang) > 2500000;

between절

  • where절에서 사용 > 조건으로 사용
  • 범위 조건으로 사용
  • 컬럼명 between 최솟값 and 최댓값
  • 연산자 사용보다 가독성 향상(성능 더 느림)
  • 최솟값, 최댓값 -> 포함(inclusive)
-- 몸무게가 60kg~70kg 사이에 있는 사람만
select last || first as name, weight from tblComedian;

select last || first as name, weight from tblComedian 
    where weight >= 60 and weight <= 70; -- 3명
    
select last || first as name, weight from tblComedian     
    where weight between 64 and 66; -- 3명 (가독성이 높음)
-- 비교 연산에 사용되는 자료형
-- 1. 숫자형(number)
desc tblInsa;

select name, sudang from tblInsa where sudang > 150000;
select name, sudang from tblInsa where sudang >= 150000 and sudang <= 160000;
select name, sudang from tblInsa where sudang between 150000 and 160000;


-- 2. 문자형
-- - 자바 : char(O), string(X)
-- - c > 'a'        "홍길동" > "아무개"
select name from tblInsa where name > '박';
select first_name from employees where first_name > 'M';
select first_name from employees where first_name >= 'M' and first_name <= 'O';
select first_name from employees where first_name between 'M' and 'O';


-- 3. 날짜/시간형
-- - 자바 : Calendar > Calendar -> tick > tick
desc tblInsa;

select ibsadate from tblInsa where ibsadate > '2010-01-01';
select ibsadate from tblInsa where ibsadate <= '2010-01-01';
select ibsadate from tblInsa where ibsadate >= '2010-01-01' and ibsadate <= '2010-12-31';
select ibsadate from tblInsa where ibsadate between '2010-01-01' and '2010-12-31';

in

  • where절에서 사용 -> 조건으로 사용
  • 열거형 조건 -> 제시된 중 하나라도 일치하면 만족
  • 컬럼형 in (값, 값, 값, ... 값)
  • 가독성 향상
-- tblInsa. 홍보부 + 개발부 + 총무부
select * from tblInsa;
select * from tblInsa where buseo = '홍보부';
select * from tblInsa where buseo = '홍보부' or buseo = '개발부' or buseo = '총무부'; -- 27명
select * from tblInsa where buseo in ('홍보부', '개발부', '총무부'); -- 27명 (가독성 높음)


-- tblInsa. (부장,과장) + (서울,인천) + 급여(250~260만원)
select * from tblInsa 
    where jikwi in ('부장', '과장') and city in ('서울', '인천')
            and basicpay between 2500000 and 2600000;

like

  • where절에서 사용 -> 조건으로 사용
  • 패턴 비교(정규 표현식과 유사)
  • 문자형을 대상으로 동작(숫자형, 날짜형은 적용 불가)
  • 컬럼명 like '패턴 문자열'

패턴 문자열 구성 요소

  1. _ : 임의의 문자 1개 -> 정규표현식 "."와 같은 기능
  2. % : 임의의 문자 N개(N: 0~무한대) -> 정규표현식".*", ".{0,}"와 같은 기능
select name from tblInsa;
select name from tblInsa where name like '홍길동';
select name from tblInsa where name = '홍길동';
select name from tblInsa where name like '홍__'; -- 홍OO
select name from tblInsa where name like '__신'; -- OO신
select name from tblInsa where name like '_길_'; -- O길O
select name from tblInsa where name like '김___'; -- 김OOO
select name from tblInsa where name like '김_'; -- 김O


select first_name from employees;
select first_name from employees where first_name like 'E____'; -- Ellen, Eleni
select first_name from employees where first_name like 'E%'; -- E~ 글자 갯수와 상관없이 E로 시작하는 모든 글자 
select first_name from employees where first_name like '%e';
select first_name from employees where first_name like '%e%'; -- 이름에 e가 들어간 사람
select first_name from employees where first_name like '%ea%'; -- 이름에 ea가 들어간 사람
select first_name from employees where first_name like '%e%a%';

RDBMS에서의 null

  • 자바의 null 개념과 유사
  • 컬럼 값이 비어있는 상태(셀)
  • null 상수
  • 대다수의 언어는 null을 피연산자로 사용할 수 없다.

null 조건

  • where절 사용 -> 조건으로 사용
  • 컬럼명 is null
select * from tblCountry;

-- 인구수가 기재되지 않은 나라?
-- select * from tblCountry where population = null; -- X
select * from tblCountry where population is null; -- O

-- 인구수가 기재된 나라?
-- select * from tblCountry where population <> null; -- X
select * from tblCountry where not population is null; -- O
select * from tblCountry where population is not null; -- 더 많이 사용

-- 할 일
select * from tblTodo;

-- 아직 실행하지 못한 일은?
select * from tblTodo where completedate is null;

-- 실행을 완료한 일은?
select * from tblTodo where completedate is not null;


-- 도서관 -> 도서 대여 테이블(대여 날짜, 반납 날짜)
-- 아직 반납이 안된 대여 기록?
select * from 도서대여 where 반납날짜 is null;

-- 반납이 완료된 대여 기록?
select * from 도서대여 where 반납날짜 is not null;

-- 여자친구 없는 애들
select * from tblMen where couple is null;
-- 있는 애들
select * from tblMen where couple is not null;

-- 남자친구 없는 애들
select * from tblWomen where couple is null;
-- 있는 애들
select * from tblWomen where couple is not null;

ex06_column.sql

distinct

  • 컬럼 리스트에 사용
  • 중복값을 제거한다.
  • distinct 컬럼명
select * from tblCountry;

-- tblCountry에는 어떤 대륙이 있나요? -> 분류 질문
select continent from tblCountry;
select distinct continent from tblCountry;

select * from tblInsa;

-- tblInsa. 어떤 부서가 있나요?
select buseo from tblInsa;
select distinct buseo from tblInsa;

-- 중복값이 단 1개도 없어도 동작된다. > 중복값이 없는 컬럼에 distinct를 적용하는건 의미가 없다.
select distinct name from tblInsa; 

-- 행으로 중복 체크를 한다.
-- 개발부	황진이
-- 개발부	채정희
select buseo, name from tblInsa;
select distinct buseo, name from tblInsa; -- 60명

-- 총무부	사원
-- 총무부	사원
-- 총무부	사원
select buseo, jikwi from tblInsa; -- 60명
select distinct buseo, jikwi from tblInsa; --23

  1. 데이터 저장하는 표 > 오라클 > 병합 x
  2. 화면에 데이터를 출력하는 표 > 보여주기 위한 표 > 셀병합 지원
profile
모르면 괴롭고 알면 즐겁다.

0개의 댓글

관련 채용 정보