본문 바로가기
oracle

oracle(문자열)_2024-06-24

by 앵보몬 2024. 6. 24.
728x90
반응형

문자열 타입

MySQL은 다양한 형태의 문자열 타입을 제공합니다.

1. CHAR와 VARCHAR

2. BINARY와 VARBINARY

3. BLOB과 TEXT

4. ENUM

5. SET

 

CHAR와 VARCHAR

CHAR와 VARCHAR는 둘다 문자열 데이터를 저장할 수 있는 타입입니다.

하지만 저장 방식과 추출 방식 그리고 최대 길이를 다루는 방식에서 차이점을 가집니다.

CHAR는 문자열을 길이가 한 번 설정되면 그대로 고정되는 고정 길이의 문자열로 다룹니다.

하지만 VARCHAR는 문자열을 길이가 고정되지 않는 가변 길이의 문자열로 다룹니다.

문법
CHAR(M)

VARCHAR(M)

M은 저장할 수 있는 문자열의 최대 길이를 나타냅니다.

이때 CHAR는 0부터 255까지 설정할 수 있으며, VARCHAR는 0부터 65,535까지 설정할 수 있습니다.

CHAR는 설정한 크기보다 작은 길이의 문자열이 입력되면, 나머지 공간을 공백으로 채워 길이를 M과 같게 만듭니다.

하지만 VARCHAR는 실제 입력된 문자열의 길이만큼만 저장하고 사용합니다.

예제
ALTER TABLE Reservation ADD Note CHAR(4);

INSERT INTO Reservation(Note) VALUES(' ');

INSERT INTO Reservation(Note) VALUES('ab');

INSERT INTO Reservation(Note) VALUES('abcd');

INSERT INTO Reservation(Note) VALUES('abcdefgh');



ALTER TABLE Reservation MODIFY COLUMN Note VARCHAR(4);

INSERT INTO Reservation(Note) VALUES(' ');

INSERT INTO Reservation(Note) VALUES('ab');

INSERT INTO Reservation(Note) VALUES('abcd');

INSERT INTO Reservation(Note) VALUES('abcdefgh');

위 예제에서 수행되는 각 INSERT 문의 결과와 필요한 저장 공간은 다음과 같습니다.

입력값CHAR(4)필요한 저장공간VARCHAR(4)필요한 저장공간

' ' '        ' 4 bytes ' ' 1 bytes
'ab' 'ab    ' 4 bytes 'ab' 3 bytes
'abcd' 'abcd' 4 bytes 'abcd' 5 bytes
'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes

 

BINARY와 VARBINARY

BINARY와 VARBINARY는 각각 CHAR와 VARCHAR과 거의 비슷합니다.

다만 BINARY와 VARBINARY는 문자 집합이 아닌 바이너리(binary) 데이터를 저장할 때 사용된다는 점만이 다릅니다.

문법
BINARY(M)

VARBINARY(M)

 

BLOB과 TEXT

BLOB은 Binary Large Object를 의미하며, 다양한 크기의 바이너리 데이터를 저장할 수 있는 타입입니다.

저장할 수 있는 데이터의 최대 크기에 따라 TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB로 구분됩니다.

TEXT는 VARCHAR와 비슷하지만, VARCHAR와는 달리 기본값을 가질 수 없습니다.

또한, TEXT는 BLOB과도 비슷하지만, BLOB과는 달리 문자열의 대소문자를 구분합니다.

저장할 수 있는 데이터의 최대 크기에 따라 TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT로 구분됩니다.

이렇게 Note 필드를 추가한 후에 DESCRIBE 문을 사용하여 Reservation 테이블의 상세 정보를 확인하면, 다음 실행 결과와 같이 나타납니다.

예제

ALTER TABLE Reservation

ADD COLUMN Note TEXT;
실행 결과

그리고서 INSERT INTO 문을 사용하여 Note 필드 값으로 'MySQL 자료형 수업입니다.'라는 문자열을 가지는 새로운 레코드를 추가합니다.

마지막으로 SELECT 문을 사용하여 Reservation 테이블의 모든 레코드를 선택하여 확인합니다.

 

ENUM

ENUM은 미리 정의한 집합 안의 요소 중 하나만을 저장할 수 있는 타입입니다.

ENUM을 사용하면 가독성을 높일 수 있으며, 특정 숫자에 문자열로 의미를 부여할 수 있습니다.

ENUM 목록 집합은 최대 65,535개의 ENUM 데이터를 포함할 수 있습니다.

이렇게 설정된 ENUM 데이터는 내부적으로 정수로 변환되어 인식됩니다.

문법
ENUM('데이터값1','데이터값2',...)

다음 예제는 ALTER TABLE 문을 사용하여 Reservation 테이블에 4개의 값 중 하나를 가질 수 있는 ENUM 형인 RoomType 필드를 추가하는 예제입니다.

이렇게 RoomType 필드를 추가한 후에 DESCRIBE 문을 사용하여 Reservation 테이블의 상세 정보를 확인하면, 다음 실행 결과와 같이 나타납니다.

예제


ALTER TABLE Reservation

ADD COLUMN RoomType ENUM('Single', 'Twin', 'Double', 'Triple');
실행 결과

그리고서 INSERT INTO 문을 사용하여 RoomType 필드의 값으로 각각 문자열 'Single'과 정수 2를 가지는 새로운 레코드를 추가합니다.

마지막으로 SELECT 문을 사용하여 Reservation 테이블의 모든 레코드를 선택하여 확인합니다.

위의 예제에서 ENUM 목록 집합의 각 데이터는 내부적으로 0부터 시작하여 1씩 증가하며 각각 대응됩니다.

단, 0은 빈 문자열('')과 대응되며, 1부터 집합의 첫 번째 요소와 대응됩니다.

따라서 'Single'은 그대로 'Single'이라는 문자열로 저장되지만, 정수 2는 문자열인 'Twin'으로 변환되어 저장됩니다.

 

SET

SET은 미리 정의한 집합 안의 요소 중 여러 개를 동시에 저장할 수 있는 타입입니다.

SET 목록 집합은 최대 64개의 SET 데이터를 포함할 수 있습니다.

문법
SET('데이터값1', '데이터값2', ...)

다음 예제는 ALTER TABLE 문을 사용하여 Reservation 테이블에 3개의 값 중 여러 개를 가질 수 있는 SET 형인 Request 필드를 추가하는 예제입니다.

이렇게 Request 필드를 추가한 후에 DESCRIBE 문을 사용하여 Reservation 테이블의 상세 정보를 확인하면, 다음 실행 결과와 같이 나타납니다.

예제
ALTER TABLE Reservation

ADD COLUMN Request SET('Breakfast', 'Extra Bed', 'Non-Smoking');

 

실행 결과


그리고서 INSERT INTO 문을 사용하여 Request 필드 값으로 'Breakfast,Extra Bed'라는 문자열을 가지는 새로운 레코드를 추가합니다.

마지막으로 SELECT 문을 사용하여 Reservation 테이블의 모든 레코드를 선택하여 확인합니다.

이처럼 SET 타입으로 설정된 Request 필드에는 SET 목록 집합인 'Breakfast', 'Extra Bed', 'Non-smoking'라는 문자열 중 한 가지 이상의 값을 저장할 수 있습니다.

단, 여러 개의 값을 저장할 경우에는 예제처럼 쉼표를 사용하여 값 사이를 구분해야 합니다.

https://www.tcpschool.com/mysql/mysql_basic_syntax

 

오라클 문자형 함수 연습문제 2024-06-24.hwp
0.03MB

 

DB 생성

--drop table members;
--drop table buy;
-- 회원 테이블 생성
CREATE TABLE members
( mem_id      VARCHAR2(8) NOT NULL PRIMARY KEY, -- 사용자 아이디(PK)
  mem_name    VARCHAR2(20) NOT NULL, -- 이름
  mem_number  NUMBER(3) NOT NULL,  -- 인원수
  addr        VARCHAR2(10) NOT NULL, -- 지역(경기,서울,경남 식으로 2글자만입력)
  phone1      CHAR(3), -- 연락처의 국번(02, 031, 055 등)
  phone2      CHAR(8), -- 연락처의 나머지 전화번호(하이픈제외)
  height      NUMBER(3),  -- 평균 키
  debut_date  DATE  -- 데뷔 일자
);

-- 구매 테이블 생성
CREATE TABLE buy
( num         NUMBER(8) PRIMARY KEY, -- 순번(PK)
  mem_id      VARCHAR2(8) NOT NULL, -- 아이디(FK)
  prod_name   VARCHAR2(20) NOT NULL, -- 제품이름
  group_name  VARCHAR2(10), -- 분류
  price       NUMBER NOT NULL, -- 가격
  amount      NUMBER(5) NOT NULL, -- 수량
  CONSTRAINT fk_members FOREIGN KEY (mem_id) REFERENCES members(mem_id)
);

-- member 테이블에 데이터 삽입
INSERT INTO members VALUES('TWC', '트와이스', 9, '서울', '02', '11111111', 167, TO_DATE('2015-10-19', 'YYYY-MM-DD'));
INSERT INTO members VALUES('BLK', '블랙핑크', 4, '경남', '055', '22222222', 163, TO_DATE('2016-08-08', 'YYYY-MM-DD'));
INSERT INTO members VALUES('WMN', '여자친구', 6, '경기', '031', '33333333', 166, TO_DATE('2015-01-15', 'YYYY-MM-DD'));
INSERT INTO members VALUES('OMY', '오마이걸', 7, '서울', NULL, NULL, 160, TO_DATE('2015-04-21', 'YYYY-MM-DD'));
INSERT INTO members VALUES('GRL', '소녀시대', 8, '서울', '02', '44444444', 168, TO_DATE('2007-08-02', 'YYYY-MM-DD'));
INSERT INTO members VALUES('ITZ', '잇지', 5, '경남', NULL, NULL, 167, TO_DATE('2019-02-12', 'YYYY-MM-DD'));
INSERT INTO members VALUES('RED', '레드벨벳', 4, '경북', '054', '55555555', 161, TO_DATE('2014-08-01', 'YYYY-MM-DD'));
INSERT INTO members VALUES('APN', '에이핑크', 6, '경기', '031', '77777777', 164, TO_DATE('2011-02-10', 'YYYY-MM-DD'));
INSERT INTO members VALUES('SPC', '우주소녀', 13, '서울', '02', '88888888', 162, TO_DATE('2016-02-25', 'YYYY-MM-DD'));
INSERT INTO members VALUES('MMU', '마마무', 4, '전남', '061', '99999999', 165, TO_DATE('2014-06-19', 'YYYY-MM-DD'));

-- buy 테이블에 데이터 삽입
INSERT INTO buy VALUES(1, 'BLK', '지갑', NULL, 30000, 2);
INSERT INTO buy VALUES(2, 'BLK', '맥북프로', '디지털', 10000, 1);
INSERT INTO buy VALUES(3, 'APN', '아이폰', '디지털', 200000, 1);
INSERT INTO buy VALUES(4, 'MMU', '아이폰', '디지털', 20000, 5);
INSERT INTO buy VALUES(5, 'BLK', '청바지', '패션', 50000, 3);
INSERT INTO buy VALUES(6, 'MMU', '에어팟', '디지털', 80000, 10);
INSERT INTO buy VALUES(7, 'GRL', '노트북2', '서적', 1500, 5);
INSERT INTO buy VALUES(8, 'APN', 'e-사전', '서적', 2500, 2);
INSERT INTO buy VALUES(9, 'APN', '청바지', '패션', 3800, 1);
INSERT INTO buy VALUES(10, 'MMU', '지갑', NULL, 1500, 1);
INSERT INTO buy VALUES(11, 'APN', '모두의 sql', '서적', 150, 1);
INSERT INTO buy VALUES(12, 'MMU', '지갑', NULL, 300, 4);

-- member 테이블 조회
SELECT * FROM members;

-- buy 테이블 조회
SELECT * FROM buy;

 

문자형 함수 연습문제 정답

1.
SELECT UPPER(first_name)
FROM employees;

2.
SELECT CONCAT(CONCAT(first_name, ' '),last_name) AS full_name
FROM employees;

3.
SELECT LENGTH(department_name) AS department_name_length
FROM departments;

4.
SELECT job_title
FROM jobs
WHERE job_title LIKE '%Manager%';

5.
select substr(phone_number, -4)as "전화번호 마지막 4자리"
from employees;

6.
select INITCAP(email)
from employees;

7.
select to_char(hire_date, 'YYYYMMDD'),
       to_char(hire_date, 'YYYY') AS "YEAR",
       to_char(hire_date, 'MM') AS "MONTH",
       to_char(hire_date, 'DD') AS "DAY"
from employees;

 

728x90
반응형

'oracle' 카테고리의 다른 글

oracle(subquery)_2024-06-26  (2) 2024.06.26
oracle(JOIN)_2024-06-25  (0) 2024.06.25
oracle(집계함수)_2024-06-25  (2) 2024.06.25
oracle(기본문법)_2024-06-24  (0) 2024.06.24
oracle(SQL기초)_2024-06-21  (0) 2024.06.21