도서 '데이터베이스 첫걸음'을 보고 책 내용과 그 이외의 부족한 부분을 채워가며 공부한 내용입니다.
키워드 : MySQL, 쿼리, SELECT
1. MySQL 커넥션 만들기
커넥션
로그인해서 프롬프트가 표시되었다는 것은 로그인 전과 로그인 후로 사용자와 MySQL의 관계가 변했다는 것을 의미
이는 사용자와 MySQL이 접속(연결)되었다고 하는데 이 연결을 '커넥션'이라 함.
- 커넥션이 유지되는 동안은 사용자는 데이터베이스와 무언가를 주고받을 수 있음
※ 프롬프트(Prompt)
명령을 입력하라 재촉하는 것
ex) mysql>
커넥션이 성립되었음을 나타내는 문장
Your MySQL connection id is 18
- MySQL은 동시에 여러 개의 커넥션을 유지하는 것이 가능(동시에 복수의 사용자와 연결하는 것이 가능)
- 커넥션의 시작과 종료 사이에 DBMS와 다양한 교환을 하는데 그 교환의 시작과 종료까지의 단위를 '세션(Session)'이라 함(커넥션 확립 후 세션이 만들어짐)
커넥션의 상태를 조사하는 명령
mysql> show status like 'Thread_connected';
- 각 DBMS마다 명령어가 다름
- MySQL의 경우 show status ~
커넥션의 로그오프
mysql> quit
SQL과 관리 명령의 차이
관리 명령
관계형 데이터베이스의 데이터를 조작하는 도구로 'SQL'이라는 언어 존재
DBMS는 SQL이외에도 다양한 용도의 명령어를 준비(이 명령어가 관리 명령)
- ex)
- mysql> show status like 'Uptime'; (MySQL이 가동된 시점부터의 경과시간(초))
- mysql> show status like 'Queries'; (MySQL이 실행한 SQL 문의 수)
- 관리 명령은 DBMS가 정상적으로 동작하는지 감시 or 이상한 동작을 할 때 문제 해결을 위해 정보수집을 하는 용도
SQL과 관리명령 구분법(대부분의 Case)
- SQL문은 반드시 'SELECT, INSERT, DELETE, UPDATE' 중 하나의 단어로 시작
- 이외의 단어로 시작한다면 관리 명령
쿼리(Query)
쿼리(Query)란 쉽게 이야기해서 데이터베이스에 정보를 요청하는 것
쿼리(Query)는 웹 서버에 특정한 정보를 보여달라는 웹 클라이언트 요청(주로 문자열을 기반으로 한 요청)에 의한 처리
쿼리(Query)는 대개 데이터베이스로부터 특정한 주제어나 어귀를 찾기 위해 사용
주제어가 검색엔진의 검색필드 내에 입력된 다음, 그 내용이 웹 서버로 넘겨짐
- 간단한 홈페이지를 개발할 경우 대부분의 홈페이지는 게시판 혹은 방명록 정도의 데이터를 보관할 수 있는 형태의 DB를 구축
- 이러한 DB는 개발자의 의도에 따라 약간씩 다르기는 하지만 대부분 유사한 형태의 구조를 가지는 테이블을 포함하게 되는데, 여기서 사용자 혹은 관리자들은 이러한 테이블에서 특정 조건에 해당하는 자료를 조회하거나 출력하는 등의 작업
- 이렇게 데이터가 입력된 DB에서 원하는 조건의 데이터를 가져오려면 특정한 구조의 프로그램언어(DB언어)를 사용하게 되는데 이러한 DB용 언어를 SQL
- 이러한 SQL언어는 대부분의 DB가 95% 이상 되는 호환성을 가진 언어로 이루어져 있으며 이러한 언어로서 특정DB에서 원하는 조건의 데이터를 조작하는 언어의 집합(문장)을 쿼리(Query)
- 이러한 쿼리(Query)는 DB를 조작하는 여러 가지 형태로 표현될 수 있으며 데이터를 다루는 프로그램에서는 필수적인 요소
쿼리(Query)를 바로 번역을 하면 '질의'라고 해석
- DB서버가 구동이 되고 있는 환경에서(Oracle, Cubrid, MsServer, MySQL, Tibero, Altibase 등) DB에 대해 명령문을 작업하게 되는데 이 때의 명령문을 쿼리(Query)
■ DB(DataBase, 데이터베이스): 데이터를 정리하여 보관하고 있는 저장소
■ DB Server: 데이터를 정리하여 보관하고 있는 저장서버
★ 내부 과정 예시 ★
사용자 -> 질의 ( 쿼리문 ) -> DB서버
사용자 <- 결과 <- DB서버
- 질의를 보내고 결과를 얻는 것
- 도스를 생각해보면 커맨드 창에서 DIR을 치면 해당 위치의 폴더명들이 나열이 되는 것처럼, 특정프로그램(혹은 유틸리티) 창에서 쿼리(Query)를 치면 결과 값이 보여짐
- 하지만, 세세히 따지고 들어가면 개념 자체가 명령문과는 사뭇 다르며 그렇기 때문에 질의문(쿼리, Query)라고 부름
- 이 또한 쿼리(Query) 표준이 있기 때문에 DB종류에 따라서 조금씩은 다르더라도 큰 틀은 벗어나지 않게 구성
질의문 = QUERY = 쿼리 = SQL
2. 관계형 데이터베이스의 계층
데이터베이스를 사용한다 = DBMS에 저장된 테이블을 SQL을 사용해서 조작하는 것
데이터베이스 내부의 테이블 = 몇 개의 그룹(스키마, Schema)으로 나뉘어서 관리
스키마
틀
스키마의 상위 계층 = 데이터베이스
데이터 베이스 상위 계층 = 인스턴스
인스턴스(Instance)
물리적 개념(메모리나 CPU를 사용하는 존재), DBMS가 동작할 때의 단위
OS 입장에서는 '프로세스'라고도 부름
DBMS에 따라 이것을 서버 or 서버 프로세스 라고 부름


3계층 : Oracle, MySQL
4계층 : SQL Server, DB2, PostgreSQL
3. SELECT
등록된 데이터베이스 확인하기
show databases;

사용할 데이터베이스 테이블 선택하기
use world; //위의 표시된 데이터베이스 테이블 중 하나
show tables;

테이블을 지정해서 데이터 전부 출력(선택)하기
//위에서 city, country, countrylanguage 세 테이블이 있는것을 확인 -> city 테이블 데이터 전부를 Select
select*from city;

테이블을 지정해서 조건에 맞는 데이터 출력(선택)하기
//한국 도시 이름만 추려서 출력
select*from city where countrycode = 'KOR';
- Where 구문을 지정해 'Where' 조건 형태로 입력

불필요한 열을 제거하고 표시
//Name과 Population
select Name, Population from city where district = 'chollanam';
- select 뒤에 콤마(,)로 구분해 입력하면 지정한 열만 출력

다양한 조건 추가
//위의 조건에 인구수가 15만명 이상인 조건을 추가하기
select Name, Population from city where district = 'chollanam' and population>150000;
- and 연산자를 이용해서 조건 추가

//중복 행 제외하고 표시하기
select distinct district from city where countrycode = 'KOR';

- 한 개의 데이터베이스 = 복수의 테이블
MySQL 관리 명령 정리
- show datatbases;
- 데이터베이스를 살펴보기
- use 데이터베이스명;
- 디폴트(현재) 데이터베이스를 지정
- show tables;
- 데이터베이스 내의 테이블 리스트를 얻기
SELECT 문 정리
SELECT 열명 FROM 테이블명;
- 열명에 * -> 지정한 테이블의 전체열 지정 가능
명령 | 설명 |
select*from city; | 디폴트 데이터베이스의 city를 SELECT |
select*from world.city; | '데이터베이스명.테이블명' 형태로 명시적으로 world 데이터베이스의 city를 SELECT |
WHERE 조건
SELECT 열명 FROM 테이블명 WHERE 조건;
- SELECT문 끝에 WHERE 조건을 추가하는 형태로 조건 추가
- 조건에는 비교연산자(=, >, <, <>(같지않다)), 'AND'와 'OR'가 자주사용
ex) select Name,Population from city where district = 'chollanam' AND population > 150000;
우선순위
- 괄호를 사용하는 것을 추천
SQL의 기초적인 기술 규칙
- SQL문의 마지막에 딜리미터(문장의 단락을 의미하는 기호 = 대부분 세미콜론(;))를 붙임
- 키워드의 대문자와 소문자는 구별X
- 정수는 기존 그대로, 문자열이나 날짜 시작은 작은 따옴표(' ')로 표기
- ex) 수치로 값 지정 = 1000
- ex) 문자열로 수치를 지정 = '1000'
- 단어는 반각 스페이스나 개행으로 구별(전각 스페이스는 사용x)
중복 배제
select distinct district from city where countrycode = 'KOR';
- distinct 를 사용해 중복 배제
검색 결과 정렬
select*from city where countrycode = 'KOR' order by population;
- order by 를 사용해 검색결과 정렬 가능
- select의 결과는 보통 열(컬럼)과 행(레코드)로 구성된 2차원 표로 표시
- 아무 언급이 없는 경우 표를 작성할때 순서대로 출력
- order by ~ (asc)= 오름차순 (asc는 기본값 = 생략가능)
- order by ~ desc = 내림차순
테이블 집약
select count(*) from city where countrycode = 'KOR';
- 실제로 행 수를 카운트 받기 = count(*)
- 최소 = min()
- 최대 = max()
- 총수 = sum()
- 평균 = avg()
- count는 NULL을 포함해서 계산하고 min() max() sum() avg() 는 NULL을 제외하고 집계
- min()과 max()는 수치 데이터 외에도 사용 가능
- ex) min(city) = Andong(A부터 시작하는 도시 중 가작 빠른 도시)
- ex) max(city) = Yosu(Z부터 시작하는 도시 중 가장 마지막 도시)
ex) select min(population), max(population), sum(population), avg(population) form city where countrycode = 'KOR';
그룹 집약
select group_concat(name) from city where countrycode = 'KOR' and district = 'Chollabuk';
- 한국의 CHhollabuk 지역의 name을 한 줄(한 문자열)에 집약시켜라
- group_concat(원하는 데이터)
- 문자열의 경우 문자열의 결합('나는' + `~다' = '나는~다'), 수치의 경우 수치에 대한 집계
- 중복 배제는 안되기 때문에 중복 배제를 하려면 distinct도 사용해야함
그룹으로 구분하기
select district, count(*) from city where countrycode = 'KOR' group by district;
- group by 데이터명
- 데이터명 별로 그룹을 나눠서 표기
- city 테이블의 countrycode가 'KOR'인 것 중 district(행정구역)별로 행 수를 count 한 것으로 확인하기
조건을 추가해 그룹 구분하기
select district, count(*) from city where countrycode = 'KOR' group by district having count(*) = 6;
- select count(*) -> 행 수를 count
- district -> district만 표시
- having count(*) = 6 -> 행 수가 6개인 것만 뽑기(조건)
- count와 같은 집양함수를 작성할 수 있는 경우
- select
- order by
- having
- count와 같은 집양함수를 작성할 수 있는 경우
①SELECT ②FROM ③WHERE ④GROUP BY ⑤HAVING ⑥ORDER BY

참고 자료
1. 미크, 기무라메이지, 데이터베이스 첫걸음(출판지 : 한빛미디어, 2016)
'Spring' 카테고리의 다른 글
Spring Security 3 (0) | 2022.05.25 |
---|---|
JDBC - 데이터 UPDATE, INSERT, DELETE (0) | 2022.05.23 |
JDBC - DataSource를 이용한 데이터 연결 (0) | 2022.05.20 |
JDBC - 기본 구조와 API (0) | 2022.05.20 |
Spring 데이터로 작업하기 3 (0) | 2022.05.18 |