개발자의 오르막
SW 심화교육 9일차 본문
# 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 |