오늘 배운 것 :
WAS, Web server 개념, tomcat, Servlet 실행환경
느낀 점:
개념이나 이론은 머리에 잘 들어오는데 객체와 내장 메소드 사용은 머슬 메모리 마냥 숙련도인 것 같다.
대략적인 구조와 설정 방법. 그리고 문제 인지와 해결 과정에서 파생된 메소드와 기술의 핵심만 파악하는 느낌으로 보고 지나쳐야겠다.
아쉬웠던 점:
html, css가 기억 나지 않는다.
WAS, Web server 개념, tomcat, Servlet 실행환경
개념이나 이론은 머리에 잘 들어오는데 객체와 내장 메소드 사용은 머슬 메모리 마냥 숙련도인 것 같다.
대략적인 구조와 설정 방법. 그리고 문제 인지와 해결 과정에서 파생된 메소드와 기술의 핵심만 파악하는 느낌으로 보고 지나쳐야겠다.
html, css가 기억 나지 않는다.
<유니온(UNION)>
-JOIN은 column을 합치는 작업이나 유니온은 레코드를 합치는 작업
-column의 갯수와 자료형만 맞춰주면 레코드를 합칠 수 있다
사용 예)
-게시판이 나뉘어져 있을 때 합쳐서 통합검색이 필요할 때
-하나의 테이블 일지라도 조건절에 따라 다르게 만들어진 결과물을 전부 합칠 때
SELECT ID, NAME, FROM MEMBER
UNION
SELECT WRITER_ID, TITLE FROM NOTICE;
UNION 옵션
UNION, MINUS, INTERSECT, UNION ALL
UNION 연산자
-동일한 레코드는 합쳐서 하나로 만든 뒤 출력
MINUS 연산자
-첫번째 레코드에서 두번째가 가진 레코드를 빼고 남은 결과물을 만듬
INTERSECT 연산자
-두 레코드의 공통 분모만을 남김
UNION ALL 연산자
-공통 분모와 상관 없이 모든 레코드를 한꺼번에 출력
ex)
select id, name from member where id like '%n%'
union
select id, name from member where id like '%g%';
select id, name from member where id like '%n%'
minus
select id, name from member where id like '%g%';
-하나의 테이블 내에서도 사용해 원하는 조건식을 채운 결과 값 들을 합칠 수 있다.
(광고 가려낼 때, 차단 기능 만들 때?)
<뷰(VIEW)>
게시글 조인하기
select n.id, n.title, n.write_id, m.name, count(c.id) cnt from
member m
right outer join notice n on m.id = n.writer_id
left outer join "COMMENT" c on n.id = c.notice_id
group by n.id, n.title, n.writer_id, m.name;
-게시글 테이블의 식별자,제목,작성자ID,이름,댓글수 출력
-게시글 테이블의 회원ID를 기준으로 회원 테이블 조인_회원id와 작성자ID 대조
-게시글 테이블의 게시글ID를 기준으로 댓글 테이블 조인_게시글ID와 댓글게시글ID 대조
-식별자,제목,작성자ID,이름으로 묶어서 집계한다.
위와 같은 쿼리를 매번 해주긴 귀찮으므로 VIEW로 정의해서 사용한다.
=VIEW로 만들기=
CREATE VIEW NOTICEVIEW
AS
select n.id, n.title, n.write_id, m.name, count(c.id) cnt from
member m
right outer join notice n on m.id = n.writer_id
left outer join "COMMENT" c on n.id = c.notice_id
group by n.id, n.title, n.writer_id, m.name;
=VIEW를 이용해 쿼리하기=
select * from NOTICEVIEW where title like '%오%'
order by seq desc
<데이터 딕셔너리(Data Dictinary)>
DBMS 내 사용자 정보, 권한, 테이블, 뷰, 제약조건, 함수, 프로시저 등 사용자 서비스를 위해 존재하는 데이터 베이스.
SELECT * FROM DICT; 를 통해 확인해 볼 수 있으며, GUI 형식의 관리 프로그램이 있기 전에는
딕셔너리를 확인하고 명령어를 입력해 테이블, 컬럼, 제약조건 등의 현재 상태를 확인하며 조작해야 했다.
도구 자체를 손댈 일이 없다면 딱히 DBMS의 딕셔너리를 사용할 일은 없다.
<제약 조건>
도메인 - 엔티티 - 릴레이션
=도메인 제약 조건=
-컬럼 내 유효한 값의 범위
종류)
NOT NULL, DEFAULT, CHECK
NOT NULL
-반드시 값이 들어가야 하는 컬럼
-ID, PW, TITLE, WRITEID 등
사용법)
CREATE TABLE TEST
(
ID VARCHAR2(50) NOT NULL,
EMAIL VARCHAR2(200) NULL,
PHONE CHAR(13) NOT NULL
)
테이블이 이미 생성된 경우
ALTER TABLE TEST MODIFY EMAIL VARCHAR2(200) NOT NULL;
DEFAULT
-반드시 값이 들어가야 하나, 사용자가 값을 전달하지는 않는 컬럼
-등록일자, 조회수 등
사용법)
CREATE TABLE TEST
(
ID VARCHAR2(50) NOT NULL,
EMAIL VARCHAR2(200) NULL,
PHONE CHAR(13) NOT NULL,
PWD VARCHAR2(200) DEFAULT '111'
)
테이블이 이미 생성된 경우
ALTER TABLE TEST MODIFY EMAIL VARCHAR2(200) DEFAULT '111';
CHECK
-값의 유효범위를 검사할 수 있게하는 제약 조건
ex) 학번 : 0보다 큰 정수, 이름 : 20자 내의 문자, 입력되는 핸드폰 번호의 포맷 형식 등
사용법)
CREATE TABLE TEST
(
ID VARCHAR2(50) NOT NULL,
PHONE VARCHAR2(200) CHECK(PHONE LIKE '010-%-____') NOT NULL,
EMAIL VARCHAR2(500) NULL
)
테이블이 이미 생성된 경우
ALTER TABLE TEST ADD CONSTRAINT CK_TEST_PHONE CHECK(PHONE LIKE '010-%-____');
제약조건을 검색하는 경우
SELECT * FROM user_constraints WHERE TABLE_NAME = 'TEST';
제약조건을 삭제하는 경우
ALTER TABLE TEST DROP CONSTRAINT CK_TEST_PHONE;
정규식을 이용한 체크 제약 조건
-'010-%-____' 오라클의 제약 조건의 경우 한계가 있다. '010-AAAA-1234', '010-12443243-1234' ...
-더 세밀한 제약 조건을 위해 정규식을 사용한다.
ex) 도구프로그램을 사용해 체크 제약 조건 등록 시
REGEXP_LIKE(PHONE, '^01[01]-\d{3,4}-\d{4}$');
명령어 사용시)
ALTER TABLE TEST ADD CONSTRAINT CK_TEST_PHONE CHECK(REGEXP_LIKE(PHONE, '^01[01]-\d{3,4}-\d{4}$'));
정규식 참고사이트
https://regexlib.com/CheatSheet.aspx
=ENTITY 제약 조건=
PRIMARY KEY / UNIQUE
-중복된 레코드가 없도록 제한한다.
PRIMARY KEY
-NULL이 들어갈 수 없다
UNIQUE
-NULL이 들어갈 수 있다
사용법)
CREATE TABLE NOTICE
(
ID NUMBER PRIMARY KEY, --기본키 제약 조건
TITLE VARCHAR2(300) NOT NULL, --NOT NULL
WRITER_ID VARCHAR2(50) NOT NULL UNIQUE, --NOT NULL/UNIQUE
CONTENT VARCHAR2(4000),
REGDATE DATE DEFAULT SYSDATE, --기본값 현재 날짜
HIT NUMBER DEFAULT 0 --기본값 0
)
제약 조건의 이름을 명시적으로 지정해줄 때)
ID NUMBER CONSTRAINT NOTICE_ID_PK PRIMARY KEY
또는 따로 하단부로 빼서 지정해준다
CREATE TABLE NOTICE
(
ID NUMBER,
WRITER_ID VARCHAR2(50) NOT NULL,
CONSTRAINT NOTICE_ID_PK PRIAMRY KEY(ID),
CONSTRAINT NOTICE_ID_UK UNIQUE(WRITER_ID)
)
테이블이 이미 생성된 경우
ALTER TABLE NOTICE
ADD CONSTRAINT NOTICE_ID_PK PRIMARY KEY(ID);
ALTER TABLE NOTICE
ADD CONSTRAINT NOTICE_WRITER_UK UNIQUE(WRITER_ID);
-도구프로그램(SQL DEVELOPER)을 사용할 경우 그냥 편집창 들어가서 PK에 체크해 주거나
-UNIQUE의 경우 제약조건 탭에서 새 고유 제약 조건을 처리해주면 된다
=시퀀스(SEQUENCE)=
-PK id 등 지속적으로 증가하는 값을 일일히 확인하기가 번거롭기 때문에 시퀀스로 등록
-데이터가 삽입 될 시 자동으로 증가하도록 해줄 수 있다.
다음으로 시작 : 시작 값
증분 : 증분 값
최소값 : 최소 값
최대값 : 최대 값
캐시 : 시퀀스가 한번 작업당 미리 확보해놓을 결과값을 정해준다.
- 레코드 삽입 마다 매번 연산을 하지 않기 때문에 레코드 삽입이 잦을 시 성능이 개선된다
주기 : 최대값에 도달했을 경우 다시 최소값부터 시작하는 순환을 할지 여부
정렬 : 캐시에 들어있는 데이터의 정렬의 보장성 여부
-값을 넣어주지 않아도 default 값들로 생성된다
시퀀스 등록 DDL 예제)
CREATE SEQUENCE NOTICE_ID_SEQ INCREMENT BY 1 START WITH 1;
사용법)
INSERT INTO NOTICE(ID, TITLE, WRITER_ID)
VALUES(NOTICE_ID_SEQ.NEXTVAL, '시퀀스1', '김댕댕');
사용법2)
편집 -> ID열 탭 -> 유형 : 열 시퀀스 -> 시퀀스 : NOTICE_ID_SEQ -> TRG1로 등록
INSERT INTO NOTICE(ITITLE, WRITER_ID)
VALUES('시퀀스1', '김댕댕');
-굳이 적지 않아도 트리거(CRUD에 따른 이벤트 조건)에 따라 알아서 증가한다.
mySQL 공지사항 게시판 참고용 Diagram (0) | 2022.09.14 |
---|---|
MySQL (0) | 2022.08.10 |
Oracle DB #4 (0) | 2022.08.09 |
Oracle DB #3 (0) | 2022.08.08 |
MongoDb Cloud / python (0) | 2022.08.07 |
OracleSQL 함수
<문자열 함수>
select substr(문자열, 시작위치, 길이) from dual;
-문자열 추출
select substrb(문자열, 시작위치, 길이) from dual;
-byte 단위로 문자열 추출
select concat('홍', '길동') from dual;
-문자열 더함
select ltrim(' hello') from dual;
select rtrim('hello ') from dual;
select trim(' hello ') from dual;
-공백 제거
select lower(문자열) from dual;
select upper(문자열) from dual;
-소문자 변경, 대문자 변경
(대소문자를 가리지 않는 검색의 용도로 사용)
사용 예)
select * from 테이블명 where upper(속성명)='영문찾을값';
select replace(문자열, 찾는문자열, 대치할문자열) from dual;
-문자열 대치
select translate(문자열, 찾는문자열, 대치할문자열) from dual;
-문자열 전체에서 찾는 문자열들을 찾아 대치할 문자열로 1:1대치(char기준)
select lpad('hello', 10, '0') from dual;
-문자열 패딩(문자열 포함 왼쪽까지 10개 공간을 만들고 공백은 0으로 채움)
//00000hello 문자열 공간은 Byte 기준으로 계산한다
select rpad('hello', 10, '0') from dual;
-문자열 패딩(문자열 포함 오른쪽까지 10개 공간을 만들고 공백은 0으로 채움
//hello00000 문자열 공간은 Byte 기준으로 계산한다
select initcap(문자열) from dual;
-모든 단어의 첫글자를 대문자로 대치
select instr(문자열, 검색문자열, 찾기시작위치, 찾을 수) from dual;
-찾는 문자열의 위치를 숫자로 반환
select length(문자열) from dual;
-문자열의 길이
select length(replace('010-1234-5678','-','')) from dual;
-함수 중첩
select ascii('A') from dual;
-코드값 반환
select chr(65) from dual;
-코드값으로 문자 반환
전화번호 중간자리 찾기
select substr(phone, 5, instr(phone, '-', 1, 2)-instr(phone,'-',1,1)-1) from members;
<숫자 함수>
select abs(-65) from dual;
-절대값 출력
select sign(35), sign(-35), sign(0) from dual;
-음수/양수를 알려주는 함수 (양수는 1, 음수는 -1, 0은 0을 출력)
select round(34.45678) from dual;
-반올림 함수
select round(34.45678, 소수점위치) from dual;
-소수점 위치까지 반올림하여 출력
select trunc(17/5) 몫, mod(17, 5) 나머지 from dual;
-몫과 나머지를 구하는 함수
-trunc의 경우 소수점을 날리고 싶을 때 사용 가능
select power(5, 2), sqrt(25) from dual;
-제곱과 제곱근을 구하는 함수
<날짜 함수>
select sysdate, current_date, systimestamp, current_timestamp from dual;
sysdate
-Db서버 기반 연월일시분초
current_date
-사용자 세션 설정에 따른 연월일시분초
systimestamp
-Db서버 기반 밀리세컨드 단위로 정교하게 구할 때 사용
current_timestamp
-사용자 세션 설정에 따른 밀리세컨드 단위로 정교하게 구할 때 사용
alter session set time_zone = '09:00';
-타임존 설정 09:00 한국
alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
-데이터 포멧 설정
extract(year/month/day/hour/minute/second)
select extract(year from sysdate) from dual;
-날짜 추출 함수(위는 연단위를 추출)
select add_months(날짜, 정수) from dual;
-날짜 누적 함수
select months_between(날짜, 날짜) from dual;
-날짜 차이 함수
select next_day(현재날짜, 다음요일) from dual;
-다음 요일을 알려주는 함수
select last_day(날짜) from dual;
-월의 마지막 일자를 알려주는 함수
select round(날짜, 포멧), trunc(날짜, 포멧) from dual;
-지정된 범위에서 날짜를 반올림/자르는 함수
포맷 : 'CC', 'YEAR', 'Q', 'MONTH', 'W', 'DAY', 'D', 'HH', 'MI'
<변환 함수>
숫자 => to_char() => 문자열 => to_date() => 날짜
날짜 => to_char() => 문자열 => to_number() => 숫자
=NUMBER 형식을 문자열(VARCHAR2)로 변환=
select to_char(number) from dual;
to_char(number, 포맷문자)
-원하는 형식으로 변환하고 싶을때 포맷문자를 넣어준다
포맷 :
9 숫자
0 빈자리를 채우는 문자
$ 앞에 $ 표시 (달러를 표시해주고 싶다면, 우리나라면 보통 뒤에 || '원'을 붙인다)
, 천 단위 구분자 표시
. 소수점 표시
포맷문자는 숫자 길이보다 길어야함
사용예)
select to_char(1234567.8, '09,999,9.90') || '원' from dual;
=DATE 형식을 문자열(VARCHAR2)로 변환=
select to_char(datetime) from dual;
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;
포맷 :
YYYY/RRRR/YY/YEAR 년도표시:4자리/Y2K/2자리/영문
MM/MON/MONTH 월표시:2자리/영문3자리/영문전체
DD/DAY/DDTH 일표시:2자리/영문/2자리ST
AM/PM 오전/오후표시
HH/HH24 시간표시:12시간/24시간
MI 분표시:0~59분
SS 초표시:0~59초
=문자열을 DATE로 변환=
select to_date('2014-03-31 12:23:03', 'YYYY-MM-DD HH:MI:SS') from dual;
-기존 리터럴 형식을 사용하지 않을 경우 두번째 인자에 현재 사용하는 포맷형식을 넣어줘야한다
=문자열을 숫자로 변환=
select to_number('2') + 3 from dual;
<NULL 관련 함수>
NVL(NULL, 대체값)
-속성값이 null일 경우 대체값으로 반환
NVL2(입력값, NOTNULL대체값, NULL대체값)
-속성값이 null이 아닐 경우 NOTNULL대체값을, null일 경우 NULL대체값을 반환
NULLIF(값1, 값2)
-두 값이 같을 경우 NULL 반환, 그렇지 않을 경우 첫 번째 값 반환
DECODE(기준값, 비교값, 출력값, 비교값, 출력값)
-조건에 따른 값 선택
사용 예)
select decode(substr(phone, 1, 3), '011', 'sk', '016', 'kt', '기타') from members;
<SELECT문의 구절>
SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY
-좌에서 우로 순서가 바뀌어서는 안됨. 실질적 절차는 아래에 있다.
FROM 격자형 데이터 준비
WHERE 필터링
GROUP BY 집계
HAVING 집계자료 필터링(집계 이후 사용이기에 WHERE 사용 불가)
ORDER BY 정렬
ORDER BY 옵션
ASC 오름차, DESC 내림차
ex) select * FROM 테이블 WHERE 속성 like '박%' ORDER BY 속성1 asc, 속성2 asc;
-속성1로 오름차 정렬 후 같은 값이 있을 경우 속성2로 2차 정렬
집계 함수
SUM, MIN, MAX, COUNT, AVG
select count(id) from notice;
-NULL 값이 들어간 컬럼을 제외하고 갯수를 반환
select sum(hit) from notice;
-값 더하기
select avg(hit) from notice
-값들의 평균
MIN, MAX
-최소값 최대값
select writer_id, count(id) COUNT
from notice
GROUP BY writer_id
ORDER BY COUNT DESC;
-갯수를 내림차순으로 정렬해서 작성자를 기준으로 작성자 아이디와 작성자별 레코드 갯수를 반환
=SELECT문 구절의 실제 절차=
FROM -> CONNECT BY -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
좌에서 우로 진행되며 하위에서 진행된 별칭은 상위에서 실행될 수 없다
때문에 FROM 절에서 부여된 별칭은 이후 모든 절에서 사용 가능
ex) 회원별 게시글 수를 조회하시오. 단 게시글이 2미만인 레코드만 출력하시오
select writer_id, count(N.id) from notice N
where count(N.id) < 2
group by writer_id;
-에러! 집계함수(count)는 where절에 사용이 불가능하고, group by 이후에만 사용이 가능하다
select writer_id, count(N.id) from notice N
group by writer_id
HAVING count(N.id) < 2;
-WHERE 절을 빼고 GROUP BY절 다음에 HAVING 절을 사용함으로써 사용이 가능해진다
<순위 함수>
select ROW_NUMBER() OVER (ORDER BY 정렬기준컬럼), id, title, writer_id, regdate, hit
from notice;
-ROWNUM을 출력한 뒤 ORDER BY로 정렬함으로써 생기는 ROWNUM 뒤섞임 문제를 해당 함수를 사용해 해결할 수 있다
select RANK() OVER (ORDER BY 정렬기준컬럼), id, title, writer_id, regdate, hit
from notice;
-순위 매기기
select DENSE_RANK() OVER (ORDER BY 정렬기준컬럼), id, title, writer_id, regdate, hit
from notice;
-공동 등수 이후 다음 등수를 뛰어넘지 않도록 순위 매기기
select DENSE_RANK() OVER (PARTITION BY 집계컬럼 ORDER BY 정렬기준컬럼 DESC), id, title, writer_id, regdate, hit
from notice;
-GROUP BY를 한 것처럼 집계를 추가해줄 수 있다
<서브 쿼리>
select * from ( select * from member order by regdate desc ) where rownum between 1 and 10;
-select 구절은 절차를 따라야 하므로 구절의 순서를 바꾸기 위해 서브쿼리를 사용하기도 한다
-from 이후 ( ) 로 묶인 구역이 서브쿼리 구절이다
-서브쿼리로 미리 정렬된 결과물로 다시 쿼리를 만들겠다는 의미이다
ex) 평균 나이 이상인 회원
select * from member
where age >= ( select avg(age) from member )
<조인(JOIN)>
INNER JOIN, OUTER JOIN, SELF JOIN, CROSS JOIN(Cartesian Product)
INNER JOIN
-좌우 테이블 중 서로 관계가 있는 것들로만 레코드를 만든다.
ex) select * from member INNER JOIN notice ON member.id = notice.writer_id;
(LEFT/RIGHT/FULL) OUTER JOIN
-사용하는 OUTER에 따라 관계가 없는 레코드 또한 포함시켜 레코드들을 만든다.
-빈값은 NULL 값이 들어간다.
-가장 자주 쓰임
SELF JOIN
-자기 자신을 JOIN, 별칭을 사용해 JOIN한다
-대댓글, 카테고리 내의 카테고리 등으로 쓰임
CROSS JOIN
-관계성 여부에 상관없이 두 테이블을 곱하기로 결과를 만든다
-테이블1: 레코드 2개, 테이블2: 레코드 3개라면 cross join할 경우 6개의 테이블이 만들어짐
-자주 사용되지 않고, 의미있는 테이블을 만들어내지 않는다
<ANSI SQL (표준SQL) 과 ORACLE SQL의 차이점>
ASNI INNER JOIN
select N.id, N.title, M.name
from
member M
inner join notice N on M.id = N.writer_id
where m.id = 'newlec';
ORACLE INNER JOIN
select N.id, N.title, M.name
from member M, notice N
where M.id = N.writer_id
and M.id = 'newlec';
ASNI OUTER JOIN
select N.*, M.name writer_name
from notice N left outer join member M
on M.id = N.writer_id
ORACLE OUTER JOIN
select N.*, M.name writer_name
from notice N, member M
where N.writer_id = M.id(+)
-oracleSQL의 left outer는 주가되는 테이블 반대 테이블에 (+)를 붙임
-오라클SQL은 full outer join은 지원하지 않음
-오라클SQL join은 ANSISQL join과 다르게 단순하나 절차가 명확하지가 않다
<필드 이름의 충돌문제>
select NOTICE.id, NOTICE.name, MEMBER.name from
member
inner join notice on member.id = notice.writer_id
-명시적으로 지칭하는 컬럼을 알려줌으로써 해결한다(대문자 부분)
select N.ID, N.WERITE_ID, M.NAME
from member M inner join notice N
on M.ID = N.WRITE_ID
-테이블 별칭 사용으로 해결한다
ex) id, name 그리고 회원별 작성한 게시글 수를 조회하시오
select m.id, m.name, count(n.id) from
member m left outer join notice n
on m.id = n.writer_id
group by m.id, m.name;
-회원에 포함되나 게시글 수가 0인 회원 또한 포함해야하므로 outer join을 사용하는 게 범용적인 사용법이다
MySQL (0) | 2022.08.10 |
---|---|
Oracle DB #5 (0) | 2022.08.09 |
Oracle DB #3 (0) | 2022.08.08 |
MongoDb Cloud / python (0) | 2022.08.07 |
Oracle DB #2 (0) | 2022.08.07 |
<트랜잭션>
-하나의 단위(목적)으로 수행되길 바라는 쿼리의 묶음(업무 수행단위, 논리적 수행단위)
-두개 이상의 쿼리 문장으로 이루어진 명령어
<트랜잭션 처리>
-ACID를 유지하는 것 (automaticity_원자성, consistency_일관성, isolation_독립성, durability_지속성)
DB작업 중 트랜잭션이 걸릴 경우 DB를 사용하는 다른 사용자에 의해 LOCK이 걸린 상태이다
함께 작업하는 작업자에게 COMMIT이나 ROLLBACK을 요청해야한다
<DB 연산자>
산술 연산자
+, -, *, /
|| 문자열 더하기
비교 연산자
=, !=, ^=, <>, >, <, >=, <=, IS NULL, IS NOT NULL
!=, ^=, <> 용도가 같음
IS NULL, IS NOT NULL 사용예) select * from 테이블명 where is null
관계 연산자
NOT, AND, OR, BETWEEN, IN
BETWEEN
select * form 테이블명 where 속성명 between 0 and 2;
0~2까지를 조회
IN
select * form 테이블명 where 속성명 in (0,2,7);
0,2,7인 hit을 조회
NOT
select * form 테이블명 where 속성명 not in (0,2,7);
0,2,7을 제외한 hit을 조회
패턴 연산자
LIKE, %, _
select * from 테이블명 where 속성명 like '박%';
-박으로 시작하는 문자열을 찾음
select * from 테이블명 where 속성명 not like '박%';
-박으로 시작하지 않는 모든 문자열
'%박%'
-박이란 문자가 포함된 문자열을 찾음
'박_';
-박이란 문자로 시작하는 두글자 문자열을 찾음
'_박__';
- 박을 포함해 앞으로 한글자 뒤로 두글자인 문자열 찾음
정규식을 이용한 패턴 검색
참고사이트
https://regexlib.com/CheatSheet.aspx
^\D\w*@\D\w*.(org|net|com)$ -이메일 검색 정규식
^01[016-9]-\d{3,4}-\d{4}$ -핸드폰 번호 검색 정규식
사용 법)
select * from 테이블명 where regexp_like(속성명, '01[016-9]-\d{3,4}-\d{4}');
정규식 시작을 뜻하는 ^과 끝 $을 제외하면 해당 패턴이 문자열 일부에 속해 있더라도 찾을 수 있다
행을 제한하기 (페이징)_(ROWNUM)
select * from 테이블명 where rownum between 1 and 5;
rownum은 기존 테이블에 속해있는 속성이 아니고 결과집합을 만들어낼 때 임시로 생성되므로 between 2 ~ 이상으론 출력할 수 없다.
페이징을 위해서는 먼저 테이블에 rownum을 생성해준 것처럼 쿼리로 결과집합을 만들어준 상태에서
조건비교를 시켜야 한다.
사용 법)
select * from (select rownum 별칭, 테이블명.* from 테이블명) where 별칭 between 6 and 10;
중복 값 제거(DISTINCT)
select distinct 속성명 from member;
Oracle DB #5 (0) | 2022.08.09 |
---|---|
Oracle DB #4 (0) | 2022.08.09 |
MongoDb Cloud / python (0) | 2022.08.07 |
Oracle DB #2 (0) | 2022.08.07 |
Oracle DB #1 (0) | 2022.08.05 |
https://account.mongodb.com/account/login
Cloud: MongoDB Cloud
account.mongodb.com
pymongo > MongoClient
파이썬 mongodb cloud 제어용 라이브러리
사용 예)
1
2
3
4
5
6
7
8
9
10
|
from pymongo import MongoClient
client = MongoClient('여기에 URL 입력')
db = client.mydb
doc = {
'name':'bob',
'age':27
}
db.users.insert_one(doc)
|
cs |
사용 예2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)
# 한 개 찾기 - 예시
user = db.users.find_one({'name':'bobby'})
# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
all_users = list(db.users.find({},{'_id':False}))
# 바꾸기 - 예시
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
# 지우기 - 예시
db.users.delete_one({'name':'bobby'})
|
cs |
Oracle DB #5 (0) | 2022.08.09 |
---|---|
Oracle DB #4 (0) | 2022.08.09 |
Oracle DB #3 (0) | 2022.08.08 |
Oracle DB #2 (0) | 2022.08.07 |
Oracle DB #1 (0) | 2022.08.05 |
JDBC
자바로 OracleDB에 접속하기 위한 라이브러리
jdbc driver를 jdk와 OracleDB의 버전에 맞게 오라클 홈페이지에서 다운 받아 프로젝트의 build path에 등록
SELECT 등 DB를 조회하여 값을 가져올 때)
String url = "jdbc:oracle:thin:@아이피:1521/사용할디비이름";
String sql = "쿼리문";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url, "디비아이디", "디비암호");
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql);
// rs.next();
// column 한줄 씩 읽기
whie(rs.next()) {
int id = rs.getInt("ID");
System.out.println(id);
}
rs.close();
st.close();
con.close();
INSERT, UPDATE, DELETE 등 DB를 조작할 때)
String title = "TEST";
String writerId = "abcd";
String content = "wow";
String files = "";
String url = "jdbc:oracle:thin:@아이피:1521/사용할디비이름";
String sql = "INSERT INTO notice ("
+ " title,"
+ " writer_id,"
+ " content,"
+ " files"
+ ") VALUES (?,?,?,?)";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url, "디비아이디", "디비암호");
PreparedStatement st = con.prepareStatement(sql);
// 쿼리문의 ?에 index는 1부터 시작.
st.setString(1, title);
st.setString(2, writerId);
st.setString(3, content);
st.setString(4, files);
int result = st.executeUpdate();
// executeUpdate 메서드는 DML 실행된 Rows 정수 결과값을 반환한다.
System.out.println(result);
st.close();
con.close();
st.set타입(인덱스, 넣을값변수) 시 넣을값은 홑따옴표에 감싸인 값 형태로 들어간다.
명령문 형식으로 들어가길 바란다면 쿼리문을 "SELECT * FROM 테이블 WHERE " + 넣을값변수 + " LIKE~" 등으로 넣어준다
Servlet #1 (0) | 2022.08.11 |
---|---|
Tomcat (0) | 2022.08.11 |
Java Thread & Sync (0) | 2022.08.04 |
JAVA Collection & Generic (0) | 2022.08.04 |
이클립스에서 GitHub contribution 안되는 문제 (0) | 2022.08.02 |