WITH절WITH절을 이용해 추출한 데이터들을 서브 쿼리, 임시 테이블과 같이 사용할 수 있습니다. 해당 SQL문 내에서는 재활용이 가능하기 때문에, 중복되는 코드에서는 WITH절을 이용하여 가독성을 향상시킬 수 있습니다. 대표적인 RDBMS(Oracle, MySQL, MS-SQL 등)에서 사용 가능한 문법입니다.어떨 때 사용해야 할까?WITH절은 가독성을 좋게할 뿐만 아니라 경우에 따라 쿼리 성능을 향상시킬 수도 있습니다. 어떨 때 쿼리 성능이 향상될 수 있는지를 알기 위해서는 먼저 WITH절의 동작 방식을 알아야 합니다.WITH절은 두 가지의 동작 방식이 존재합니다. 상황에 따라서 Inline View 방식과 Materialize 방식 중 한 가지 방식으로 동작하게 됩니다. 오라클을 예로, 이전 버전..
SQL
오래전 만들어두었던 사이드 프로젝트를 리팩토링하는 작업을 진행중에 소소하게 막힌 부분들 중 간단히 작성할 수 있는 내용을 남긴다. 현재 리팩토링하는 프로젝트는 SpringBoot 3.2.3 버전에 JPA 관련해서는 `spring-boot-starter-data-jpa` 라이브러리를 사용한다. 기본적으로 모든 레파지토리는 `JpaRepository` 인터페이스를 상속하는 형태로 존재한다.문제가 된 부분은 게시글(BoardImp)을 조회할 때, 대소문자 구분없이 들어온 값이 포함되는 데이터를 조회하는 기능을 작성하는 것이었다. `LOWER()`와 `LIKE %문자열%`를 함께 쓰고 싶었다. 실행되길 원하는 쿼리문은 아래와 같았다.SELECT b.* from board_imp bWHERE (LOWER(b.ti..
주요 SQL 문법 1. 다중 조건문 (CASE문) CASE WHEN [조건1] THEN [조건1가 참일 경우 반환 값] WHEN [조건2] THEN [조건2가 참일 경우 반환 값] ELSE [조건들이 모두 거짓일 경우 반환 값] END2. 특정 문자열 포함 여부 확인 예시에서 검사하는 컬럼은 VARCHAR2 타입으로 간주한다. LIKE를 사용하는 경우 : 특정 컬럼의 값에 주어진 문자열이 속한다면 참을, 그렇지 않다면 거짓을 반환한다. -- WHERE절의 조건문으로 사용 SELECT * FROM ITEMS WHERE ITEM_NAME LIKE '%문자열%'; -- CASE문의 조건문으로 사용 SELECT CASE WHEN ITEM_NAME LIKE '%문자열%' THEN &#..
-- 현재 사용자가 접근 가능한 모든 메타데이터 조회(OWNER 상관없이 모든 데이터 조회) SELECT * FROM ALL_TAB_TABLES WHERE TABLE_NAME = '[table name]'; // 해당 테이블 존재 여부 조회 SELECT * FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = '[table name][table name]'; // 해당 테이블의 모든 컬럼 조회 SELECT * FROM ALL_CONS_COLUMNS WHERE TABLE_NAME = '[table name]'; // 해당 테이블의 제약조건과 컬럼 조회 SELECT * FROM ALL_CONSTRAINTS WHERE TABLE_NAME = '[table name]'; // 해당 테이블의 제..
주요 SQL 문법 1. 다중 조건문 (CASE문) CASE WHEN [조건1] THEN [조건1가 참일 경우 반환 값] WHEN [조건2] THEN [조건2가 참일 경우 반환 값] ELSE [조건들이 모두 거짓일 경우 반환 값] END2. 특정 문자열 포함 여부 확인 예시에서 검사하는 컬럼은 VARCHAR2 타입으로 간주한다. LIKE를 사용하는 경우 : 특정 컬럼의 값에 주어진 문자열이 속한다면 참을, 그렇지 않다면 거짓을 반환한다. -- WHERE절의 조건문으로 사용 SELECT * FROM ITEMS WHERE ITEM_NAME LIKE '%문자열%'; -- CASE문의 조건문으로 사용 SELECT CASE WHEN ITEM_NAME LIKE '%문자열%' THEN &#..
MariaDB -- 해당 데이터가 존재할 경우 새로운 로우를 삽입하지 않는다. INSERT IGNORE INTO [TABLE NAME](COLUMN1, COLUMN2, ...) VALUES(VAL1, VAL2, ...); -- 해당 데이터가 존재할 경우 해당 로우를 업데이트 한다. INSERT INTO [TABLE NAME](COLUMN1, COLUMN2, ...) VALUES(VAL1, VAL2, ...) ON DUPLICATE KEY UPDATE COL1 = VAL1, COL2 = VAL2, ... Oracle INSERT INTO [TABLE NAME](COLUMN1, COLUMN2, ...) VALUES(VAL1, VAL2, ...) WHERE NOT EXISTS(SELECT * FROM [TAB..
'SELECT COUNT(*) FROM ... WHERE ...'와 같이 특정 조건의 데이터 여부를 확인할 때 COUNT 함수를 사용하곤 하는데, 이 경우에는 조건에 맞는 데이터를 모두 쿼리한 다음 그 수를 세기 때문에 이럴 경우에는 EXISTS를 사용하는 것이 좋습니다. 'SELECT EXISTS(SELECT * FROM ... WHERE ...)'와 같이 EXISTS 함수를 사용하는 것이 훨씬 좋습니다.(이 경우에는 한 번만 쿼리합니다.) MariaDB SELECT COUNT(*) FROM TABLENAME WHERE VAL_COL1 = ? SELECT EXISTS(SELECT * FROM TABLENAME WHERE VAL_COL1 = ?) Oracle SELECT 1 FROM DUAL WHERE ..

본 게시글은 Datacamp의 Introduction to SQL 코스와 패스트캠퍼스의 SQL/DB 올인원 패키지 강좌를 수강하며 제가 기억할 수 있도록 작성한 것으로, 아주 기초적인 내용으로 구성되어 있습니다. SELF JOIN 동일 테이블 사이의 조인. 즉, 하나의 테이블이 특정 컬럼을 기준으로 자기 자신과 조인하는 것을 말한다. ex. country_code 컬럼을 기준으로 populations 테이블을 셀프 조인하여 각각을 p1, p2라고 명명하고, p1의 country_code, size(두 컬럼의 공통 컬럼으로 size2010, size2015의 두 개의 컬럼으로 표현할 것)을 조회 SELECT p1.country_code, p1.size size2010, p2.size size2015 FRO..

테이블명 변경(RENAME) ALTER TABLE [기존 테이블명] RENAME [변경될 테이블명]; 컬럼 추가(ADD) -- 마지막에 추가(기본) ALTER TABLE 테이블명 ADD COLUMN 칼럼이름 칼럼타입 -- 지정 칼럼 뒤에 ALTER TABLE 테이블명 ADD COLUMN 칼럼이름 칼럼타입 AFTER 칼럼이름 -- 제일 앞에 추가 ALTER TABLE 테이블명 ADD COLUMN 칼럼이름 칼럼타입 FIRST 컬럼 삭제(DROP COLUMN) ALTER TABLE [테이블명] DROP COLUMN [컬럼명]; 컬럼 수정 - 컬럼명, 컬럼 데이터 타입 변경 - 컬럼 데이터 타입만 변경(MODIFY COLUMN) ALTER TABLE [테이블명] MODIFY COLUMN [컬럼이름] [새컬럼타입..

PostgreSQL을 이용하며 실습해보는 과정에서 테이블을 생성한 후 수정해야하는 상황이 생길 때 헷갈렸던 부분들을 따로 정리했다. 기존에 사용하던 MySQL(MariaDB)의 명령어도 따로 정리할 생각이다. 테이블명 변경하기 ALTER TABLE [기존 테이블명] RENAME TO [변경될 테이블명]; 기존 테이블에 컬럼 추가하기 ALTER TABLE [테이블명] ADD [컬럼명] [데이터 타입]; 컬럼 제거하기 ALTER TABLE [테이블명] DROP [컬럼명]; 컬럼명 변경하기 ALTER TABLE [테이블명] RENAME COLUMN [기존 컬럼명] TO [변경될 컬럼명]; 컬럼의 데이터 타입 변경하기 ALTER TABLE [테이블명] ALTER COLUMN [컬럼명] TYPE [변경될 데이터 ..