
- 들어가기 전에
- 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 ~ 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%';


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%';


대소문자를 구분하는 예약어는 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를 사용하지 않고 스페이스바만으로도 별칭을 붙여줄 수 있다. 그러나, 이때 새로 이름 짓는 변수명에 띄어쓰기가 있다면 인식이 되지 않으므로 띄어쓰기가 있는 변수명을 따옴표('')로 묶어야 한다.
'Database > MySQL' 카테고리의 다른 글
[Programming][MySQL] NULL 값 다루기(Feat. 카카오 주가 데이터) (0) | 2021.07.25 |
---|---|
[Programming][MySQL] 연산을 할 수 있는 다양한 함수(Feat. 카카오 주가 데이터) (0) | 2021.07.25 |
[Programming][MySQL] ORDER BY / GROUP BY / LIMIT(Feat. 카카오 주가 데이터) (0) | 2021.07.24 |
[Programming][MySQL] DATE (날짜/시간) 함수(Feat. 카카오 주가 데이터) (0) | 2021.07.24 |
[Programming][MySQL] Workbench로 데이터 Import하기(Feat. 카카오 주가 데이터) (0) | 2021.07.22 |
댓글