본문 바로가기
Database/MySQL

[Programming][MySQL] SQL 기본 문법(Feat. 카카오 주가 데이터)

by LydiaRyu 2021. 7. 23.
반응형

 

  • 들어가기 전에

- SQL 문이 하나일 경우는 상관없지만, 여러 개일 경우 끝에 세미콜론(;)을 적어야 한다. 

- 예약어(SQL을 실행할 때 내장되어 있는 키워드로 명령하는 언어)는 대문자로 작성하는 것을 권장한다.

 

1. 데이터 베이스 활성화

 

--앞으로 사용할 데이터 베이스 지정

USE data;
SELECT * FROM kakao;

-- Dot으로 테이블 선언

SELECT * FROM data.kakao;

--SCHEMAS 클릭하여 활성화 시킨 후 바로 테이블 선언

SELECT * FROM kakao;

 

2. SELECT / FROM 

 

  • SELECT는 테이블에서 가지고 오고 싶은 정보를 선택한다는 의미로 열, 연산 값, 파생변수 등을 지정할 수 있다. 

     * 은 모든 열을 조회한다는 의미로 왼쪽 그림과 같이 전체 열이 출력된다. 반면, 출력하고 싶은 열만 SELECT 뒤에 작성한 오른쪽 그림은 해당 열만 출력된다.

  • FROM은 불러오고 싶은 테이블을 지정하는 예약어이다.
-- 전체 열 출력
SELECT * FROM kakao;

-- 원하는 열만 출력
SELECT date, close, volume FROM kakao;

왼쪽: 전체 출력 / 오른쪽: 원하는 열만 출력

 

3. 조건에 맞는 값 산출하기

 

  • WHERE로 원하는 값들을 조건에 맞게 생성할 수 있다. TEXT 타입의 경우는 작은따옴표('')나 큰 따옴표("")로 설정하고, numeric(숫자) 타입의 경우에는 그냥 숫자만 써준다. 
SELECT * FROM kakao
WHERE month = 'August';

SELECT * FROM kakao
WHERE close <= 100000;

 

4. 조건에 맞는 숫자/ 문자 출력

 

  • 부등호 비교
SELECT * FROM kakao
WHERE date >= '2021-01-01';

SELECT * FROM kakao
WHERE month <> 'JULY';

왼쪽: >= / 오른쪽: <>

 

다음의 표와 같이 부등호를 통해서 조건에 일치하는 값을 산출한다. 

기호 설명
>= / > 같거나 크다(이상) / 보다 크다(초과)
<= / < 같거나 작다(이하) / 보다 작다(미만)
= 같다
<> / != 같지 않다

왼쪽 코드는 2021년부터의 데이터를 확인하고자 2021-01-01 이후의 데이터를 조건으로 넣었고, 오른쪽 코드는 7월이 아닌 값들만 산출하고자 같지 않다 (<>)는 조건을 넣었다.

 

  •  BETWEEN ~ AND / IN
SELECT * FROM kakao
WHERE date BETWEEN '2020-07-01' AND '2020-07-30';

SELECT * FROM kakao
WHERE month IN ('JUNE', 'JULY');

왼쪽:BETWEEN /  오른쪽: IN

 

BETWEEN ~ AND 구문을 사용하면, 원하는 범위의 값들을 산출할 수 있다. 1년 전(2020년) 7월 한 달 동안의 데이터를 산출하기 위해 BETWEEN '2020-07-01' AND '2020-07-30'으로 범위를 지정했다.

 

IN괄호() 뒤의 값을 가지고 오기 위한 예약어이다. 6월과 7월의 데이터만을 출발하고 싶다면 IN('JUNE', 'JULY')로 작성한다. 

 

  •  문자열 조건 
SELECT * FROM kakao
WHERE month LIKE 'O%';

SELECT * FROM kakao
WHERE month LIKE '%O%';

왼쪽: O% / 오른쪽: %O%

 

LIKE는 뒤에 나올 조건을 포함한다는 예약어이다. 왼쪽의 쿼리는 알파벳 O로 시작하는 문자를 출력하라는 의미인데, 'O%'와 같이 퍼센트(%) 기호를 붙이면 전부를 산출하라는 의미이다. 따라서, O로 시작하는 문자열 전부를 출력한다는 의미의 쿼리이다. 

 

응용하면, 오른쪽의 쿼리와 같이 '% O%'로 작성하면 알파벳 O를 포함하는 전체 문자를 출력하라는 의미로 November와 October 두 문자 모두 출력된다.

 

SELECT * FROM kakao
WHERE month LIKE 'A___l';

 

 

문자열을 출력하는 또 다른 방법은 언더바(_)이다. 언더바 1개당 한 글자를 의미하므로 퀴리 문은 A 뒤에 3글자(언더바 3개)가 오고 l로 끝나는 month 데이터를 출력하라는 의미이다.

 

아래 MySQL Manual에서 비교 함수를 다양하게 확인할 수 있다.

MySQL :: MySQL 8.0 Reference Manual :: 12.4.2 Comparison Functions and Operators

 

MySQL :: MySQL 8.0 Reference Manual :: 12.4.2 Comparison Functions and Operators

12.4.2 Comparison Functions and Operators Table 12.4 Comparison Operators Name Description > Greater than operator >= Greater than or equal operator < Less than operator <>, != Not equal operator <= Less than or equal operator <=> NULL-safe equal to ope

dev.mysql.com

 

  • 대소문자 구문
-- 대문자 알파벳 'O'
SELECT month FROM kakao
WHERE MONTH LIKE BINARY '%O%';

-- 소문자 알파벳 'O'
SELECT month FROM kakao
WHERE MONTH LIKE BINARY '%o%';

왼쪽: 대문자 O / 오른쪽: 소문자 o

 

대소문자를 구분하는 예약어는 BINARY이다. 찾고 싶은 문자열 조건 앞에 BINARY를 붙여주면 대소문자를 인식하고 위의 결과와 같이 대문자일 경우 October만 출력되는 반면, 소문자로 구분한 경우는 November, October 둘 다 출력되는 것을 볼 수 있다.

 

  • 이스케이핑(Escaping)

문자열 중에 %  ' "  _  / 와 같이 표현식인 동시에 문자에도 포함될 수 있는 기호가 있다. 이런 경우 쿼리문을 수행하면 표현식인지 실제 문자 값인지 분별하여 수행하지 못한다. 이러한 경우 역 슬래쉬를 붙여서 해결할 수 있는데, 이처럼 문자가 단순한 문자로 인식되도록 하는 것을 이스케이핑(escaping)이라고 한다. 

 

SELECT * FROM kakao
WHERE fluctuation LIKE '\-%';

 

변동이 마이너스(-)가 데이터만 출력하고자 이스케이핑을 활용하여 마이너스 기호 앞에 역 슬래쉬를 붙여 출력했다.

 

5. 여러 조건 출력하기

 

  • AND

AND는 동시에 충족하는 조건을 출력할 때 사용한다.  

SELECT * FROM kakao
WHERE date BETWEEN '2020-01-01' AND '2020-12-31' 
AND fluctuation LIKE '\-%';

 

2020년 1년 동안 마이너스를 기록했던 주(week)를 출력하고 싶을 때, 쿼리와 같이 2020년 1년 간의 기간과 마이너스로 시작하는 변동의 조건을 AND로 연결하여 작성한다.

 

  • OR

OR는 조건 1과 일치하거나 조건 2와 일치하는 모든 값을 산출하는 의미로, '또는' 혹은 '합집합'의 개념이다. 

 

SELECT * FROM kakao
WHERE date BETWEEN '2020-01-01' AND '2020-12-31' 
OR close < 100000;

 

2020년 1년간의 데이터이거나 종가(close)가 10만 원 아래인 데이터들만 산출했다. 이를 수행하기 위해, 2020년 1년 간의 기간과 종가가 10만 원 아래인 조건을 OR로 연결했다. 

 

OR에서 중요한 것은 같은 조건을 작성할 때, 변수까지 같이 작성해야 한다. 만약, 6월이거나 7월인 달은 산출하고 싶다고 해서 month = 'JUNE' OR 'JULY'로 하면 문자열인 경우 인식이 안되고 숫자인 경우 0은 False로 0을 제외한 값은 True로 조건을 인식한다. 따라서, month = 'JUNE' OR month = 'JULY'로 작성해야 한다.

 

  • 조건 간의 충돌 방지

AND와 OR를 사용하여 조건을 여러 개 작성할 때, 쿼리 수행 시간이 오래 걸려 Timeout이 나기도 하고 조건의 우선순위가 혼동되기도 한다. 

-- 괄호 미사용
SELECT * FROM kakao
WHERE date BETWEEN '2020-01-01' AND '2020-12-31' 
OR close < 100000
AND fluctuation LIKE '\-%';

-- 괄호 사용
SELECT * FROM kakao
WHERE (date BETWEEN '2020-01-01' AND '2020-12-31' 
OR close < 100000)
AND fluctuation LIKE '\-%';

왼쪽: 괄호 없는 경우 / 오른쪽: 괄호 있는 경우

 

AND와 OR를 같이 쓸 때, 쿼리는 AND를 우선적으로 인식한다.

 

왼쪽 결과와 같이 괄호를 사용하지 않으면 종가가 10만 원 이하이고, Fluctuation에 마이너스인 값 또는 2020년 1년 데이터를 불러오는 것으로 인식하여 Fluctuation에 마이너스가 아닌 값도 포함해서 산출된다.

그러나, 오른쪽과 같이 OR 절에 괄호를 작성하면 OR 절이 우선적으로 인식되어 종가가 10만 원 이하이거나 2020년 1년 데이터이면서 Fluctuation에 마이너스인 값을 불러오기 때문에 Fluctuation에 마이너스인 값만 출력된다.

 

만약 OR 조건을 우선적으로 인식되도록 하고 싶다면 괄호를 사용하여 우선시 되도록 작성한다. 

→ 조건절이 여러 개가 포함된 경우 수행 시간에도 영향을 미치기 때문에 OR를 사용할 때 괄호를 사용하는 편이 유용하기도 하다!

 

6. 별칭 붙이기

 

열(Column)에 이름을 붙이고 싶을 때 AS를 이용하여 만들어줄 수 있다. 이를 alias라고 한다.

 

SELECT SUM(volume) AS total_vol
FROM kakao;

 

  • 1년 동안 전체 거래량을 구하고자 SUM으로 거래량을 합해주고, 이 변수의 이름을 total_vol으로 붙였다. 데이터 결과 값에도 열(Column)의 이름이 total_vol으로 생성되었다. 

 

SELECT SUM(volume) total_vol
FROM kakao;

SELECT SUM(volume) 'total vol'
FROM kakao;

 

  • AS를 사용하지 않고 스페이스바만으로도 별칭을 붙여줄 수 있다. 그러나, 이때 새로 이름 짓는 변수명에 띄어쓰기가 있다면 인식이 되지 않으므로 띄어쓰기가 있는 변수명을 따옴표('')로 묶어야 한다. 
728x90

댓글