[MySQL] 데이터 검색

김재현·2022년 10월 13일
0

sql

목록 보기
7/12
post-thumbnail

깃허브 : TIL 저장소

MySQL 공부 내용을 깃허브 TIL 저장소에 정리를 해두었습니다. 이를 수행하고자 하는 작업을 기준으로 문법들을 다시 정리를 해보고자합니다. 이번 게시글에서는 테이블에서 데이터를 검색할 때 사용할 수 있는 문법을 정리해보았습니다.


1. SELECT/FROM 구

SELECT *
FROM tablename;

SQL은 영어를 조금할 수 있다면, 직관적으로 이해가 될 수 있도록 문법이 구성되어있습니다. 위의 쿼리문은 '해당 테이블에서 모든 열들을 가져오라'는 의미를 담고 있습니다.

SELECT는 테이블에서 데이터를 조회할 수 있도록 하는 명령어입니다. 말 그대로 조회이기 때문에 형태를 변형하더라도 원본 데이터에는 영향을 미치지 않습니다. 이제 이 SELECT문과 함께 사용할 수 있는 문법들을 소개해보고자 합니다.


1.1 AS

-- 컬럼명 별칭 생성
SELECT column AS newcolumnname
FROM tablename;

-- 테이블명 별칭 생성
SELECT newtablename.column
FROM tablename AS newtablename;

AS는 Alias의 약자로 별칭을 지어주는 역할을 합니다. 컬럼과 테이블 모두에 별칭을 부여할 수 있습니다. AS는 생략이 가능합니다.

SELECT/FROM구와 WHERE구는 동시에 실행 됩니다. 그래서 앞에서 지정한 AS를 사용할 수 없습니다. 하지만 이후에 소개할 GROUP BY, HAVING구, ORDER BY구는 그 이후에 실행됩니다. 그래서 앞에서 지정한 별칭을 사용할 수 있습니다.


1.2 DISTINCT

-- 검색한 결과의 중복 제외
SELECT DISTINCT column1
FROM tablename

DISTINCT는 테이블에서 조회한 결과의 중복된 값을 제외하고 싶을 때 사용합니다. 예로 들어 주문 데이터에서 상품의 카테고리가 어떤 것들이 있는지 조회할 때 중복을 제외하기 위해 사용할 수 있습니다.

1.2.1 Aggregate Function

FunctionDescription
COUNT총 갯수를 계산해주는 함수
SUM합계를 계산해주는 함수
AVG평균을 계산해주는 함수
MIN가장 작은 값을 찾아주는 함수
MAX가장 큰 값을 찾아주는 함수
FIRST첫번째 결과값을 리턴하는 함수
LAST마지막 결과값을 리턴하는 함수

DISTINCT는 집계함수와도 함께 사용됩니다. 중복을 제외한 카테고리의 수는 얼마나 되는지 계산을 할 때 사용할 수 있죠. 그리고 집계함수 중에서 AVG 함수를 사용을 할 때는 주의를 해야합니다.

SELECT AVG(columnname)
FROM tablename

AVG 함수는 데이터에 NULL 값이 있으면 이를 무시하고 계산합니다. 그래서 총합을 NULL 값을 제외한 수로 나눕니다. 데이터 정합성 체크를 하고 NULL값이 없다면 상관이 없지만, 만약 있다면 다음의 방법을 사용해야 합니다.

SELECT SUM(columnname)/COUNT(*)
FROME tablename

COUNT(*)은 NULL 값을 포함한 전체 행의 수를 카운트해줍니다. NULL 값을 무시하지 않고 계산을 하기 위해서는 이와 같은 방법을 사용해야 합니다.


1.3 CONCAT

SELECT CONCAT('정답 :', colmname 또는 문자열)
FROM tablename;

데이터베이스에서 검색한 결과를 특정한 형태로 나타내기위해서 문자열을 합치는 함수를 사용할 수 있습니다. MySQL에서는 CONCAT을 사용합니다. 다른 데이터베이스에서는 '+'와 '||'를 사용하기도 하니 참고해주시기 바랍니다.


1.4 조건문

조건문을 활용하여, 데이터베이스의 데이터를 원하는 형태로 반환받을 수 있습니다. 그 방법으로 CASE문, IF문, COALESCE문을 소개하고, 피봇테이블은 어떻게 만드는지 간단히 이야기해보도록 하겠습니다.

1.4.1 CASE문

SELECT CASE WHEN condition1 THEN result1
            WHEN condition2 THEN result2
            ...
            ELSE result3
       END
FROM tablename

CASE문의 기본 형태입니다. WHEN 뒤에 조건을 주어 이를 만족한다면 내가 원하는 결과를 반환 받을 수 있도록 작성합니다. 만약 앞에서 언급한 조건이 모두 아니라면 ELSE 뒤에 있는 값으로 반환을 받게 되는데, 값을 입력하지 않으면 NULL이 기본값으로 들어가게 됩니다.


1.4.2 IF문

SELECT IF(조건, 조건이 True일 때, 조건이 false일 때)
FROM tablename

IF문의 기본 형태입니다. CASE문에 비해 비교적 길이가 짧습니다. 조건이 하나일 때는 IF문을 사용하고, 하나보다 많을 때는 CASE문을 사용하여 쿼리문을 작성할 수 있습니다.


1.4.3 COALESCE문

SELECT a
     , COALESCE(a, 0)
FROM tablename

COLLESCE문은 NULL 값을 다루기 위해 사용합니다. 컬럼 a가 NULL이 아니면 a, NULL이면 0으로 반환됩니다.


1.4.4 피봇테이블

idavg
13.5
27.0

피벗 테이블은 데이터 처리의 한 기법입니다. 유용한 정보에 집중할 수 있도록 하기 위해 통계를 정렬 또는 재정렬합니다. 위와 같은 테이블의 형태를 조건문을 통해 피봇테이블을 만들 수 있습니다.

SELECT CASE WHEN id=1 THEN avg END AS id1_avg
     , CASE WHEN id=1 THEN avg END AS id2_avg
FROM tablename
id1_avgid2_avg
3.57.0

이와 같은 방법으로 데이터를 재정렬 할 수 있습니다.


2. WHERE 구

SELECT column1, colum2, ...
FROM tablename
WHERE condition;

데이터베이스의 행의 숫자가 많으면 처리 속도가 느려질 수 있습니다. 이때 WHERE구를 통해 행 속에서만 필요한 데이터만 먼저 필터링 해서 데이터를 조회할 수 있습니다.

SQL에서는 구의 순서가 정해져 있어 순서를 바꿀 수 없습니다. SELECTFROM이 나온 이후에 WHERE구를 사용할 수 있습니다. 그렇지 않으면 에러가 발생합니다.

2.1 IS NULL / IS NOT NULL

-- NULL값 조회
SELECT *
FROM tablename
WHERE columnname IS NULL;

-- NULL이 아닌 값을 조회
SELECT *
FROM tablename
WHERE columnname IS NOT NULL;

NULL 혹은 NaN(not a number)은 비어있는 값을 의미합니다. SQL에서는 NULL값이 0으로 처리되지 않아 연산을 해도 NULL이 된다.


2.2 연산자

  • 비교 연산자
비교 연산자논리 연산자
A=BA와 B가 같다
A>BA가 B보다 크다 (초과)
A<BA가 B보다 작다 (미만)
A>=BA가 B보다 크거나 같다 (이상)
A<=BA가 B보다 작거나 같다 (이하)
A<>BA가 B보다 크거나 작다 (같지 않다)
A!=BA와 B가 같지 않다
  • 논리 연산자
연산자의미
AND두 조건을 모두 만족하면 TRUE
OR두 조건 중 하나라도 만족하면 TRUE
NOT조건을 만족하지 않으면 TRUE
BETWEEN조건이 범위안에 있으면 TRUE
IN조건이 목록에 있으면 TRUE
LIKE조건이 패턴에 맞으면 TRUE

WHERE구 뒤에 나오는 조건에는 비교 연산자와 논리 연산자를 활용할 수 있습니다. 그 중에서 기억해둘만한 것들을 따로 정리해 보았습니다.


  • BETWEEN vs AND
# BETWEEN
SELECT * FROM Customers
WHERE customerID BETWEEN 3 AND 5

# AND
SELECT * FROM Customers
WHERE customerID >= 3 AND customerID <=5

BETWEEN은 AND로 연결된 두 숫자를 모두 포함합니다. 처음 사용할 때 해당 숫자를 포함하는지, 하지 않는지 헷갈렸던 경험이 있습니다.

  • OR vs IN
# OR
SELECT * FROM customers
WHERE country = 'Germany' OR country = 'France' OR country = 'British'

# IN
SELECT * FROM customers
WHERE country IN ('Germany', 'France', 'British')

포함하는 내용이 얼마 없다면 OR을 사용할 수 있지만, 구문이 길어질 경우에는 IN을 활용하는 것이 훨씬 깔끔합니다.

  • LIKE
SELECT * FROM tablename
# a로 시작하는 경우
WHERE columnname LIKE 'a%';

# a로 끝나는 경우
WHERE columnname LIKE '%a';

# a가 포함된 경우
WHERE columnname LIKE '%a%';

# a가 두번째에 글자에 포함될 경우
WHERE columnname LIKE '_a%';

# a로 시작하고 최소 두글자 이상인 경우
WHERE columnname LIKE 'a_%';

# a로 시작하고 b로 끝나는 경우
WHERE columnname LIKE 'a%b';

# 요소가 2개 이상인 경우
WHERE columnname LIKE '%,%';

원하는 문자가 명확하게 있으면 비교연산자(=)를 사용하는 것이 훨씬 속도가 빠릅니다. 하지만 그렇지 않고 패턴으로 찾을 경우에는 Like를 사용해야 합니다. '%'나 '_'와 같은 예약어로 인식하지 않게 하기 위해서는 이스케이프 문자를('\') 사용합니다.

  • NOT
-- NOT 연산자를 사용하지 않을 경우
SELECT * FROM people
WHERE SEX != 'F'

-- NOT 연산자를 사용할 경우
SELECT * FROM people
WHERE NOT SEX = 'F'

비교연산자와 함께 NOT 연산자를 활용할 수 있습니다.

연산자NOT 연산자
BETWEENNOT BETWEEN
INNOT IN
LIKENOT LIKE

논리 연산자와 함께 NOT 연산자를 활용할 수도 있습니다. NOT 연산자을 사용할 때, 위치를 헷갈렸던 적이 있어서 따로 정리해보았습니다.


3. ORDER BY 구

SELECT column1, colum2, ...
FROM tablename
ORDER BY column1 ASC, column2 DESC;

ORDER BY 구는 특정 컬럼을 기준으로 오름차순 혹은 내림차순으로 정렬 할 때 사용합니다. 오름차순은 ASC로 표기하며, 기본값이기 때문에 뒤에 컬럼명 뒤에 아무것도 입력하지 않으면 자동으로 오름차순 정렬이 됩니다. 내림차순은 DESC로 표기합니다.

NULL 값은 정렬하는 방법이 데이터베이스 제품마다 기준이 다릅니다. NULL값은 특성상 대소비교를 할 수 없기 때문입니다. MySQL에서는 NULL값을 가장 작은 값으로 취급합니다.


4. LIMIT 구

SELECT *
FROM tablename
LIMIT number;

데이터베이스의 데이터가 많으면 조회해보는 것만으로도 많은 시간을 소요할 수 있습니다. 이런 경우에 LIMIT을 활용하여 주어진 숫자만큼의 데이터를 빠르게 확인할 수 있습니다.

-- b행부터 a건의 데이터를 조회한다.
SELECT *
FROM tablename
LIMIT a
OFFSET b

OFFSET의 기본값은 0으로 되어있어, 입력하지 않으면 가장 위에있는 데이터 n개를 조회할 수 있습니다. 만약 OFFSET을 설정하면 특정 행부터 n개의 데이터를 조회할 수 있습니다.

0개의 댓글