SQLD 시험 전에 공부해야 할 것5 : DECODE, CASE

 

안녕하세요! 오늘은 SQLD를 준비할 때 절대로 놓쳐서는 안 될 조건문에 대해 알아보려고 합니다. 데이터를 정제할 때 어떤 조건의 정보만 추출하고 싶을 때가 있습니다. 이 때 유용하게 사용될 수 있는 문법입니다. 

 

DECODE

 

SELECT DECODE(column_name, 'value1', 'result1', 'value2', 'result2', 'default_result') AS decoded_value
FROM table_name;

 

오라클에서 사용하는 문법입니다

 

컬럼명, 컬럼의 데이터, 출력할 값, 기본값 이렇게 4개의 정보가 필요합니다.

 

바로 예시로 들어가서 살펴보겠습니다!

 

예를 들어 한 회사에 여러 부서가 있습니다. 부서별로 번호를 부여하고 싶습니다. 마케팅팀은 10, 운영팀은 20, 영업팀은 30 이렇게요! 그럴 때 DECODE를 어떻게 사용하면 좋을까요?

 

DECODE('DEPT', '마케팅', '10', '운영팀', '20', '영업팀','30')

 

간단하죠ㅎㅎ

 

그런데 이 세개의 팀에 속하지 않는 팀이 있다면 에러가 생길 수 있습니다. 그럴 땐 default 값으로 뒤에 앞에 내용에 해당하지 않은 데이터들은 어떻게 처리할 지 적어주면 됩니다. 저는 세 팀에 속하지 않은 팀의 경우 100이라는 숫자를 부여하도록 하겠습니다.

DECODE('DEPT', '마케팅', '10', '운영팀', '20', '영업팀','30', '100')

 

CASE

 

case 문법은 정말정말 자주 사용되기 때문에 꼭 아셔야 하는 필수 문법입니다. case 또한 조건문을 만들 때 사용됩니다. 

 

SELECT 
    CASE 
        WHEN condition1 THEN result1
        WHEN condition2 THEN result2
        ELSE default_result
    END AS case_result
FROM table_name;

 

 

이렇게 보면 복잡해 보이죠. 예시를 활용해서 하나하나 살펴보겠습니다!

 

예를 들면 한 동물원에 갔습니다. 입장권을 살려고 하는데 나이별로 할인 금액이 달릅니다. 예를 들면 3살 미만일 경우 무료이며 3살부터 12살 미만일 경우 50%의 할인 가격이 들어갑니다. 그 외에는 정상 가격으로 받습니다. 이를 sql로 코딩을 하면 다음과 같습니다.

 

CASE
WHEN 나이 < 3 THEN '무료'
WHEN 나이 >= 3 AND 나이 < 12 THEN '할인 가격'
ELSE '정상 가격'
END

 

2 무료
5 할인 가격
10 할인 가격
15 정상 가격

 

이렇게 결과 표가 출력이 됩니다.

쉽죠ㅎㅎ

 

 

DECODE와 CASE의 차이

 

둘의 큰 차이는 바로 부등호 비교가 가능한지 여부입니다. 앞선 예문에서 보셨듯이 CASE는 등호비교(=), 부등호비교(<,>,<=,>=) 모두 사용 가능합니다. 하지만 DECODE는 등호비교만 가능합니다. 이 점 꼭 기억하시기 바랍니다:)

 

 

확실하게 이해했는지 확인하기 위해 테스트 문제를 제시해볼게요!

 

문제 

 

직급이 사장인 경우에는  null을 출력하고 팀장인 경우에는 7000, 과장은 6000, 대리는 5000을 출력하시오.

 

직급 컬럼 : JOB

연봉 컬럼 : SALARY

데이터명: EMP

 

정답

 

select JOB, DECODE(JOB,'사장',null,'팀장',7000,'과장',6000,'대리',5000) as SALARY
from EMP

 

어떠셨나요? 이제 조금 심화 과정으로 들어갈볼까요?

 

데이터들을 정렬할 때 사용하는 구문 중 하나가 바로 order by 컬럼명 desc/asc 입니다. decode를 사용할 때 order by를 사용해보면 이상한 점을 발견할 수 있습니다.

 

바로 숫자가 문자열로 암시적 형변환으로 일어나는 것인데요. 예시로 쉽게 알아보겠습니다.

 

아래와 같은 order_details라는 테이블이 있습니다. 각각의 상품의 id와 수량이 적혀있군요.

테이블 이름: order_details

| product_id | quantity |
|------------|----------|
| 1          | 10       |
| 2          | 5        |
| 3          | 15       |
| 4          | 8        |

 

이제 id 별로 quantity에 따라 등급을 나눠주려고 합니다. 10개 이상이면 A 나머지는 quantity를 적습니다. 그 다음 quantity 컬럼을 기준으로 내림차순으로 정렬을 시켜보았습니다.

SELECT 
    product_id, 
    quantity,
DECODE(product_id, 15, 'A',quantity) as quantity_code
FROM 
    order_details
ORDER BY 
    quantity DESC;

 

 

출력 결과는?

어라 이상합니다. quantity를 기준으로 내림차순으로 정렬 되게 하였습니다. 그렇다면 15인 1이 가장 위에 있어야 하는데 8이 가장 위에 있습니다.

왜 그럴까요?

 

 

product_id quantity quantity_code
4 8 8
2 5 5
3 15 A
1 10 10
4 8 8

 

암시적 형변환

 

decode의 가장 많이 발생하는 에러 중 하나가 바로 암시적 형변환입니다. 즉 숫자를 문자로 자기가 멋대로 바꿔버립니다. 세번째 변수가 A 였었죠. A는 문자형입니다. 그래서 그 다음 변수인 quantity가 영향을 받아 숫자를 문자로 바꾼것입니다. 

 

여기를 숫자로 바꾸려면?

 

to_number('A') 로 적어주면 됩니다.

 

to_number 함수를 활용해서 문자형을 숫자형으로 바꿔줍니다.

 

SELECT 
    product_id, 
    quantity,
DECODE(product_id, 15, number('A'),quantity) as quantity_code
FROM 
    order_details
ORDER BY 
    quantity DESC;

 

 

자 이렇게 오늘은 조건문인 DECODE, CASE를 배웠습니다. 혹시 어렵거나 헷갈렸던 부분이 있다면 언제든 댓글로 알려주세요. 이번 포스팅 도움이 되기를 바라며 이만 물러나보겠습니다. 좋은 하루 보내세요!

 

 

 

 

SQLD 시험 전에 공부해야 할 것4 : TRANSACTION, COMMIT, ROLLBACK

 

 

 

 안녕하세요 오늘은 아주아주 중요한 TRANSACTION, COMMIT, ROLLBACK에 대해서 알아보려고 합니다!

 

ORACLE 과  SQL Server에서 각각 조금씩 차이점이 있는데요.

 

우선 SQL Server부터 살펴보겠습니다.

 

SQL Server에서의 TRANSACTION, COMMIT, ROLLBACK

 

SQL(Structured Query Language)에서 트랜잭션은 단일 작업 단위로 처리되는 일련의 SQL 문입니다. 

 

SQL Server에서 트랜잭션 작업을 위한 BEGIN TRANSACTION, COMMIT 및 Rollback의 세 가지 주요 명령을 제공합니다.

 

 

 

BEGIN TRANSACTION

이 명령은 트랜잭션의 시작을 표시합니다. BEGIN TRANSACTION 명령이 실행되면 COMMIT 또는 ROLBACK 명령이 실행될 때까지 동일한 세션에서 실행되는 후속 SQL 문은 동일한 트랜잭션의 일부가 됩니다.

 

COMMIT

이 명령은 트랜잭션의 종료를 표시하고 트랜잭션 중에 수행된 모든 변경 사항을 영구적으로 적용합니다. COMMIT 명령이 실행되면 트랜잭션의 변경 내용이 다른 사용자에게 표시됩니다.

 

ROLLBACK

이 명령은 트랜잭션 중에 변경된 내용을 모두 실행 취소하고 데이터베이스를 트랜잭션이 시작되기 전의 상태로 되돌립니다. 트랜잭션에 오류가 발생하거나 어떤 이유로 완료할 수 없는 경우 ROLBACK 명령을 사용하여 이미 수행된 변경 내용을 실행 취소하고 추가 변경 내용이 데이터베이스에 커밋되지 않도록 할 수 있습니다.

 

예시를 한 번 살펴볼까요!

 

 

BEGIN TRANSACTION
UPDATE Customers SET Phone = '123-456-7890' WHERE Name = 'John Smith'
COMMIT

 

 

 

 

이 예시에서 BEGIN TRANSACTION 명령은 트랜잭션의 시작을 표시하고 UPDATE 명령은 고객 "John Smith"의 전화 번호를 수정합니다. 트랜잭션이 성공적으로 완료되면 COMMIT 명령이 실행될 때 UPDATE 명령에 의해 변경된 내용이 데이터베이스에 영구적으로 적용됩니다.

 

그러나 트랜잭션을 실행하는 동안 오류가 발생하면 UPDATE 명령이 실행되기 전의 초기 상태로 트랜잭션을 롤백할 수 있습니다. 이렇게 하면 오류 또는 오류 발생 시에도 데이터베이스가 일관되고 정확하게 유지됩니다.

 

 

 

Oracle 및 SQL Server는 모두 트랜잭션, 커밋 및 롤백 작업을 지원하는 관계형 데이터베이스 관리 시스템이지만 각 시스템에서 이러한 작업이 구현되는 방식에는 약간의 차이가 있습니다.

 

ORACLE에서의 TRANSACTION, COMMIT, ROLLBACK

 

Oracle에서 트랜잭션은 하나 이상의 SQL 문으로 구성된 작업의 논리 단위입니다. 이러한 문은 단일 단위로 처리되며 트랜잭션은 모든 문이 함께 성공하거나 실패하도록 보장하는 데 사용되어 데이터의 무결성을 유지합니다. ACID(원자성, 일관성, 격리, 내구성) 속성을 따릅니다.

 

 

원자성(Automicity)

트랜잭션의 일부라도 실패하면 전체 트랜잭션이 롤백되고 데이터베이스가 이전 상태로 복원됩니다.

일관성(Consistency)

트랜잭션이 실행 되기 전의 데이터베이스 내용이 잘못되어 있지 않다면 트랜잭션이 실행된 이후에도 데이터베이스의 내용에 오류가 있으면 안됩니다.

고립성(Isolation)

트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어내서는 안된다

지속성(Durability)

트랜잭션이 커밋되면 트랜잭션에 의해 변경된 내용이 영구적이며 손실되지 않도록 보장합니다.

 

 

COMMIT

오라클에서 트랜잭션을 커밋하려면 COMMIT 문을 사용합니다. COMMIT 문은 트랜잭션의 모든 변경 내용을 영구적으로 변경하고 트랜잭션이 보유한 잠금을 해제합니다. 트랜잭션이 커밋되면 변경 내용이 다른 세션에 표시됩니다.

 

ROLLBACK

Oracle에서 트랜잭션을 롤백하려면 ROLBACK 문을 사용합니다. ROLBACK 문은 트랜잭션의 모든 변경 내용을 실행 취소하고 데이터베이스를 이전 상태로 복원합니다.

 

BEGIN
  UPDATE Customers SET status = 'Active' WHERE id = 1;
  UPDATE Orders SET status = 'Shipped' WHERE customer_id = 1;
  COMMIT;
END;

SAVEPOINT

Oracle에서는 SAVEPOINT 문을 사용하여 트랜잭션 내에서 저장 지점을 정의할 수도 있습니다. 저장 지점을 사용하면 전체 트랜잭션을 롤백하지 않고 트랜잭션의 일부를 롤백할 수 있습니다. 또한 SET TRANSACTION 문을 사용하여 분리 수준, 일관성 수준 및 트랜잭션 시간 초과와 같은 트랜잭션 특성을 설정할 수 있습니다.

 

SAVEPOINT 생성하는 구문

SAVEPOINT savepoint_name;

 

 

SAVEPOINT를 활용한 예시입니다

 

 

거래에서 한 은행 계좌에서 다른 은행 계좌로 돈을 이체한다고 가정합니다. 원본 계정에서 돈을 차감하기 전에 저장 지점을 생성하여 대상 계정으로 돈을 입금할 때 오류가 발생하면 트랜잭션을 저장 지점으로 롤백하고 원본 계정에서 돈을 차감하지 않도록 하려고 합니다.

 

BEGIN
  SAVEPOINT before_transfer; -- SAVEPOINT 생성
  UPDATE accounts SET balance = balance - 500 WHERE account_number = '123456';
  UPDATE accounts SET balance = balance + 500 WHERE account_number = '789012'; 
EXCEPTION
  WHEN OTHERS THEN 
    ROLLBACK TO before_transfer; -- SAVEPOINT로 ROLLBACK
END;

 

이 예에서는 SAVEPOINT 문을 사용하여 before_transfer라는 이름의 저장 지점을 만듭니다. 그런 다음 우리는 소스 계좌에서 500 단위의 통화를 공제하고 동일한 금액을 목적지 계좌로 입금합니다. 트랜잭션 도중 오류가 발생하면 EXPECTION 블록이 실행되고 ROLLBACK TO 문을 사용하여 트랜잭션을 before_transfer 저장 지점으로 롤백합니다. 이렇게 하면 목적지 계좌로 입금하는 과정에서 오류가 발생하더라도 원본 계좌에서 돈이 차감되지 않습니다.

 

 

 

만약 두 SAVEPOINTS의 이름이 같다면 어떻게 될까요?

 

SAVEPOINT my_savepoint;
-- make some changes here
SAVEPOINT my_savepoint;
-- make some more changes here
ROLLBACK TO my_savepoint;

 

여기 이름이 my_savepoint로 같은 savepoint 2개가 있는데요

결론은 Rollback을 했을 때 가장 나중에 생긴 savepoint로 이동이 됩니다.

 

이 코드에서는 "my_savepoint"라는 이름의 저장 지점을 설정하고, 몇 가지를 변경하고, "my_savepoint"라는 이름의 다른 저장 지점을 설정하고, 몇 가지를 더 변경합니다. "my_savepoint"로 롤백하면 두 번째 저장 지점 이후의 변경 내용만 실행 취소되고 이전에 변경된 내용은 실행 취소되지 않습니다.

따라서 혼동을 방지하고 트랜잭션의 올바른 지점으로 롤백할 수 있도록 트랜잭션에서 고유한 저장 지점 이름을 사용하는 것이 중요합니다.

 

 

 

자동커밋?

자동커밋 또는 암묵적 커밋이라고도 하는데요. 말 그대로 commit을 작성하지 않아도 알아서 자동으로  commit이 되는 경우가 있습니다. 이와 관련해 SQL Server와 ORACLE 각각 다른 특징을 보이는데요.

 

SQL Server에서는 기본적으로 각 문이 자체 트랜잭션 내에서 실행되며, 문이 성공적으로 완료되면 자동으로 커밋됩니다. 이를 자동 커밋 모드라고 합니다. 

 

Oracle에서는 자동 커밋 모드가 기본적으로 사용되지 않습니다. 각 문은 트랜잭션의 컨텍스트 내에서 실행되며 변경 내용을 영구적으로 변경하려면 COMMIT 문을 사용하여 명시적으로 커밋되어야 합니다. 

 

Oracle에서 DDL 구문이 사용시 자동 COMMIT이 수행되기도 하는데요

DDL(데이터 정의 언어)은 테이블, 인덱스, 보기 및 시퀀스와 같은 데이터베이스 개체를 정의, 수정 또는 삭제하는 데 사용되는 SQL 문 집합을 말합니다. DDL 문에는 CREATE, ALTER ,DROP,RENAME 문이 포함됩니다.

 

Oracle에서 DDL 문을 실행할 때 데이터베이스는 암묵적 트랜잭션 모드로 작동합니다. 즉, 각 DDL 문이 실행된 후 자동으로 커밋됩니다. 

 

자동 커밋 모드는 대부분의 데이터베이스 작업에 권장되지 않습니다. 자동 커밋 모드는 예기치 않은 데이터 변경을 초래하고 오류가 발생할 경우 트랜잭션을 롤백하기 어려울 수 있기 때문입니다. 따라서 Oracle 데이터베이스로 작업할 때는 COMMIT 및 ROLBOLLBACK 문을 사용하여 트랜잭션 동작을 명시적으로 제어하는 것이 가장 이상적입니다.

 

 

 

그럼 오늘도 화이팅!

 

SQLD 시험 전 공부해야 할 것3 : NVL, NULLIF, COALESCE

 

SQL에서 NULL값을 처리하고 싶은데 어떻게 하면 좋을까요?

 

이때 활용하는 함수인 NVL, NULLIF, COALESCE를 알아보도록 해요!

 

NULLIF

두 식을 비교하여 표현식2와 동일하면 null을 반환하고 동일하지 않으면 표현식1을 반환합니다. 구문은 NULLIF(expression1, expression2)입니다. 이 함수는 종종 오류를 방지하거나 null 값을 기본값으로 대체하는 데 사용됩니다.

 

SELECT NULLIF(5,5); -- null을 반환합니다
SELECT NULLIF(5,6); -- 5를 반환합니다

예시문제

1.제품 목록과 가격을 반환하지만 무료가 아닌 제품만 포함하는 쿼리를 작성합니다.

SELECT product_name, price
FROM products
WHERE NULLIF(price, 0) IS NOT NULL;

 

2. 각 제품의 평균 등급을 계산하지만 0인 등급은 제외하는 쿼리를 작성합니다

SELECT product_id, AVG(NULLIF(rating, 0)) AS avg_rating
FROM ratings
GROUP BY product_id;

 

COALESCE

이 함수는 식 목록에서 null이 아닌 첫 번째 값을 반환합니다. 구문은 COALESCE(식 1, 식 2, ..., 식 N)입니다. 이 함수는 종종 쿼리에서 null 값을 처리하거나 null 값을 기본값으로 대체하는 데 사용됩니다.

 

SELECT COALESCE(NULL, 1, 2); -- 1을 반환합니다
SELECT COALESCE(NULL, NULL, 'hello', 'world'); -- 'hello'를 반환합니다

예시문제

 

1. 고객 이름 및 연락처 전자 메일 목록을 반환하는 쿼리를 작성합니다. 고객에게 연락처 전자 메일이 없는 경우 기본 전자 메일을 대신 반환합니다.

 

SELECT name, COALESCE(contact_email, primary_email) AS email
FROM customers;

 

NVL

이 기능은 COALESCE와 유사하지만 Oracle 데이터베이스에만 해당됩니다. 식 목록에서 null이 아닌 첫 번째 값을 반환합니다. 구문은 NVL(expression1, expression2)입니다. 이 함수는 종종 쿼리에서 null 값을 처리하거나 null 값을 기본값으로 대체하는 데 사용됩니다.

 

SELECT NVL(NULL, 1); -- 1을 반환합니다
SELECT NVL(NULL, 'hello'); -- 'hello'를 반환합니다

 

예시문제

 

1.직원 및 부서 이름 목록을 반환하는 쿼리를 작성합니다. 직원이 부서에 할당되지 않은 경우, 대신 "할당되지 않음"을 반환합니다.

SELECT employee_name, NVL(department_name, '할당되지 않음') AS department
FROM employees;

 

2. 각 제품의 총 매출을 계산하는 쿼리를 작성하고, 매출이 없는 제품의 경우 매출에 대해 0을 반환합니다.

SELECT product_id, NVL(SUM(sales_amount), 0) AS total_sales
FROM sales
GROUP BY product_id;

 

 

NVL2

SQL에서 식을 null이 아닌 경우 반환할 값과 식이 null인 경우 반환할 다른 값을 지정할 수 있는 함수입니다.

 

NVL2 (expression, value_if_not_null, value_if_null)

expression: null을 확인할 식입니다
value_if_not_null: 식을 null이 아닌 경우 반환할 값
value_if_null: 식이 null인 경우 반환할 값

 

SELECT NVL2(salary, 'has salary', 'no salary') AS salary_status
FROM employees;

 

예시문제

 

1. 직원 및 직함 목록을 반환하는 조회를 작성합니다. 직원에게 직함이 할당되지 않은 경우, "No title assigned"를 대신 반환합니다.

SELECT employee_name, NVL2(job_title, job_title, 'No title assigned') AS job_title
FROM employees;

 

2. 각 영업 사원의 수수료를 계산하는 쿼리를 작성합니다. 판매원이 판매를 하지 않은 경우 "수수료 없음"을 대신 반환합니다.

SELECT salesperson_name, NVL2(total_sales, total_sales * 0.1, 'No commission') AS commission
FROM salespeople;

 

SQLD 시험 전 공부해야 할 것2 : DROP, TRUNCATE, DELETE 차이점

 

 

시험에 자주 나오는 단골 질문 중 하나인 DROP, TRUNCATE, DELETE의 차이점 및 기능에 대해 알아보도록 하겠습니다!

 

SQL에서 DROP, TRUNCATE 및 DELETE 문의 주요 차이점은 다음과 같습니다

 

기능

DROP TRUNCATE DELETE
전체 테이블 또는 데이터베이스를 영구적으로 제거합니다. 테이블에서 모든 행을 제거하지만 테이블 구조는 유지합니다. 특정 조건에 따라 테이블에서 특정 행을 제거합니다.
테이블 정의 자체를 완전히 삭제 테이블을 최초 생성된 초기상태로 만듦 데이터만 삭제
DDL DDL(일부 DML 성격을 가짐) DML

 

DROP  예시

DROP TABLE employees; -- 인덱스, 트리거 및 제약 조건을 포함하여 전체 "인덱스" 테이블과 관련된 모든 개체를 삭제합니다.

TRUNCATE 예시

TRUNCATE TABLE orders; -- 테이블 구조와 관련 개체(예: 인덱스 및 트리거)를 유지하면서 "주문" 테이블에서 모든 행을 제거합니다.

DELETE 예시

DELETE FROM customers WHERE city = 'London';-- 도시가 런던인 "고객" 테이블에서 모든 행을 제거합니다.

 

속도

DROP TRUNCATE DELETE
테이블이나 데이터베이스를 삭제하기만 하면 되며 모든 관련 개체(예: 인덱스, 트리거, 제약 조건)도 삭제되므로 가장 빠릅니다. 테이블에서 모든 행을 제거하고 데이터 페이지의 할당을 해제하기만 하면 테이블 구조가 그대로 유지되므로 DELETE보다 빠릅니다. 연결된 개체는 삭제되지 않습니다. 한 번에 하나의 행을 삭제하고 각 삭제 작업을 기록하므로 속도가 가장 느립니다. 테이블 구조 및 관련 개체는 영향을 받지 않습니다.

 

복구여부

DROP TRUNCATE DELETE
실행을 취소할 수 없으며 데이터가 영구적으로 손실됩니다. 데이터베이스가 전체 복구 모드에 있는 경우 트랜잭션 로그를 사용하여 실행 취소할 수 있지만 단순 복구 모드에서는 실행 취소할 수 없습니다. 시스템에 장애가 발생하면 데이터가 영구적으로 손실됩니다. 트랜잭션 로그를 사용하여 각 삭제 작업을 기록하므로 취소할 수 있습니다. 커밋 작업 전에 시스템 오류가 발생하면 데이터를 복원할 수 있습니다.
ROLLBACK 불가능 ROLLBACK 불가능 COMMIT 이전 ROLLBACK 가능

 

여기서 COMMIT과 ROLLBACK이란

SQL에서 COMMIT 및 ROLBOLLBACK은 트랜잭션을 관리하는 데 사용됩니다. 트랜잭션은 단일 단위로 실행되는 하나 이상의 SQL 문으로 구성된 논리적 작업 단위입니다. 커밋 및 롤백을 사용하면 트랜잭션 내에서 수행된 데이터 변경의 내구성과 일관성을 제어할 수 있습니다.

COMMIT: 트랜잭션의 변경 내용을 데이터베이스에 저장하는 데 사용됩니다. COMMIT 문이 실행되면 변경 내용이 영구적으로 변경되어 실행 취소할 수 없습니다. COMMIT 문은 현재 트랜잭션을 종료하고 트랜잭션 내의 모든 변경 내용을 다른 트랜잭션에 표시합니다.

ROLBACK: 트랜잭션의 변경 내용을 실행 취소하고 데이터베이스를 이전 상태로 복원하는 데 사용됩니다. ROLBACK 문이 실행되면 트랜잭션 내의 모든 변경 내용이 삭제되고 데이터베이스가 이전 상태로 복원됩니다. ROLBACK 문은 현재 트랜잭션을 종료하고 데이터베이스를 트랜잭션이 시작되기 전의 이전 상태로 되돌립니다.

 

권한

DROP TRUNCATE DELETE
전체 테이블 또는 데이터베이스를 삭제할 수 있으므로 가장 높은 수준의 권한이 필요합니다. 테이블에 대한 다른 테이블 권한이 필요합니다. 테이블에 대한 삭제 권한이 필요합니다.

 

요약

DROP는 전체 테이블 또는 데이터베이스를 영구적으로 삭제하는 데 사용되고, TRUNCATE는 테이블 구조를 유지하면서 테이블에서 모든 행을 신속하게 제거하는 데 사용되며, DELETE는 특정 조건에 따라 테이블에서 특정 행을 선택적으로 제거하는 데 사용됩니다. 사용할 명령문의 선택은 속도, 데이터 보존 또는 작업 실행 취소 기능과 같은 당면한 작업의 특정 요구 사항에 따라 달라집니다.

 

SQLD 시험 전 꼭 공부해야 할 것 : 비교연산자

안녕하세요!

오늘은 SQLD 시험에서 빠지지 않고 나오는 비교연산자에 대해서 알아보려고 해요.

 

비교연산자는 크게 기호, BETWEEND AND 구문, LIKE, IS NULL, IN이 있어요.

 

그럼 하나씩 살펴볼까요.

 

 

SQL에서 비교 연산자는 두 값 또는 식을 비교하고 비교 결과에 따라 부울 값(TRUE 또는 FALSE)을 반환하는 데 사용됩니다. 비교 연산자에는 다음이 포함됩니다:

 

비교연산자 기호

"=" (동일): 양쪽의 값 또는 식이 같으면 true를 반환합니다.

"<>" 또는 "!="(동등하지 않음): 양쪽의 값 또는 식이 동일하지 않으면 true를 반환합니다.

">"(보다 큼): 왼쪽에 있는 값이나 식이 오른쪽에 있는 값이나 식보다 크면 true를 반환합니다.

">="(보다 크거나 같음): 왼쪽에 있는 값이나 식을 오른쪽에 있는 값이나 식보다 크거나 같으면 true를 반환합니다.

"<" (보다 작음): 왼쪽에 있는 값 또는 식을 오른쪽에 있는 값 또는 식보다 작으면 true를 반환합니다.

"<="(보다 작거나 같음): 왼쪽의 값 또는 식이 오른쪽의 값 또는 식보다 작거나 같으면 true를 반환합니다.

이러한 비교 연산자는 일반적으로 WHERE 절과 같은 SQL 문에서 특정 기준에 따라 데이터베이스에서 데이터를 필터링하고 검색하는 데 사용됩니다.

 

BETWEEN AND 구문

 

SQL에서 BETWEEN 연산자는 값 범위 내의 값을 선택하는 데 사용됩니다. 값 범위를 기준으로 레코드를 필터링하기 위해 SELECT, UPDATE 또는 DELETE 문의 WHERE 절에서 자주 사용됩니다.

 

회사의 판매 데이터가 들어 있는 "판매"라는 테이블이 있다고 가정해 보겠습니다. 표에는 각 판매 금액이 들어 있는 "sales_mount"라는 열이 있습니다. 우리는 sales_금액이 $1000에서 $5000 사이인 모든 sales 데이터를 검색하고 싶습니다.

BETWE 연산자를 사용하여 이 데이터를 검색하는 SQL 쿼리는 다음과 같습니다:

 

SELECT *
FROM sales
WHERE sales_amount BETWEEN 1000 AND 5000;

 

LIKE 구문

SQL의 LIKE 연산자는 문자열의 패턴 매칭에 사용됩니다. 표의 열에서 지정된 패턴을 검색하기 위해 SELECT 문의 WHERE 절에서 자주 사용됩니다.


여기서 패턴은 문자, 와일드카드 문자 및 이스케이프 문자의 임의 조합을 포함할 수 있습니다. LIKE에서 가장 일반적으로 사용되는 와일드카드 문자는 다음과 같습니다:

'%' (백분율 기호): 0개 이상의 문자를 의미합니다
'_'(밑줄): 1개의 문자를 의미합니다


예를 들어, "직원"이라는 테이블에 열 "이름"과 "위치"가 있다고 가정해 보겠습니다. 우리는 "관리자"라는 단어가 포함된 직위의 모든 직원을 불러오기를 원합니다. LIKE 연산자는 다음과 같이 사용할 수 있습니다:

 

SELECT *
FROM employees
WHERE position LIKE '%관리자%';

 

LIKE를 공부했으면 ESCAPE구문이 빠질 수 없죠!

 

SQL에서 'ESCAPE'는 LIKE 연산자와 함께 사용하여 이스케이프 문자를 지정하는 키워드입니다. 이스케이프 문자는 일반적으로 리터럴로 취급되는 특수 문자 또는 와일드카드를 이스케이프하는 데 사용되는 문자입니다.

 

예를 들어, "직원"이라는 테이블에 "이름"이라는 열이 있다고 가정해 보겠습니다. 이름에 "%manager%" 문자열이 포함된 모든 직원을 검색하지만 '%' 문자는 와일드카드가 아닌 리터럴 문자로 처리합니다. 'ESCAPE' 키워드를 사용하여 백슬래시() 문자를 이스케이프 문자로 사용하도록 지정할 수 있습니다:

 

SELECT *
FROM employees
WHERE name LIKE '%\%manager\%%' ESCAPE '\';

이 문은 "직원" 테이블에서 "이름" 열에 "%manager%" 문자열이 포함된 모든 레코드를 검색합니다. 여기서 '%' 문자는 와일드카드가 아닌 리터럴 문자로 처리됩니다.

'ESCAPE' 키워드는 선택 사항이며 'pattern' 문자열의 특수 문자 또는 와일드카드를 이스케이프하려는 경우에만 필요합니다. 문자를 이스케이프할 필요가 없다면 LIKE 연산자에서 'ESCAPE' 키워드를 생략할 수 있습니다.

 

 

IS NULL 구문

 

SQL에서 'IS NULL'은 열에 Null 값이 포함되어 있는지 확인하는 데 사용되는 비교 연산자입니다. null 값은 열의 결측값 또는 알 수 없는 값을 나타냅니다.

 

예를 들어, "orders"라는 테이블에 "orders_id" 열과 "customer_id" 열이 있다고 가정해 보겠습니다. 고객이 아직 주문을 하지 않은 경우 "주문" 표의 "customer_id" 열에 null 값이 포함됩니다. 'IS NULL' 연산자를 사용하여 이러한 모든 레코드를 검색할 수 있습니다:

 

SELECT *
FROM orders
WHERE customer_id IS NULL;

 

'IS NULL' 연산자는 다른 유형의 결측 데이터나 빈 값이 아닌(0과 다릅니다!) null 값을 확인하는 데만 사용할 수 있습니다. 결측값 또는 빈 값을 확인하기 위해 'IS NOT NULL', '!=' 또는 '<>'과 같은 다른 연산자를 대신 사용할 수 있습니다.

 

IN 구문

 

SQL에서는 'IN' 연산자는 값이 지정된 값 목록의 값과 일치하는지 확인하는 데 사용됩니다. SELECT 문의 WHERE 절에서 특정 열 값이 값 목록에 있는지 여부를 기준으로 레코드를 필터링하는 데 사용할 수 있습니다.

 

예를 들어, "customers"라는 테이블에 열 "customers_id", "first_name" 및 "last_name"이 있다고 가정해 보겠습니다. customer_id가 1, 3 또는 5인 모든 레코드를 검색하려고 합니다. '를 사용할 수 있습니다IN' 연산자는 다음과 같습니다

 

SELECT *
FROM customers
WHERE customer_id IN (1, 3, 5);

이 문은 "customers" 테이블에서 "customers_id" 열에 1, 3 또는 5 값이 포함된 모든 레코드를 검색합니다.

 

 

오라클 SQL 설치하기 따라하면 어렵지 않아요

 

오늘은 오라클 SQL 설치를 해보려고 합니다ㅎㅎ

사실 오라클 SQL 잘 못 설치하면 노트북을 다시 갈아야 할 수도 있을 만큼 조금 번거로운 작업이 될 수도 있어서

신중하게 진행해야 하는데요

오늘 다운로드 받을 오라클 xe버전은 설치 파일 중에 가장 가벼운 프로그램으로 머신러닝까지 구현 가능합니다

 

1. 우선 오라클 다운로드 받는 사이트로 접속합니다

컴퓨터 사양에 맞는 패키지로 다운로드를 받습니다

https://www.oracle.com/database/technologies/xe-downloads.html

 

Oracle Database Express Edition (XE) Downloads

Support Oracle Database Express Edition (XE) is a community supported edition of the Oracle Database family. Please go to the Oracle Database XE Community Support Forum for help, feedback, and enhancement requests. Note: Oracle Support Services only provid

www.oracle.com

 

다운로드를 받고 압축을 푼 경로로 가서 SETUP 파일을 찾으세요!

 

 

2.  setup 파일 마우스 우클릭해서 관리자 권한으로 실행합니다

 

다운로드 받을 때 주의할 점

1. 설치 파일의 폴더명이 한글이 포함되면 안 됨 ex)오라클sql(x)

2. 중간에 비밀번호는 영문으로 시작, 특수문자와 대소문자를 포함

 

그럼 이제 최상위 계정에 접속해 볼까요?

 

sys는 database에서 가장 권한이 막강한 유저이므로 이 계정에서는 주로 데이터 베이스 관리 작업을 하는데요

그러니 이 계정으로 데이터분석을 하면 안 되겠죠

 

최상위로 접속하는 방법

관리자권한으로 명령 프롬프트 실행 > sqlplus '"/ as sysdba" 입

 

show user 를 입력하면 현재 사용하고 있는 유저가 무엇인지 알 수 있습니다

 

그럼 일반 유저 계정은 어떻게 설정할까요?

create user c##scott

identified by tiger;

 

먼저 일반 유저 계정의 아이디를 설정해주고 

비밀번호를 설정합니다

 

c##scott : 유저 이름(해킹 위험방지를 위해 특수문자를 꼭 붙여주어야합니다! )

tiger : 비밀번호

 

 

2. dba에 대한 권한을 부여

dba 권한이란 database에 있는 모든 데이터를 다 볼 수 있고 조작할 수 있는 권한을 말합니다

 

그럼 이 막대한 권한을 scott에게 한번 줘 볼까요

SQLD 시험 공부하다 보면 나오는 내용이기도 하는데요

 

grant dba to c##scott;

 

 

그럼 중요한 업무는 다 끝이 났어요!

 

만약 컴퓨터를 끄고 다시 접속하려면 어떻게 할까요?

 

 

다시 시작하는 방법

시작창에서 cmd 검색 > sqlplus c$$scott/tiger > 요거 검색하기!

 

어려운 작업은 이제 끝이 났네요 

이제 데이터를 입력해 원하는 작업을 하면 됩니다

 

 

도움이 되었기를 바라며 오늘도 화이팅 하세요!

 

SQLD 시험 합격 후기 이거 모르면 안되겠네

 

 

 

 

안녕하세요!

늦었지만 SQLD 시험 합격 후기를 써봅니다ㅎㅎ

 

전에 SQLD 관련해서 짧게 포스팅을 한 적이 있는데 

요약하자면

"안전하게 합격하려면 노랭이 3회독은 필수"

였습니다

 

비전공자로 한 9일정도 빡세게 공부했더니 합격할 수 있었는데요!

 

 

1. 노랭이 공부하기(답지부터 보기)

 

첫 SQLD 시험이다 보니 걱정을 많이 했는데 다행히도 난이도가 그리 높지 않았었습니다

그리고 개인적으로 어려웠던 최적화 관련해서 문제가 나오지 않아 수월하게 풀 수 있었던 것 같아요

 

저는 비전공자이고 SQLD 공부하는데 9일~10일 정도 

평일에 2~3시간 정도 활용하였습니다

 

주말에는 4~5시간 정도 공부했던 것 같아요

 

공부하면서 사용한 몇가지 치트기가 있는데요!

 

1. 무조건 답지부터 보기

사실 이론까지 빠삭하게 공부하는게 베스트지만 

한정된 시간안에 합격이 목표였기 때문에 답지를 먼저 보며 공부를 하였는데요

 

뇌는 새로운것에 대해 거부감이 있어서 최대한 너 이거 알잖아~ 식으로 반복적으로 보여주어야 

기억에 오래 남게 한다고 해요

 

그래서 해설답안을 빠르게 3번정도 탐독한 다음 아~이런식으로 문제가 나오는 구나라고 뇌에게 알려주었습니다

 

그 다음 교재와 답안지를 보면서 2번정도 빠르게 맞춰 보았어요

 

이 작업이 넉넉잡아 3일 정도 걸렸습니다

 

2. 유튜브 강의 듣기

 

어느 정도 시험이 어떻게 나오겠구나 감이 잡힌 시점에 

본격적으로 문제를 풀어보기 시작했는데요

 

SQLD여도 이해하기 어려운게 많아

유튜브 선생님들의 힘을 빌렸습니다

 

저는 크게 2명의 선생님의 영상들로 공부했는데요

 

 

 

1. 전광철 OCP

사실 이분이 제 합격의 공의 50% 지분을 차지한다고 생각합니다ㅎㅎ

그 만큼 도움을 많이 받았는데요

 

특히 저는 SQL 활용에서 서브쿼리나 셀프조인 등이 어려웠는데요

 

선생님께서 하나하나 설명을 상세하게 해주셔서 이해하기 쉬웠습니다

 

노랭이 해설해주는 다른 유튜버분들도 계시는 걸로 알고 있는데 듣지 않아서 

뭐라 코멘트를 남기기가 어렵네요ㅎㅎ

 

무튼 한번 들어보시는거 추천드려요!

 

 

2. SQL전문가 정미나

 

SQL 튜너 및 강사로 활동하고 계시는 선생님이신데요!

조곤조곤하고 깔끔하게 설명해주셔서 이해하기 너무 좋았어요ㅎㅎ

사실 이분 영상은 시험 이틀 정도 앞두고 스피드 퀴즈만 빠르게 들었었는데요

 

시험 바로 전에 이론 정리 겸 스피드 퀴즈 영상 듣는 거 추천드려요

영상도 3분 내외라 부담없이 들으실 수 있답니다

 

 

 

3. 출제가의 입장에서 공부하기

 

공부하면서 가장 도움이 되었던 마인드 셋은 바로 제가 문제 출제자라면 어떤 문제를 낼까

였습니다

 

노랭이 3회독을 해 보시면 대략 어떤 문제들이 중요하구나라는 것을 느끼실 거에요

 

인터넷에 도는 정말 어려운 문제들은 사실 실제 문제로 나오는 경우 드물었습니다

 

무엇보다 기본은 충실하되 문제 패턴이 어떻게 되는지 파악하려고 노력했습니다

 

주로 특징 비교 문제가 많이 나오더라구요

차이점을 중점으로 맞는지 틀린지 나오는 문제들이 많기에 이 부분도 염두해주시면 좋을 것 같아요!

 

 

 

 

별거 아니지만 공부하시는데 도움이 되기를 바랍니다

 

오늘도 즐거운 하루 보내세요!

 

감사합니다:)

 

 

 

데이터분석에서 A/B테스트란

 

상관관계 배울 때 인과관계를 배웠습니다

 

확률적 의사결정으로서 간접적으로 인과관계를 알 수 있는 테스트인데

 

A/B TEST 

비교를 하고 싶은 특정 이벤트를 제외하고 나머지 요소는 동일하게 테스트하는 것입니다

 

예시로 한 패션 이커머스에서 푸쉬앱을 보낼 때 상단에 귀여운 일러스트가 있을 때와 없을 때의 고객 수신율 차이를 알고 싶어합니다

 

이 때 이미지 여부만 다르게 하고 나머지 디자인이나 글들은 동일하게 한 다음 각각 A와 B 그룹으로 나눠 테스트를 합니다

 

A/B TEST는 비지니스뿐만 아니라 선거, 사회적 문제, 일상생활에서도 사용하는데요

 

문제에 대한 의사결정을 할 때 통계적 확률과 데이터 근거를 통해 의사결정을 내립니다

 

데이터분석가뿐만 아니라 누구나 할 수 있으며 정답을 모르는 상황에서 더 나은 후보/보기를 선택하는 방법입니다

 

A/B TEST가 활용된 예시를 더 알아볼까요?

 

어떤 콘텐츠가 기부를 증가시킬까?

 

 

 

 어떤 버튼이 더 많은 클릭률을 모을까

 

 

 

+ Recent posts