SQL 첫걸음 - 3, 4장

채원·2023년 9월 30일
0

3장 : 정렬과 연산

정렬 - ORDER BY

SELECT 열명 FROM 테이블명 WHERE 조건식 ORDER BY 열명

ORDER BY 구를 사용하면 검색결과의 행 순서를 바꿀 수 있다.
FROM 구 뒤에 사용하기만 하면 된다.

정렬의 순서는 오름차순이 기본값이다. 만약 내림차순으로 하고 싶다면 열명 뒤 DESC을 붙이면 된다. 오름차순은 ASC다.
이렇게 정렬된 값은 실제 데이터에는 영향을 주지 않는다. 그렇게 참조만 하는 것 뿐이다.

NULL값은 MySQL 기준으로는 가장 작은 값으로 간주되어서 오름차순으로 정렬할 시 항상 맨 위에 오게 된다. 하지만 제품에 따라 다르기 때문에, 차이을 알아둘 필요가 있다.

복수의 열을 지정해 정렬하기

SELECT 열명 FROM 테이블명 WHERE 조건식 ORDER BY 열명1 (ASC|DESC) 열명2 (ASC|DESC)...

여러 열을 고려해서 정렬을 하고 싶을 수 있다. 그럴 떼에는, ORDER BY 뒤에 여러 개의 열을 붙이면 된다. 이 때에는, 앞에 붙은 열을 우선으로 정렬한 뒤, 뒤에 붙은 열을 나중에 정렬한다.

결과 행 제한하기 - LIMIT

SELECT 열명 FROM 테이블명 LIMIT 행수 [OFFSET 시작행]

블로그나 쇼핑몰에서 제품 수 기준으로 인덱싱을 하는 것처럼, MySQL도 몇 개를 기준으로 해서 표시되는 행을 제한할 수 있다.
이때 이 문법은 표준 문법은 아니고, MySQL과 PostgreSQL에서만 사용 가능하다.

만약 데이터를 3개로 제한하고, 4번째 데이터부터 출력하고 싶다면 다음과 같이 쓰면 된다.

SELECT 열명 FROM 테이블명 LIMIT 3 OFFSET 3

OFFSET 뒤에 3을 붙인 건 프로그래밍 언어에서 배열이 0에서 시작하는 것처럼 생각하면 된다.

수치 연산

이건 그냥... 연산자 자체는 그냥 다른 언어들의 연산자랑 비슷하다.
연산은 SELECT나 WHERE 어디서든 모두 사용이 가능하다.

이 때, 테이블의 이름에 별명을 붙이는 방법이 있다.

SELECT 열명, a*b AS mul FROM 테이블명 

위 처럼 AS 별명, 아니면 바로 별명을 붙이면 저 연산을 수행한 테이블이 해당 별명으로 표시가 된다.

이 때, 만약 SELECT에서 지정한 별명을 가지고 WHERE에서 검색을 하는 것은 불가능하다. 검색 순서가 WHERE 다음 SELECT이기 때문이다. 따라서 반대는 또 가능하다.

MySQL에서는 NULL을 가지고 계산을 하면 무조건 값이 NULL이 된다. 하지만, 이 또한 언어에 따라 다르기 때문에 차이를 알아둘 필요가 있다.

문자열 연산

말 그래도 문자열을 합치고 추출하고 이런 연산들을 말한다.

  • CONCAT
    이름처럼 문자열을 합친다.
  • SUBSTRING
    이름처럼 부분 문자열을 리턴한다. 예를 들어서, 20230930이라는 문자열에서 2023을 추출하고 싶다면 이렇게 해주면 된다.
SUBSTRING('20230930', 1, 4)
  • TRIM
    파이썬의 trim이나 split이랑 비슷하다. 스페이스를 제거해주는 함수다.
  • CHARACTER_LENGTH
    이름대로 문자열의 길이를 출력하는 함수이다.

날짜 연산

SELECT CURRENT_TIMESTAMP;

만약 현재 시스템 날짜를 확인하고 싶다면 위의 함수를 사용하면 된다. 인자는 없다.
날짜 데이터에 +- N일을 할 수도 있고, 날짜끼리 뺄 수도 있다.

CASE문으로 데이터 변환하기

다른 언어의 if 같은 문법이다.
CASE의 조건에 따라서 내가 원하는 대로 데이터를 출력할 수 있다.
예를 들어, 여자면 0, 남자면 1을 출력하고 싶다면 이렇게 하면 된다.

SELECT sex, 
CASE 
	WHEN sex = '여자' then 0
    WHEN sex = '남자' then 1
END

그런데 이걸 또 switch처럼 간락한 버전으로도 쓸 수가 있다.

SELECT sex, 
CASE sex when
	'여자' then 0
    '남자' then 1
END

뤌씬 간단하다.
다만, 값이 NULL인지를 확인하기 위해서는 ISNULL을 사용해야 하기 때문에, 간략한 버전으로는 NULL인지를 검사할 수는 없다.


4장

행 추가하기 - INSERT

INSERT INTO 테이블명 VALUES(값1, 값2, ...)

테이블의 구조에 맞춰서 INSERT 연산을 수행하면 테이블의 맨 아래에 값이 들어간다. 다음처럼 하면 된다.

INSERT INTO 테이블명 VALUES (2, 'NAME');

원하는 열을 선택해서 일부만 추가할 수도 있다.

INSERT INTO 테이블명(no) VALUES (2);

이 때, 추가하지 않은 열에는 DEFAULT값이 들어간다. 이 값은 DESC 명령을 통해 확인할 수 있다.

DESC 명령을 통해서는 열에 NOT NULL 조건 여부도 확인할 수 있다. 만약 NOT NULL이 설정되어 있다면, 해당 열에는 NULL을 추가할 수 없다.

행 삭제하기 - DELETE

DELETE FROM 테이블명 WHERE 조건식

이 명령을 수행하면 조건식에 해당하는 모든 행이 삭제된다.

데이터 갱신하기 - UPDATE

UPDATE 테이블명 SET 열1 = 값1, 열2 = 값2,... WHERE 조건식

이 명령을 해당하면 WHERE에 해당되는 행에 대해서 열의 값을 변경할 수 있다. WHERE을 반드시 붙여야 하는 것은 아니다.

이 때, SET 뒤에 복수의 열을 지정할 수도 있는데, MySQL에서는 이러면 변경되는 순서가 앞에서 뒤 순서가 된다. 앞의 열을 먼저 변경하고, 뒤의 열을 나중에 변경하는 것이다. 이는 또 언어에 따라 다르다고 한다.

물리삭제와 논리삭제

물리삭제는 정말 물리적으로 데이터베이스에서 해당 값을 지워버리는 것이고, 논리삭제는 삭제했음을 의미하는 플래그를 갱신하는 것으로 이 데이터가 삭제됐음을 간접적으로 나타내는 방법이다.

물리삭제를 하면 그만큼 데이터가 정말 지워지기 때문에 용량상 이점을 얻을 수 있겠지만, 만약 그 데이터가 이후에 필요할 때에는 다시 복구하지 못 할 것이다. 논리삭제는 반대로, 삭제되기 이전으로 간단하게 되돌릴 수 있지만, 데이터가 커지면 커질 수록 용량도 증가하고, 검색 속도도 늘어날 것이다.

따라서 둘의 장단점이 각각 존재하기 때문에, 상황에 맞춰 적절한 삭제 방식을 선택하는 것이 중요하다.

profile
학부생

0개의 댓글