DB/SQL 66

[SQL] INSTR

[INSTR]INSTR(문자열, 찾을 문자값, 찾기를 시작할 위치, 몇번째로 나오는 값)찾기를 시작할 위치 : 맨앞이 1이며 뒤에서 부터 찾고싶을땐 '-'를 붙인다.  n번째 문자부터 찾고싶으면 n. 몇번째로 나오는 값 : 찾는 값이 여러개 일때 n번째로 나오는 값을 찾는다.(default는 가장 첫번째로 나오는 값)값이 없으면 0을 반환한다. (첫번째 인덱스는 1이다) [예시]SELECT INSTR('Oracle Database', 'Database') AS result1 , INSTR('Oracle Database', 'Server') AS result2 FROM TABLE -- result1 : 8, result2 :0

DB/SQL 2024.12.04

NULL관련 함수

NVL(col,exp2)col이 null이면 exp2를 반환한다.ex)select nvl(col,"없음")from table NVL2(col, exp1, exp2)col이 값이 있으면 exp1을 반환, 값이 없으면(null이면) exp2를 반환ex)select nvl(job, "직업있음","직업없음")from table nullif(col1,exp)col1이 exp와 같으면 null반환, 다르면 col1을 반환* 특정값을 제외하고싶을 떄 사용ex)--nation컬럼에서 한국만 null로 나온다.select nullif(nation, "한국")from table coalesce(col1,col2,col3...)첫번째로 null이 아닌값을 반환한다.ex)select coalesce(col1, col2, co..

DB/SQL 2024.06.27

[SQL] 날짜 함수

MONTHS_BETWEEN(d1,d2)d1, d2두 날짜의 개월수 차이 반환months_between('22/09/01','22/01/11') => 7.677 ADD_MONTHS(d1,N)d1에 N개월 더함ADD_MONTHS('22/01/31',3) => 22/04/30 NEXT_DAY(d1, 'n요일')d1이후 날짜중 처음으로  n요일이 되는 날짜.next_day('24/06/27','금요일') => 24/06/28' LAST_DAY(d1)D1날짜 월의 마지막 일을 리턴last_day('24/06/27') => 24/06/30 TO_CHAR(date_col, 'format')날짜를 문자로 바꿔주는 함수. 포멧에 따라 다양한 형태로 표현이 가능함.format내용YYYY년도MM월MONTH전체 월 이름MON..

DB/SQL 2024.06.27

[SQL] 문자열 조건 escape

escape?문자열을 검색할때 '%' 혹은 '_'를 이용하여 검색할 떄가 있다.이떄 '%'나 '_'를 특정 기능이 아닌 문자 그 자체로 취급하고 싶을 때 escape를 쓴다. 방법조건절에서 escape의 기준이될 문자열(\)을 정하고,  뒤에  명시해준다.where col_name like '100\%' escape '\' 예시예시1.select *from employeeswhere job_id like 'abc\_def' escape '\';=> '_'가 아무 1글자를 의미하는것이 아니라, 언더바('_')라는 문자 자체로 인식된다. 예시2.select *from employeeswhere percentage like '98\%' escape '8';=>'%'가 아무글자를 의미하는 것이 아니라, 퍼센트..

DB/SQL 2024.06.27

스칼라 서브쿼리

스칼라 서브쿼리- 오직 한행만 반환하는 select문에 쓰는 서브쿼리- 마치 join의 효과를 볼 수 있다.- ex)table: scoreidnamekormatheng학생 id이름국어점수수학점수영어점수 위와같은 테이블에서 학생별 국어, 수학, 영어점수의 평균을 구하고자 한다면, 다음과 같은 스칼라 서브쿼리를 이용할 수 있다.select id, name (select (kor+math+eng)/3 from score A where A.id=B.id) from score B;=> 서브쿼리에서 (kor+math+eng)/3이 하나의 행씩 반환하여 id가 같은 것에 매핑된다.

DB/SQL 2024.05.02

[SQL] DML (update,select,insert,delete)

INSERT* insert는 into를 써준다!(1) insert into (테이블) (컬럼1,컬럼2...) values (데이터1, 데이터2...);insert into emp(empno,ename) values(1000,'임베스트');/* 아래처럼 컬럼을 생략해도 된다. 하지만 이때는 1000이 들어갈 숫자형 컬럼과 '임베스트'가 들어갈문자형 컬럼이 각각 하나씩만 있어야 한다 */insert into emp values(1000, '임베스트'); (2) select 이용하여 insert--dept에서 모든 데이터를 dpet_test에 입력한다insert into dept_test select * from dept;   SELECT(1) select 기본select * --컬럼from emp --테..

DB/SQL 2024.04.30

[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

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

소프트파싱, 하드파싱

라이브러리 캐시 - 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