MySQL 8.0 공식문서를 참고하였으며, 직접 실습한 부분은 터미널 캡쳐본으로 정리했습니다. 🤓
테이블을 생성하고, 데이터를 로드/검색 하는 것 보다 쿼리를 실행하는 방법에 대해 아는 것이 더 중요하므로
mysql 작동방식을 이해할 수 있는 몇 쿼리들로 쿼리 입력의 기본 원리에 대해 먼저 알아본다.
다음은 버전 번호와 현재 날짜를 알려달라고 서버에 요청하는 간단한 쿼리입니다.
mysql> SELECT VERSION(), CURRENT_DATE;
+-----------+--------------+
| VERSION() | CURRENT_DATE |
+-----------+--------------+
| 5.8.0-m17 | 2015-12-21 |
+-----------+--------------+
1 row in set (0.02 sec)
mysql>
위 쿼리 결과를 통해 알 수 있는 몇가지 사항이 있습니다
mysql 작동방식
- 쿼리는 일반적으로 SQL 문과 세미콜론으로 구성됩니다. 세미콜론을 생략할 수 있는 예외도 있습니다. (ex: QUIT)
- 쿼리를 실행하면 mysql은 실행을 위해 서버로 전송하고 결과를 표시한 다음 다른 mysql> 프롬프트를 인쇄하여 다른 쿼리에 대한 준비가 되었음을 나타냅니다.
- mysql은 쿼리 출력을 표 형식(행 및 열)으로 표시합니다. 첫 번째 행에는 열 레이블이 포함되며, 다음 행은 쿼리 결과입니다. 일반적으로 열 레이블은 데이터베이스 테이블에서 가져오는 열 이름입니다. 하지만 테이블 열이 아닌 식 값을 검색하는 경우(위 예시처럼), mysql은 식 자체를 열 레이블로 지정합니다.
- mysql은 반환된 행 수와 쿼리 실행 시간을 보여 주며, 서버 성능에 대한 대략적인 정보를 제공합니다. 이러한 값은 시계 시간(CPU나 컴퓨터 시간이 아님)을 나타내며 서버 로드 및 네트워크 지연과 같은 요인에 의해 영향을 받아 정확하지는 않습니다.
키워드는 대소문자를 구별하지 않아 아래 쿼리는 모두 동일합니다.
mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;
쿼리로 간단한 계산도 가능합니다
mysql> SELECT SIN(PI()/4), (4+1)*5;
+------------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+------------------+---------+
| 0.70710678118655 | 25 |
+------------------+---------+
1 row in set (0.02 sec)
docs 예시를 약간 변형해서 실행한 결과
, 으로 구분 된 식들이 각 열의 label로
결과 값은 row값으로 나타나는 것을 볼 수 있습니다.
지금까지 보여진 쿼리는 비교적 짧은 단일문이었지만, 한 줄에 여러 문을 입력할 수도 있습니다. 각 항목은 세미콜론으로 끝냅니다.
mysql> SELECT VERSION(); SELECT NOW();
쿼리는 한 줄에 모두 지정할 필요는 없이 여러 줄이 필요한 긴 쿼리도 가능합니다.
mysql은 입력 줄의 끝을 찾는 것이 아니라 종료 세미콜론을 찾아 쿼리 끝의 위치를 결정합니다. (즉, mysql은 입력 line을 수집하지만 세미콜론을 볼 때까지 실행하지 않는다.)
mysql> SELECT
-> USER()
-> ,
-> CURRENT_DATE;
실행 결과를 보면, 위에서 이미 한 번 실행했던
mysql> SELECT VERSION(), CURRENT_DATE;
와 동일함을 알 수 있습니다
SELECT라는 같은 키워드 아래 식이 존재함으로 SELECT 아래 -> 에 식과 , 을 입력하고 ;으로 쿼리를 마쳐주는 것입니다.
즉 다중 행 쿼리의 첫 번째 줄을 입력한 후 프롬프트가 mysql>에서 ->로 변경되는 것은 mysql이 아직 완전한 문을 보지 못했고 나머지를 기다리고 있다는 것을 나타내는 방법입니다.
이러한 프롬프트의 피드백을 참고하면 mysql이 현재 필요한 것이 무엇인지 쉽게 알 수 있습니다. 👍
입력 중인 쿼리를 실행하지 않으려면 \c 를 입력하여 쿼리를 취소합니다.
mysql> SELECT
-> USER()
-> \c
mysql>
❗️이 때 대문자 C를 사용하지 않도록 주의해야 합니다. (문제는 없지만, 작동하지 않습니다.)
프롬포트 | 의미 |
---|---|
mysql > | 새 쿼리 준비 |
-> | 다음 줄 다중 줄 쿼리 대기 중 |
'> | 다음 줄을 기다리며, 한 개의 따옴표(')로 시작하는 문자열 완료를 대기 |
"> | 다음 줄을 기다리며, 큰따옴표(")로 시작하는 문자열 완료를 대기 |
"> | 다음 줄을 기다리며, 백티크(')로 시작하는 식별자 완료를 대기 |
/*> | 다음 줄을 기다리며, /*로 시작하는 코멘트의 완료를 대기 |
case 1
mysql> SELECT USER() ->
위 예시에서는 -> 에
;
를 입력해야 합니다.
case 2
mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30; '>
'> 및 "> 프롬프트는 문자열 수집 중에 발생합니다(MySQL이 문자열의 완료를 기다리고 있음을 나타냄)
MySQL 에서는 ' or " 로 둘러쌓인 문자열을 쓸 수 있습니다.
위 예시는 'Smith 뒤에 ' 가 누락된 문제가 있습니다.
이를 해결하는 가장 간단한 방법은 쿼리를 취소하는 것입니다.
그러나 mysql은 \c 를 수집 중인 문자열의 일부로 해석 합니다.
따라서 아래와 같이 ' 로 먼저 문자열을 마무리하고 \c 를 입력해야 합니다.
mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30;
'> '\c
mysql>
위 표의 다른 프롬포트 메시지도 '> 와 유사한 의미를 가집니다.
✅ check
실수로 unterminated string을 입력하는 경우 mysql이 다음 입력문도 인식하지 못하므로 반드시 terminating quote를 먼저 제공하고 현재 쿼리를 종료해야 합니다
reference link