설치 시에 필요에 따라서 .NET Framework 4.5.2 를 설치 요구를 할 수 있다.
OS X
아래 명령어를 차례로 입력하도록 하며, 기존에 사용하던 파일이 지워지므로 반드시 백업을 하고 진행한다.
명령어
sudo rm /usr/local/mysql
sudo rm -rf /usr/local/mysql *
sudo rm -rf /Library/StartupItems/MySQLCOM
sudo rm -rf /Library/PreferencePanes/My*
rm -rf /Library/PreferencePanes/My*
sudo rm -rf /Library/Receipts/mysql*
sudo rm -rf /Library/Receipts/MySQL*
sudo rm -rf /var/db/receipts/com.mysql.*
OS X 에서 MySQL 설치 후에 World 데이터베이스가 출력되지 않아서 Windows 환경에서 실습 진행
MySQL 기본 사용법
Windows 에서 설치가 마무리가 되면, "C:\Program Files\MySQL\MySQL Server 5.7\bin" 위치를 확인하면 MySQL 에서 사용하는 명령어들이 보이며, 주로 "mysql" 실행 파일을 사용한다.
MySQL 시작하는 방법은 Windows 의 CMD 창을 열어서 위 경로를 이동한다.
CMD 창에서 환경변수 설정해서 바로 사용하는 방법
내 컴퓨터 마우스 오른쪽 클릭해서 속성을 누른다.
속성 내에서 아래 그림과 같이 "고급 시스템 설정" 을 누른다.
시스템 속성에서 "환경 변수" 를 선택하면 아래와 같은 창이 뜬다.
환경 변수 창에서 아래 시스템 변수부분에 "편집(I)" 버튼을 눌러서 그림과 같이 입력해주고 "확인 " 버튼을 누른다.
그리고 시스템 변수 내에 "Path" 를 찾아서 편집을 눌러서 "%MySQL_HOME%;" 을 입력한다.
그 후 모두 "확인" 버튼을 눌러서 창을 닫아준다. (취소 버튼을 누르면 해당 설정이 저장되지 않은 상태로 되지 조심한다.)
CMD 창을 열어서 아래 그림과 같은 메시지가 출력되면 환경변수가 제대로 설정이 된 것이다.
그 후에 실습을 진행한다.
실행 방법은 cmd 창에서 "mysql -uroot -p" 를 입력 후 비밀번호를 입력하여 로그인하여 사용
로그인 후에 "sql>" 프롬프트 창에서 아래 명령어를 입력한다.
show databases; : DB 들의 목록을 표시한다.
use world; : 목록에 표시된 DB 중에 "world" 라는 DB 를 선택한다.
show tables; : World DB 의 테이블 목록을 표시한다.
desc city; : city 테이블의 구조를 표시한다.
select * from city; : city 테이블의 내용을 표시한다. (결과가 많아서 명령어 친 부분은 보이지 않는다.)
SQL(DML)
SQL이란?
SQL은 Structured Query Language의 약자로 데이터베이스에 있는 필요한 정보를 사용할 수 있도록 도와주는 언어이다.
사용방법이나 문법이 다른 언어(Java, C, C#, VB 등) 보다 단순하여 하나를 배워두면 모든 DBMS에서 사용가능하다.
대소문자 구별하지 않으나 테이블 내의 데이터 내용은 구별한다.
SQL의 이해
사용자나 프로그램이 필요한 데이터를 가져오기 위해 SQL을 작성한다.
DBMS가 DB에서 사용자가 작성한 SQL을 통해서 데이터를 가져온다.
사용자는 SQL을 통해서 가져온 데이터를 볼 수 있다.
해당 내용은 아래 그림으로 요약할 수 있다.
SQL의 종류
DML(Data Manipulation Language)
테이블의 데이터를 조작하는 기능
테이블의 레코드를 CRUD(Create, Retrieve, Update, Delete)
INSERT : 데이터베이스 객체에 데이터를 입력한다.
SELECT : 데이터베이스 객체 안에 데이터를 조회한다.
UPDATE : 데이터베이스 객체 안의 데이터를 수정한다.
DELETE : 데이터베이스 객체에 데이터를 삭제한다.
DDL(Data Definition Language)
DB, 테이블의 스키마를 정의, 수정하는 기능
테이블 생성, 컬럼 추가, 타이변경, 각종 제약조건 지정, 수정 등
CREATE : 데이터베이스 객체를 생성한다.
SHOW : 등록된 데이터베이스 객체를 조회한다.
DROP : 데이터베이스 객체를 삭제한다.
ALTER : 기존에 존재하는 데이터베이스 객체를 다시 정의한다.
DCL(Data Control Language)
DB나 테이블의 접근권한이나 CRUD 권한을 정의하는 기능
특정 사용자에게 테이블의 조회권한 허가/금지 등
GRANT : 데이터베이스 객체에 권한을 부여한다.
REVOKE : 이미 부여된 데이터베이스 객체 권한을 취소한다.
CRUD(Create, Retrieve, Update, Delete)의 이해
DML에서 CRUD 이해
Create에 해당하는 DML은 INSERT로 새로운 레코드를 추가한다. 사용방법은 "INSERT INTO 추가할 레코드 내용"
Retrieve에 해당하는 DML은 SELECT로 조건을 만족하는 테이블의 레코드를 찾아서 조회해준다. 사용방법은 "SELECT * FROM 조회할 테이블 명"
Update에 해당하는 DML은 UPDATE로 조건을 만족하는 테이블의 레코드를 수정한다. 사용방법은 "UPDATE 수정할 테이블 명 SET 수정할 내용"
DELETE에 해당하는 DML은 DELETE로 조건을 만족하는 테이블의 레코드를 삭제한다. 사용방법은 "DELETE FROM 삭제할 테이블 명"으로 DELETE 사용 시에 반드시 조건을 지정해야하며 그렇지 않으면 모든 레코드가 지워진다.
쿼리 결과 중복 제거(DISTINCT)
DML의 SELECT문의 결과값에서 특정 컬럼만 출력할 경우, 중복된 값들이 나오는 경우에 이를 제거해서 표시하는 기능
사용방법 : SELECT DISTINCT 컬럼명1, 컬럼명2, ... FROM 테이블 명 WHERE 조건절
적용 그림은 다음과 같다.
논리연산자(AND, OR, NOT, IN, BETWEEN)
SELECT문의 조건절에 논리 조건을 적용하는 연산자
사용방법 : SELECT * FROM 테이블 명 WHERE (NOT) 조건1 AND/OR 조건2, ...
AND, OR, NOT 과 관련된 결과 그림은 다음과 같다.
AND 결과
OR 결과
NOT 결과
IN 결과
IN 과 = 의 차이
Where 절에서 = 은 관계연산자로 특정 컬럼의 값이 지정한 값과 같은 결과만 출력한다.
Where 절에서 IN은 =, OR을 한 결과와 같다, IN의 경우는 = 과는 다르게 다중입력이 가능하다. ex) IN ('KOR', 'USA')
BETWEEN 결과
결과 정렬(ORDER BY)
SELECT문의 결과값을 특정한 컬럼을 기준으로 오름차순/내림차순으로 정렬한다.
기본 값은 오름차순이며, 내림차순은 ORDER BY 컬럼명 DEESC 로 표현한다.
정렬 전 테이블
오름차순으로 정렬한 테이블
내림차순으로 정렬한 테이블
결과 값 일부 조회
결과값 일부조회하는 LIMIT(ROWNUM, TOP)
SQL 쿼리 결과가 너무 크면 전체화면에서 모두 나타내지 못해서 잘리는 경우가 발생하거나 상위 몇 번째까지만 보고 싶을 경우에 사용한다.
비표준 기능으로 오라클에서는 ROWNUM, SQLServer 에서는 TOP으로 사용된다.
사용 시에 다음과 같은 결과를 얻을 수 있다.
집합 함수(Aggregation Function)
테이블의 전체 레코드를 대상으로 특정 컬럼을 적용해서 한 개의 값을 리턴하는 함수
사용함수 종류 : Count(), Avg(), Sum(), Min(), Max(), First(), Last, ...
Count 결과
Sum 결과
Avg 결과
Min 결과
Max 결과
기타 유용한 함수
LENGTH() : 레코드의 문자열 컬럼의 글자 수를 리턴한다.
MID() : 문자열의 중간부분을 리턴한다.
UPPER()/LOWER() : 문자열을 대문자/소문자로 리턴한다.
ROUND() : 레코드의 숫자 컬럼 값을 반올림해서 리턴한다.
Join
서로 다른 테이블을 공통 컬럼을 이용해서 합치는 테이블 연산을 말한다.
조인의 결과는 이전 테이블의 컬럼 수와 동일한다.
조인 시에 각 테이블의 컬럼을 구분하기 위해서 테이블1.컬럼1, 테이블2.컬럼1 이런 식으로 구분을 한다.
사용 방법 : SELECT * FROM 테이블1 Join 테이블2 on 테이블1, 2에 대한 조건문
Join의 종류
INNER Join : 조인 시에 NULL 값을 허용하지 않으며 NULL 값인 경우 제외하고 결과를 출력한다.
LEFT Join : 조인 시에 왼쪽 테이블의 NULL 값을 포함해서 결과를 출력한다.
RIGHT Join : 조인 시에 오른쪽 테이블의 NULL 값을 포함해서 결과를 출력한다.
Full Join : 조인 시에 NULL 값을 허용해서 결과를 출력하는데 MySQL에서는 지원하지 않는다.
ALIAS
SQL 쿼리 결과 생성 시에 컬럼 명에 대한 별도의 명칭을 붙이는 기능이다.
조인 시에 많이 사용된다.
사용 방법 : SELECT 테이블1.컬럼1 AS 별명1, .. FROM 테이블1
뷰(VIEW)
SQL 쿼리의 결과 테이블을 임시 테이블로 저장해서 사용하는 용도로 사용하며, 그 용도가 끝나면 명시적으로 삭제해야 한다.
사용방법 : CREATE VIEW 뷰 이름 AS SELECT ...
SELECT INTO와 INSERT INTO
뷰의 기능과 동일하게 테이블을 생성한 후에 바로 결과 테이블을 저장할 수 있고, 동일한 테이블을 생성한 후에 INSERT 를 이용해서 결과 테이블을 저장할 수 있는 방법이 있다.
테이블을 생성한 후에 바로 테이블을 저장하는 방법 : CREATE TABLE 테이블명 SELECT * FROM 테이블 명 -> SELECT INTO
테이블을 생성한 후에 그 테이블에 저장하는 방법 : INSERT INTO 테이블명1 SELECT * FROM 테이블2 ... -> INSERT INTO
CASE ... WHEN ... END
SQL의 조건문에 해당하며, IF/ELSE 와 동일하다고 생각하면 된다.
사용방법 : CASE WHEN 조건값 1 THEN ... WHEN 조건값2 THEN... ELSE... END
사용 시 주의점은 CASE 조건문을 모두 작성 후에 END를 붙여주어서 조건문의 끝을 알려주도록 한다.
Like 검색
Like 는 검색하려는 키워드를 모두 알지 못할 때 일부문자를 사용해서 해당 패턴에 맞는 레코드들을 찾아줄 떄 사용한다.
사용방법 : SELECT * FROM 테이블 WHERE 컬럼명 LIKE 패턴 (와일드 카드인 %, _ 를 사용한다.)
LIKE 검색 시에 OR 같은 논리연산을 하지 않도록 한다. DB에 부담을 줄 수 있기 때문이다.
%를 이용한 LIKE검색
_를 이용한 LIKE 검색
NULL 값과 NULL 함수
레코드 중에 NULL 값을 허용할지 여부는 컬럼명 IS NULL 을 이용해서 허용하고, IS NOT NULL을 이용해서 허용하지 않는다.
NULL 함수는 집합 함수 등을 이용할 때 레코드 중에 NULL 값을 제외할 지 NULL 인 경우 처리해주는 함수가 있다.
MySQL : IFNULL(컬럼명, 처리할 값)
SQL Server : ISNULL(컬럼명, 처리할 값)
오라클 : NVL(컬럼명, 처리할 값)
Group by와 Having
Group by는 집합함수를 같이 사용해서 그룹별 연산 시에 적용한다. 예를 들어 국가코드가 일치하는 값의 개수를 구할 때 사용한다.
Having 은 그룹별 연산 시에 조건을 추가할 때 사용한다. 별다른 조건이 없다면 생략해서 사용되기도 한다.
Group by, Having 사용방법 : SELECT 컬럼명, 집합함수(컬럼명) FROM 테이블 GROUP BY 컬러명 Having 조건절
서브쿼리
쿼리 내에 또 다른 쿼리 문이 있는 형태이다.
서브쿼리는 메인 쿼리에 포함되는 관계이다.
() 를 사용해서 감싸서 구분하도록 한다.
서브쿼리에선 ORDER BY를 사용할 수 없다.
서브쿼리 종류
단일행(Single Row) 서브쿼리
결과가 레코드 하나로 된 서브쿼리이다.
일반 연산자(=, >, <, ...) 사용
사용 예) SELECT Count(*) FROM CITY WHERE CountryCode = (select code from country where name='South Korea'); 또는 SELECT NAME, POPULATION FROM CITY WHERE POPULATION > (select avg(Population) from city where countrycode='KOR') ORDER BY POPULATION DESC;
다중행(Multi Row) 서브쿼리
결과가 레코드 여러개로 된 서브쿼리이다.
다중행 연산자(IN, ALL, ANY, EXISTS) 사용
ALL 은 여러 개의 레코드의 AND 효과를 가지며 가장 큰 값 보다 큰 값들을 나타낸다. (Population > ALL(select population ...))
ANY 는 여러 개의 레코드의 OR 효과를 가지며 가장 작은 값보다 큰 값들을 나타낸다. (Population > ANY(select population ...))
IN
결과 값 중에 존재여부를 나타내는 의미한다.
전체 레코드를 스캔해서 존재하면 TRUE, 존재하지 않으면 FALSE로 표시한다.
EXIT
결과 값 중에 존재여부를 나타내는 의미로 존재여부만 확인하고 스캔하지 않아서 IN 보다 속도가 빠르다.
존재여부만 확인해서 존재하면 TRUE, 존재하지 않으면 FALSE로 표시한다.
다중 컬럼(Multi Column) 서브쿼리
결과가 컬럼 여러 개인 서브쿼리
단일 행이면서 다중 컬럼인 경우가 있고, 다중 행이면서 다중 컬럼인 경우가 있다.
집합연산
각 종 집합연산을 지원하며, 합집합(UNION), 교집합(INTERSECT), 차집합(MINUS), ...
MySQL에선 합집합만 지원한다.
교집합과 차집합은 IN 등 별도의 연산으로 대체되어서 사용된다.
합집합에는 UNION과 UNION ALL 두 가지 형식으로 지원된다.
UNION은 두 쿼리의 결과 값을 합쳐서 리턴하는 것으로 두 쿼리의 형식이 동일해야한다.
UNION ALL은 중복을 허용하는 UNION으로 조건은 UNION 과 동일하게 두 쿼리의 형식이 동일해야한다.
SQL(DDL)
스키마 정의
DDL(Data Definition Language)로 데이터베이스와 테이블을 CRUD(Create, Retrieve, Update, Delete)하는 것을 의미하며, 테이블에 대한 정보는 메타데이터(Metadata)로 데이터 사전에 저장, 관리된다.