DML(Data Manipulation Language)
- 데이터 조작 언어
- 데이터를 조작(선택,삽입,수정,삭제) 하는 데 사용되는 언어
- DML 구문이 사용되는 대상은 테이블의 해
- DML을 사용하기 위해서는 꼭 그 이전에 테이블이 정의 되어 있어야 함
- SQL문 중 SELECT,INSERT,UPDATE,DELETE가 이 구문에 해당
- Transaction이 발생하는 SQL도 이 DML에 속함
- 테이블의 데이터를 변경(입력/수정/삭제) 할 때 실제 테이블에 환전히 적용하지 않고, 임시로 적용시키는 것
- 취소 가능
DDL(Data Definition Language)
- 데이터 정의 언어
- 데이터베이스, 테이블, 뷰, 인덱스 등의 데이터베이스 개체를 생성/삭제/변경 하는 역할
- CREATE, DROP, ALTER구문
- DDL은 transaction을 발생시키지 않음
- ROLLBACK이나 COMMIT 사용 불가
- DDL문은 실행 즉시 MySQL에 적용
DCL(Data Control Language)
- 데이터 제어 언어
- 사용자에게 어떤 권한을 부여하거나 빼앗을 때 부로 사용하는 구문
- GRANT/REVOCK
기본 명령어 모음
SHOW DATABASES
- 현재 서버에 어떤 DB가 있는지 보기
USE
- 사용할 데이터베이스 지정 ( USE database_name )
- 지정해 놓은 후 특별히 다시 USE문 사용하거나 다른 DB를 사용하겠다고 명시하지 않는 이상 모든 SQL문은 지정 DB에서 수행
- Workbench에서 [Navigator]->[SCHEMAS]->데이터베이스를 선택하여 직접 선택 가능
SHOW TABLE STATUS
- 데이터베이스 world의 테이블 정보 조회
DESCRIBE(DESC)
- 테이블에 무슨 열이 있는지 확인 (속성 정보 확인)
SELECT
- <SELECT...FROM>
- 요구하는 데이터를 가져오는 구문
- 일반적으로 가장 많이 사용되는 구문
- 데이터베이스 내 테이블에서 원하는 정보를 추출
- SELECT의 구문 형식
-
SELECT select_expr [FROM table_references] [WHERE where_condition] [GROUP BY {col_name | expr | position}] [HAVING where_condition] [ORDER BY {col_name | expr | condition}]
-
- SELECT * FROM table_name - table에 있는 모든 data를 불러오라는 의미
- SELECT row_name FROM table_name - 테이블에서 필요로하는 열만 가져옴, 여러 개일 경우 콤마로 구분
SELECT FROM WHERE
- 기본적인 WHERE절
- 조회하는 경로가에 특정한 조건으로 원하는 데이터만 보고 싶을 때 사용
- SELECT field_name FROM table_name WHERE 조건식
- 조건이 없을 경우 테이블의 크기가 클수록 찾는 시간과 노력이 증가
- 관계 연산자의 사용
- OR 연산자
- AND 연산자
- 조건 연산자( =, <, >, <=, >=, <, >, != etc)
- 관계 연산자( NOT, AND, OR etc)
- 연산자의 조합으로 데이터를 효율적으로 추출
- 데이터가 숫자로 구성되어 있어 연속적인 값은 두 개의 조건연산자를 사용하기보다는 BETWEEN...AND를 사용하도록 하자
- 이산적인(Discrete) 값의 조건에서는 IN() 사용 가능
- ANY
- 서브쿼리의 여러 개의 결과 중 한 가지만 만족해도 가능
- SOME은 ANY와 동일한 의미로 사용
- = ANY 구문은 IN과 동일한 의미
-
SELECT * FROM city WHERE Population > ANY ( SELECT Population FROM city WHERE District = 'New York');
- ALL
- 서브쿼리의 여러 개의 결과를 모두 만족시켜야 함
ORDER BY
- 결과가 출력되는 순서를 조절하는 구문
- 기본적으로 오름차순(ASCENDING)정렬
- 내림차순(DESCENDING)으로 정렬하고 싶다면 열 이름 뒤에 DESC를 적어 줄것
SELECT *
FROM city
ORDER By Population DESC
- 콤마를 이용하여 조건을 추가할 수 있다.
DISTINCT
- 중복된 것은 1개씩만 보여주면서 출력
- 테이블의 크기가 클수록 효율적
SELECT DISTINCT CountryCode
FROM city;
LIMIT
- 출력 개수를 제한
- 상위의 N개만 출력하는 'LIMIT IN' 구문
- 서버의 처리량을 많이 사용해 서버의 전반적인 성능을 나쁘게 하는 악성 쿼리문 개선할 때 사용
GROUP BY
- 그룹으로 묶어주는 역할
- 집계 함수(Aggregate Function)를 함께 사용
- AVG() : 평균
- MIN() : 최소값
- MAX() : 최대값
- COUNT() : 행의 개수
- COUNT(DISTINCT) : 중복 제외된 행의 개수
- STDEV() : 표준 편차
- VARIANCE() : 분산
- 효율적인 데이터 그룹화 (Grouping)
- 읽기 좋게 하기위해 별칭(Alias) 사용
SELECT CountryCode, MAX(Population) AS 'Populataion'
FROM city
GROUP BY CountryCode
HAVING
- WHERE과 비슷한 개념으로 조건 제한
- 집계 함수에 대해서 조건 제한하는 편리한 개념
- HAVING절은 반드시 GROUP BY절 다음에 나와야 함
SELECT CountryCode, Name, MAX(Population)
FROM city
GROUP BY CountryCode
HAVING MAX(Population) > 8000000
ROLLUP
- 총합 또는 중간함계가 필요할 경우 사용
- GROUP BY절과 함께 WITH ROLLUP문 사용
SELECT CountryCode, Name, SUM(Populatioin)
FROM city
GROUP BY CountryCode, Name WITH ROLLUP
JOIN
- JOIN은 데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현
SELECT *
FROM city
JOIN country ON city.CountryCode = country.Code
MySQL 내장함수
- 사용자의 편의를 위해 다양한 기능의 내장 함수를 미리 정의하여 제공
- 대표적인 내장 함수의 종류
- 문자열 함수
- 수학 함수
- 날짜와 시간 함수
LENGTH()
- 전달받은 문자열의 길이를 반환한다.
CONCAT()
- 전달받은 문자열을 모두 결합하여 하나의 문자열로 반환
- 전달받은 문자열 중 하나라도 NULL이 존재하면 NULL을 반환
LOCATE()
- 문자열 내에서 찾는 문자열이 처음으로 나타나는 위치를 찾아서 해당 위치를 반환
- 찾는 문자열이 문자열 내에 존재하지 않으면 0을 반환(SQL의 경우 index의 시작점이 1이다.)
- MySQL에서는 문자열의 시작 인덱스를 1부터 계산
LEFT(),RIGHT()
- LEFT() : 문자열의 왼쪽부터 지정한 개수만큼의 문자를 반환
- RIGHT() : 문자열의 오른쪽부터 지정한 개수만큼 문자를 반환
LOWER(), UPPER()
- LOWER() : 문자열의 문자를 모두 소문자로 변경
- UPPER() : 문자열의 문자를 모두 대문자로 변경
REPLACE()
- 문자열에서 특정 문자열을 대체 문자열로 교체
TRIM()
- 문자열의 앞이나 뒤, 또는 양쪽 모두에 있는 특정 문자를 제거
- TRIM() 함수에서 사용할 수 있는 지정자
- BOTH : 전달받은 문자열의 양 끝에 존재하는 특정 문자를 제거 (기본 설정)
- LEADING : 전달받은 문자열 앞에 존재하는 특정 문자를 제거
- TRAILING : 전달받은 문자열 뒤에 존재하는 특정 문자를 제거
- 만약 지정자를 명시하지 않으면, 자동으로 BOTH로 설정
- 제거할 문자를 명시하지 않으면, 자동으로 공백을 제거
SELECT TRIM(LEADING '#' FROM '###MySQL##'),
TRIM(TRAILING '#' FROM '###MySQL##');
FORMAT()
- 숫자 타입의 데이터를 세자리마다 쉼표(,)를 사용하는 '#,###,###.##'형식으로 변환
- 반환되는 데이터의 형식은 문자열 타입
- 두 번째 인수는 반올림할 소수 부분의 자릿수
FLOOR(),CEIL(),ROUND()
- FLOOR() : 올림
- CEIL() : 내림
- ROUND() : 반올림
SQRT(), POW(), EXP(), LOG()
- SQRT() : 양의 제곱근
- POW() : 첫 번째 인수로는 밑수를 전달하고, 두 번째 인수로는 지수를 전달하여 거듭제곱 계산
- EXP() : 인수로 지수를 전달 받아, e의 거듭제곱을 계산
- LOG() : 자연로그 값을 계산
SIN(),COS(),TAN()
- 사인, 코사인, 탄젠트 반환
ABS(),RAND()
- ABS(x) : 절대값을 반환
- RAND() : 0.0 보다 크거나 같고 1.0보다 작은 하나의 실수를 무작위로 생성
NOW(), CURDATE(), CURTIME()
- NOW() : 현재 날짜와 시간을 반환, 반환되는 값은 'YYYY-MM-DD HH:MM:SS' 또는 YYYYMMDDHHMMSS 형태로 반환
- CURDATE() : 현재 날짜를 반환, 이때 반환되는 값은 'YYYY-MM-DD' 또는 YYMMDD 형태로 반환
- CURTIME() : 현재 시간을 반환, 이때 반환되는 값은 'HH:MM:SS' 또는 HHMMSS 형태로 반환
DATE(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND()
- DATE() : 전달받은 값에 해당하는 날짜 정보를 반환
- MONTH() : 월에 해당하는 값을 반환하며, 0부터 12 사이의 값을 가짐
- DAY() : 일에 해당하는 값을 반환하며, 0부터 31사이의 값을 가짐
- HOUR() : 시간에 해당하는 값을 반환하며, 0부터 23사이의 값을 가짐
- MINUTE() : 분에 해당하는 값을 반환하며, 0 부터 59 사이의 값을 가짐
- SECCOND() : 초에 해당하는 값을 반환하며, 0 부터 59 사이의 값을 가짐
MONTHNAME(), DAYNAME()
- MONTHNAME() : 월에 해당하는 이름을 반환
- DAYNAME() : 요일에 해당하는 이름을 반환
DAYOFWEEK(), DAYOFMONTH(), DAYOFYEAR()
- DAYOFWEEK() : 일자가 해당 주에서 몇 번째 날인지를 반환, 1부터 7 사이의 값을 반환(일요일 = 1, 토요일 = 7)
- DAYOFMONTH() : 일자가 해당 월에서 몇 번째 날인지를 반환, 0부터 31 사이의 값을 반환
- DAYOFYEAR() : 일자가 해당 연도에서 몇 번째 날인지를 반환, 1부터 366사이의 값을 반환
DATE_FORMAT()
- 전달받은 형식에 맞춰 날짜와 시간 정보를 문자열로 변환
SELECT
DATE_FORMAT(NOW(), '%D %y %a %d %m %n %j')