SQL_WHERE, ROWNUM, ROWID, 단일행 함수 모음

김수경·2024년 1월 9일

SQLD 자격증

목록 보기
8/14

알고 있는 함수 제외
생소하고 헷갈리는 함수 위주로 복습!

WHERE

WHERE(SELECT/UPDATE/DELETE)

CREATE TABLE OLYMPIC (
	olympic_id  NUMBER    NOT NULL,
	host_city  CHAR(15) NOT NULL,
	host_year  INT  NOT NULL,
	CONSTRAINT OLYMPIC_PK PRIMARY KEY (olympic_id)
);

위 테이블을 참고하여 다음을 SQL문을 작성해보세요.
1. 올림픽 테이블에서 host_city 가 '서울' 인 데이터의 모든 정보를 조회해보세요.
2. host_city가 '평양' 데이터를 찾아 '평창'으로 수정해보세요.
3. host_year 정보가 2019인 데이터를 찾아서 삭제해보세요.

--1. 
SELECT * FROM OLYMPIC WHERE host_city = '서울';
--2.
UPDATE OLYMPIC SET HOST_CITY ='평창' WHERE host_city = '평양';
--3.
DELETE FROM OLYMPIC WHERE host_year = 2019;

비교연산자

BETWEEN, IN, LIKE, 비교연산

CREATE TABLE OLYMPIC (
	olympic_id  NUMBER    NOT NULL,
	host_city  CHAR(15) NOT NULL,
	host_year  NUMBER  NOT NULL,
  nation CHAR(10) NOT NULL,
	history CHAR(10),
	CONSTRAINT OLYMPIC_PK PRIMARY KEY (olympic_id)
);

위 테이블을 참고하여 다음을 SQL문을 작성해보세요.

  1. 1980 ~ 2010 사이에 개최된 올림픽 정보를 조회해보세요.
  2. 아테나, 로마, 파리, 런던에서 개최한 올림픽들의 정보를 조회해보세요.
  3. host_city가 '국' 으로 끝나는 국가가 개최한 올림픽 정보를 조회해보세요.
  4. 1896년 이후에 개최된 올림픽의 history를 근대 올림픽으로 수정해보세요.
  5. 1889년 이전에 개최된 올림픽의 데이터를 삭제해보세요.
--1. 
SELECT * FROM OLYMPIC WHERE HOST_YEAR BETWEEN 1980 AND 2010;
--2. 
SELECT * FROM OLYMPIC WHERE HOST_CITY IN('아테나','로마','파리','런던');
--3.
SELECT * FROM OLYMPIC WHERE HOST_CITY LIKE '%국';
--4. 
UPDATE OLYMPIC SET HISTORY = '근대 올림픽' WHERE HOST_YEAR >= 1896;
--5. 
DELETE FROM OLYMPIC WHERE HOST_YEAR < 1889;

논리연산자

AND, OR, NOT

CREATE TABLE OLYMPIC (
	olympic_id  NUMBER    NOT NULL,
	host_city  CHAR(15) NOT NULL,
	host_year  NUMBER  NOT NULL,
  nation CHAR(10) NOT NULL,
  season CHAR(6) NOT NULL,
	history CHAR(10),
	CONSTRAINT OLYMPIC_PK PRIMARY KEY (olympic_id)
);

위 테이블을 참고하여 다음을 SQL문을 작성해보세요.
1. 2001년 이후에 열린 season이 'winter'인 olympic 을 조회해보세요.
2. nation 이 '국'으로 끝나거나 1980~2000 에 개최한 올림픽의 정보를 조회해보세요.
3. nation 에 '아' 가 들어가고 1990 년 이후에 개최된 올림픽의 정보를 조회해보세요.

--1. 
SELECT * FROM OLYMPIC WHERE HOST_YEAR >= 2001 AND SEASON = 'winter' ;
--2. 
SELECT * FROM OLYMPIC WHERE NATION LIKE '%국' OR HOST_YEAR BETWEEN 1980 AND 2000 ; 
--3. 
SELECT * FROM OLYMPIC WHERE NATION LIKE '%아%' AND HOST_YEAR >=1990 ; 

부정연산

CREATE TABLE OLYMPIC (
	olympic_id  NUMBER    NOT NULL,
	host_city  CHAR(15) NOT NULL,
	host_year  NUMBER  NOT NULL,
  nation CHAR(10) NOT NULL,
  season CHAR(6) NOT NULL,
	history CHAR(10),
	CONSTRAINT OLYMPIC_PK PRIMARY KEY (olympic_id)
);

위 테이블을 참고하여 다음을 SQL문으로 작성해 보세요.
1. season이 winter가 아닌 올림픽의 정보를 조회해 보세요.
2. nation이 미국, 브라질, 독일, 중국 제외하고 모든 올림픽 정보를 조회해 보세요.
3. history가 비어있지 않은 올림픽 정보만 조회해 보세요.
4. nation에 '아' 가 들어가 있지 않은 올림픽 정보를 조회해 보세요.

--1. 
SELECT * FROM OLYMPIC WHERE SEASON <> 'winter' ;
--2. 
SELECT * FROM OLYMPIC WHERE NATION NOT IN ('미국','브라질','독일','중국') ; 
--3.
SELECT * FROM OLYMPIC WHERE HISTORY IS NOT NULL ; 
--4. 
SELECT * FROM OLYMPIC WHERE NATION NOT LIKE '%아%' ; 

ROWNUM, ROWID

ROWNUM = LIMIT

-- Employees 테이블 생성
CREATE TABLE Employees (
    EmployeeID NUMBER PRIMARY KEY,
    FirstName VARCHAR2(50),
    LastName VARCHAR2(50),
    Department VARCHAR2(50)
);
-- 데이터 삽입
INSERT INTO Employees (EmployeeID, FirstName, LastName, Department)
VALUES (1, 'John', 'Doe', 'HR');
INSERT INTO Employees (EmployeeID, FirstName, LastName, Department)
VALUES (2, 'Jane', 'Smith', 'IT');
INSERT INTO Employees (EmployeeID, FirstName, LastName, Department)
VALUES (3, 'Michael', 'Johnson', 'Finance');
INSERT INTO Employees (EmployeeID, FirstName, LastName, Department)
VALUES (4, 'Emily', 'Williams', 'IT');
INSERT INTO Employees (EmployeeID, FirstName, LastName, Department)
VALUES (5, 'William', 'Brown', 'Finance');

두명의 사원만 조회해 보세요.

SELECT *
FROM EMPLOYEES
WHERE ROWNUM <= 2 ;

TOP

  • PERCENT : 쿼리 결과 집합에서 몇 %를 반환할 지
  • WITH TIES : 정해진 개수만큼 출력 되었는데, 마지막 행과 같은 값이 추가로 존재하는 경우 행이 출력되도록 지정할 수 있음(ORDER BY가 있어야만 사용 가능)

    olympic 테이블에서 5개의 host_city 정보를 출력하려고 하는데 6번째 데이터도 조건을 만족해서 같이 출력을 하고 싶다면 다음 쿼리문의 빈칸에 알맞은 구문을 작성하시오.

SELECT TOP(5) WITH TIES HOST_CITY 
FROM OLYMPIC
ORDER BY NATION 

ROWID

ROWID는 주어진 테이블에 가장 빠른 엑세스 방법을 제공하고, 단일 ROW에 접근하는 가장 빠른 수단이다.

문자형 함수

LOWER, UPPER, CONCAT

'Completed!' 는 LOWER함수를 이용하고 'sqld'는 UPPER 함수를 이용하여 최종 결과가 'SQLD complelted! 가 되도록 두 문자열을 CONCAT 함수를 이용하여 하나로 만들어 출력해보세요. (DUAL 테이블 이용하세요.)

SELECT CANCAT(LOWER('Completed!', UPPER('sqld')
FROM DUAL; 

ASCII(문자)

'SQLD' 문자열의 ASCII 코드의 합은 얼마인지 확인해보세요.
(DUAL 테이블 이용하세요.)

SELECT ASCII('S') + ASCII('Q') + ASCII('L') + ASCII('D')
FROM DUAL ; 
--> 308

ASCII(숫자)

아래의 문장에서 숫자를 온전히 문자로 나타내 보세요.
문장 : 여러분 70, 105, 71, 104, 84, 105, 78, 103 !

SELECT 
    CHR(70) ||
    CHR(105) ||
    CHR(71) ||
    CHR(104) ||
    CHR(84) ||
    CHR(105) ||
    CHR(78) ||
    CHR(103) ||
    '!'
FROM DUAL;
-- FiGhTiNg !

SUBSRING

다음 문장에서 'language'라는 문자열만 선택하여 출력해보세요.
'SQL is a standard language for accessing and manipulating databases.'
(DUAL 테이블 이용하세요.)

SELCT substing('SQL is a standard language for accessing and manipulating databases.', 19, 8) 
FROM DUAL ;

LENGTH

다음 문자열의 길이를 구해보세요.
'SQL is a standard language for accessing and manipulating databases.'
(DUAL 테이블 이용하세요.)

SELECT length('SQL is a standard language for accessing and manipulating databases.') 
FROM dual ; 

LTRIM, RTRIM(문자열[,지정문자])

문자열 첫번째 문자부터 확인해서 지정문자가 나타나면 해당 문자를 문자열에서 제거함. SQL Server 에서는 LTRIM 함수의 지정문자를 정할 수 없고 오직 공백 제거만 가능합니다.

-- oracle
SELECT LTRIM('xxxYYZZxYZ', 'x') FROM dual ; 
--> 'YYYZZxYZ'
-- SQL Server
SELECT LTRIM('xxxYYZZxYZ', 'x');
--> Error 발생, SQL Server에서는 공백만 제거 가능
SELECT LTRIM('   YYZZxzYZ');
--> 'YYZZxYZ'

TRIM

-- Oracle
-- 양쪽 제거
SELECT TRIM('x' FROM 'xxYYZZxYZxx') FROM DUAL;
--> 'YYZZxYZ'
-- 왼쪽 제거 (LTRIM)
SELECT TRIM(leading'x' FROM 'xxYYZZxYZxx') FROM DUAL;
--> YYZZxYZxx
-- 오른쪽 제거 (RTRIM)
SELECT TRIM(trailing 'x' FROM 'xxYYZZxYZxx') FROM DUAL;
--> xxYYZZxYZ
-- SQL Server
SELECT TRIM('x' FROM 'xxYYZZxYZxx');
--> YYZZxYZ
SELECT TRIM(leading 'x' FROM 'xxYYZZxYZxx');
--> Error 발생, SQL Server는 leading 설정을 불가

LPAD(문자열1, n [,문자열2]) / RPAD(문자열1,n [,문자열2])

  • LPAD : 문자열1을 n자리만큼 늘리고, 왼쪽 빈 공간을 문자열 2로 채워서 리턴
  • RPAD : 문자열1을 n자리만큼 늘리고, 오른쪽 빈 공간을 문자열 2로 채워서 리턴
-- Oracle
SELECT LPAD('ABC',8,'Z') FROM dual;
--> ZZZZZABC
SELECT RPAD('ABC',8) FROM dual;
--> ABC(공백 5칸)
#다음 문자열을 8자리만큼만 늘리고, 오른쪽 빈 공간을 15로 채워서 리턴
'SQL'
SELECT RPAD('SQL', 8, 15) FROM DUAL;

숫자형 함수

ABS(절대값)

--oracle
SELECT ABS(-15) FROM DUAL ; 
--> 15
--SQL
SELECT ABS(-15) ; 
--> 15

SIGN(숫자)

숫자가 양수면 1, 0이면 0 음수면 -1을 리턴함

-- Oracle 
SELECT SIGN(20) FROM DUAL;
--> 1
SELECT SIGN(0) FROM DUAL;
--> 0
SELECT SIGN(-10) FROM DUAL;
--> -1
-- SQL Server
SELECT SIGN(20);
--> 1
SELECT SIGN(0);
--> 0
SELECT SIGN(-10);
--> -1

MOD(숫자 1, 숫자 2)

숫자1을 숫자2로 나누어 나머지 값을 계산 %로 대체 가능함

-- Oracle
SELECT MOD(7, 3) FROM DUAL;
--> 1
-- SQL Server
SELECT MOD(7, 3);
--> 1

Oracle : CEIL(숫자) / SQL Server : CEILING(숫자)

숫자보다 크거나 같은 최소 정수를 리턴합니다. 소수를 정수로 올림 연산할 때 사용합니다.

  • 예시
    -- Oracle
    SELECT CEIL(38.567) FROM DUAL;
    --> 39
    SELECT CEIL(-38.567) FROM DUAL;
    --> -38
    -- SQL Server
    SELECT CEILING(38.567);
    --> 39
    SELECT CEILING(-38.567);
    --> -38

FLOOR(숫자)

숫자보다 작거나 같은 최대 정수를 리턴합니다. 소수를 정수로 내림 연산할 때 사용합니다.

-- Oracle
SELECT FLOOR(38.567) FROM DUAL;
--> 38
SELECT FLOOR(-38.567) FROM DUAL;
--> -39
-- SQL Server
SELECT FLOOR(38.567);
--> 38
SELECT FLOOR(-38.567);
--> -39

ROUND(숫자 [, m])

숫자를 소수점 m자리에서 반올림하여 리턴합니다. m이 생략되면 default 값은 0 입니다.

   -- Oracle
   SELECT ROUND(38.567, 2) FROM DUAL;
   --> 38.57
   SELECT ROUND(38.567) FROM DUAL;
   --> 39
   --SQL Server
   SELECT ROUND(38.567, 2);
   --> 38.57
   SELECT ROUND(38.567);
   --> 39

TRUNC(숫자 [, m])

숫자를 소수 m자리에서 잘라서 버린 값을 리턴합니다. m이 생략되면 default 값은 0입니다. SQL Server는 TRUNC 함수가 제공되지 않습니다.

-- Oracle
SELECT TRUNC(38.567, 2) FROM DUAL;
--> 38.56
SELECT TRUNC(38.567) FROM DUAL;
--> 38

SIN, COS, TAN(숫자)

숫자의 삼각함수 연산을 하여 결과를 리턴합니다. 숫자는 라디안을 의미합니다.

-- Oracle
SELECT SIN(1.5708) FROM DUAL;
--> 0.99999
```sql
-- SQL Server
SELECT SIN(1.5708);
--> 0.99999

EXP, POWER, SQRT, LOG, LN

숫자의 지수, 거듭 제곱, 제곱근, 로그, 자연 로그의 값을 리턴합니다.

  • EXP(n) : e의 n제곱을 반환합니다.
  • POWER(m, n) : m의 n제곱을 반환합니다.
  • SQRT(n) : n의 제곱근을 반환합니다. n은 음수가 될 수 없습니다.
  • LOG(m, n) : 밑을 m으로 한 n의 로그 값을 반환합니다. m은 0 또는 1이외의 정수이며 n은 양수 값으로 설정해야 합니다.
  • LN(n) : n의 자연 로그 값을 반환합니다.
-- Oracle
SELECT EXP(2) FROM DUAL;
--> 7.389056
SELECT POWER(2, 3) FROM DUAL;
--> 8
SELECT SQRT(4) FROM DUAL;
--> 2
SELECT LOG(10,100) FROM DUAL;
--> 2
SELECT LN(10) FROM DUAL;
--> 2.302585
-- SQL Server
SELECT EXP(2);
--> 7.389056
SELECT POWER(2, 3);
--> 8
SELECT SQRT(4);
--> 2
SELECT LOG(10,100);
--> 2
SELECT LN(10);
--> 2.302585

날짜형 함수

Oracle : SYSDATE / SQL Server : GETDATE()

현재 날짜와 시간을 출력합니다.

 -- Oracle    
 SELECT SYSDATE FROM DUAL;
-- SQL Serve  
SELECT GETDATE();

Oracle : EXTRACT(시간날짜단위 FROM 시간날짜) / SQL Server : DATEPART(시간날짜단위, 시간날짜)

날짜 데이터에서 년/월/일 데이터를 출력합니다. 시간/분/초도 가능합니다.

-- Oracle
SELECT EXTRACT(YEAR FROM DATE '2023-10-10') FROM DUAL;
--> 2023
-- SQL Server
SELECT DATEPART(month, '2021/10/10');
--> 10

Oracle : TOㅡNUMBER(TOCHAR(날짜정보, 데이트포멧)) / SQL Server : YEAR(날짜정보), MONTH(날짜정보), DAY(날짜정보)

날짜 데이터에서 년/월/일 데이터를 출력합니다. Oracle의 EXTRACT 옵션이나 SQL Server의 DATEPART 옵션과 같은 기능을 합니다. TO_NUMBER 함수 제외 시 문자형으로 출력됩니다.

-- Oracle
SELECT TO_CHAR(hire_date,'YYYY') FROM emp;
-- SQL Server
SELECT YEAR(hire_date) FROM emp;

변환형 함수

명시적 데이터 유형 변환

💡 !참고. 벤더별 단일행 함수의 종류
Oracle

  • TO_NUMBER(문자열)
    alphanumeric 문자열을 숫자로 변환
  • TO_CHAR(숫자|날짜 [, FORMAT])
    숫자나 날짜를 주어진 FORMAT 형태의 문자열 형식으로 변환
  • TO_DATE(문자열 [, FORMAT])
    문자열을 주어진 FORMAT 형태로 날짜 형식으로 변환
    SQL Server
  • CAST (expression AS data type [(length)])
    expression을 목표 데이터 유형으로 변환
  • CONVERT (data_type [(length)], expression [,style])
    expression을 목표 데이터 유형으로 변환
-- Oracle
SELECT TO_CHAR(SYSDATE, 'YYYY. MON, DAY') FROM DUAL;
SELECT TO_NUMBER('888') + TO_NUMBER('111') FROM dual;
--> 999
-- SQL Server
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) AS CURRNETDATE;

암시적 데이터 유형 변환

암시적인 데이터 유형 변환은 '2' + 1 연산을 하려고 할 때 데이터베이스는 서로 다른 두 타입을 계산하기 쉽게 자동으로 데이터 유형을 변환하여 계산을 하는 경우를 말합니다. 사용자는 모르지만 데이터가 스스로 타입을 변경하기 때문에 편하지만 성능 저하가 발생할 수 있습니다. 또한, 자동적으로 데이터베이스가 알아서 계산하지 않는 경우와 같은 문제가 발생할 수 있습니다.

-- Oracle 
SELECT '2' + 1 FROM DUAL;
--> 3
-- SQL Server
SELECT '4' * 2;

NULL 관련 함수

NULL의 특징

NULL은 정의되지 않은 값을 의미한다.
숫자 0이나 빈공백과는 다른 값이다.
어떠한 값과 NULL의 연산은 무조건 NULL이 나온다.

Oracle : NVL / SQL Server : ISNULL 함수

결괏값을 NULL이 아닌 다른 값을 얻고자 할 때 Oracle은 NVL, SQL Server는 ISNULL 함수를 사용합니다. NULL 관련 함수 중 가장 많이 사용되므로 반드시 사용방법에 대해 알아두어야 합니다.

  • 기본 구조
-- Oracle
NVL(NULL_판단_대상, NULL일_때_대체값)
-- SQL Server
ISNULL(NULL_판단_대상, NULL일_때_대체값)
  • 예시
-- Oracle 
SELECT NVL(NULL, 'NVL-OK') FROM DUAL;
--> NVL-OK
-- SQL Server
SELECT ISNULL(NULL, 'IS-NULL-OK');
--> IS-NULL-OK
  • 실습
    다음 데이터에서 NULL이 허용된 칼럼 중 NULL이 존재한다면 문자형 칼럼인 경우 '알 수 없음'을 숫자형 칼럼인 경우는 999를 출력하여 전체 데이터의 칼럼을 조회해보세요.
CREATE TABLE pokemon (
  pm_id NUMBER PRIMARY KEY NOT NULL,
  name VARCHAR2(20) NOT NULL,
  attr VARCHAR2(20),
  weight NUMBER
);
INSERT INTO pokemon VALUES (1, 'Bulbasaur', 'Grass', 30);
INSERT INTO pokemon VALUES (4, 'Charmander', 'Fire', 80);
INSERT INTO pokemon VALUES (25, 'Pikachu', 'Electric', 15);
INSERT INTO pokemon (pm_id, name) VALUES (54, 'Psyduck');
INSERT INTO pokemon (pm_id, name, attr) VALUES (76, 'Golem', 'Rock');
--oracle
SELECT pm_id,
name,
NVL(attr, '알 수 없음'),
NVL(weight, 999)
FROM pokemon ; 
--SQL
SELECT pm_id,
name,
ISNULL(attr, '알 수 없음'),
ISNULL(weight, 999)
FROM pokemon ; 

NULL과 공집합

테이블에서 조건에 맞는 데이터가 한 건도 없는 경우를 공집합이라고 부릅니다. 이때 공집합은 NULL과 다릅니다. 일치되는 데이터가 없는 것이 공집합, 값 자체가 정의되지 않은 것이 NULL 입니다.
공집합의 경우 NVL 함수를 사용해도 공집합이 출력되므로, 그룹함수와 NVL 함수를 같이 사용해서 공집합을 처리해야 합니다.

  • 예시
-- NVL 만 사용했을 때
SELECT NVL(MGR, 9999) FROM EMP WHERE ENAME='JSC'; 
--> 9999가 나올것 같지만 결과는 데이터를 찾을 수 없음
실제로 많이 실수 하는 부분
​
-- 집계 함수와 같이 사용했을 때
SELECT NVL(SUM(MGR), 9999) MGR FROM EMP WHERE ENAME='JSC';
-- MAX(MGR)의 값은 선택된 값이 없기에 NULL이 출력되고
--  이를 NVL 함수에서 9999로 변환
SUM 같은 집계함수는 뒤에서 다시 살펴봅니다

NULLIF

NULLIF 함수는 특정 값을 NULL로 대체하는 경우에 유용하게 사용할 수 있습니다. NULLIF 함수는 두 조건 EXPR1과 EXPR2를 비교하고 같다면 NULL 을 리턴하고, 같지 않으면 첫 번째 EXPR1을 리턴을 합니다.

- 기본 구조
NULLIF (EXPR1, EXPR2)
  • 예시
-- mgr 이 7698 과 같다면 NULL을 출력
SELECT NULLIF(mgr, 7698) AS result1 FROM emp;
  • 실습
    다음 포켓몬 데이터 중에서 name과 attr 값을 조회해보세요. 단 attr 값이 'normal' 인 포켓몬의 조회 결과를 NULL로 출력해주세요.
CREATE TABLE pokemon (
  pm_id NUMBER PRIMARY KEY NOT NULL,
  name VARCHAR2(20) NOT NULL,
  attr VARCHAR2(20) DEFAULT 'normal',
	weight NUMBER
);
INSERT INTO pokemon VALUES (1, 'Bulbasaur', 'Grass', 30);
INSERT INTO pokemon VALUES (4, 'Charmander', 'Fire', 80);
INSERT INTO pokemon VALUES (25, 'Pikachu', 'Electric', 15);
INSERT INTO pokemon (pm_id, name) VALUES (54, 'Psyduck');
INSERT INTO pokemon (pm_id, name, attr) VALUES (76, 'Golem', 'Rock');
INSERT INTO pokemon (pm_id, name, weight) VALUES (86, 'Seel', 85);
SELECT name,
NULLIF(attr, 'normal') AS attr
FROM pokemon 

기타 NULL관련 함수(COALESCE)

COALESCE 함수는 여러 값 중에서 NULL이 아닌 첫 번째 값을 찾을 때 사용합니다. 만약에 모든 값들이 NULL이라면 NULL을 리턴합니다.
COALESCE → ‘합치다’ 라는 의미 ! 이게 왜 합치는걸까? 👀
테이블에 각각 email , uesr_mail 이라는 컬럼이 존재한다고 해보자. 컬럼명은 다르지만 사실 같은것을 의미한다고하자 (물론 이렇게 구성하면 안되지만, 실제 서비스에서는 상상하지 못한 일이 일어나곤한다) 특정 로직은 email 에 저장하고 다른 로직은 user_mail 에 저장하는 식이다. 자, 이럴때 내가 이메일을 조회한다면 email 한 번 보고, user_mail 한 번 보는 두번의 작업을 해야한다. 이럴때 COALESCE 를 사용하면 email 에 값이 있으면 해당 값을 리턴하고, 해당 컬럼의 값이 NULL 이면 user_mail 값을 리턴하니 마치 두개의 컬럼을 합쳐서 다루는 듯 하기때문에 이런 이름이 붙은 것 !

  • 기본 구조
COALESCE(EXPR1, EXPR2, EXPR3, ...)
  • 예시
-- emp 테이블에서 ename, comm, sal과 comm, sal 중에서 null이 아닌 값을 조회
SELECT ename, comm, sal, COALESCE(comm, sal) coal FROM emp;
  • 실습
    pm_id 가 30 이상인 포켓몬의 pm_id, name을 조회하는데, 이 때 추가로 attr, weight 중에서 NULL이 아닌 값을 같이 출력해주세요. 만약 attr, weight 둘 다 NULL인 경우 NULL을 그대로 출력해주세요.
SELECT pm_id,
name,
COALESCE(attr, weight)
WHERE pm_id >= 30 ; 

CASE 표현

SIMPLE_CASE_EXPRESSION

CASE 다음에 바로 조건에 사용되는 칼럼이나 표현식을 작성하고 바로 WHEN 절에 앞서 작성한 칼럼 혹은 표현식과 같은지 아닌지 판단하는 문장을 써 넣는 형태로 표현식이 같은지 여부를 확인합니다. EQUAL(=) 조건만 사용한다면 간단하게 사용할 수 있습니다.

-- 각 지역별 위치를 정하는 CASE 표현
SELECT loc,
	CASE loc 
		WHEN 'NEW YORK' THEN 'EAST' 
		WHEN 'BOSTON' THEN 'EAST' 
		WHEN 'CHICAGO' THEN 'CENTER' 
		WHEN 'DALLAS' THEN 'CENTER' 
		ELSE 'ETC' 
	END as 'AREA'
FROM dept;
SELECT employee_id, first_name, last_name,
    CASE
        WHEN salary >= 5000 THEN 'High Salary'
        WHEN salary >= 3000 THEN 'Medium Salary'
        ELSE 'Low Salary'
    END AS salary_category
FROM employees;

DECODE 함수

조건을 평가하여 값을 반환하는 함수로, 주로 간단한 조건과 대응하는 결과 값을 처리할 때 사용됩니다. DECODE 함수는 CASE 문과 유사한 역할을 수행하지만, 보다 간단한 형식으로 작성할 수 있습니다.
DECODE 함수의 첫 번째 인자로 표현식을 지정하고 표현식의 값이 기준값1 과 같다면 값1을 출력하고 기준값1과 다르다면 디폴트 값을 출력합니다. 여러 개의 기준값을 설정할 수 있으며 기본값을 설정하지 않으면 NULL 값이 반환됩니다.

  • 기본 구조
-- 기본 형태
SELECT DECODE(표현식, 기준값1,1 [, 기준값2,2, ..., default])
FROM 테이블명;
  • 실습
    DECODE 함수를 이용하여 이름과 속성별로 조회해보세요. 단, 속성은 한글로 분류해주세요.
    Grass⇒ '풀 속성'
    Fire⇒ '화염 속성'
    Electric ⇒ '전기 속성'
    어떤 부분도 포함되지 않는다면 '노말 속성' 으로 분류해주세요.
CREATE TABLE pokemon (
  pm_id NUMBER PRIMARY KEY NOT NULL,
  name VARCHAR2(20) NOT NULL,
  attr VARCHAR2(20) DEFAULT 'normal',
	weight NUMBER
);
INSERT INTO pokemon VALUES (1, 'Bulbasaur', 'Grass', 30);
INSERT INTO pokemon VALUES (2, 'Ivysaur', 'Grass', 50);
INSERT INTO pokemon VALUES (3, 'Venusaur', 'Grass', 150);
INSERT INTO pokemon VALUES (4, 'Charmander', 'Fire', 80);
INSERT INTO pokemon VALUES (5, 'Charmeleon', 'Fire', 200);
INSERT INTO pokemon VALUES (25, 'Pikachu', 'Electric', 15);
SELECT name,
	DECODE(attr, 'Grass', '풀 속성', 'Fire', '화염 속성', 'Electric', '전기 속성', '노말 속성')
FROM pokemon;
profile
잘 하고 있는겨?

0개의 댓글