Search
Duplicate

뉴비를 위한 SQL - 2. SELECT 간단 활용기

뉴비를 위한 SQL

현업에서 자주 사용하는 SQL 중 하나가 SELECT이다.
특정 데이터의 리스트나 사용자의 정보를 출력할 수 있고, 특정 테이블에 있는 row를 토대로 각종 통계 데이터를 만들 수 도 있다.
이번에는 SELECT를 활용하는 방법을 간단하게 소개하려고 한다.
뉴비를 위한 SQL - 1. SQL이 뭐지? 에서 import한 employees 데이터 베이스를 활용할 것이다.

SELECT

DML의 한 종류로써, SELECT는 데이터베이스, 테이블의 데이터를 조회을 하는 질의어
반드시 테이블의 row 정보만 출력할 수 있는게 아니라, RDBMS가 지원하는 범위에서 Database의 version과 같은 정보도 출력이 가능하다.

일반적인 SELECT

select first_name from employees where emp_no=10022;
SQL
복사

MySQL or MariaDB의 Version 출력

SELECT VERSION();
SQL
복사

SQL Server(MS-SQL)의 Version 출력

SELECT @@VERSION;
SQL
복사

Oracle의 Version 출력

SELECT * FROM PRODUCT_COMPONENT_VERSION;
SQL
복사
위 SQL에서 "VERSION()" 이라는 키워드는 뭔가 함수(Function)의 느낌이 나지 않는가?
대부분의 RDBMS에서는 사용자의 편의를 위한 함수들을 지원한다.
SQL문과 함수들을 활용하면 좀 더 편리하게 원하는 결과를 출력할 수 있다.

Function

거의 모든 RDBMS에서는 다양한 내부 함수(Built in Function)를 지원한다.
예를 들어 SELECT를 한 결과 리스트의 최대 값을 구할 때 MAX() 함수를 사용하는 등..
표준 SQL 함수(ANSI SQL Function)가 내부 함수들은 각 RDBMS 별로 지원 여부가 다르기 때문에 별도로 찾아보는 것을 추천한다.

표준 SQL 함수(ANSI SQL Function)

표준 SQL(ANSI SQL)은 또 뭐야?

American National Standards Institute Structured Query Language 미국 표준협회에서 정립한 표준 SQL
이 또한 정리를하면 내용이 꽤나 많다. 우리는 뉴비이다.
대~충 ANSI SQL이 어떤 느낌인지만 알고 넘어가자.
사실 핑계이다. 이 부분에 대해서는 아직 공부를 하지 않았다 -_-;;
표준 SQL을 사용함으로써 얻는 장점은 아래와 같다.
1. 한 번 작성한 쿼리는 대부분의 RDBMS에서 지원이 된다. (다시 작성 안해도 된다!)
2. 가독성이 좋아진다. (물론 사람 by 사람)

Oracle Join와 ANSI Join 비교

-- Oracle SQL SELECT * FROM TBL_A, TBL_B WHERE TBL_A.a = TBL_BB.b(+); -- ANSI SQL SELECT * FROM TBL_A LEFT OUTER JOIN TBL_B ON TBL_A.a = TBL_B.b;
SQL
복사
"어디서 가독성이 좋아진다는거야!" 라고 생각 할 수 있다.
일단, 두 쿼리는 동일한 결과를 출력한다!
ANSI SQL에서는 테이블간의 Join 관계를 FROM 절에서 모두 기술되어 있고, 순수한 조건만 "WHERE"절에 기술 되어 있다.
아, 당장 Join이 뭔지 몰라도 된다!
중요한건 표준 SQL을 사용하면 "한 번 작성한 쿼리"로 다양한 RDBMS에서 동일한 결과를 얻을 수 있다는 점이다.
"그러면 표준 SQL만 배우면 되지, 왜 Oracle, MySQL 문법을 왜 배우는 거지?" 라고 생각할 수 있다.
항상 표준 SQL이 가장 좋은 성능을 가져오는 것은 아니며, 쿼리에 따라서 표준 SQL이 오히려 가독성이 나빠질수 도 있다.
적재적소에 알맞는 쿼리를 작성하는 것이 가장 좋다!
뭐든지 꽉 막히게 살지말고, 유연하게 살도록 하자.
항상 삼천포로 빠지는 것 같다. 그래도 잔 지식(?)은 다다익선이다.
넘어가자.
자주 사용하는 ANSI SQL Function 몇 가지를 사용하는 법을 배워보자.

Sample #1

select * from salaries where emp_no=10022;
Plain Text
복사

SUM()

합계를 구하는 집계함수

봉급만 출력

select salary from salaries where emp_no=10022;
Plain Text
복사

봉급의 합계를 출력

select SUM(salary) from salaries where emp_no=10022;
Plain Text
복사

출력된 봉급의 합계를 출력. 컬럼명(salaries)을 total로 표기

select SUM(salary) as total from salaries where emp_no=10022;
Plain Text
복사

AVG()

평균을 구하는 집계함수

출력된 봉급의 평균을 출력. 컬럼명(salaries)을 avg로 표기

select AVG(salary) as avg from salaries where emp_no=10022;
Plain Text
복사

MAX()

최댓값을 구하는 집계함수

출력된 봉급의 최댓값을 출력. 컬럼명(salaries)을 max로 표기

select MAX(salary) as max from salaries where emp_no=10022;
Plain Text
복사

MIN()

최솟값을 구하는 집계함수

출력된 봉급의 최솟값을 출력. 컬럼명(salaries)을 min로 표기

select MIN(salary) as min from salaries where emp_no=10022;
Plain Text
복사

Sample #2

select first_name from employees where emp_no=10022;
Plain Text
복사

Lower()

출력된 문자열을 소문자로 치환하는 함수

출력된 이름을 소문자로 치환

select Lower(first_name) from employees where emp_no=10022;
Plain Text
복사

Upper()

출력된 문자열을 대문자로 치환하는 함수

출력된 이름을 대문자로 치환

select Upper(first_name) from employees where emp_no=10022;
Plain Text
복사

관계

RDBMS(관계형 데이터베이스)라는 이름에서 유추할 수 있는 것 중 하나가,
각 데이터들을 관계를 지어서 저장 및 관리를 한다는 점이다.
보다 쉬운 예를 들자면 직원과 부서의 관계이다.
회사에 소속한 직원이라는 객체가 가지는 요소는 이름, 사원번호, 소속부서, 직급 등이 있을 것이다.
이러한 직원 정보를 데이터베이스의 "사원"이라는 테이블에 저장을 한다면 아래와 같은 형태로 표현할 수 있다.

"직원" 테이블

위와 같이 하나의 테이블에 사원의 모든 정보가 담게 된다면 각 컬럼에 중복되는 데이터가 발생되고, 만약 그 데이터의 크기 자체가 큰 경우 비효율적으로 사용하게된다.
또 DML을 통한 쿼리로 인하여 발생하는 여러 이상 현상이 발생할 수 도 있다. 그리고 저장하는 데이터를 활용하여 각종 쿼리를 효율적으로 작성하기도 어려워진다.
조금 더 전문적인 용어로 설명하면 데이터의 일관성, 중복 데이터의 최소화, 데이터의 유연성 향상의 관점으로 테이블을 나누어 관리를 한다.
이러한 과정을 정규화라고 하며, 정규화의 종류는 제 1정규화 ~ 제 6정규화가 있다.
지금은 그런게 있구나 정도만 하고 넘어가도록하자. 궁금하면 구글링을 하면 자세한 설명이 넘치고 넘친다..!
다시 "직원" 테이블로 돌아가서, 분리하여 관리 할 수 있는 컬럼에 대하여 테이블로 나누어 보면 아래와 같이 표현할 수 있다.

"직원" 테이블

"부서" 테이블

"직급" 테이블

이렇게 테이블을 분리하면 어떤 효과를 가져올 수 있을까? 딱 눈에 보이는 장점을 나열하면 아래와 같다.
1. 부서테이블을 별개로 관리를 하여 부서코드와 상위부서코드를 활용하여 트리 구조의 조직도를 표현 할 수 있다.
데이터를 하나의 목적이 아닌, 다양한 방법으로 활용을 할 수 있게 되었다.
2. 직급테이블을 구성하고 직급 코드를 부여를 함으로써, SELECT를 한 후 직급코드를 오름차순으로 정렬하면 직급이 높은 직원을 리스트 상단에 위치를 시킬 수 있다.
2번과 마찬가지로 데이터를 다양한 방법으로 활용을 할 수 있게 되었다.
위와 같이 데이터의 중복을 피하기 위하여, 테이블을 정규화 하게되면 정보(데이터)들이 여러 테이블로 흩어지게 된다.
그렇다면, 여러 테이블에 흩어져있는 데이터를 조합하여 원하는 결과를 어떻게 얻을 수 있을까?
그 방법에 대해서는 다음 포스팅에 이어서 정리 하도록 하겠다.