SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC, prod_name DESC;
= : 같다. <> : 같지 않다. != : 같지 않다.
< : -보다 작다. <= : -보다 작거나 같다. !< : -보다 작지 않다.
> : -보다 크다. >= : -보다 크거나 같다. !> : -보다 크지 않다.
BETWEEN ? AND ? : 두 개의 특정한 값 사이 IS NULL : 값이 NULL이다.
OR : 지정된 조건을 하나라도 만족하는 경우 NOT : (뒤에 나오는 조건)이 아니다.
AND가 OR보다 더 높다.
WHERE vend_id IN ('DLL01', 'BRS01')
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
IN을 사용하는 이유는…
WHERE prod_name LIKE 'Fish%';
: Fish로 시작하는 이름
WHERE prod_name LIKE '%bean bag%';
: bean bag을 포함한 이름
WHERE prod_name LIKE 'F%y';
: F로 시작하고 y로 끝나는 단어를 가진 이름
(값에 공백이 있는 'Fish bean bag toy'와 같은 단어는 X)
WHERE prod_name LIKE '__ inch teddy bear'
: 후행 공백이 있는 경우 아무 결과도 출력되지 않을 수 있으므로 아래와 같이 수정
WHERE prod_name LIKE '__ inch teddy bear%'
: 이때는 12, 18 등 두 개의 문자와만 매칭이 되므로 아래와 같이 수정
WHERE prod_name LIKE '% inch teddy bear%'
SELECT vend_name || '(' || vend_country || ')'
: 오른쪽에 있는 모든 공백 제거가 필요한 경우에는 아래와 같이 작성
SELECT vend_name || '(' || RTRIM(vend_country) || ')'
: 별칭을 사용하려면 아래와 같이 작성
SELECT vend_name || '(' || RTRIM(vend_country) || ')' vend_title
RTRIM() : 오른쪽에 있는 모든 공백 제거
LTRIM() : 왼쪽에 있는 모든 공백 제거
TRIM() : 양쪽에 있는 모든 공백 제거
SYSDATE : 현재 날짜
UPPER() : 문자열을 모두 대문자로 변환 LEFT() : 왼쪽부터 문자열 일부 추출
LOWER() : 문자열을 모두 소문자로 변환 RIGHT() : 오른쪽부터 문자열 일부 추출
>> LEFT()와 RIGHT()는 이들 또는 문자열 추출 함수 사용
LENGHT() : 문자열 길이 반환 SUBSTR() : 문자열 일부 추출
SOUNDEX() : 문자열 SOUNDEX 값 반환 (비슷한 소리의 값 반환)
SELECT order_num
FROM Orders
WHERE EXTRACT(year FROM order_date) = '2020';
또는
SELECT order_num
FROM Orders
WHERE order_date BETWEEN to_date('2020-01-01', 'yyyy-mm-dd')
AND to_date('2020-12-31', 'yyyy-mm-dd');
-- to_date()는 문자열을 날짜로 변환되기 위해 사용
ABS() : 숫자의 절댓값 반환 EXP() : 숫자의 지숫값 반환 SQRT() : 숫자의 제곱근 반환
TAN() : 숫자의 탄젠트 반환 COS() : 숫자의 코사인 반환 SIN() : 숫자의 사인 반환
PI() : 숫자의 파이값 반환
AVG() : 열의 평균값 반환 COUNT() : 열에 있는 행의 개수 반환
MAX() : 열의 최댓값 반환 MIN() : 열의 최솟값 반환 SUM() : 열의 합계 반환
ALL : 기본값, 모든 행에 대해 계산 수행
DISTINCT : 중복되는 값 제거 시 사용
SELECT vend_id, COUNT(*) num_prods
FROM Products
GROUP BY vend_id;
SELECT cust_id, COUNT(*) orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;
SELECT vend_id, COUNT(*) num_prods
FROM Products
WHERE prod_price >= 4
GROUP BY vend_id
HAVING COUNT(*) >= 2;
SELECT order_num, COUNT(*) items
FROM OrderItems
GROUP BY order_num
HAVING COUNT(*) >= 3
ORDER BY items, order_num;
| ORDER BY | GROUP BY |
|---|---|
| 결과를 정렬 | 행을 그룹핑 |
| 어떤 열이라도 (가져오지 않은 열 포함) 사용 가능 | 결과는 그룹 순서대로 출력되지 않기도 |
| 필수 항목 X | 선택된 열이나 수식만 사용 가능, 선택된 열이나 수식 꼭 사용 |
| 그룹 함수와 함께 사용하는 열이 (또는 수식) 있는 경우 필수 항목 |
SELECT (가져올 열이나 수식) : 필수
FROM (데이터를 가져올 테이블) : 테이블에서 데이터를 가져올 때 사용
WHERE (행 레벨 필터링) : 필수X
GROUP BY (그룹 지정) : 그룹핑한 데이터로 집계 계산 시 사용
HAVING (그룹 레벨 필터링) : 필수X
ORDER BY (정렬 순서) : 필수X
SELECT cust_name, cust_contact
FROM Customers
WHERE cust_id IN (SELECT cust_id
FROM Orders
WHERE Order num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01'));
SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id = Customers.cust_id) orders
FROM Customers
ORDER BY cust_name;
SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id
-- WHERE 절이 없는 경우 훨씬 많은 데이터를 가져오므로 WHERE 절을 잊지 말자!
SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Products.vend_id
>> EQUI JOIN 보다 권장!
SELECT prod_name, vend_name, prod_price, quantity
FROM OrderItems, Products, Vendors
WHERE Products.vend_id = Vendors.vend_id
AND OrderItems.prod_id = Products.prod_id
AND order_num = 20007
SELECT cust_name, cust_contact
FROM Customers
WHERE cust_id IN (SELECT cust_id
FROM Orders
WHERE Order num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01'));
=
SELECT cust_name, cust_contact
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order_num
AND prod_id = 'RGAN01';
SELECT cust_id, cust_name, cust_contact
FROM Customers
WHERE cust_name = (SELECT cust_name
FROM Customers
WHERE cust_contact = 'Jim Jones');
=
SELECT c1.cust_id, c1.cust_name, c1.cust_contact
FROM Customers c1, Customers c2
WHERE c1.cust_name = c2.cust_name AND c2.cust_contact = 'Jim Jones';
SELECT C.*, O.order_num, O.order_date,
OI.prod_id, OI.quantity, OI.item_price
FROM Customers C, Orders O, OrderItems OI
WHERE C.cust_id = O.cust_id
AND OI.order_num = O.order_num
AND prod_id = 'RGAN01';
SELECT Customers.cust_id, Orders.order_num
FROM Customers INNER JOIN Orders
ON Customers.cust_id = Orders.cust_id;
=
SELECT Customers.cust_id, Orders.order_num
FROM Customers LEFT OUTER JOIN Orders
ON Customers.cust_id = Orders.cust_id;
LEFT / RIGHT / FULL OUTER JOIN : 왼쪽 / 오른쪽 / 양쪽에 있는 테이블의 모든 행을 가져온다.
SELECT Customers.cust_id,
COUNT(Orders.order_num) num_ord
FROM Customers INNER JOIN Orders
ON Customers.cust_id = Orders.cust_id
GROUP BY Customers.cust_id;
SELECT Customers.cust_id,
COUNT(Orders.order_num) num_ord
FROM Customers LEFT OUTER JOIN Orders
ON Customers.cust_id = Orders.cust_id
GROUP BY Customers.cust_id;
-- 내부 조인을 사용할 때와는 달리 왼쪽 외부 조인을 사용했을 때 주문한 적이 없는 고객도 검색되었다.
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL', 'IN', 'MI');
+
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All';
=
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL', 'IN', 'MI');
UNION
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All';
AND
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL', 'IN', 'MI');
OR cust_name = 'Fun4All';
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL', 'IN', 'MI');
UNION ALL
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All';
UNION은 대부분 여러 개의 WHERE 조건을 사용하는 것과 같은 결과를 얻을 수 있으나,
UNION ALL은 WHERE 절에서 갖고 올 수 없는 결과를 반환하므로
중복된 행을 포함해서 모든 조건과 일치하는 행을 가져오고 싶다면 반드시 UNION ALL 사용!
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL', 'IN', 'MI');
UNION
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All';
ORDER BY cust_name, cust_contact;
1. EXCEPT : 두 번째 테이블에는 없지만, 첫 번째 테이블에 있는 행을 가져올 때
2. INTERSECT : 두 개의 테이블에 모두 존재하는 행을 가져올 때
-- INTERSECT 대신 JOIN 사용해도 같은 결과 도출 가능, 거의 사용X
INSERT INTO Customers (cust_id,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country,
cust_contact,
cust_email)
VALUES (1000000006,
'Toy Land',
'123 Any Street',
'New York',
'NY',
'11111',
'USA',
NULL,
NULL);
=
INSERT INTO Customers (cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country)
VALUES (1000000006,
NULL,
NULL,
'Toy Land',
'123 Any Street',
'New York',
'NY',
'11111',
'USA');
INSERT INTO Customers (cust_id,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country)
VALUES (1000000006,
'Toy Land',
'123 Any Street',
'New York',
'NY',
'11111',
'USA');
INSERT INTO Customers (cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country)
SELECT cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country
FROM CustNew;
-- CustNew에 있는 모든 데이터를 Customers로 가져온다.
-- VALUES로 넣을 데이터를 나열하는 대신에, SELECT 문으로 CustNew에서 값을 가져온다.
-- SELECT 절에 있는 각 열은 열 목록에 대응된다.
-- 이 문장을 수행하면 몇 개의 행이 삽입될까? CustNew 테이블에 있는 행의 수에 따라 다르다!
-- 테이블이 비어 있다면, 아무런 행도 삽입되지 않으나 작업은 유효하므로 에러는 발생하지 않는다.
-- 반면 테이블에 데이터가 있다면, 모든 데이터는 Customers에 삽입된다.
열 이름이 반드시 같아야 할 필요는 없다. 그보다는 열의 위치를 사용하므로 순서가 중요하다!
INSERT 문은 보통 하나의 행을 삽입하기 때문에 여러 개의 행을 삽입하려면 INSERT 문을 여러 번 실행
INSERT SELECT 문을 사용하면, 결과로 가져오는 행을 모두 삽입하므로 하나의 문장으로 여러 행 삽입 가능
CREATE TABLE CustCopy AS SELECT * FROM Customers;
UPDATE Customers
SET cust_email = 'kim@thetoystore.com'
WHERE cust_id = 1000000005;
>> WHERE 절을 통해 특정 행 업데이트, WHERE 절이 없다면 모든 행을 새로운 이메일 주소로 업데이트
UPDATE Customers
SET cust_email = NULL
WHERE cust_id = 1000000005;
>> 테이블이 NULL 값을 허용하도록 정의된 경우, 위와 같은 방식으로 데이터 업데이트 가능
DELETE FROM Customers
WHERE cust_id = 1000000006;
>> 고객 아이디가 1000000006인 고객만 삭제
CREATE TABLE Products
(
prod_id CHAR(10) NOT NULL,
vend_id CHAR(10) NOT NULL,
prod_name CHAR(254) NOT NULL,
prod_price DECIMAL(8, 2) NOT NULL,
prod_desc VARCHAR(1000) NULL
);
SQL 문은 공백 문자를 무시하기 때문에 SQL 문을 하나의 긴 문장으로 작성 또는 여러줄로 나눠서 입력 가능
여러 줄로 SQL을 작성하는 것은 SQL 문을 사용하기 편이(열에 대한 정의 수정 편리, 가시적)
CREATE TABLE Products
(
prod_id CHAR(10) NOT NULL,
vend_id CHAR(10) NOT NULL,
prod_name CHAR(254) ,
prod_price DECIMAL(8, 2) ,
prod_desc VARCHAR(1000)
);
기본 키는 테이블에서 각 행을 구별해주는 고유한 값을 가지는 열 (NULL 값 불허)
CREATE TABLE Products
(
prod_id CHAR(10) NOT NULL,
vend_id CHAR(10) NOT NULL,
prod_name CHAR(254) NOT NULL,
prod_price DECIMAL(8, 2) NOT NULL DEFAULT 1,
prod_desc VARCHAR(1000) NOT NULL
);
ALTER TABLE Vendors
ADD vend_phone CHAR(20);
ALTER TABLE Vendors
DROP COULMN vend_phone;
필요 없는 열이 추가되었다면 그 열을 제거할 순 있으나, 실수로 필요한 열을 삭제했을 때는 복구 불가!
새로운 열 구조를 가진 새 테이블 생성
INSERT SELECT 문을 사용하여 이전의 테이블에 있는 데이터를 새로운 테이블에 복사
필요하다면 변환 함수나 계산 필드를 사용
새로운 테이블에 원하는 데이터가 있는 지 확인
이전 테이블명을 변경 또는 과감히 삭제
새로운 테이블을 이전 테이블명으로 변경
필요하다면 트리거, 저장 프로시저, 인덱스, 외래 키 등을 다시 생성
DROP TABLE CustCopy;
ALTER TABLE Table1 RENAME TO Table2;
: 데이터를 가진 테이블과는 달리 사용될 때 동적으로 데이터를 가져오는 쿼리들을 보유한 가상 테이블
💡 뷰를 사용하는 이유
고유한 이름을 가질 것 (다른 테이블이나 뷰 이름 사용 불가)
생성할 수 있는 뷰의 수 제한X
뷰를 생성하기 위해 보안 권한 보유 필요
뷰는 뷰를 포함 가능. 즉, 뷰는 다른 뷰에서 데이터를 가져오는 쿼리를 사용하여 제작 가능
중첩 횟수는 DBMS마다 상이
많은 DBMS에서 뷰 쿼리에서의 ORDER BY 절 사용 금지
일부 DBMS에서는 가져오는 모든열에 이름 부여 필수
열이 계산 필드라면, 별칭 사용
뷰는 인덱스 사용 불가 및 트리거 또는 그와 연관된 기본값 사용 불가
Orcle에서는 읽기 전용 뷰 따로 생성 가능
일부 DBMS에서는 삽입 또는 업데이트한 데이터가 뷰의 범위를 벗어나는 경우,
삽입과 업데이트를 불허하는 뷰 생성 가능
CREATE VIEW ProductCustomers
SELECT cust_name, cust_contact, prod_id
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.orer_num;
SELECT RTRIM(vend_name) + '(' + RTRIM(vend_country) + ')'
vend_title
FROM Vendors
ORDER BY vend_name;
>>
CREATE VIEW VendorLocations
SELECT RTRIM(vend_name) + '(' + + RTRIM(vend_country) + ')'
vend_title
FROM Vendors;
SELECT *
FROM VendorLocations;
CREATE VIEW CustomerEmailList
SELECT cust_id, cust_name, cust_email
FROM Customers
WHERE cust_email IS NOT NULL;
SELECT *
FROM CustomerEmailList;
SELECT prod_id,
quantity,
item_price,
quantity*item_price expanded_price
FROM OrderItems
WHERE order_num = 20008;
>>
CREATE VIEW OrderItemsExpanded
SELECT order_num,
prod_id,
quantity,
item_price,
quantity*item_price expanded_price
FROM OrderItems;
SELECT *
FROM OrderItemsExpanded
WHER order_num = 20008;
여러 단계로 이루어진 과정을 사용하기 쉬운 하나의 단위로 캡슐화하여 복잡한 작업을 단순화
여러 단계를 반복해서 만들 필요가 없어 데이터 일관성 보장
오류 방지에도 도움을 주어 데이터 일관성 보장
테이블, 열 이름, 비즈니스 로직 등이 변경되면 저장 프로시저 코드 변경만 하면 되어 변경 관리를 단순화
기본 데이터에 대한 접근을 제한하여 데이터 손상 가능성 저하, 보안성 증가
대개 컴파일 형태로 저장, 명령 처리를 위해 DBMS가 하는 일이 줄어 성능 향상
SQL 언어 요소와 기능 중 하나의 요청 안에서만 사용해야 하는 것이 있는데,
저장 프로시저는 좀 더 강력하고 유연한 코드를 작성하기 위해 이런 언어 요소와 기능을 사용
DBMS마다 문법이 달라 다른 DBMS로 바꿔야 하는 경우 이식 난이
기본 SQL 문 작성보다 복잡하여 저장 프로시저 작성 시 고수준의 기술과 경험 필요
작성할 수 없더라도, 사용할 수는 있다!
EXECUTE AddNewProduct ('JTS01',
'Stuffed Eiffel Tower',
6.49,
'Plush stuffed toy with the text La Tour Eiffel
in red white and blue');
IS
v_rows INTEGER;
BEGIN
SELECT COUNT(*) INTO v_rows
FROM Customers
WHERE NOT cust_email IS NULL;
ListCount := v_rows;
END;
-- 호출 :
var ReturnValue NUMBER;
EXEC MailingListCount(:ReturnValue);
SELECT ReturnValue;
IN : 저장 프로시저로 값을 전달
OUT : 저장 프로시저에서 값을 반환
INOUT : 위의 두 용도 모두
저장 프로시저 코드는 BEGIN과 END 문으로 묶여 있고, 여기에서는 이메일 주소를 가진 고객을 가져오기 위해 간단한 SELECT 문을 수행 후 ListCount가 가져온 행의 수로 설정
: DB의 부분적인 작업 수행을 막기 위해 여러 SQL 작업을 일괄적으로 처리하는 메커니즘
트랜잭션 처리는 INSERT, UPDATE, DELETE 문을 관리하기 위해 사용
SELECT 문은 롤백 불가, (그럴 이유도 없지만) CREATE나 DROP 작업도 롤백 불가
트랜잭션 블록 안에서 사용은 되나, 롤백하더라도 작업을 되돌릴 수X
SET TRANSACTION
...
DELETE FROM Orders;
ROLLBACK;
SET TRANSACTION
DELETE OrderItems WHERE order_num = 12345;
DELETE Orders WHERE order_num = 12345;
COMMIT;
SAVEPOINT delete1;
ROLLBACK TO delete1;
행을 앞뒤로 이동하며 데이터를 가져와야 할 필요가 있을 때 사용
DECLARE CURSOR CustCursor
IS
SELECT * FROM Customers
WHERE cust_email IS NULL;
OPEN CURSOR CustCursor
-- 1. 커서에서 맨 위에 있는 한 행을 가져오기
DECLARE TYPE CustCursor IS REF CURSOR
RETURN Customers%ROWTYPE;
DECLARE CustRecord Customers%ROWTYPE
BEGIN
OPEN CustCursor;
FETCH CustCursor INTO CustRecord;
CLOSE CustCursor;
END;
-- 2. 커서의 첫 번째 행부터 마지막 행까지 루프돌기
DECLARE TYPE CustCursor IS REF CURSOR
RETURN Customers%ROWTYPE;
DECLARE CustRecord Customers%ROWTYPE
BEGIN
OPEN CustCursor;
LOOP
FETCH CustCursor INTO CustRecord;
EXIT WHEN CustCursor%NOTFOUND;
...
END LOOP;
CLOSE CustCursor;
END;
CLOSE CustCursor
DB 데이터를 어떻게 삽입하고 조작할 것인지 통제하는 규칙
CREATE TABLE Products
(
prod_id CHAR(10) NOT NULL PRIMARY KEY,
vend_id CHAR(10) NOT NULL,
prod_name CHAR(254) NOT NULL,
prod_price DECIMAL(8, 2) NOT NULL,
prod_desc VARCHAR(1000) NOT NULL
);
ALTER TABLE Products ADD CONSTRAINT PRIMARY KEY(prod_id);
CREATE TABLE Orders
(
order_num INTEGER NOT NULL PRIMARY KEY,
order_date DATETIME NOT NULL,
cust_id CHAR(10) NOT NULL REFERENCES Customers(cust_id)
);
ALTER TABLE Orders
ADD CONSTRAINT
FOREIGN KEY(cust_id) REFERENCES Customers(cust_id);
CREATE TABLE OrderItems
(
order_num INTEGER NOT NULL,
order_items INTEGER NOT NULL,
prod_id CHAR(10) NOT NULL,
quantity INTEGER NOT NULL CHECK (quantity>0),
item_price MONEY NOT NULL
);
ADD CONSTRAINT CHECK (gender LIKE '[MF]')
일부 DBMS에서는 사용자가 직접 데이터형 정의 가능
이는 체크 무결성 제약 조건이나 다른 제약 조건을 사용하며 만든 데이터형
장점은 데이터형을 정의할 때 제약 조건을 한 번만 사용해도 데이터형이 사용될 때마다 자동으로 적용
CREATE INDEX prod_name_ind
ON Products (prod_name)
CREATE TRIGGER customer_state
AFTER INSERT OR UPDATE
FOR EACH ROW
BEGIN
UPDATE Customers
SET cust_state = Upper(cust_state)
WHERE Customers.cust_id = inserted.cust_id
END;
| 데이터형 | 설명 |
|---|---|
| CHAR | 1 - 255 길이의 문자열을 저장할 수 있는 고정 길이 문자열, 크기는 테이블을 생성할 때 정립 |
| NCHAR | 멀티바이트나 유니코드 문자를 지원하기 위해 고안된 특별한 형태의 고정 길이 문자열 데이터형(정확한 사양은 DBMS마다 상이) |
| NVARCHAR | 멀티바이트나 유니코드 문자를 지원하기 위해 고안된 특별한 형태의 가변 길이 문자열 데이터형 |
| TEXT(LONG, MEMO, VARCHAR) | 가변 길이 문자형 |
다국어 지원이 필요한 데이터베이스에 주로 사용
만약 우편번호 01234를 수치형 열에 저장하면, 숫자 1234가 저장되어 숫자 0를 상실
숫자가 계산에 사용된다면 수치형 열에 저장하고, 아닌 경우에는 문자열애 저장하자!
| 데이터형 | 설명 |
|---|---|
| BIT | 단일 BIT 값으로 0 또는 1, 주로 BOOLEAN(True, False)으로 사용 |
| DECIMAL (NUMERIC) | 고정 정밀도를 가진 값 |
| FLOAT (NUMBER) | 부동 소수점 값 |
| INT (INTEGER) | 4바이트의 정숫값으로 -2147483648 - 2147483647 범위의 수 지원 |
| REAL | 4바이트 부동 소수점 값 |
| SMALLINT | 2바이트 정숫값으로 -32768 - 32767 범위의 수 지원 |
| TINYINT | 1바이트 정숫값으로 0 - 255 범위의 수 지원 |
| 데이터형 | 설명 |
|---|---|
| DATE | 날짜 |
| DATETIME (TIMESTAMP) | 날짜와 시간 |
| SMALLDATETIME | 날짜와 시간(초나 밀리세컨드(1/1000초) 단위가 아니라 분 단위 까지 저장) |
| TIME | 시간 |
모든 DBMS가 이해할 수 있게 날짜를 정의하는 표준 방법은 X
대부분의 실행 환경은 20202-12-30이나 Dec 30th, 2020과 같은 형태
| 데이터형 | 설명 |
|---|---|
| BINARY | 고정 길이 바이너리 데이터(최대 길이는 255-8000바이트로 실행 환경마다 상이) |
| LONG LAW | 2GB까지 저장할 수 있는 가변 길이 바이너리 데이터 |
| RAW (BINARY) | 255바이트까지 저장할 수 있는 고정 길이 바이너리 데이터 |
| VARBINARY | 가변 길이 바이너리 데이터(최대 길이는 255-8000바이트로 실행 환경마다 상이) |