[내일배움캠프] 데이터 트랙/본 캠프

[내일배움캠프] 13일 차 - SQL 코드카타, Python 알고리즘 코드카타, SQLD

554083460 2025. 5. 28. 20:51

 

 

 

 SQL 코드카타

 

 

문제 58

취소되지 않은 진료 예약 조회하기

 

 

최종 답안

SELECT A.APNT_NO,
       P.PT_NAME,
       A.PT_NO,
       A.MCDP_CD,
       D.DR_NAME,
       A.APNT_YMD
FROM APPOINTMENT A 
JOIN PATIENT P -- JOIN 2번
ON A.PT_NO = P.PT_NO
JOIN DOCTOR D -- JOIN 2번
ON A.MDDR_ID = D.DR_ID 
WHERE DATE(A.APNT_YMD) = '2022-04-13'
AND A.APNT_CNCL_YN = 'N'
ORDER BY A.APNT_YMD;

 

개선점

1. [MySQL] 3개 이상의 테이블 연결할 때 JOIN

FROM TABLEA
LEFT JOIN TABLEB
ON A.COLUMN = B.COLUMN
LEFT JOIN TABLEC
ON A.COLUMN = C.COLUMN
-- TABLEA 기준으로 LEFT JOIN

 

2. [MySQL] JOIN이라고 쓰면 'INNER JOIN'을 의미함

 

 

 

 Python 알고리즘 코드카타

 

 

문제 32

내적

 

 

최종 답안

def solution(a, b):
    answer = sum([a[i]*b[i] for i in range(len(a))])
    return answer

 

새롭게 알게 된 것

1. List Comprehension

 

설명

새로운 리스트 만들기

 

문법

[표현식 for 항목 in iterable if 조건]

 

표현식: 새로운 리스트에 넣을 값, 또는 값을 구할 수식

항목: iterable을 반복하면서 얻는 요소

iterable: 반복 가능 객체. 리스트, 튜플, 문자열 등

조건 (선택): 특정 조건 만족하는 요소만 리스트에 추가

 

예시

# 짝수만 포함한 리스트 만들기

a = [1, 2, 3, 4, 5, 6, 7, 8]
even_numbers = [i for i in a if i % 2 == 0]
print(even_numbers)

 

 

2. SUM(list)


설명

리스트의 전체 요소의 합 더하기 

요소가 integer일 때만 사용 가능

 

문법

SUM(list)

 

 

 

 SQLD 헷갈리는 내용만 정리 - Oracle 기준

 

 

참고 자료

SQL 자격검정 실전문제, 한국데이터산업진흥원

GPT 검색

 

더보기
더보기

GRANT, REVOKE

어떤 사용자가 WITH GRANT OPTION과 함께 권한 허가받았으면, 그 사용자는 해당 권한을 WITH GRANT OPTION 유무와 관계없이 다른 사용자에게 허가할 수 있다. 

PUBLIC 사용하면 자신에게 허가된 권한을 모든 사용자들에게 허가할 수 있다.

REVOKE 사용하여 권한 취소하면, 권한 취소당한 사용자가 WITH GRANT OPTION을 통해서 다른 사용자들에게 허가했던 권한들도 모두 연쇄적으로 취소된다.

REVOKE 사용해 권한 취소할 때, 그 권한 허가한 사용자가 권한을 취소할 수 있다.

 

DROP SCHEMA EMPLOYEE CASCADE;

EMPLOYEE 스키마 뿐만 아니라 연관된 객체들도 모두 삭제

 

DROP SCHEMA EMPLOYEE RESTRICT;

스키마가 공백인 경우에만 삭제, 스키마에 객체 있으면 삭제되지 않음

 

스키마(SCHEMA)

데이터베이스 객체들의 집합

데이터베이스의 폴더 같은 것

테이블, 뷰, 인덱스, 트리거, 프로시저, 함수 등 데이터베이스 내에서 모든 객체들이 포함될 수 있는 논리적인 구획

 

LAG 함수

LAG(column_name, offset, default_value) OVER (PARTITION BY column_name ORDER BY column_name)

 

- column_name: 값을 가져오고자 하는 컬럼명

- offset (선택사항): 몇 번째 이전 행의 값을 가져올지 지정 (기본값은 1로, 바로 이전 행을 가져옴)

- default_value (선택사항): 이전 값이 없을 때 반환할 값 (기본값은 NULL)

- OVER: 윈도우 함수는 OVER 절을 사용하여 데이터를 어떻게 나눠서(partition) 어떻게 정렬할지 지정합니다.

 

 

CREATE TABLE 제약조건 형식

마지막에

CONSTRAINT 제약조건명 PRIMARY KEY (PK가 될 컬럼이름)

 

트랜잭션의 특징

원자성

트랜잭션은 전체가 성공하거나 실패

 

일관성

트랜잭션 전후, 데이터는 항상 유효한 상태

 

고립성

여러 트랜잭션은 서로 간섭하지 않음

어떤 트랜잭션이 수행 중일 때 다른 트랜잭션의 영향 받아 잘못된 결과 도출하는 경우가 발생하는 것을 방지하는 것

 

영속성

트랜잭션 완료 후, 데이터는 영구적으로 저장

 

트랜잭션 ROLLBACK

트랜잭션 처리 시 SAVEPOINT 지정하면,

ROLLBACK 시 특정 SAVEPOINT로 돌아갈 수 있다.

 

테이블 생성 시 주의사항

- 테이블 이름은 객체 의미하는 적절한 이름

- 테이블 이름은 가능한 단수형

- 테이블 이름은 다른 테이블 이름과 중복되지 않아야

- 한 테이블 내에서 컬럼명 중복될 수 없다.

- 테이블 이름 지정하고, 각 컬럼들은 괄호"()"로 묶어 지정

- 각 컬럼 콤마(,)로 구분됨

- 테이블 생성문 끝은 항상 ;

- 컬럼은 다른 테이블까지 고려하여 데이터베이스 내에서 일관성 있게 사용하는 것이 좋다.

- 컬럼 뒤에 데이터 유형은 꼭 지정되어야 한다.

- 테이블명, 컬럼명 반드시 문자로 시작해야 하고, 벤더별로 길이에 대한 한계 있다.

- 벤더에서 사전에 정의한 예약어는 쓸 수 없다.

 

후보 키(Candidate key)

테이블의 각 행을 유일하게 식별할 수 있는 컬럼들의 집합

여러 개가 존재할 수 있습니다.

그 중 하나를 기본 키로 선택하고, 나머지는 후보 키로 남는다. 

예시) 하나의 PK, 하나의 UNIQUE KEY가 있을 때, UNIQUE KEY가 후보 키

 

SELECT DISTICT COLUMN1, COLUMN2

COLUMN1과 COLUMN2의 값이 모두 동일한 행만 중복으로 판단

 

DEPENDENT

자식 테이블의 FK 데이터 생성 시 부모 테이블에 PK가 없는 경우, 자식 테이블 데이터 입력을 허용하지 않는 참조동작

 

INSERT, UPDATE 등에서 오류 패턴

컬럼이 NOT NULL인데, 

입력 시 값이 없어 NULL이 될 상황이면 오류

 

DROP, TRUNCATE, DELETE 비교

  DROP TRUNCATE DELETE
삭제 대상 테이블/데이터베이스/인덱스 등 테이블의 모든 행 조건에 맞는 행
테이블 구조 유지 삭제 유지 유지
속도 매우 느림 빠름 느림
트랜잭션 지원 지원되지 않음 (일반적으로) 일부 DBMS에서 지원됨 (MySQL에서는 불가) 지원 (롤백 가능)
사용 예 테이블이나 DB 객체 완전 삭제 모든 데이터 삭제, 구조는 유지 조건에 맞는 데이터 삭제
자동 증가 리셋 해당 없음 리셋될 수 있음 (DBMS에 따라 다름) 리셋되지 않음
사용 예 더 이상 사용하지 않는 테이블 삭제 모든 데이터 삭제 (빠르게) 특정 조건에 맞는 데이터 삭제

 

Oracle VS SQL Server

Oracle: DDL 문장 수행 이후 자동으로 COMMIT 수행

SQL Server: DDL 문장 수행 이후 자동으로 COMMIT 수행하지 않음

 

*DDL: CREATE, ALTER, DROP, TRUNCATE

*COMMIT

COMMIT을 하면 변경된 데이터가 영구적으로 저장되고, 그 이후에는 롤백할 수 없음

트랜잭션을 명시적으로 종료하는 방법

 

 

SQL Server TOP(n) WITH TIES column1, column2

column 높은 순으로 n위까지 출력하되, 같은 건수인 것 있으면 함께 출력