DB 94

[SQL] 연속된 년도 구하기

연속된 년도 구하기 DB에 다음과 같은 데이터가 있다고 가정했을 때, 연속된 년도(혹은 어떤 숫자든)가 얼마나 있는지 확인하는 쿼리 ex ) [인원별 수상내역]테이블이 아래와 같을때 2년이상 연속으로 수상한 사람을 구하시오 수상년도 성명 2014 A 2013 A 2016 B 2020 B 2020 C 2021 C 2019 C => A(2013, 2014 2년연속 수상), B(2019, 2020, 2021 3년 연속 수상)를 출력해야 한다. 방법 핵심 아이디어는 "년도를 오름차순으로 정리하고 순서대로 인덱스를 매기는것" 그 후 현재년도(혹은 수상년도 컬럼에서 가장 max값)에서 수상년도값을 뺀값과 index를 더하는것 1. 수상년도와 이름을 오름차순으로 정렬 수상년도 성명 2013 A 2014 A 2016 ..

DB/SQL 2024.02.26

트랜잭션 격리수준(isolation level)

트랜잭션 격리수준 발생에러 \ 트렌잭션 격리수준 Dirty Read Non-Repeatable read Pantom Read 격리수준 낮음 . . . . . 격리수준 높음 READ UNCOMMITED 발생 가능 발생 가능 발생 가능 READ COMMITED 없음 발생 가능 발생 가능 REPEATABLE READ 없음 없음 발생 가능 SERIALIZABLE 없음 없음 없음 READ UNCOMMITED 가장 낮은 격리수준으로서 커밋되지 않은 데이터를 볼 수 있음. 따라서 dirty read오류 발생 READ COMMITED 커밋된 데이터만 읽는것. 다른 A 트랜잭션에서 변경한 데이터를 읽을 때 B 트랜잭션에서 일관되게 읽지 않을 수 있음. 즉 unrepeatable read가 발생할 수 있음. 오라클의 ..

DB/[이론] 2023.11.19

데이터 무결성

데이터 무결성이란 - 데이터 무효갱신으로 부터 데이터를 보호하여 정확성, 유효성, 일관성, 안정성 등을 유지하는것 무결성의 종류 * 개체무결성 : 기본키로 선택된 필드는 빈 값을 허용하지 않음 * 참조 무결성 : 서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관되어야 함 - 외래키는 Null이거나 참조하는 테이블의 기본키에 존재하는 값이여야 함 - 기본키 중 자신을 참조하는 외래키가 존재하면 기본키를 삭제할 수 없다. * NULL 무결성 : not null인 컬럼의 경우 not null이 지켜져야 함 * 영역 무결성(Domain Integrity) : 테이블에 존재하는 필드의 무결성을 보장하는것. 데이터타입, NULL 허용 등의 여부 정의. 속성값은 원자성을 가지며, 해당 도메인에서 정의된 값이여야..

DB/[이론] 2023.11.13

데이터베이스의 구성요소

데이터베이스의 구성요소 1. 데이터베이스 관리시스템 : 데이터베이스를 구축하고 이용하는 기능을 제공하는 시스템 소프트웨어 2. 데이터베이스(DB) : 한 조직의 여러 응용프로그램이 공용하기 위해 최소의 중복으로 저장한 데이터의 집합 3. 데이터베이스 언어 : 사람과 시스템의 인터페이스를 제공하는 도구 4. 사용자 : 데이터베이스 관리자(DBA), 데이터베이스 응용 프로그래머, 데이터 베이스 사용자 등

DB/[이론] 2023.10.15

redis 명령어

MAP - GET SET 함수 명령 설명 SET mykey "myvalue" key: mykey, value:myvalue 값을 가지는 객체 SET mykey "myvalue" EX 10 10s뒤에 삭제 SET mykey "myvalue" PX 10 10ms뒤에 삭제 SET mykey "myvalue" XX 키가 존재하면 SET을 실행 SET mykey "myvalue" GET 이전에 있던 value값을 return한후 SET을 실행 SET mykey "myvalue" NX SETNX mykey "myvalue" 키가 존재하지 않으면 SET을 실행 MSET key1 val1 key2 val2 ... 여러값을 SET MGET key1 key2 여러값을 GET - counter command 명령 설명 I..

DB/[이론] 2023.07.12

mac redis 설치 및 실행

redis란 cacheDB의 한 종류로서 다양한 자료구조를 제공하는 in memory database이다. 싱글스레드라는 특징이 있고 하나의 한 클라이언트만 자료를 저장/조회하기 때문에 데이터 lock없이 빠르게 데이터를 조회가능하다. cacheDB로 redis를 많이 사용하는 이유는 자료구조의 설계와 사례가 용도에 따라 명확하기 때문이다. 또한 분산 클러스터 모드를 지원하므로 확장성도 제공할 수 있고 레퍼런스가 충분히 많다. redis설치 및 실행 1. brew를 이용한 redis설치 brew install redis 2. redis 실행 redis-server //일반실행 brew services start redis //백그라운드실행 3. 실행됐는지 확인 brew services info re..

DB/[이론] 2023.07.02

foreign key의 설정에 따른 update, delete 영향

foreign 설정 종류 1. ON DELETE/UPDATE CASCADE : 부모 테이블의 값이 지워지면(업데이트되면) 자식 테이블의 해당 row도 지워(업데이트)진다 CREATE TABLE foreign_key_test ( id int NOT NULL, content varchar(2048) DEFAULT NULL, user_id int DEFAULT NULL, product_id int unsigned NOT NULL, PRIMARY KEY (id), FOREIGN KEY (product_id) REFERENCES product (id) on delete cascade ); 2. ON DELETE/UPDATE SET NULL : 부모 테이블의 값이 지워지면(업데이트되면) 자식 테이블의 해당 row의..

DB/SQL 2023.06.21

SQL update에러(Error Code: 1175. You are using safe update mode)

SQL update 에러 SQL에서 UPDATE시에 다음과 같은 에러가 나는 경우가 있다. Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect. 이는 update를 할 때 where 절에 key 컬럼을 사용하지 않았을 때 발생하는 경고 에러이다. 예시) update product set price = price-1000 where name like 'shoes%'; 해결책 key 칼럼을 사용하..

DB/SQL 2023.06.20

studio 3T Visual Query Builder를 이용한 쿼리 역추출

Studio 3T의 Visual Query Builder기능 studio 3t에서 Visual Query builder를 이용하면, GUI로 원하는 검색을 하고, 그에 맞는 쿼리를 역으로 추출받을 수 있다. Visual Query Builder 사용법 1. GUI쿼리설정 1. Drag and drop field here or double-click를 더블클릭한다 2. 원하는 필드를 설정하고 해당 필드의 특정값과 같은, 혹은 포함하는(혹은 포함하지 않는..등등)의 조건을 설정한다. 2. 쿼리확인 query code를 눌러서 쿼리확인

DB/MONGODB 2023.06.19

소프트파싱, 하드파싱

라이브러리 캐시 - SGA(System Global Area) : 서버 프로세스, 백그라운드 프로세스가 공통으로 엑세스하는 데이터와 제어 구조를 캐싱하는 메모리공간 - 라이브러리 캐시 : SGA에 속해있는 내부 프로시저를 반복 재사용 할 수 있도록 캐싱해 두는 메모리 공간. 소프트파싱과 하드파싱 - SQL문을 실행하면, SQL이 라이브러리 캐시에 존재하는지 확인 - 이때 라이브러리 캐시에서 찾으면 곧바로 실행 => 소프트파싱 - 라이브러리 캐시에서 찾지 못하면, 최적화, 로우 소스 생성단계를 거침 => 하드파싱

DB/SQL 2023.02.12

옵티마이저 힌트 규칙

사용법 주석( /* */)에 +를 붙이는 방식으로 사용 SELECT /* +INDEX(table col) */ col1, col2, col3, col4 FROM table where col1==option1 주의사항 1. 인자를 나열할 때는 콤마 사용가능, 힌트와 힌트사이에는 사용 불가 아래는 가능 /* INDEX(a,b) INDEX(c,d)*/ 아래는 불가능(첫번째 힌트만 유효) /* INDEX(A), INDEX(B) */ 2. 태이블을 지정할 때 스키마명까지 명시하면 안됨 SELECT /*+ FULL(scima.table) */ FROM table 3. alias를 사용했으면, 힌트에서도 반드시 alias를 사용해야함 SELECT /*+ FULL(EMP) */ FROM EMP E

DB/SQL 2023.02.12

SQL 최적화 과정

SQL 최적화 과정 1. SQL파싱 1.1 파싱 트리 생성 : SQL문을 이루는 개별 구성요소를 분석해서 파싱 트리 생성 1.2. syntax 체크 : 문접적 오류가 있는지 확인 (사용 or 순서 바르지 않거나 누락된 키워드 확인) 1.3. semantic체크 : 의미상 오류가 있는지 확인 (존재하지 않는 테이블 사용 or 사용한 오브젝트 권한 있는지) 2. SQL최적화 : 옵티마이저가 통계정보를 바탕으로 다양한 실행경로를 생성하여 비교한 후 효율적인 방법 선택 3. 로우소스 생성 : SQL옵티마이저가 선택한 실행경로를 실제 실행 가능한 코드 또는 프로시저 형태로 포매팅 하는 단계 SQL 옵티마이저 최적화 단계 1. 사용자가 전달한 쿼리를 수행하는데 후보군이 될 만한 실행계획들을 찾음 2. 데이터 딕셔너..

DB/SQL 2023.02.12

[프로그래머스] 즐겨찾기가 가장 많은 식당정보 출력하기 #group by

문제 음식 종류별 즐겨찾기 수가 최대인 값들을 구하는 문제. 오답 SELECT A.FOOD_TYPE, A.REST_ID, A.REST_NAME, A.FAVORITES FROM (SELECT *, max(FAVORITES) as max_favorites FROM REST_INFO group by FOOD_TYPE) AS A order by FOOD_TYPE DESC 위 쿼리가 틀린 이유는 서브쿼리(SELECT *, max(FAVORITES) as max_favorites FROM REST_INFO group by FOOD_TYPE)에서 SELECT문을 "*, max(FAVORITES)"로 하면 max(FAVORITES)컬럼에는 FOOD_TYPE별 최댓값이 들어가지만, 나머지 컬럼들에는 FOOD_TYPE별 ..

DB/SQL 2022.11.26

소트 오퍼레이션

1. sort aggregate - 전체 로우를 대상으로 집계를 수행할 때 - sort라는 표현을 썼지만 실제로 정렬하진 않는다 - sum, max, min, avg 등의 값을 구할 때 사용 - 집계당(sum, max, min, count 등) 변수를 만들고 데이터를 하나씩 넣으면서 집어 넣으면서 집계를 수행 ex) 값을 하나씩 넣으면서 sum은 더하고, max는 큰게 나오면 교치하고, min은 작은게 나오면 교체하고, count는 1씩 더해준다 2.sort order by - sort order by : 데이터를 정렬할 때 발생 - ex select colA from tableA order by colB 3. sort group by - 그룹별 집계를 수행할 때 나타난다. - ex) select c..

DB/SQL 2022.08.16

소트 수행 과정

메모리 공간 종류 1. 메모리 소트(in memory sort) : 전체 데이터의 정렬 작업을 메모리 내에서 완료하는 것 2. 디스크 소트(to-dist sort) : 할당받은 sort area내에서 정렬을 완료하지 못해 디스크 공간까지 사용하는 경우 과정 [SGA] -> [PGA] -> [temp tablespace] --(merge)--> [PGA] 1. 소트할 대상 집합을 SGA버퍼캐시를 통해 읽어들인다. 2. sort area에서 정렬을 시도한다. 3. 양이 많을 때는 정렬된 중간집합을 temp 태이블스페이스에 임시 세그먼트로 저장한다. 4. 최종 결과집합을 얻기 위해 merge한다

DB/SQL 2022.08.15

인덱스 엑세스 조건, 인덱스 필터 조건

인덱스 엑세스 조건 - 인덱스 스캔 범위를 결정하는 조건절 - 수직적 탐색을 통해 스캔 시작점을 결정하는 데 영향을 미치는 조건절 - 또한 인덱스 리프 블록을 스캔하다가 어디서 멈출지 결정하는데 영향을 미치는 조건절 - 첫번째 범위검색 조건절 이전까지 조건절이 인덱스 엑세스 조건이다 인덱스 필터 조건 - 테이블로 엑세스를 할지 결정하는 조건절 - 첫번째 범위검색 조건절 이후부터가 인덱스 필터 조건이다 그림

DB/SQL 2022.08.11

인덱스 탐색과정

인덱스 탐색과정 - 인덱스 tree가 위와 같고, 조건절이 where c1='B' and c2=3이라고 가정하자 - 루트 블록에서 조건에 맞는건 (B,3)이지만 그 직전 데이터인 (A,3)의 리프블록에서 부터 스캔을 시작 해야 조건에 맞는 모든 데이터를 찾을 수 있다. - 스캔시작구간은 리프블록2의 네번째 데이터(B,3), 종료구간은 리프블록3의 두번째(B,3) - 루트블록속 데이터들의 하위블록들은, 루트블록속 데이터들보다 항상 크거나 같다. - 루트블록속 가장 왼쪽 레코드를 LMC(LeftMost Child)라고 한다.

DB/SQL 2022.08.11