본문 바로가기

CS+/SQL

Mysql - DML 01 - select, desc, where , order by

mysql workbench 로 작업을 합니다. 

쿼리문에서 쓰이는 db는 한빛미디어의 'sql첫걸음'책에 나온 예제 데이터를 활용해서 실습을 진행하겠습니다. 

 

1) 확인(조회) 

> SELECT * FROM 테이블명; 

 

* 애스터리스크는 모든 열을 뜻하는 메타문자입니다. from 다음에는 테이블명이 옵니다. 그리고 명령문 마지막에는 항상 ; 세미콜론을 붙여줍니다. 위의 명령어는 select * 라는 select 구와 from sample21 이라는 from 구 2가지의 구로 나눌 수 있습니다. 이를 결정하는 것은 select, from 과 같은 예약어입니다.

 

데이터베이스에서 테이블처럼 데이터를 저장하거나 관리하는 '어떤 것'을 '데이터베이스 객체'라고 부릅니다. 테이블말고는 '뷰(view)'라는 것이 있습니다. 같은 이름의 '데이터베이스 객체'를 만들 수 없고, 예약어와 동일한 이름의 '데이터베이스 객체'도 만들 수 없습니다. 'SELECT'라는 이름의 테이블은 만들 수 없습니다. 마지막으로,

예약어와 데이터베이스 객체명대소문자를 구별하지 않습니다.

 

select * from sample21;

SELECT * FROM SAMPLE21;

 

모두 동일하게 작용합니다. 

 

헷갈리지 마세요. 대부분의 데이터베이스 제품들은 데!이!터!의 대소문자는 구별합니다. 단, 설정에 따라 구별하지 않기도 합니다. 

위에서 대소문자 구별이 안된다고 하는 것은 예약어 와 데이터베이스 객체 2가지를 말합니다.

 

테이블에 나온 결과를 보면 데이터의 타입들이 '수치형', '문자열형', '날짜시간형' 이렇게 나뉩니다. 

NULL 이라는 것은 아무것도 저장되어 있지 않은 상태를 의미합니다. 

 

1_2) 테이블 구조 살펴보기 

> desc 테이블명;

 

sample21 테이블을 desc 명령어로 살펴보면 위와 같습니다. Field에는 열 이름, Type 에는 '자료형'이 나옵니다. Null은 null값을 허용하는 지 여부를 말합니다. key는 key로 지정되어 있는지를 나타내면 default는 그 열에 주어진 '기본값'을 의미하는데, 생략했을 때, 적용되는 값이라고 보면 됩니다. 

 

1_3) 자료형

https://bit.ly/2uUKJcM

 

MySQL 필드 데이터 타입(자료형) 총정리

MySQL 5.0 기준 데이터 자료형을 정리했습니다~항상 DB를 설계하다보면 몇바이트였지? 몇까지 지원됐...

blog.naver.com

자료형에 대한 것은 위 링크를 참고해주세요. 

 

** CHAR vs VARCHAR

 두 형의 차이는 바로 고정형과 가변형에 있습니다. 말 그대로 CHAR형은 고정된 바이트로 기록을 하고, VARCHAR는 입력된 데이터에 따라 용량을 가변시켜 저장하죠. 한 예로 8글자의 아이디를 저장할 경우 아래의 표와 같이 CHAR형은 8byte, VARCHAR형은 7byte를 사용하게 됩니다. (VARCHAR형은 저장된 문자 + 길이 기록용 1byte)

 

출처: https://bit.ly/2uUKJcM

 

 때문에 데이터에 맞추어 길이를 짤라주는 VARCHAR형이 지정된 크기로 저장되는 CHAR형보단 저장 용량면에선 유리합니다. 하지만 VARCHAR형은 데이터에 따라서 짤라서 저장하기 때문에 내부적으로 엉켜있겠죠. 하지만 CHAR형의 경우 항상 정해진 용량을 채워 저장하기 때문에 차곡차곡 데이터를 쌓아두어 깔끔하게 저장되기 때문에 검색면에서 훨씬 유리합니다.

 

 회원 정보를 예로 들자면, 검색을 많이 하고 비교적 일정한 길이의 아이디 같은 경우 CHAR형으로 저장하고, 이메일 같이 길이가 유동적이고 검색을 별로 하지 않는 데이터의 경우 VARCHAR형으로 저장하는게 유리합니다.

(실제 두 형의 체감 검색 속도 차이는 개미똥구멍 만한 차이겠지만, 데이터가 많아지면 얘기가 달라지겠죠? 항상 목적에 맞는 정확한 타입을 쓰는 습관을 들이는게 좋을듯 싶네요~)

 

CHAR형은 용량은 많이 차지하지만 검색에 유리하고,

VARCHAR형은 용량은 적게차지 하지만 검색에서 불리하죠.

 

위 링크에 다 나와 있는 내용이지만 위 링크 안의 내용을 자세히 안 본다는 가정하에 위 부분만 일단 이 포스팅에 가져왔습니다. 저 부분만이라도 읽어보시면 좋겠습니다 :) 

 

1_3) 검색 조건 지정하기 

> select 열1, 열2 from 테이블명 where 조건식 

 

화면에 표시할 때는 행이나 열을 선택하여 데이터베이승서 데이터를 읽어오는, 다시 말해 '검색'이 빈번하게 일어납니다.

행을 선택할 때는 WHERE 구를 사용하며, 열을 선택할 때는 SELECT 구를 사용합니다. 

 

이제, select 구에서 특정 열을 지정해보겠습니다. 

 

지금까지 * 애스터리스크를 통해 전체 열을 골랐지만, 이제는 2개의 열(no,name)을 선택해서 출력해보았습니다. 

열 지정 순서는 임의로 정할 수 있습니다. 테이블에서 열이 정의된 순서와 동일한 순으로 지정할 필요는 없습니다.

point! select 구에서 결과로 표시하고 싶은 열을 지정할 수 있다!

 

이제 where 조건식을 써보겠습니다. 

 

where 구의 조건에 일치하는 행만 결과로 반환되는 것을 볼 수 있습니다. 

위 쿼리문에서는 no 열 값이 2인 행만을 보여줍니다. 조건식은 비교 연산자를 통해 참 또는 거짓의 진리값을 반환합니다. 

 

<> 연산자는 서로 다른 값인 것을 출력합니다. 위 쿼리에서는 no 열 값이 2가 아닌 행들을 보여주라는 의미가 됩니다. 

 

문자열형의 상수는 싱글쿼터(' ')로 둘러싸서 표기해야 합니다. 날짜시간형의 경우 연월일을 하이픈(-) 으로 구분합니다. 

시각은 시분초를 콜론(:)으로 구분하여 표기합니다. 

 

+) null 값 검색 

null값의 경우  = NULL 의 표기가 아닌 IS NULL 을 사용합니다. 

 

정리하면 

  • = 연산자 : 좌변과 우변의 값이 같을 경우 참이 된다
  • <> 연산자 : 좌변과 우변의 값이 다를 경우 참이 된다. 
  • IS NULL : NULL값 검색은 IS NULL을 통해서 한다.

1_4) 정렬 - order by 

> select 열명 from 테이블명 where 조건식 order by 열명 

 

select 명령에서 order by 구를 지정하면 검색 결과의 행 순서를 바꿀 수 있습니다. order by 구를 지정하지 않을 경우에는 데이터베 이스 내부에 저장된 순서로 반환됩니다. 아래와 같은 테이블을 정렬 해보겠습니다. 

 

기본적으로 오름차순입니다.  내림차순을 원한다면 DESC를 붙여주면 됩니다. 

 

오름차순은 ASC 로 해주면 되지만 디폴트로 되어있으니깐 굳이 표기 안해줘도 됩니다. 정렬방법은 표기 안하면 ASC로 간주합니다. 즉, ORDER BY 의 기본 정렬방법은 오름차순입니다. 

수치데이터는 기본이 오름차순이고 내림차순으로 바꿀 수 있다 라는 사실을 알았습니다. 그러면, 문자열형의 데이터는 어떨까요?

 

보시다시피 문자열형 데이터의 대소 관계는 사전식 순서에 의해 결정됩니다.

재밌는 예를 보겠습니다.

 

똑같이 생겼지만 데이터타입이 전혀 다른 테이블이 있습니다. 

이를 문자타입의 a열 기준으로 정렬해보겠습니다. 

 

숫자 순서가 아닌 사전식 순서대로 1을 먼저 표기하고 그 다음인 10 이런 식으로 나열이 됩니다. 

 

수치형 칼럼인 b열로 정렬을 하면 오름차순이 올바르게 적용 된 것을 위를 통해서 확인할 수 있습니다. 

프로그래머스에 있는 문제를 하나 풀고 결과를 보겠습니다.

 

방금 위에서 배운 거 그대로 하시면 됩니다.

정렬을 어느 열 기준으로 해줄 지 문제에 나와 있으니 그대로 해주세요.

 

두 번째 문제입니다. 

 

똑같은 문제입니다. SELECT 에서 2개의 열만 선택해주면 됩니다 :)

 

 

 

 

 

 

 

 

이번 포스팅은 DML 중 기본인 SELECT 에서 검색과 정렬까지 하는 법을 살펴 보았습니다 :)