1. 외래키(Foreign Key)상품테이블과 주문테이블이 있다고 생각해보자. 아직 두 테이블간의 관계는 정해지지않은 상태다. 두 테이블의 관계는 어떻게 될지 생각해보자. 하나의 상품은 여러 주문에서 구매할 수 있고(재고만있다면..), 하나의 주문은 여러 상품을 구매할 수 있다. 다대다(N:M) 관계라는 뜻이다. ERD상으로는 이렇게 그릴 수 있지만 보통 RDB에서 다대다 관계는 중간에 관계 테이블을 추가해서 사용한다. 주문_상품이라는 관계 테이블을 추가했다(주문 테이블이 너무 허전해서 아무렇지않은듯 속성도 추가했다.). 주문_상품 테이블은 각각 상품 테이블과 일대다, 주문 테이블과 다대일 관계를 갖고있다. 주문_상품이 없는 상품은 존재할 수 있지만 주문_상품이 없는 주문은 존재할 수 없음도 ERD에 표..
1. 자연키(Natural Key)회원 테이블을 만든다고 가정해보자. 약간 속성의 차이는 있겠지만 대부분 이런형태의 테이블구조가 나올것이다. 이제 회원이 늘어날때마다 각각의 속성들에 대응하는 값들을 갖고있는 로우가 하나씩 추가될것이다. 그럼 이제 해당 로우들을 각각 고유하게 구별할 수 있는 기본키(primary key)를 지정해야한다. 어떤 컬럼을 기본키로 지정해주면 좋을까?성별은 회원이 몇명이든 2개의 값밖에 들어갈 수 없다. 필연코 각 로우별 중복적인 값이 들어올수밖에 없는 속성이므로 기본키로 적합하지않다(불가능하다.).이름도 동명이인이 충분히 있는만큼 적합하지않다. 주소는 가능할까? 주소를 가지고 기본키로 설정하면 내가 가입한곳을 동생이 가입하기 힘든사태가 벌어질수도 있을것 같다.그럼 남은것 중 전..
보통 하나의 완성된 쿼리 내에 존재하는 하위 쿼리들을 전부 서브 쿼리라고 총칭하기는 하는데 사용되는 위치에 따라 각각의 이름이 있다. 그냥 서브 쿼리라고만 부르면 큰 문제 없는데 간혹 이 명칭들을 이용해 의사소통이 이루어지는 경우가 있다. 이럴때 이 용어를 모르면 의사소통에 문제가 생기므로 정리해본다. 1. Nested Query (중첩 쿼리) SELECT 절에 사용되는 서브 쿼리 SELECT (SELECT name FROM test) a FROM test; 2. Sub Query (하위 쿼리) 서브 쿼리의 명확한 사용처는 WHERE 절에 사용되었을 때다. SELECT * FROM test WHERE name IN (SELECT name FROM test); 3. Inline View (인라인 뷰) FR..
인덱스 확인 방법 SELECT * FROM USER_INDEXES WHERE TABLE_NAME='/*테이블명*/ ' ; 인덱스를 확인했으니 그 키가 되는 컬럼을 알아보는방법은... SELECT * FROM USER_IND_COLUMNS WHERE TABLE_NAME='/*테이블명*/ ' ; 이라 하면 모든 인덱스의 컬럼이 다 나오고 해당 인덱스의 컬럼만 보고싶다면 SELECT * FROM USER_IND_COLUMNS WHERE INDEX_NAME='/*인덱스명*/';[출처] Oracle Table Index Column(오라클 테이블 인덱스 확인)|작성자 똥스배스
보통 테이블 만들때create table 테이블명(컬럼1 number primary key,컬럼2 number primary key);이렇게 하게되면 기본키 에러가 발생한다.기본키는 복수가 되는데 왜? 라는 의문을 가질수 있지만 '기본키를 구성하는 컬럼이 복수일 수는 있어도''기본키가 복수일 수는 없다' 라고 생각하면 이해가 쉬울 것 같다. 그럼 기본키를 구성하는 컬럼을 복수로 하기위해선 어떻게 하느냐 create table tab ( 컬럼1 number, 컬럼2 number, CONSTRAINT 기본키이름 PRIMARY KEY (컬럼1, 컬럼2) ); 이런식으로 사용하면 된다.
count로 추출할 데이터가 있어서 오전시간 내내 count 함수가지고 이짓저짓했는데데이터가 있는 컬럼의 개수는 잘 가져오는데 데이터가 없는 경우 0이나 null 도 아니고 아예 데이터를 안가져오길래 그걸 어떻게해야하는지 고민하다가 알게된 쿼리.잘 기억해놔야겠다. select req_no , count(*) , count(decode(prg_cd, '40000',1 )) finish , count(decode(prg_cd, '50000',1 )) cancel from mtn_req_lst group by req_no;
되게 간단한건데 오늘 새롭게 알게되서 정리한다.난 여태 한 테이블에 기본키가 2개 이상의 컬럼으로 이루어져있으면그게 각각의 키로 인식해서 두 컬럼 모두 개별적으로 중복이 되면 안되는줄알았다.그래서 두테이블간에 관계를 맺을때 식별자와 비식별자관계가 무슨 차이인지 잘 몰랐는데2개 이상의 컬럼을 개별적으로 보는게 아니라 모두 합쳤을때 중복이 되면 안되는거였다. 즉, A컬럼과 B컬럼이 기본키로 잡혀있다고 가정할때 내가 여태 잘못알고있던 방식은 A는 A끼리 중복이 되면 안되고 B는 B끼리 중복이 되면 안되는줄알았는데 그게 아니고 [A = 1 B = 1], [A = 1, B = 2] 와 같이 두 컬럼 모두 중복이 아니라면 이 데이터는 무결성 원칙을 지키는 것이다. A컬럼과 B컬럼이 같이 기본키일때 B컬럼만 기본키일..
위의 그림을 보자. 회원 테이블과 이름 컬럼으로 만든 인덱스, 주소 컬럼으로 만든 인덱스, 연락처 컬럼으로 만든 인덱스가 있다. select * from 회원 where 이름 = '나한일'; 위 쿼리를 날리면 먼저 where절에 있는 이름 컬럼으로 인덱스가 만들어져있는지 찾아본다. 보니까 idx_이름 이라는 인덱스가 있다. 그 인덱스에 나한일이 어디 사냐고 물어본다. 인덱스에서 나한일의 ROWID를 보니 B3이다. B3 주소값을 가지고 HDD에서 B3으로 가 나한일을 메모리로 끌어올린다.(Single Block I/O) where 주소 in ('서울', '부산');위 쿼리는 주소 인덱스에서 서울과 부산의 주소값을 가지고 하드로 가므로 블록I/O가 두번 일어난다. where 급여 = 80;위 쿼리는 급여 ..
문자함수-INITCAP : 첫 글자를 대문자로 변환-LOWER : 문자열 전체를 소문자로 변환-UPPER : 문자열 전체를 대문자로 변환-LENGTH : 문자열의 길이 반환-LENGTHB : 문자의 바이트 수를 반환-CONCAT : 문자열 결합. ||와 같음-SUBSTR : 문자열 일부를 추출 SUBSTR(문자열, n1, n2); //해당 문자열의 n1번째부터 n2개 까지 추출하겠다.(n2를 입력하지않으면 n1부터 이후문자열 모두 추출)-INSTR : 특정 문자가 있는 첫번째 위치 반환-LPAD : 오른쪽 정렬 후 왼쪽으로 지정 문자 삽입-RPAD : 왼쪽 정렬 후 오른쪽으로 지정 문자 삽입-LTRIM : 왼쪽 지정 문자 삭제-RTRIM : 오른쪽 지정 문자 삭제-TRIM : 문자열 양쪽 공백 제거 숫자..
현재 접속 DB계정에 생성되어있는 테이블 확인 SELECT * FROM tab; 테이블 구조 확인 DESC table_name; SELECT 절에서 중복데이터를 제거하는 키워드DISTINCT예)SELECT DISTINCT column_name FROM table_name; 컬럼에 대한 별명 부여(alias)-column_name as alias_name-column_name alias_name-column_name "alias_name"어떤 방식으로 사용하든 상관없으나 특수문자를 사용해야할때는 "" 사용 합성연산자 ||Column 2개를 한 Column으로 출력하고 싶을때 사용.조회결과에 무언가를 더하고싶을때 사용예)SELECT column_name || column_name FROM table_name..
- Total
- Today
- Yesterday
- Kotlin
- JavaScript Core
- servlet
- JPA
- 정규표현식
- Git
- spring cloud
- clean code
- javascript
- java
- TEST
- frontcode
- toby
- generics
- code
- java8
- EffectiveJava
- mariadb
- Spring
- programming
- db
- frontend개발환경
- MySQL
- Design Pattern
- DesignPattern
- http
- go-core
- OOP
- backend개발환경
- Jackson
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |