본문 바로가기

Database/SQL15

TCL TCL1) TRANSACTION트랜잭션 = “하나의 작업 단위”로TCL이란 한마디로, 변경 내용을 언제 확정(COMMIT)하고 언제 되돌릴지(ROLLBACK) 통제하는 언어DB 입장에서 중요한 건 두 가지다.중간 상태가 외부에 보이면 안 됨 (Atomicity)성공하면 영구히 반영돼야 함 (Durability) 2) BEGIN / START TRANSACTION트랜잭션 시작을 나타낸다.BEGIN;-- 또는START TRANSACTION;둘은 사실상 동일.트랜잭션 없이 UPDATE 하면:UPDATE users SET age = 0 WHERE age IS NULL;→ 바로 반영됨→ 사고 나면 되돌릴 방법 없음트랜잭션 안에서 하면:BEGIN;UPDATE users SET age = 0 WHERE age IS .. 2026. 2. 11.
Lock과 성능 개선 1) PostgreSQL Lock 전체 구조PostgreSQL은 두 가지 lock을 동시에 사용한다.(1) Table-level lock(2) Row-level lock핵심은 가능한 한 “최소 범위만 잠근다”(1) Table-level Lock 종류이건 “테이블 전체”에 대한 lock이다. 하지만 대부분 읽기/쓰기 막지는 않는다.ACCESS SHARESELECT가 거는 lock.특징:UPDATE/INSERT/DELETE 허용SELECT끼리는 충돌 없음SELECT는 거의 시스템에 영향 없음ROW EXCLUSIVEINSERT / UPDATE / DELETE 시 걸림.특징:다른 DML 허용DDL은 막힘일반 서비스 트래픽은 이 lock 위에서 돌아감SHARECREATE INDEX 등에서 발생.읽기 허용, 쓰기 .. 2026. 2. 11.
INSERT, UPDATE, DELETE 1) DML이미 존재하는 테이블의 데이터(row) 를 변경하는 명령DDL은 구조를 다루고 DML은 데이터를 다룬다. DML은 구조는 건드리지 않는다.SELECT → 데이터 조회INSERT → 데이터 추가UPDATE → 데이터 수정DELETE → 데이터 제거2) INSERT기본 형태INSERT INTO users (name, email)VALUES ('kim', 'kim@test.com');INSERT는 단순 “쓰기”가 아니라 무결성 검사 + 인덱스 변경 + 로그 기록 작업이다.INSERT는 생각보다 많은 작업을 한다.타입 검사NOT NULL 검사CHECK 검사FK 검사DEFAULT 적용IDENTITY/SEQUENCE 값 생성인덱스 업데이트WAL 기록여러 row INSERTINSERT INTO users .. 2026. 2. 10.
ALTER, DROP, TRUNCATE ALTER: 구조 변경(데이터 유지)하지만 lock/rewrite 발생 가능DROP: 객체 삭제(데이터/구조 모두 삭제)가장 위험TRUNCATE: 데이터만 전체 삭제(구조 유지, 빠름, 시퀀스 옵션 가능)FK/IDENTITY 옵션 중요1) ALTER이미 존재하는 객체의 구조를 바꾸는 명령ALTER는 단순 문법이 아니라 락 / 테이블 리라이트 / 성능 / 서비스 중단과 직결된다.대상:TABLECOLUMNCONSTRAINTINDEXSEQUENCESCHEMAVIEW1-1) 컬럼 추가ALTER TABLE users ADD COLUMN phone varchar(20);metadata 변경기존에 있던 row는 NULL 값으로 취급LOCK: 짧은 ACCESS EXCLUSIVE lockDEFAULT와 함께 추가할 때A.. 2026. 2. 10.
CREATE psql 내부 기본 메타 명령어\l: 현재 DB 목록 \dt: 테이블 목록 \c db이름: 특정 DB로 이동 \d 테이블명: 테이블 구조 보기 \q: 종료 CREATE TABLE컬럼 정의: 타입, DEFAULT, NOT NULL, GENERATED …제약조건(Constraints): PK/UK/FK/CHECK 등 “규칙(무결성)”물리/운영 옵션: TEMP, UNLOGGED, PARTITION, TABLESPACE 등 “저장/운영 방식”1) 컬럼 정의(Column definition)column_name data_type [COLLATE collation] [CONSTRAINT ...] [NOT NULL | NULL] [DEFAULT expr] [GENERATED ...] [IDENTITY ...].. 2026. 2. 10.
String, Date e문자열 관련length(): 문자열 길이 — 공통select length('hello'); -- 5Oracle → byte 길이 = lengthb()MySQL → byte 길이 = length()MySQL 문자수 ('한글' - 2 / byte로 검색하면 6) = char_length()substr(): 문자열 자르기 — 공통substr(문자열, 시작, 길이)select substr('abcdef',1,3); -- abcselect substr('abcdef',-3); -- defsubstr(phone,1,3) -- 앞 n글자substr(phone,-4) -- 뒤 n글자instr(): 문자열 위치 찾기 — 공통instr('abcdef','cd') -- 3instr(email@email.com,'@').. 2026. 2. 9.
GROUP BY 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기(존재 여부 CASE-MAX, 전부 만족 CASE-MIN, 개수 CASE-COUNT)CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시해주시고 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.MAXSELECT car_id, CASE WHEN MAX( .. 2026. 2. 9.
JOIN 주문량이 많은 아이스크림들 조회하기7월 아이스크림 총 주문량과 상반기의 아이스크림 총 주문량을 더한 값이 큰 순서대로 상위 3개의 맛을 조회하는 SQL 문을 작성해주세요.-- OracleSELECT H.FLAVORFROM FIRST_HALF HLEFT JOIN ( SELECT FLAVOR, SUM(TOTAL_ORDER) AS TOTAL_ORDER FROM JULY GROUP BY FLAVOR) JON H.FLAVOR = J.FLAVORORDER BY J.TOTAL_ORDER + H.TOTAL_ORDER DESCFETCH FIRST 3 ROW ONLY;-- MySQLSELECT H.FLAVORFROM FIRST_HALF HLEFT JOIN ( SELECT FLAVOR, SUM(TOT.. 2026. 2. 8.
SUM, MAX, MIN 가격이 제일 비싼 식품의 정보 출력하기FOOD_PRODUCT 테이블에서 가격이 제일 비싼 식품의 식품 ID, 식품 이름, 식품 코드, 식품분류, 식품 가격을 조회하는 SQL문을 작성해주세요.SELECT *FROM FOOD_PRODUCTWHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT)가장 비싼 상품 구하기PRODUCT 테이블에서 판매 중인 상품 중 가장 높은 판매가를 출력하는 SQL문을 작성해주세요. 이때 컬럼명은 MAX_PRICE로 지정해주세요.SELECT MAX(PRICE) AS MAX_PRICEFROM PRODUCT최댓값 구하기가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.SELECT MAX(DATETIME)FROM ANIMAL.. 2026. 2. 7.