데이터, 데이터베이스와 관련된 작업을 한 번 이라고 해 본 분이라면 SQL을 모를 수 없다. 데이터베이스 입출력 작업은 거의 모든 경우 SQL을 이용해서 이루어지기 때문이다. SQL을 '에스큐엘' 또는 '시퀄'이라고 읽는다(한국과 미국에서 거의 대부분 '에스큐엘'로 읽지만 미국에서는 종종 '시퀄'로도 읽는 것 같다).
SQL은 Structured Query Language의 약자로서 ISO/IEC 9075 표준으로 관리된다. 1987년에 ANSI SQL과 ISO/IEC 9075 표준이 내용을 맞춘 이후로 현재(2022년 12월) 8번째 개정(revision)인 ANSI/ISO/IEC 9075:2016에 이르고 있다. 데이터를 다루기 위한 표준 언어라고 할 수 있다.
SQL 명령을, 데이터베이스에 전달하는 질의 또는 요청이라는 뜻에서 일반적으로 쿼리(query)라고 부른다. 가장 기본적인 쿼리는 데이터베이스에서 데이터를 조회하는 SELECT 명령이다.
SELECT <무엇> FROM <어디>
무엇: 콤마(,)로 구분된 컬럼 이름들
어디: 테이블 이름
이렇게 SELECT 구문을 사용하여 조회한 결과들을 결과 셋(result set)이라 한다.
테이블의 모든 컬럼(항목)을 읽을 때는 '모든 것'을 의미하는 와일드 카드 문자인 별표 *를 사용한다.
예) SELECT * FROM employees;
하지만 모든 컬럼을 의미하는 * 기호는 사용하지 않는 것이 좋다. 왜냐하면 원하지 않는 이름이 비슷한 데이터를 가져오게 될 수 있기 때문이다. 테이블의 구조를 먼저 알고, 꺼내야 하는 데이터를 정확히 알고 있어야한다. DESCRIBE 명령으로 테이블의 구조를 알 수 있다.
DESCRIBE <테이블 이름>
예) DESCRIBE employees;
처음 보는 테이블에서 데이터를 조회한다면 먼저 이렇게 테이블의 구조를 조사한 후 SELECT 명령을 사용하게 된다.
데이터를 조회할 때는 거의 모든 경우에 있어 어떤 '조건'에 맞는 데이터를 조회하게 된다. 이 때 SELECT 명령어와 함께 사용하는 구문이 WHERE 절이다.
SELECT <무엇> FROM <어디> WHERE <조건들>
예를 들어 근속 연수가 10년 이상인 직원들을 조회한다면 아래와 같이 쿼리를 구성할 수 있다.
예) SELECT EmployeeID, EmpFirstName, EmpLastName FROM employees WHERE DATEDIFF(current_date(), EmpHiredDate) > 10*365;
위 쿼리 예에서 current_date() 함수는 현재 날짜를 YYYY-MM-DD 형태(date 타입)로 반환한다. 만약 EmpHiredDate 행의 데이터 타입이 date라면 DATEDIFF( ) 함수의 연산을 통해 두 날짜의 차이를 날 수(days)로 구할 수 있다.
조건은 하나 이상이 될 수 있는데 이 때는 각 조건을 AND 또는 OR 키워드를 사용하여 연결하면 된다.
데이터를 조회할 때는 조건이 가장 중요하지만 인지적으로 정렬이 필요한 경우도 많다. 정렬을 위해 ORDER BY 구문을 함께 사용한다. 예를 들어 근속 연수가 10년 이상인 직원들을 내림차순, 즉 가장 근속 기간이 긴 직원을 앞에 오도록 정렬한다면 아래와 같이 쿼리를 구성할 수 있다.
SELECT <컬럼들> FROM <테이블 이름> WHERE <조건들> ORDER BY <기준> DESC/ASC;
아래 예는 근속 연수가 10년 이상인 직원들의 조회 결과를 근속 연수가 긴 직원이 앞에 오도록 내림차순(DESC)으로 출력한다.
예) SELECT EmployeeID, EmpFirstName, EmpLastName FROM employees WHERE DATEDIFF(current_date(), EmpHiredDate) > 10*365 ORDER BY DATEDIFF(current_date(), EmpHiredDate) DESC;
정렬 방식에는 내림차순(descending order, 큰 것이 앞에 오도록)과 오름차순(ascending order, 작은 것이 앞에 오도록)이 있고 각각 DESC, ASC로 표현하여 ORDER BY 절과 함께 사용한다. 기본은 ASC이고 생략이 가능하다.
SQL 요청식의 결과 셋을 CREATE VIEW ~ AS 명령을 이용하여 테이블 형태로 저장할 수 있다. 이는 실제 테이블은 아니며 '가상 테이블' 또는 데이터를 어떤 관점에서 본다는 의미로 뷰(view)라고 한다.
CREATE VIEW <뷰 이름> AS SELECT 명령
예) CREATE VIEW Employees_Working_mt_10Y AS SELECT EmployeeID, EmpFirstName, EmpLastName FROM employees WHERE DATEDIFF(current_date(), EmpHiredDate) > 10*365 ORDER BY DATEDIFF(current_date(), EmpHiredDate) DESC;
위 예에서 AS는 '별칭'의 뜻을 가진 Alias의 약자로 생성하려는 뷰인 Employees_Working_mt_10Y가 AS 뒤에 이어지는 SELECT 쿼리의 결과 셋과 같다는 뜻이다.
뷰를 삭제할 때는 DROP VIEW 명령을 사용한다.
DROP VIEW <뷰 이름>
예) DROP VIEW Employees_Working_mt_10Y;
쿼리는 대소문자 구별을 하지 않는다. 하지만 쿼리에서 SQL 명령이나 키워드들은 보통 대문자로 표시한다. 컬럼 이름이나 테이블 이름 등과 구분하여 요청식을 읽기 쉽게 만들어주기 때문이다.
■
'데이터 모델과 SQL' 카테고리의 다른 글
[데이터 모델과 SQL] 5. 검색 조건 지정하기 - 1/2 (1) | 2023.01.02 |
---|---|
[데이터 모델과 SQL] 4. 좋은 테이블이란? (1) | 2022.12.28 |
[데이터 모델과 SQL] 3. SQL - SELECT 명령 - 표현식(Expression) (0) | 2022.12.25 |
[데이터 모델과 SQL] 1. 데이터베이스 (0) | 2022.12.14 |
[데이터 모델과 SQL] 0.서비스 개발과 데이터 모델 (0) | 2022.12.13 |
댓글