3.2. 쿼리 입력하기
이전 섹션에서 설명 하였듯이 여러분은 서버에 연결 되어 있어야 한다. 이제 쿼리를 만드는 방법에 대해 배워 보도록 한다. 이 섹션에서는, 여러분이 정확히 알고 있는 몇몇 쿼리를 사용해서 명령어를 입력하는 기본 원칙에 대해 설명하기로 한다.
여기에 있는 간단한 명령어는 서버가 현재의 날짜와 버전을 보여주도록 하는 것이다. 여기에 있는 대로 mysql> 프롬프트 다음에 입력을 한 후 엔터키 (Enter)를 누른다:
mysql> SELECT VERSION(), CURRENT_DATE;
+-----------------+--------------+
| VERSION() | CURRENT_DATE |
+-----------------+--------------+
| 5.1.2-alpha-log |
+-----------------+--------------+
1 row in set (0.01 sec)
mysql>
이 쿼리는 mysql에 대한 몇 가지 내용을 설명하고 있다:
· 일반적으로 명령어는 세미콜론이 뒤에 나오는 SQL명령문으로 구성된다. (세미 콜론이 생략되는 예외적인 경우도 있다. 앞에서 언급한 QUIT 의 경우가 이 중 하나이다. 다른 것들은 나중에 보기로 한다.)
· 명령어를 입력하면, mysql은 이 명령어를 서버에 보내서 실행을 하고 그 결과를 화면에 보여준 후에 또 다른 mysql> 프롬프트를 내 보내서 다른 명령어를 받아들일 준비가 되었음을 알려준다.
· mysql는 쿼리 결과를 표 형식 (열과 행이 있는)으로 보여 준다. 첫 번째 열에는 행의 레이블이 있다. 그 다음 열은 쿼리의 결과 값이다. 일반적으로, 컬럼 레이블은 데이터 베이스에서 가져오는 컬럼 이름이 된다. 만약에 위에서 보여준 것과 같이 테이블 컬럼이 아닌 수식 결과 값을 얻고자 한다면, mysql은 수식 자체가 된다.
· mysql 은 얼마나 많은 줄을 생성하였고 쿼리를 처리하는데 얼마의 시간이 소모되었는지에 대한 정보를 보여 주는데, 이러한 것들은 서버의 성능에 대한 대략적인 정보를 제공해 준다. 이러한 값들은 정확한 값들이 아닌데, 그 이유는 대략적인 처리 시간 (CPU, 머신 타임이 아님)만을 나타내고, 서버의 로드 및 네트워크의 성능에 결과 값이 영향을 받기 때문이다.
키워드들은 어떤 문자 형식 (대/소 문자)로도 입력할 수 있다. 아래의 쿼리는 모두 동일한 것들이다:
mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;
여기에 또 다른 쿼리가 있다. 이 쿼리는 mysql을 간단한 계산기 형태로 사용하는 예를 나타내는 것이다:
mysql> SELECT SIN(PI()/4), (4+1)*5;
+------------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+------------------+---------+
| 0.70710678118655 | 25 |
+------------------+---------+
1 row in set (0.02 sec)
지금까지 보여진 쿼리들은 상대적으로 간단한 단일 라인 명령문들이었다. 하나의 라인에 여러 개의 명령문을 입력하는 것도 가능하다. 각각의 명령문들은 세미콜론으로 구분한다:
mysql> SELECT VERSION(); SELECT NOW();
+-----------------+
| VERSION() |
+-----------------+
| 5.1.2-alpha-log |
+-----------------+
1 row in set (0.00 sec)
+---------------------+
| NOW() |
+---------------------+
|
+---------------------+
1 row in set (0.00 sec)
명령어는 하나의 라인에서만 표현될 필요는 없고, 여러 라인이 필요한 긴 명령어를 입력하는 것도 문제가 없다. mysql은 여러분이 입력하는 명령문을 입력 라인의 끝으로 구분하는 것이 아니라, 명령문의 끝을 가리키는 세미콜론을 가지고 구분한다. (다른 말로 표현하면, mysql은 프리-포맷(free-format) 입력을 수용한다: mysql은 세미콜론이 나타날 때까지 모든 입력 라인을 실행하지 않는다.)
여기에 간단한 다중 라인 명령문이 있다:
mysql> SELECT
-> USER()
-> ,
-> CURRENT_DATE;
+---------------+--------------+
| USER() | CURRENT_DATE |
+---------------+--------------+
| jon@localhost |
+---------------+--------------+
이 예문에서, 여러분이 다중 라인 쿼리의 처음 라인을 입력한 후에 프롬프트가 mysql>에서 ->로 변하는 것을 주목하자. 이것은 mysql이 아직 완전한 명령문을 가지지 않았고 나머지 부분이 입력되기를 기다리고 있다는 것을 나타내는 것이다.
만약에 여러분이 명령어를 입력하는 도중에 입력한 명령어를 실행시키고 싶지 않을 경우, \c를 통해 취소 명령을 내릴 수 있다:
mysql> SELECT
-> USER()
-> \c
mysql>
여기에서도 역시 프롬프트의 변화를 주목하자. 프롬프트는 \c 이후에 mysql>로 다시 복귀되었으며, mysql은 새로운 명령어를 실행할 준비가 되었음을 나타낸다.
아래의 테이블은 여러분이 볼 수 있는 프롬프트의 형태이며, 각 프롬프트가 의미하는 mysql의 상태를 정리한 것이다:
|
Prompt |
Meaning |
|
mysql> |
Ready for new command. |
|
-> |
Waiting for next line of multiple-line command. |
|
'> |
Waiting for next line, waiting for completion of a string that began with a single quote (‘'’). |
|
"> |
Waiting for next line, waiting for completion of a string that began with a double quote (‘"’). |
|
`> |
Waiting for next line, waiting for completion of an identifier that began with a backtick (‘`’). |
|
/*> |
Waiting for next line, waiting for completion of a comment that began with /*. |
다중 라인 명령문들은 주로 여러분이 단일 라인 명령문을 입력한 후에 실수로 세미콜론을 입력하지 않을 경우에 일어난다. mysql은 이러한 경우에 입력 사항이 더 있는지를 기다린다:
mysql> SELECT USER()
->
이러한 일이 일어나면 (모든 명령어를 다 입력을 하였지만 -> 프롬프트가 나타나면), 대부분의 경우 mysql은 세미콜론을 기다리고 있는 것이다. 명령문을 완료하기 위한 세미콜론을 입력하게 되면, mysql은 쿼리를 실행한다:
mysql> SELECT USER()
-> ;
+---------------+
| USER() |
+---------------+
| jon@localhost |
+---------------+
'> 과 "> 프롬프트는 스트링 콜렉션 동안 나타난다 (다른 말로 표현하면, MySQL은 문장이 완료되길 기다린다). MySQL에서는 ‘'’ 또는 ‘"’ 문자를 가지고 문장을 쓸 수 있고 (예를 들면, 'hello' 또는 "goodbye"), mysql은 문장을 여러 개의 라인에 걸쳐 입력할 수 있게 한다. '> 또는 "> 프롬프트를 보게 되면, 이것은 여러분이 ‘'’ 또는 ‘"’로 시작되는 문장을 입력했으나, 아직까지 이 문장을 맺기 위해 나머지 인용 부호를 입력하지 않고 있다는 것을 의미한다. 이것은 종종 실수로 인용 부호를 누락하고 있다는 것을 가리켜 주기도 한다. 예를 들면:
mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30;
'>
위와 같은 SELECT 명령문을 입력하였다면, Enter를 누르고 결과를 기다린다고 하더라도 아무런 일이 일어나지 않는다. 이 쿼리가 너무 오래 걸린다고 의심하지 말고, '> 프롬프트가 의미하는 것이 무엇인지를 찾아야 한다. 이 프롬프트는 mysql이 지금 문장을 완성하기 위해 무엇인가를 기다리고 있다는 것을 나타내고 있는 것이다.
이 시점에서, 여러분이 할 수 있는 일은 무엇인가? 가장 간단한 것은 명령을 취소하는 것이다. 하지만, 이와 같은 경우에는 \c 만을 입력해서 종료할 수 없는데, 그 이유는 mysql이 이것을 문장의 일부분으로 해석하기 때문이다. 이렇게 하는 것 대신에, 문장 종료 문자를 입력하고 (mysql이 문장의 끝임을 알게끔), 그 후에 \c를 입력한다:
mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30;
'> '\c
mysql>
프롬프트는 다시 mysql>로 변하고, mysql은 새로운 명령어를 기다리게 된다.
`> 프롬프트는 '> 과 "> 프롬프트와 유사하지만, 여러분이 역방향 (backtick-quoted) 인용 부호로 시작한 식별자를 완성하지 않았음을 가리킨다.
'>, ">, 및 `> 프롬프트가 의미하는 것이 무엇인지 아는 것이 중요한데, 그 이유는 여러분이 실수로 완료 (unterminated)가 되지 않은 문장을 입력한다면, 그 이후의 모든 라인들이- QUIT 을 갖고 있는 문장 포함해서-mysql에 의해 무시되기 때문이다. 만약에 여러분이 현재의 명령어를 취소하기 전에 문장 종료용 인용 부호를 입력해야 한다는 것을 모르고 있을 경우에는 특히 혼란을 일으킬 수 있는 사항이다.