PostgreSQL

PostgreSQL 기본 문법 SQL 다루기

서울 유생 2024. 9. 28. 18:00
반응형

 DBMS는 관계형(Relational) 데이터베이스와 비관계형(Non-Relational) 데이터베이스가 있다. 주로 RDBMS (Relational DataBase) 관계형 데이터베이스를 사용하는데, 최근 다양한 시스템과 아키텍처가 나오면서 비관계형 데이터베이스(NoSQL) 도 많이 쓰이고 있다. NoSQL의 종류로는 Amazon DynamoDB, MongoDB, RedisDB, CouchDB 등 다양하게 있으며 기재한 NoSQL이 현재 가장 널리 사용되고 있다. RDBMS의 종류는 Oarcle, MySQL, Postgre, SQL Server(MS-SQL) 등 대표적인 DBMS이다.

 

 대부분의 RDBMS는 데이터를 엑셀 시트와 같이 2차원 형태로 출력해 준다. 이러한 출력을 요구할 때는 SQL을 사용하는데 기본적으로 SELECT 절을 사용하려고 할 때 여러 칼럼을 조회할 때 쉼표(,)를 사용하며, 모든 칼럼을 조회할 때는 Asterisk [애스터리스크 (*)] 기호를 사용하여 출력을 유도한다. SQL 에서 전체적으로 따옴표(' ') 안에 있는 내용이 아니면 대소문자를 구분하지 않으며, 띄어쓰기와 줄 바꿈에 대한 제한이 없다.

SELECT temp_id
	, temp_title
FROM tb_temp ;

 

 

줄 바꿈으로 작성해도 에러는 없다. 띄어쓰기와 적절한 줄 바꿈 사용으로 가독성을 고려하여 작성기에 좋다.

SELECT temp_id, temp_title FROM temp;

 

WHERE 절에서 SELECT, FROM 절 뒤에 위치하게 작성하는데 부등호, IN, LIKE, BETWEEN 등을 사용해서 조건을 지정할 수 있다. 전체적인 SQL 구조는 이렇고 다음 아래 SELECT부터 천천히 살펴보자. 경력자 분들이 보기에는 다소 너무 쉬운 소재였으나 교수님 첫 수업은 항상 40분에 불과하지 않았던 기억을 떠올려보면 첫 시작은 읽기 쉽게 시작하는 게 좋겠다는 생각이 들었다. 따라서 기초적이지만 다시 되짚어 본다는 생각으로 읽어주면 좋겠다. (???: 유생 너 뭐 돼...?)

1. SELECT

SELECT 절에는 조회할 칼럼 명을 쉼표 (,)로 구분한다. 전체 칼럼을 조회할 때는 Asterisk [애스터리스크 (*)] 를 사용한다. * 를 사용할 때에는 개발상황에서 조회하는 것이 좋지만 개발에 적용하거나 실제 개발에서 쓰이는 SQL에는 컬럼을 지정하는 SQL을 작성하는 것이 좋다.

SELECT * FROM employees;

SELECT *
FROM employees;

SELECT employees_id
		, phone_number
        , email        
FROM employees ;

SELECT employees_id, phone_number, email FROM employees;

 

짧은 SQL의 경우 한 줄로 기재하는 게 가독성이 좋을 때가 있지만 실무는 항상 길어지는 SQL에 줄 바꿈을 사용하여 기재하므로 습관화해두면 좋다. 잘 정돈하여 작성하는 습관은 곧 훗날 연봉에 ++ 읍읍ㅡ. 이다.

SELECT에서 칼럼에 별칭을 부여할 수 있다. [칼럼 명] as [별칭]으로 작성하는데 PostgreSQL에서는 칼럼을 가공 후에 별칭 하지 않으면? column?으로 표기된다.

id employees_id ?column?
123 gilong hong 55
345 dulri kim 17

 

SELECT 절에서 중복 데이터 제거

DISTINCT 명령어는 SELECT 절에서 집합된 결과에 중복 데이터를 제거하는 함수이다.

2. FROM

FROM 절에는 데이터를 찾을 테이블 이름을 명시한다. 이 테이블 이름은 SELECT 절에서 칼럼을 지정하는 곳의 테이블을 정의하는데 PostgreSQL에서는 SELECT temp.temp_id as postgre_id FROM temp; 와 같이 사용할 수 있다. MySQL과 같이 테이블에도 별칭을 사용할 수 있으며 FROM temp t1; 과 같이 테이블에 별칭을 부여할 수 있다. Oracle에서는 AS를 사용하여 별칭을 사용하면 에러가 발생하지만 PostgreSQL에서는 AS 별칭을 사용할 수 있다.

3. WHERE

WHERE 절은 해당 테이블에서 가져올 칼럼 명을 작성하고 어떤 데이터를 가져오는지 조건을 지정하게 된다. WHERE 절 조건은 상당히 중요한데 우선 WHERE 절에서 사용되는 칼럼, 산술식, 함수, 상숫값, 다른 SQL 등 다양한 조건을 사용하여 정의하고 작성할 수 있다.

 

PostgreSQL <조건>

조건
=
!=, <>

^= (PostgreSQL 미지원)
>,<
>=, <=
IN
LIKE
BETWEEN
IS NULL
AND
OR
NOT

4. 조건 연산자

AND 조건과 OR 조건이 있다. 단일 조건 외 여러 조건을 사용할 때에는 AND와 OR를 이용해 조건들을 연결한다. 조건이 맞을 경우 true, 틀릴 경우 false인데 AND는 모든 연결된 조건이 true 일 경우만 데이터를 반환한다. 반대로 OR 조건은 조건 중 하나라도 true 인 경우 데이터를 반환한다. AND는 찾고자 하는 데이터를 연결함으로써 데이터의 범위를 좁혀가는 것인가 하면 OR 조건은 데이터의 범위를 넓혀간다는 것으로 간주하는 게 좋다.

 

AND 조건과 OR 조건을 함께 사용할 때 괄호가 없으면 결괏값이 달라진다. AND와 OR의 조건을 동시에 사용하는 경우 괄호를 사용하는 습관을 들이자. 이는 오류를 줄이고 가독성을 높일 수 있기도 하다. AND와 OR 조건이 함께 있을 때는 조건절의 순서에 따라 결과가 달라지므로 괄호 사용이 필요하다. 

-- SQL 1.
SELECT
*
FROM employees
WHERE first_name='Park'
AND job_id = 'ST_CC'
OR job_id = 'SD_SM' ;


-- SQL 2.
SELECT
*
FROM employees
WHERE first_name='Park'
OR job_id = 'SD_SM'
AND job_id = 'ST_CC';

 

연산자 우선순위에 따라 AND 조건이 OR 조건보다 우선하는데, AND 조건에 괄호가 있는 것처럼 동작한다. 이로 인해 위의 두 SQL은 결과가 다르다. 위에서 제시한 두 SQL은 아래 SQL 처럼 동작하는데 괄호 위치에 주의하자.

 

-- SQL 1.
SELECT 
*
FROM employees
WHERE (first_name='Park'
AND job_id = 'ST_CC')
OR job_id = 'SD_MD')

-- SQL 2.
SELECT
*
FROM employees
WHERE first_name = 'Park'
OR (job_id = 'ST_CC'
AND job_id = 'SD_MD');

4. NOT 조건

NOT 연산자는 조건에 만족하지 않는 데이터를 반환하며, IS NULL과 반대인 IS NOT NULL이 있다. 외에 NOT은 IN의 반대 NOT IN, BETWEEN의 반대 NOT BETWEEN이 있다. 연산자 앞에 NOT을 붙혀 연산자의 반대 조건을 충족하면 된다. 그러나, NOT 조건은 특정 상황에서 성능 저하를 유발하거나 코드 이해를 어렵게 할 수 있으므로, NOT은 비교연산자를 활용하는 것으로 작성할 수 있는 건 작성하는 것이 좋다.

-- NOT 조건과 미사용 SQL 비교.

SELECT * FROM tb_temp WHERE NOT age > 27; -> WHERE age <= 27;
-- 주문, 배송, 완료 
SELECT * FROM tb_temp WHERE product_order NOT IN('주문','배송'); -> WHERE product_order = '완료';
SELECT * FROM tb_temp WHERE c1 NOT BETWEEN 10 AND 30; -> WHERE c1 < 10 OR c1 > 30;

 

NOT IN 조건에서 NULL 이 포함되면 다른 조건이 나올 수 있다는 점을 알아두는 게 좋다. 예를 들어 c1 컬럼에 데이터 a,b,c가 있는 경우 WHERE NOT IN ('a','b')의 결과는 c이다. WHERE c1 NOT IN('a',NULL)의 경우, 데이터를 조회 결과는 어떤 행도 반환하지 않는다. 이를 풀어보면 WHERE c1 <> 'a' AND c1 <> NULL 조건에 해당되기 때문에 조회 결과는 반환되지 않는다.

'PostgreSQL' 카테고리의 다른 글

PostgreSQL 날짜 함수  (2) 2024.10.01
PostgreSQL 조건문과 기본 함수  (0) 2024.09.29