Oracle 다중쿼리(Multiple row query)
2018-11-29 00:00:00 +0000다중쿼리
- 서브 쿼리의 결과가 여러개인 경우 사용
- 서브 쿼리의 결과를 하나의 값과 비교할 수 도 있고, 두개 이상도 비교 가능
- WHERE 컬럼 = (SELECT ~ ) => 단일로우
-
WHERE 컬럼 IN(SELECT ~ ) =>다중로우
- IN : 검색된 값 중에 하나만 일치하면 참이다
- ANY : 검색된 값 중에 조건에 맞는 것이 하나 이상 있으면 참
-
ALL : 검색된 값과 조건에 모두 일치해야 참
- 컬럼 > ALL(서브쿼리) => 컬럼 > MAX : 가장 큰 값 보다 크다.
-
컬럼 < ALL(서브쿼리) => 컬럼 > MIN: 가장 작은 값 보다 작다.
- 컬럼 > ANY(서브쿼리) => 컬럼 > MIN : 가장 작은 값 보다 크다.
- 컬럼 < ANY(서브쿼리) => 컬럼 > MAX: 가장 큰 값 보다 작다.
SELECT 컬럼
FROM 테이블
WHERE 비교대상 (서브쿼리)
- 두 개 이상의 값을 쿼리로 받아서 비교
SELECT * FROM STUDENT WHERE MAJOR = '화학';
SELECT SNO, SNAME, SYEAR, MAJOR, AVR
FROM STUDENT S
WHERE (AVR,SYEAR) IN (SELECT AVR,SYEAR FROM STUDENT WHERE MAJOR = '화학' )
AND MAJOR != '화학';
FROM절 서브쿼리(Top-N SQL
- FROM 절에 테이블 이름 대신 서브쿼리 사용
- 테이블을 질의하기 편하게 수정하면 데이터 찾기가 쉽다
- 예를 들어 입사를 제일 오래한 사원을 출력 시, 테이블에 입사순서대로 정렬되어있으면 편하다
- FROM에 서브쿼리로 입사순으로 정렬된 테이블을 가져올 수 있다
서브쿼리 SELECT * FROM 테이블이름 ORDER BY DESC
SELECT A.*
FROM (서브쿼리).A
WHERE 조건
- 4.5 환산평점이 가장 높은 3명의 학생을 검색하는 예제
SELECT SNO,SNAME,(AVR/4.0 *4.5) FROM STUDENT ORDER BY 3 DESC;
SELECT ROWNUM, S.*
FROM (SELECT SNO,SNAME,(AVR/4.0 *4.5) FROM STUDENT ORDER BY AVR DESC)S
WHERE ROWNUM <= 3;
Oracle 인덱스, 뷰, 시퀀스, 트랜잭션, 세션 정리
2018-11-29 00:00:00 +0000인덱스(INDEX)
- 데이터를 처음부터 끝까지 찾는 건 Table Full Scan, 인덱스를 통해 검색하는 것은 Index Scan이라고 한다
- 데이터 양이 많을 때 Full Scan을 하면 검색 속도가 느려지고, 일정하지 않다
- 기본키(Primary key)또는 고유키(unique key)일 경우 자동으로 생성됨
- Index Scan은 일정한 검색속도를 제공한다
- Index 생성 시 오히려 성능이 떨어질 수도 있다(튜닝 참고)
- 인덱스 생성
CREATE INDEX index_name
ON table_name(column_name)
- 인덱스 삭제
DROP INDEX 인덱스 이름;
뷰(VIEW)
- 하나 이상의 테이블을 조회하는 SELECT 문을 저장한 객체
- 물리적으로 따로 저장하지 않음
- 쿼리의 복잡도를 낮추고, 보안적인 용도로 사용
| 뷰 조회 | 기존 테이블 조회 |
|---|---|
| SELECT * FROM VM_TOP_3 | SELECT C.CNO, C.CNAME, S.AVG_RESULT FROM COURSE C, (SELECT CNO, AVG(RESULT) AS AVG_RESULT FROM SCORE GROUP BY CNO ORDER BY AVG(RESULT) DESC)S WHERE C.CNO = S.CN |
- view 생성
CREATE VIEW VIEW_NAME
AS ( 복잡한 SELECT 쿼리)
- view 삭제
DROP VIEW VW_EMP20;
시퀀스(Sequence)
- 대리 식별자. 특정 규칙에 맞는 연속 숫자를 생성하는 객체. 값이 커지면서, 고유한 값을 생성한다
- 시퀀스는 이전 값을 돌아오게 할 수 없다
- 시퀀스 생성 및 사용
CREATE SEQUENCE Sequence 이름 -- 시퀀스 생성
CREATE SEQUENCE department_id_seq
START WITH 1 -- 어떤 숫자부터 값을 매길 것인지
INCREMENT BY 10; -- 다음 숫자는 얼마만큼 커질 것인지
INSERT IINTO departments -- 시퀀스 사용
VALUES(department_id_seq.NEXTVAL , 'IT Education', 103, 1400);
DROP SEQUENCE SEQUENCE_NAME -- 시퀀스 삭제
트랜잭션(Transaction)
- 실행단위 안에 여러 SQL문이 존재할 수 있다.
- 실행단위 기준으로 실행 되거나, 실행되지 않아야 한다
- 트랜잭션을 취소 하고 싶을 때 ROLLBACK 사용
- 트랜잭션을 영원히 반영하고 싶다면 COMMIT. ROLLBACK되지 않는다
- 트랜잭션 예제
CREATE TABLE NEW_TABLE( -- 테이블 생성
NEW_INDEX NUMBER,
INEW_COUNT NUMBER
);
INSERT INTO NEW_TABLE VALUES(1, 10);
INSERT INTO NEW_TABLE VALUES(2, 10);
COMMIT; -- 데이터 저장(ROLLBACK으로 못돌림)
INSERT INTO NEW_TABLE VALUES(3, 10);
INSERT INTO NEW_TABLE VALUES(4, 10);
ROLLBACK;
-- 데이터 3, 4만 존재
세션(Session)
- 세션은 어떤 활동을 위한 시간이나 기간을 뜻함(게임에서 로그인-로그아웃 기간 같은 것)
- 세션이 여러개라는 건 DB 접속을 여러명이 했다는 뜻
- 만약 A세션에서 데이터를 삭제했다면 B세션에는 반영되지 않는다. 반영하려면 COMMIT을 해야한다
Oracle JOIN 정리
2018-11-28 00:00:00 +0000조인(JOIN)
- 2개 이상의 테이블에서 데이터를 검색하기 위해서 사용
- FROM 절에 두 개 이상의 테이블을 명시한다(View, Subquery도 가능)
- 공통된 컬럼이 없다면, 두 테이블의 공통컬럼을 가진 다른 테이블과 JOIN한 후 목표 테이블과 JOIN
- 두 테이블의 모든 조합 확인
SELECT * FROM 테이블1, 테이블2;
- 만약 테이블1, 테이블 2에 각 각 3개의 정보가 있다면 모든 데이터를 조합하므로 총 9개의 데이터가 나옴
- 조건을 걸어서 데이터에 알맞은 값을 매칭 시켜줘야 함
INNER JOIN 사용법
- 조건에 부합하는 두 테이블의 데이터를 합치는 방식
- 컬럼 사용 시 테이블 구분이 필요
SELECT a컬럼명, b.컬럼명 etc... FROM TABLE_NAME a, TABLE_NAME b
WHERE a.조건컬럼 == b.조건컬럼 (그외 조건이 있다면 추가)
- INNER JOIN ANSI JOIN
- WHERE절에 조건이 길어지만 AND가 많이 늘어남
- 결과는 같은데 표기법이 다름
SELECT a.칼럼명, b.칼럼명 ...
FROM 테이블1 A JOIN테이블2 B
ON 조건
- 3개 이상의 테이블 JOIN
SELECT a.칼럼명, b.칼럼명 ...
FROM 테이블1 A, 테이블2 B
ON 조건
JOIN 테이블3
ON 조건
SEFE JOIN
- 자기 자신의 테이블과 합치는 것
- 찾고자 하는 값이 자신의 테이블에 있을 때 사용
SELECT a.칼럼명, b.칼럼명 ...
FROM 테이블1 A JOIN 테이블1 B
ON A.컬럼 = B.다른컬럼
OUTER JOIN
- INNER JOIN 사용시 테이블 데이터가 매칭되지 않은 정보는 볼 수 없음
- 데이터가 매칭 되지 않더라도 한쪽의 테이블을 전부 보고 싶을 때 OUTER JOIN을 사용함
- 매칭되는 데이터가 없을 때 NULL이 표시
- +표시는 전체를 보고 싶은쪽 반대편에 붙이도록 함
SELECT A.칼럼, B.칼럼 ..
FROM TALBLE1 A, TABLE2 B
WHERE A.칼럼 = B.칼럼(+)
- OUTER JOIN ANSI JOIN
- 전체 데이터를 보고 싶은 쪽을 JOIN에 지정
- 왼쪽 테이블의 데이터를 전체 출력하고 싶다면 LEFT JOIN, 오른쪽일 경우 RIGHT JOIN
SELECT TABLE1 A, TABLE2 B
FROM TABLE1 A LEFT JOIN TABLE2 B
ON A.컬럼 = B.컬럼
SUB QUERY
- 예를들어 ‘평균 연봉보다 많은 사람만 출력하시오’란 예제가 있다면 먼저 평균연봉을 구해야한다
- 이 때 평균연봉을 구한 후 결과를 복사해서 비교하면 2번 실행해야하므로 비효율적이다
- SUB QUERY를 사용해서 결과값을 구한 후 메인쿼리에서 사용할 수 있다
- 서브쿼리를 먼저 작성 후 메인쿼리를 작성한다
SELECT TABLE1 칼럼
FROM TABLE1
WHERE 연봉 > (SELECT AVG(연봉) FROM TABLE1)
Oracle DDL, DML 정리
2018-11-27 00:00:00 +0000테이블 추가
- 테이블을 복사하여 새로운 테이블 만들 때 CREATE 문 사용
- ORI_TABLE을 복사하여 NEW_TABLE을 만든다
- ORI_TABLE의 내용이 그대로 복사된다
CREATE TABLE NEW_TABLE AS SELECT * FROM ORI_TABLE; - 일부 복사
CREATE TABLE NEW_TABLE AS SELECT 복사할 컬럼 FROM ORI_TABLE; - 테이블 구조만 복사
CREATE TABLE NEW_TABLE AS SELECT * FROM WHERE 1=0; - 컬럼을 새로 설정하는 경우
CREATE TABLE NEW_TABLE( NEW_INDEX NUMBER, INEW_COUNT NUMBER );
테이블 변경
- 이미 생성된 데이터베이스 객체 수정
- 테이블에 새 열을 추가, 삭제, 길이 변경 등의 일을 할 수 있음
- 테이블에 열을 추가하는 ADD
ALTER TABLE ITEMNAME ADD 컬럼이름 컬럼자료형; - 테이블의 열 이름 변경 RENAME
ALTER TABLE 테이블NAME RENAME COLUMN 컬럼명 TO 바꿀 컬럼명 - 열의 자료형 변경 MODIFY
- DESC TABLE_NAME 으로 데이터형이 수정되었는지 확인할 수 있다
ALTER TABLE 테이블NAME MODIFY 컬럼명 수정데이터형 - 열을 삭제하는 DROP
ALTER TABLE NAME DROP COLUMN 컬럼명 - 테이블 이름을 변경하는 RENAME
RENAME TABLE_NAME TO 바꿀 TABLE_NAME - 테이블의 데이터를 삭제하는 TRUNCATE
- TRUNCATE로 삭제한 테이블은 복구할 수 없다
TRUNCATE TABLE TABLE_NANE - 테이블의 데이터를 삭제하는 DROP
- DROP으로 삭제한 테이블은 복구할 수 있다
DROP TABLE TABLENAME;
테이블 데이터 처리
- 테이블에 데이터 추가 시 INSERT문 사용
INSERT INTO ITEM VALUES(VALUE, VALUE); // 순서대로 값이 들어갈 때 INSERT INTO NEW_ITEM(NEW_COUNT, NEW_INDEX) VALUES(VALUE, VALUE); // 순서를 지정하고 싶을 때 - 테이블의 데이터 수정 시 UPDATE문 사용
- ROLLBACK; 명령문으로 이전 데이터로 돌아갈 수 있다
UPDATE TABLE_NAME SET 컬럼=VALUE WHERE 조건... - 테이블에 들어있는 데이터 삭제 시 DELETE 문 사용
DELETE FROM TABLE_NAME WHERE 조건
Oracle 문자열 함수 정리
2018-11-27 00:00:00 +0000오라클 함수
- Oracle 함수란 특정한 결과 값을 얻기 위해 데이터를 입력할 수 있는 특수 명령어
DUAL 테이블이란?
- Oracle의 최고 권한 관리자 계정인 SYS 소유의 테이블
- 임시 연산, 함수의 결과값을 확인할 때 주로 사용
문자 함수
- UPEER(문자열)
- 문자열을 모두 대문자로 변경
- SELECT UPPER(‘AbcdEF’) FROM DUAL;
- 결과 ABCDEF
- LOWER(문자열)
- 문자열을 모두 소문자로 변경
- SELECT LOWER(‘AbcdEF’) FROM DUAL;
- 결과 abcdef
- INITCAP(문자열)
- 첫글자를 대문자로. 나머지는 소문자로 변경
- SELECT INITCAP(‘AbcdEF’) FROM DUAL;
-
결과 Abcdef
-
특정 단어를 찾으려고 하는데, 찾을 대상들이 형식이 다를 때(‘ABcd’, ‘aBcd’) 일원화하여 쉽게 찾을 수 있다
- LENGTH(문자열)
- 문자열의 길이를 구한다
- SELECT LENGTH(‘가나다라’) FROM DUAL;
- 결과 4
- LENGTHB(문자열)
- 문자열의 길이를 바이트 수로 반환한다
- SELECT LENGTHB(‘가나다라’) FROM DUAL;
- 결과 12
-
LENGTH는 문자열 갯수를 반환하지만, LENGTHB는 바이트 수를 반환한다
- SUBSTR(문자열, 시작위치, 추출길이)
- 문자열을 시작위치부터 추출길이만큼 구한다. 시작위치는 1부터 시작
- SELECT SUBSTR(‘가나다라’,2) FROM DUAL;
- 결과 나다라
- 추출길이를 지정하지 않으면 문자 끝까지 추출
- 시작위치에 음수값을 넣으면 끝에서 부터 추출
-
가(-4) 나(-3) 다(-2) 라(-1), 시작위치에 -1을 넣으면 ‘라’가 출력됩니다
- INSTR(대상 문자열 데이터(필수),위치를 찾으려는 부분 문자(필수),위치 찾기를 시작할 대상 문자열 데이터 위치,시작 위치에서 찾으려는 문자가 몇번째인지 지정)
- 문자열안에서 특정 문자를 찾는다
- SELECT INSTR(‘가나다라’, ‘나다’) FROM DUAL;
-
결과 2
- REPLACE(문자열 데이터 또는 열 이름(필수),찾는 문자(필수),대체할 문자)
- 문자를 다른 문자로 바꾼다
- SELECT REPLACE(‘010-1111-2222’, ‘-‘) FROM DUAL;
- 01011112222
-
만약 대체할 문자를 지정하지 않는다면 찾는 문자는 삭제 된다
- LPAD(문자열 또는 열이름(필수),데이터 자릿수(필수),빈공간에 채울 문자)
- 빈 공간이 있다면 왼쪽에 특정 문자로 채움
- SELECT RPAD(‘201204-‘, 14, ‘*’) FROM DUAL;
- 결과 201204-***
-
RPAD는 사용법은 같고, 오른쪽을 특정 문자로 채움
- CONCAT(문자열,문자열)
- 두 문자열을 합침
- SELECT CONCAT(‘AB’,’CD’) FROM DUAL;
-
ABCD
- TRIM(삭제옵션, 삭제할 문자) FROM 원본문자열 데이터(필수)
- 특정 문자 삭제
- SELECT TRIM(‘A’ FROM ‘ABCDEFG’) FROM DUAL;
- BCDEFG
Posts
-
Interceptor(인터셉터)
-
Android Studio Install
-
계층형 게시판
-
VirtualBox Ubuntu 18.04.2 LTS
-
TransactionAwareDataSourceProxy Error
-
Java Coding Conventions
-
Java Long과 long의 차이
-
Mybatis 객체 안에 객체 매핑
-
JavaConfig mariadb 연결
-
DataTable
-
관리자 페이지
-
MappingJackson2JsonView
-
Spring Javaconfig
-
게시판 만들기-제품 등록
-
게시판 만들기-제품 페이지 제작
-
게시판 만들기-회원탈퇴 및 게시판 삭제 플래그 추가
-
footer 하단에 고정시키기
-
bootstrap4 사용법
-
Spring 데이터 검증 @Valid, BindingResult
-
brackets 실시간 미리보기
-
Spring 기본설정(pom.xml, web.xml, encoding)
-
Vue.js computed, methods, watch
-
javascript onkeyup
-
Maria DB Incorrect string value Error
-
javascript 암호화(md5, base64)
-
Vue.js template
-
Vue.js 소개
-
Nexacro 설명
-
ControllerAdvice
-
Batch
-
html 페이지 로딩 순서
-
소수구하기(PrimeNumber)
-
최소공배수,최대공약수
-
Stream
-
Lambda(람다식)
-
inner class(내부 클래스)
-
final 키워드
-
file upload
-
파이썬 빅 데이터 K-평균(K-means)
-
아나콘다(Anaconda), 주피터 개발환경 세팅
-
텐서플로우(TensorFlow) 아키텍쳐 및 Session
-
텐서플로우(TensorFlow)상수, 변수, 함수
-
머신러닝 기초
-
한글 리스트 오름차순, 내림차순
-
연속된 글자의 갯수 출력
-
java spring5 프로젝트 설정
-
restController
-
spring 세팅 및 기본설정
-
mybatis trim
-
jquery datepicker
-
ajax로 데이터 전달/응답 받는법
-
mybatis error
-
mybatis 게시판 만들기 순서
-
Java Jsp Mybatis Dynamic Query
-
mybatis
-
git 소개
-
node.js 개발환경 구축
-
node.js 기본 내장 모듈
-
node.js의 전역 객체
-
node.js http module
-
node.js event
-
jdbc
-
자바빈
-
jsp, servlet 정리
-
java null object pattern
-
다음지도 key 등록(kakao map)
-
공공 데이터 open api
-
facebook login api
-
sourcetree 사용법
-
JavaScript event3
-
JavaScript jquery
-
JavaScript dom
-
JavaScript ajax
-
JavaScript 이벤트2
-
JavaScript 캡슐화
-
JavaScript Array,내장객체
-
JavaScript var
-
JavaScript 객체,생성자
-
JavaScript 함수,클로저
-
JavaScript Event
-
javascript eclipse 자동완성(with tern)
-
CSS position
-
HTML5,CSS 선택자
-
자바 시간 측정
-
git,eclipse 연동
-
HTML 기초 정리
-
Eclipse Web 환경세팅
-
피보나치의 수
-
Oracle 반복문,커서,예외,저장 서브프로그램
-
Oracle PL/SQL
-
Oracle 다중쿼리(Multiple row query)
-
Oracle 인덱스, 뷰, 시퀀스, 트랜잭션, 세션 정리
-
Oracle JOIN 정리
-
Oracle DDL, DML 정리
-
Oracle 문자열 함수 정리
-
Oracle 숫자,날짜,자료형 변환 함수 정리
-
Oracle 제약조건 정리
-
Oracle 기초 쿼리 정리
-
문제2775
-
DFS
-
junit
-
json
-
algorithmus basic
-
circular queue(원형큐)
-
binary search(이진탐색)
-
port forwarding(포트포워딩)
-
kakao chatbot(카카오 챗봇)
-
java io
-
sort comparable, comparator
-
Unresolved compilation problem
-
ArrayList, HashMap
-
Regular(정규표현식)
-
Enum Class
-
String Function
-
refactoring 이란(상수,제어플래그,assert)
-
reference,abstract 정리
-
FileNotFoundException Solve
-
static
-
Thread Synchronization(스레드동기화,원자성)
-
Java Exception(예외처리)
-
Java 생성자, this, super
-
roomnum
-
BeeHouse
-
Git Reset, Revert
-
Git Log
-
Array
-
stack
-
pyramid draw
-
Star Draw(별 그리기4)
-
Star Draw(별 그리기3)
-
Star Draw(별 그리기2)
-
Star Draw(별 그리기1)
-
Loop(While, For)
-
자바 데이터 타입, 데이터 연산
-
시계방향 달팽이 그리기
-
정수값의 짝수,홀수 갯수 구하기
-
java, Scanner 정리
-
draw dog
subscribe via RSS