Chap 3. SQL 데이터 검색
카테고리: SQL
SQL을 공부하기 앞서 가장 중요한 개발 환경을 만들었다. 우선 교재에 따라 MySQL이라는 RDBMS를 채택하여 공부하기로 했다. 표준 SQL을 위주로 공부할거라 Oracle과 큰 차이는 없을거라 생각했다.
자세한 설치 방법은 아래 주소를 참고하였다. (물론 책에도 나와있었지만, 시청각 자료가 있음 훨씬 더 안정적이다.)
MySQL을 설치한 이후 나는 추가적으로 책에서 제공한 DB 샘플 더미 파일을 다운 받아 환경설정을 마쳤다.
서버 & DB 사용하기
서버
처음 클라이언트 터미널을 키면 사용자인증
을 하게 된다. 미리 설정했던 비밀번호를 입력하여 MySQL 서버에 들어간다.
일반 터미널을 이용하여 MySQL 서버에 들어가려면 아래와 같은 코드를 입력한다.
mysql -u[사용자명] -p[비밀번호]
DB 선택하기.
우선 서버 내에 어떤 DB가 있는지 확인한다.
show databases;
사용할 DB를 확인한 뒤 밑 코드를 입력해 DB를 선택한다.
use [DB명]
중간에 DB를 바꾸고 싶다면 다시 use 명령문을 사용하면 된다.
MySQL 클라이언트 종료
exit;
데이터 검색, 질의
MySQL 클라이언트를 통해 SQL 명령문을 서버에 전송하면 그에 맞는 값을 서버가 응답한다.
SELCET문
DB 속 데이터 검색의 기본구문이다.
SELECT [열이름 OR *] FROM [테이블명];
SELECT는 DML에 속하는 명령어로 데이터를 선택하다, ‘질의’, ‘쿼리’라고 불린다.
*
은 애스터리스크로 모든 열을 의미하는 메타문자다.
FROM은 처리 대상 테이블을 지정하는 키워드이다.
각 예약어 및 객체명은 띄어쓰기를 해야하며 SQL문 마지막은 ;(세미콜론)으로 끝나야한다.
SQL 명령은 키워드(SELECT, FROM 등)에 의해 ‘구’단위로 구성된다. 구는 순서가 정해져있으며 생략해도 되는 구들이 존재한다.
예약어와 DB 객체명
SELECT, FROM, * 등 SQL 명령문 및 메타문자와 같이 미리 정해져있는 단어, 이름을 예약어
라고 한다.
DB 객체 (테이블, 뷰 등)은 반드시 이름이 있어야하며 중복은 허용되지 않는다. 이때 예약어의 이름으로 이름을 생성할 수 없다.
예약어와 DB 객체명은 대소문자를 구별하지 않는다. SELECT이든 select이든 동일하다는 것이다. 다만, DB 제품들은 이를 구별하는 경우도 있다.
SELCET문 실행결과
SELCET 명령을 실행하면 테이블이 출력된다. 행(레코드)와 열(컬럼/필드)로 구성되며 행은 모두 동일하나 열은 각각의 이름이 지정되어 있다. 행과 열이 만나는 부분을 셀이라하며 셀에는 하나의 데이터가 들어간다.
데이터는 대략 3가지로 나뉜다. 자료형은 더 세분화 된 개념이다.
-
수치형 데이터
1, 2, 3처럼 숫자만으로 구성된 데이터를 수치형데이터라고 한다. 오른쪽 정렬이다. -
문자열형 데이터 말 그래도 문자로 구성되어 있는 데이터를 말한다. 왼쪽 정렬이다.
-
날짜시간형 데이터 날짜와 시각을 나타내는 데이터이며 왼쪽 정렬이다.
열은 하나의 자료형만을 갖을 수 있다.
NULL 값
NULL값은 데이터 값으로 아무것도 저장되어 있는 않은 상태를 말한다. 즉 해당 셀에 데이터가 없다는 것이다.
테이블 구조 참조
SQL 명령문을 통해 데이터 검색 혹은 테이블을 조작하기 전 필요한 테이블 구조를 파악한다면 더 효율적으로 SQL문을 만들 수 있을거라 생각한다. DESC
명령을 통해 구조를 파악하자!
DESC 명령
DESC, 헷갈릴 수 있다. 원래 내가 알기론 이게 ,, 내림차순 정렬 명령문이었다. 하지만 description 설명이라는 문자의 줄임말로 테이블 구조를 참조하는 명령문으로도 사용한다.
DESC [테이블명];
Field - 열이름, Type - 자료형, NUll - 제약사항으로 null값을 허용할지 말지, Key - 키로 지정되어있는가? Default - 기본값으로 만일 데이터를 입력안했을 때 기본적으로 입력되는 값이 적혀있음.
자료형
- INTEGER
수치형 데이터로 정수값을 저장하는 자료형이다. int(10)은 자리수가 최대 10이라는 것.
- CHAR
문자열형 데이터로 문자열을 저장한다. 이때 열의 최대 길이를 꼭 지정해야한다. 언제나 고정된 길이로 데이터가 저장되며 자리수보다 적은 데이터가 입력되면 나머지는 공백문자로 저장된다.
- VARCHAR
문자열형 데이터로 문자열을 저장하고 최대 길이를 꼭 입력해야한다. 다만, CHAR형과 다르게 데이터 크기 즉, 입력한 문자 수에 따라 저장공간 크기가 조정된다. 가변 길이 문자열이다.
- DATE
날짜값을 저장하는 자료형이다. 연월일 저장함.
- TIME
시분초를 저장하는 자료형이다.
검색 조건 지정
검색 조건을 지정하기 위해 WHERE 구를 사용한다.
SELCET [열이름] FROM [테이블명] WHERE [조건식]
화면에 표시될 수 있는 데이터(행)는 한정적이고 필요한 데이터만 추출하기 위해 WHERE 구를 사용한다.
SELCET은 열을 선택, WHERE은 행을 선택!
SELCET 구 열 지정하기
SELECT 열1, 열2 ... FROM [테이블명]
*를 사용해 모든 열을 불러올 수도 있지만 콤마(,)를 이용하여 여러 개의 컬럼을 지정할 수 있다. 컬럼은 SELCET문에 명시된 순서대로 출력되며 중복도 가능하다.
WHERE 구 행 지정하기.
SELCET [열] FROM [테이블명] WHERE [조건식]
WHERE 구는 생략 가능하다. 생략 시 모든 행이 출력된다. 다만, 구의 순서는 주의하자.
-
조건식
조건식은 ‘열’, ‘연산자’, ‘상수 혹은 문자열’로 구성되어있다. 우리가 흔히 생각하는 조건식으로 참과 거짓을 구별할 수 있는 식이면 된다. 이때 상수는 (예, 2)는 늘 참이다.
⚫ 수치형 자료형은 number = 1
이런식으로 싱글쿼트(‘‘)없이 상수를 입력하면 된다.
⚫ 문자열형은 char = 'heoni00'
이렇게 문자열을 싱글쿼트로 둘러싸 표기해야한다.
⚫ 날짜시간형 또한 싱글쿼트로 둘러싸 표기해야하며 날짜의 경우 연월일을 -
로 구분, 시각은 시분초를 :
로 구분해야한다.
비교연산자는 대표적으로 ‘=’, ‘<>’, ‘>’, ‘>=’등이 있다.
NULL값 검색
NULL값 검색은 위와 같은 방식으로 진행하지 않는다.
= 연산자가 아닌 IS NULL을 사용한다. NULL값인 경우 반환한다.
조건식 -> birthday IS NULL;
조건 조합
데이터 검색을 할 때 1개의 조건만으로 질의를 하기보단 여러개의 조건을 조합하여 필요한 정보를 검색한다.
논리연산자 AND, OR, NOT
조건식1 AND 조건식2 # 두조건 모두 참이어야 반환
조건식1 OR 조건식2 # 두조건 중 하나만 참이라도 반환
NOT 조건식 # 조건에 거짓만 반환
이때 주의할 것은 논리연산자의 우선 순위이다.
AND가 1순위, OR가 2순위이다.
만일 여러개의 조건 조합에 정확한 의도대로 추출하고 싶다면 괄호()를 이용하여 우선순위를 묶어라.
패턴 매칭, 부분 검색
열 LIKE 패턴(문자열)
LIKE를 이용하여 문자열의 일부분이 포함된 레코드를 추출하는 기법이다.
=
연산자가 완전히 같은 것을 찾는다면 LIKE는 필요한 부분만!
다만 메타문자 %
와 _
를 잘 사용해야한다. *
는 사용 불가
- %는 임의의 문자열들을 의미한다.
- _는 임의의 문자를 의미한다.
excel 혹은 python 처럼 $sql$ 처럼 앞뒤에 어떤 자료가 있을 수 있다! 라는 의미와 같다고 생각하면 된다.
예를 들어 조건식이 text = ‘%SQL%’라면 text 컬럼에서 SQL이 중간에 포함된 (처음과 끝도 가능) 행 추출이 되는거다.
만일 ‘SQL%’이라면 문자열 처음에 SQL이 있는 문자 추출, ‘%SQL’라면 문자열 끝에 SQL문자가 있는 레코드 추출이 된다.
이스케이프
당연히 부분 검색에서 %
라는 문자 혹은 _
문자 '
라는 문자를 부분검색할 수도 있다.
이럴땐 프로그래밍 기술 이스케이프를 사용하면 된다.
-
조건식 text = ‘%/%%’ 이렇게 찾고자하는 문자 %를
/%
로 표기하면된다. -
‘의 경우 조건식 text = ‘’’’ 처럼 문자를
''
로 표기하면 된다.
댓글 남기기