이 장에서는 특정 스키마에 대한 정보를 찾는 레시피를 제공한다.
예) 어떤 테이블이 생성되어 있는가
예) 어떤 왜래 키가 인덱싱되지 않았는지 등
이 주제에 대한 표준화 수준은 높지 않은 편이다. 따라서 RDBMS에 따라 각기 다른 해법을 적용한다.
각 RDBMS의 가장 일반적인 스키마 쿼리 중심으로 서술된다.
극히 일부분의 내용이 제공된다.
select table_name
from information_schema.tables
where table_schema = 'sqlcook';
>> 실행 결과
+------------+
| table_name |
+------------+
| v |
| emp_bonus |
| emp |
| new_sal |
| T10 |
| dept |
| T100 |
| new_dept |
| T1 |
+------------+
9 rows in set (0.005 sec)
select table_name
from all_tables
where owner = 'SCOTT';
>> 실행 결과
TABLE_NAME
DEPT
EMP
2 rows selected.
Oracle Live SQL에서 스키마명은 'SCOTT'이다
Oracle의 시스템 뷰는 벤더에 특화되어 있다. 지들만 쓴다는 뜻이다.
반면, MySQL은 SQL 표준에 의해 정의된 정보 스키마를 지원한다.
따라서 다른 데이터베이스에 대해서도 해당 쿼리를 사용할 수 있다.
select column_name, data_type, ordinal_position
from information_schema.columns
where table_schema = 'sqlcook'
and table_name = 'emp';
>> 실행결과
+-------------+-----------+------------------+
| column_name | data_type | ordinal_position |
+-------------+-----------+------------------+
| empno | int | 1 |
| ename | varchar | 2 |
| job | varchar | 3 |
| mgr | int | 4 |
| hiredate | date | 5 |
| sal | int | 6 |
| comm | int | 7 |
| deptno | int | 8 |
+-------------+-----------+------------------+
8 rows in set (0.004 sec)
select column_name, data_type, data_length, column_id
from all_tab_columns
where owner = 'SCOTT'
and table_name = 'EMP'
>> 실행결과
COLUMN_NAME DATA_TYPE DATA_LENGTH COLUMN_ID
EMPNO NUMBER 22 1
ENAME VARCHAR2 10 2
JOB VARCHAR2 9 3
MGR NUMBER 22 4
HIREDATE DATE 7 5
SAL NUMBER 22 6
COMM NUMBER 22 7
DEPTNO NUMBER 22 8
8 rows selected.
각 벤더는 열 데이터의 자세한 정보를 얻는 방법을 제공한다.
위 예제에서는 열 이름, 데이터 유형, 위치, 길이 등을 반환했으나 NULL
허용 여부 등 기본값들이 존재한다.
스키마에 대한 정보를 얻는 방법이 소개되고 있다.
이는 실무적 측면에서 데이터베이스 또는 스키마의 동기화 작업이나 이전 작업에서 유사하게 사용했던 쿼리다.
수동으로(ㅠㅠ) 한땀한땀 비교했던 때가 생각이 난다.
나름대로 굉장히 유용한 쿼리가 될 수 있다.