개발자의 오르막

SW 심화교육 9일차 본문

교육과정 ( SW 개발자 심화과정 )/Java

SW 심화교육 9일차

계단 2019. 7. 23. 12:34

# String 과 Stringpool 의 차이와 문자열 변환

 

 

- ""로 생성한 String 은 Pool 을 쓴다. 포인터 비굑가 가능
- 그 이외의 경우 (subString 등등 ) 은 Pool 쓴다는 보장이 없다.
- 그 때는 equals 로 비교한다.

 

# window grep

- 디렉토리 설정하고, 클래스 명을 검색하면 파일을 쉽게 찾을 수 있음.

 

# Oracle DB 설정

- 설치 후 웹 브라우저에 접근

- System / 1111

- 관리 → 데이터베이스 사용자 → HR → 계정상태 잠금 해제 → HR / HR 암호설정

- sql 명령줄 실행 

- conn 입력 → 아이디, 패스워드

 

# mysql

 

- 데이터베이스 탐색

  show databases;

 

- 데이터베이스 생성

  create database study;

 

- 데이터베이스 선택

  use study;

 

- 테이블 생성

  create table study01t(

  id INT NOT NULL,

  score TINYINT NOT NULL

  );

  

- 테이블 삭제

  drop table study01t;

 

- 자료 삽입

  insert into study01t values( 10101, 100 );

  insert into study01t ( score, id ) values ( 90, 10104 );

  insert into study02t values ('a0001', 'abcd');

  같은 자료형의 data만 테이블에 삽입해야 한다.

 

- 자료 조회

  select * from study01t;

  select * from study01t where id = 10101;

  select * from study01t where id != 10101;

  select id from study01t where id != 10101;

  * 특정 필드만 조회한다.

  select score, id from study01t where id != 10101;

  select score + 5, id from study01t where id != 10101;

  * 가공된 데이터를 볼 수 있다.

  select score + 5 as sungjuk, id from study01t where id != 10101;

  * 실제 컬럼명이 변경된 것이 아니다.

  select score + 5 as sungjuk, sungjuk from study01t;

  * 하나의 컬럼을 여러번 출력해도 무관하다. 

  select concat( id, '*' ) from study02t;

  * 데이터에 * 붙여서 나옴.

 

- 데이터 삭제

  delete from study01t where id = 10101;

  * ~~ where 조건을 만족하는 레코드를 없앤다.

  delete from study01t;

  * 조건을 주지 않으면 다 지워버린다.

  delete from study01t where 0 = 1;

  * 모든 레코드가 만족하지 않는 조건

  delete from study01t where 1 = 1;

  * 모든 레코드가 만족하는 조건

 

- 데이터 수정 UPDATE

  update study01t set score = 100 where id = 10101;

  update study01t set score = score - 10 where id = 10101;

  * 기존의 값을 활용하여 데이터를 넣을 수 있다.

  update study01t set score = id - 10000 where id = 10101;

  update study01t set score = id - 10000 where id != 10101;

  * 해당 필드 뿐 아니라 다른 필드도 활용할 수 있다.

    이때 사용되는 id는 같은 레콛의 값이 활용되는 것

  update study01t set score = 0, id = 0 where id = 10101;

  * 두 칼럼을 동시에 수정할 때에는 ,을 이용한다.

 

- 특정 단어 포함 검색 LIKE

  select * from studentt where addr LIKE '역%';

  select * from studentt where addr LIKE '%삼동';

  select * from studentt where addr LIKE '%역%';

 

- 부분 문자열 추출 SUBSTR( 문자열 , 시작, 갯수 )

  select substr(addr, 1, 2 ) from studentt;

  select * from studentt where substr( addr, 1, 2 ) = '역삼';

 

- 길이 추출

  select length( addr ) from studentt;

  * 한글은 한 글자 당 3바이트를 갖고 있다고 설정함.

 

- aggregate function : 5가지

  min / max / count / avg / sum

  select * from scoret where subid = 'KOR1';

  select min(score) from scoret where subid = 'KOR1';

  * 유일한 결과를 출력하는 성격이 있다.

  select count(*) from scoret where subid = 'MAT1' and score in(60,80);

 

- 연산자 (and, or, in)

  select stId from scoret where subid = 'KOR1' and score <= 70;

  select stId from scoret where subid = 'MAT1' and (score = 60 or score = 80);

  select stId from scoret where subid = 'MAT1' and score in(60, 80);

 

- 서브쿼리

  select * from scoret where subid = 'KOR1' and stid In(

                                                               select stid from studentt where addr like '%역삼%');

  여러개 연산자가 나올 때에는 IN 또는 Not IN을 사용한다.

  select stid as 평균이하 from scoret where score <=(

                                                           select avg(Score) from scoret where subid = 'KOR1');

  유일한 서브쿼리 결과의 비교는 =, !=, <, <=, >, >- 을 쓴다.

  select avg(score) from scoret where subid = 'MAT1' and stid in(

                                                                select stid from studentt where name like '김%');

  update scoret set score = score -5 where subid = 'eng1' and stid in(

                                             select stid from scoret where subid = 'eng1' and score <= 70);

 

- Aggregate function 은 group by , having 과 연동된다.

  select stid, avg(score) from scoret group by stid;

  stid 에 동일한 값을 가진 레코드를 짜매여서 평균 낸 결과

  group by를 썼을때는 group by 에 지정된 컬럼만 select 절에 와야 한다.

 

- select stid, avg(score) from scoret group by stid where avg(score) <= 75;

  실행 X, → where 가 먼저 동작하고 통계처리가 나옴

  select stid, avg(score) from scoret group by stid having avg(score) <= 75;

 

- 서브쿼리는 크게 3종류로 나뉜다.

  1. where 절에서의 서브쿼리

  2. from 절의 서브쿼리 ( inline view )

  3. select 절의 서브쿼리 ( 엄청난 결과 / 엄청난 부담 )

  select stid, name, (select avg(score) from scoret) as 평균 from studentt;

  * 오버헤드의 발생 (엄청난 부담), 레코드 하나마다 서브쿼리 문장이 돌아감

 

- from 절의 서브쿼리 : select 결과를 마치 table 처럼 보면 된다.

  select stid, round(avg(score),2) as xx from scoret group by stid;

  select * from (select stid, round(avg(score),2) as xx from scoret group by stid)

  where xx <= 75;

  에러, from 절의 서브쿼리는 지원 안하기도 하다

  select stid, avg from (select stid, avg(score) as avg from scoret group by stid ) as x;

  * select 한 테이블을 마치 테이블처럼 이용할 수 있는 서브쿼리

    alias를 붙여줘서 테이블 명을 붙여주면 사용 가능하다.

 

- select stid, name, (select avg(score) from scoret where stid = '10101' )

   as avg from studentt;

 

- 테이블명.컬럼명 식으로 쓰는게 맞았다. (우리는 생략)

  select studentt.stid , studentt.name from studentt;

  

- studentt 가 길기 때문에 x로 바꾸어서 쓴다.

  select x.stid , x.name from studentt as x;

 

  select x.stid, x.name, (select avg(score) from scoret

               where stid = x.stid ) as avg from studentt as x;

  테이블 자체를 붙일 수 있지만, 레코드 하나 당 서브쿼리가 돌아야 함.

 

- create table temp01t as select stid, avg(score) as avg from scoret group by stid;

  아예 테이블을 생성하는 것으로 칼럼이 생김으로 검색속도 빠름, 최신데이터 반영 X

 

- 효율적 DB 구성, 데이터 튜닝

  select x.stid , x.avg, (select count(*) + 1 from temp01t where avg > x.avg) as rank

          from temp01t as x;

  3000명일 때, 이 쿼리를 사용하면 3001번 쿼리가 동작해야 함으로, 부담이 너무 크다

 

→ 임시 테이블 구성했을 땐, 테이블 한번 만들어놓으면 쿼리는 1번만 동작해도 된다.

    create table temp02t as select x.stid , x.avg, (select count(*) + 1 from temp01t 

    where avg > x.avg) as rank from temp01t as x;

    But DB 실시간 반영 X  / as의 기능 : 복사할 테이블명

 

- order by

  select * from temp02t order by rank asc;

  select * from temp02t order by rank desc;

 

- datetime

  create table study3t (no int not null auto_increment primary key,

  theTime datetime not null);

  insert into study3t values(default, now() );

  * mysql 은 일련번호 auto_increment primary key 사용, (oracle 은 sequence 를 이용)

  * now() 는 현재시간, 그것을 입력할 때 datatime 자료형을 쓴다.

  select no, data_add(theTime,INTERVAL 1 month) from study3t;

  select no, data_add(theTime,INTERVAL 1 day) from study3t;

  select no, data_add(theTime,INTERVAL 1 hour) from study3t;

  날짜 데이터를 다룰 때 연산의 필요성이 없으면 char 쓴다.

  

  create table study4t(

  no int not null auto_increment primary key,

  theTime char(19) not null

  );

 

  insert into study4t values ( default, now() );

  

- view

  create view score2v as select stid, round(avg(score),2) as xx from scoret group by stid;

  테이블이 아님, 다만 테이블 결과를 검색한 하나의 창임

  view는 실제로 데이터가 존재하는 테이블이 아니라 테이블 데이터를 이용해서 만들어진

  하나의 결과화면일 뿐이다.

  view를 대상으로 수정 삭제는 무의미하다.

  view는 데이터의 변화를 즉각적으로 알 수 있다. 대신 서브쿼리를 돌리는 것으로 검색속도가 낮다.

 

 


- 테이블에 있어야 하는 개념

  1. 필드 ( Field ) - 컬럼

     자료형을 지정한다. ( int, tinyint )

     같은 자료형의 , 같은 의미의 값이 와야 한다.

 

  2. 레코드 (Record) - Row

     입력의 단위

     데이터들이 연관되어진 묶음이어야 한다.

 

  "이 두가지 개념이 있어야 테이블이라 할 수 있다."

 

- 레코드는 입력단위이다.

  레코드는 연관 데이터의 묶음이다.

 

- tinyint : 1바이트 / int : 4바이트

- where 문장은 delete, update, select 와 연동된다.

- 문자열 : '' 로 감싼다. char or varchar 자료형

- char : 고정길이 문자열 (학번, 주민번호 ... )

           5자리를 고정적으로 입력이 됨. ( a01^^ ) 낭비 각오

           varchar 에 비해 처리속도가 빠름

 

- varchar : List라고 생각하면 됨, size에 맞춰서 데이터가 입력됨

              넘으면 에러 발생함. (가변길이)

 

- 임시테이블과 뷰는 흩어진 데이터에서 자신이 원하는 데이터로 가공할 수 있는 방법을 제공한다.

  (비정형 데이터에서 정형화 된 데이터를 만들어낸다.)

 

- 뷰는 오버헤드가 있지만 데이터의 변경을 즉각 반영한다.

  임시테이블은 오버헤드가 적지만 데이터의 변경을 즉각 반영 못함

 

- select 서브쿼리는 오버헤드가 크다.

  (1000 명의 등수를 처리한 결과를 1000명이 동시 열람하면 100만건의 쿼리가 동작하는 셈)

   + group by 오버헤드 포함

 

- 임시 테이블은 이러한 부담을 극적으로 줄여준다.

 

 

'교육과정 ( SW 개발자 심화과정 ) > Java' 카테고리의 다른 글

SW 심화교육 11일차  (0) 2019.07.25
SW 심화과정 D-9  (0) 2019.07.24
SW 심화교육 8일차  (0) 2019.07.22
SW 심화과정 교육 5일차  (0) 2019.07.19
SW 심화과정 D-4  (0) 2019.07.18
Comments