도메인이란 하나의 속성이 취할 수 있는 동일한 유형의 원자값들의 집합이다.
DDL(Data Define Language) {CREATE, ALTER, DROP}
1. 성별도메인
CREATE DOMAIN SEX CHAR(1)
DEFAULT '남'
CONSTRAINT VALID-SEX CHECK(VALUE('남', '여'));
2. 이메일 도메인
CREATE DOMAIN EMAIL VARCHAR(100)
CONSTRAINT VALID-EMAIL CHECK(VALUE LIKE '%@%.%);
3. 나이 도메인
CREATE DOMAIN AGE INTEGER
DEFAULT 0
CONATRAINT VALID_AGE CHECK(VALUE >= 0 AND VALUE <= 150);
4. 전화번호 도메인
CREATE DOMAIN PHONE_NUMBER CHAR(13)
CONSTRAINT VALID_PHONE CHECK(VALUE LIKE '___-____-____');
5. 급여 도메인
CREATE DOMAIN SALARY DECIMAL(10, 2)
DEFAULT 0.00
CONSTRAINT VALID_SALARY CHECK(VALUE >= 0)
6. 학점 도메인
CREATE DOMAIN GRADE CAHR(1)
CONSTRAINT VALID_GRADE CHECK (VALUE IN ('A', 'B', 'C', 'D', 'F'))
7. 우편번호 도메인
CREATE DOMAIN POSTAL_CODE CHAR(5)
CONSTRAINT VALID_POSTAL CHECK(VALUE SIMILAR TO '[0-9]{5});
8. URL 도메인
CREATE DOMIAN URL VARCHAR(255)
CONSTRAINT VALID_URL CHECK(VALUE LIKE 'http://%' OR VALUE LIKE 'https://%');
9. 백분율 도메인
CREATE DOMAIN PERCENTAGE NUMERIC(5, 2)
DEFAULT 0.00
CONSTRAINT VALID_PERCENTAGE CHECK(VALUE >= 0.00 AND VALUE <== 100.00>);
10. 상태 코드 도메인
CREATE DOMAIN STATUS_CODE CHAR(2)
DEFAULT 'AC'
CONSTRAINT VALID_STATUS CHECK(VALUE IN ('AC', 'IN', 'PE', 'CL'));
ALTER DOMAIN SALARY
ADD CONSTRAINT MIN_SALARY CHECK(VALUE>=1000000);
DROP DOMAIN SEX CASCADE;
CASCADE : 해당 도메인을 사용하는 모든 컬럼도 함께 처리
CREATE TABLE EMPLOYEE (
EMP_ID INTEGER PRIMARY KEY,
EMP_NAME VARCHAR(50) NOT NULL,
EMP_SEX SEX,
EMP_AGE AGE,
EMP_EMAIL EMAIL,
EMP_PHONE PHONE_NUMBER,
EMP_SALARY SALARY
);
참고: MySQL은 DOMAIN을 지원하지 않으므로, CHECK 제약조건을 테이블 레벨에서 직접 사용해야 한다.
표준 SQL에서는 NUMERIC과 DECIMAL이 동일하다:
NUMERIC(10, 2) = DECIMAL(10, 2)
권장사항
-- 기본 조회
SELECT column1, column2 FROM table_name;
-- 모든 컬럼 조회
SELECT * FROM employees;
-- 중복 제거
SELECT DISTINCT department FROM employees;
-- 조건 검색
SELECT * FROM employees WHERE salary >= 50000;
-- 정렬
SELECT * FROM employees ORDER BY salary DESC;
-- 상위 N개 조회
SELECT * FROM employees LIMIT 10;
-- 비교 연산자
WHERE age >= 30
WHERE name = '홍길동'
WHERE salary BETWEEN 30000 AND 50000
-- 논리 연산자
WHERE age >= 30 AND department = 'IT'
WHERE salary < 30000 OR salary > 80000
-- IN 연산자
WHERE department IN ('IT', 'HR', 'Sales')
-- LIKE 패턴 매칭
WHERE name LIKE '김%' -- 김으로 시작
WHERE email LIKE '%@gmail.com' -- gmail.com으로 끝
WHERE phone LIKE '010-____-____' -- _는 한 글자
-- AS 없이
SELECT COUNT(*) FROM employees;
-- 결과 컬럼명: COUNT(*) ← 이게 뭔지 한눈에 안 들어옴
-- AS 사용
SELECT COUNT(*) AS 총직원수 FROM employees;
-- 결과 컬럼명: 총직원수 ← 명확함!
-- AS 없이
SELECT salary * 12 FROM employees;
-- 결과 컬럼명: salary * 12 ← 무슨 의미인지 불명확
-- AS 사용
SELECT salary * 12 AS 연봉 FROM employees;
-- 결과 컬럼명: 연봉 ← 의미 명확!
-- AS 없이 (너무 길어서 불편)
SELECT employees.name, departments.department_name
FROM employees
INNER JOIN departments
ON employees.dept_id = departments.dept_id;
-- AS 사용 (간결함)
SELECT e.name, d.department_name
FROM employees AS e
INNER JOIN departments AS d
ON e.dept_id = d.dept_id;
-- 직원과 상사를 구분하기 위해 별칭 필수
SELECT
e1.name AS 직원,
e2.name AS 상사
FROM employees e1
LEFT JOIN employees e2
ON e1.manager_id = e2.id;
| AS 사용 위치 | 목적 | 생략 가능? |
|---|---|---|
| SELECT 컬럼 | 결과 컬럼명 변경 | ⭕ (AS 생략 가능) |
| FROM 테이블 | 테이블명 줄이기 | ⭕ (AS 생략 가능) |
| SELF JOIN | 같은 테이블 구분 | ❌ (필수) |
AS는 생략 가능하지만, 명확성을 위해 쓰는 게 좋음
-- 둘 다 동일하게 동작
SELECT COUNT(*) AS cnt FROM employees;
SELECT COUNT(*) cnt FROM employees; -- AS 생략
-- 하지만 AS를 쓰는 게 더 명확함