SQL 통한 Database 관리

별칭이 안되는 구문은?

JBS 12 2024. 8. 29. 21:00

SQL에서 **별칭(alias)** 사용이 불가능하거나 제한되는 주요 경우는 다음과 같습니다:

### 1. **WHERE 절에서 별칭 사용 불가**
`WHERE` 절에서는 `SELECT` 절에서 지정한 별칭을 사용할 수 없습니다. `WHERE` 절은 `SELECT` 절보다 먼저 처리되기 때문에, 별칭이 아직 정의되지 않은 상태입니다.

#### 예시
```sql
SELECT salary AS monthly_salary
FROM employees
WHERE monthly_salary > 5000;  -- 오류 발생
```

위 예시에서는 `WHERE` 절에서 `monthly_salary`라는 별칭을 사용하려고 하지만, 이는 오류를 발생시킵니다.

**올바른 방법**:
```sql
SELECT salary AS monthly_salary
FROM employees
WHERE salary > 5000;  -- 원래 컬럼명 사용
```

### 2. **GROUP BY 절에서의 별칭 사용 (일부 DBMS)**
일부 데이터베이스 관리 시스템(DBMS)에서는 `GROUP BY` 절에서 별칭을 사용할 수 없습니다. 이 경우 원래의 컬럼명을 사용해야 합니다.

#### 예시 (일부 DBMS에서 오류 발생):
```sql
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id, employee_count;  -- 일부 DBMS에서 오류
```

**올바른 방법**:
```sql
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id;  -- 별칭이 아닌 원래의 컬럼 또는 집계 함수 사용
```

### 3. **HAVING 절에서의 별칭 사용 (일부 DBMS)**
마찬가지로 일부 DBMS에서는 `HAVING` 절에서 별칭을 사용하는 것이 제한될 수 있습니다.

#### 예시:
```sql
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id
HAVING employee_count > 10;  -- 일부 DBMS에서 오류
```

**올바른 방법**:
```sql
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id
HAVING COUNT(*) > 10;  -- 별칭 대신 집계 함수를 사용
```

### 4. **ORDER BY에서 숫자 인덱스와 별칭 혼용 (일부 DBMS)**
`ORDER BY` 절에서 숫자 인덱스와 별칭을 혼용하는 경우, 일부 DBMS에서는 이를 허용하지 않을 수 있습니다.

#### 예시:
```sql
SELECT name, salary AS sal
FROM employees
ORDER BY sal, 1;  -- 일부 DBMS에서 혼용할 경우 오류 발생
```

**올바른 방법**:
```sql
SELECT name, salary AS sal
FROM employees
ORDER BY sal, name;  -- 숫자 인덱스 또는 별칭 중 하나만 사용
```

### 결론
- `WHERE`, `GROUP BY`, `HAVING` 절에서는 별칭 사용이 제한될 수 있으며, 이는 DBMS에 따라 다를 수 있습니다.
- `ORDER BY`에서 숫자 인덱스와 별칭의 혼용도 일부 DBMS에서 문제가 될 수 있습니다.
- 이러한 제한을 피하려면 원래 컬럼명이나 함수를 직접 사용하거나, 별칭이 지원되지 않는 경우를 염두에 두고 쿼리를 작성하는 것이 좋습니다.

'SQL 통한 Database 관리' 카테고리의 다른 글

replace(c1, chr(10))  (0) 2024.08.30
select dname, loc, deptno from dept order by dname, loc, 3 desc  (0) 2024.08.30
values ()  (0) 2024.08.29
savepoint ?  (0) 2024.08.29
rollback to savepoint  (0) 2024.08.29