이번 시간에는 MySQL에서 많이 쓰이는 DML 중 SELECT에 대해 알아보도록 하겠다.
● 데이터 조작어(Data Manipulation Language, DML)의 종류
-데이터 조작어는 모두 동사로 시작한다.
-시작하는 동사에 따라서 다음과 같이 4가지 조작어가 있다.
① SELECT – 검색
② INSERT – 등록
③ UPDATE – 수정
④ DELETE – 삭제
이 중 오늘은 SELECT에 대해 알아보도록 하겠다.
● SELECT 구문의 기본문형
SELECT (DISTINCT) 칼럼명(ALIAS)
FROM 테이블명;
SELECT |
검색하고자하는 데이터(칼럼)를 나열한다. |
DISTINCT |
중복행을 제거 |
ALIAS |
나타날 컬럼에 대한 다른 이름 부여 |
FROM |
선택한 컬럼이 있는 테이블을 명시한다. |
● SELECT 구문 예제(전체 데이터 검색)
-전체 데이터 검색
-SELECT 뒤에 *를 기술함으로써 나타낼 수 있다.
-DEPARTMENT 테이블의 모든 데이터를 출력해보자.
● SELECT 구문 예제(특정 컬럼 검색)
-SELECT 뒤에 컬럼을 콤마(,)로 구별해서 나열
→ 예: employee 테이블에서 직원의 사번(empno), 이름(name), 직업(job)을 출력하시오.
어떤 칼럼이 있는지는 desc 명령으로 확인
SELECT empno, name, job from EMPLOYEE;
● SELECT 구문 예제(특정 컬럼에 Alias 부여하기)
SELECT empno as 사번, name as 이름, job as 직업 from EMPLOYEE;
● SELECT 구문 예제(컬럼의 합성(Concatenation))
-문자열 결합함수 concat 사용
-예: employee 테이블에서 사번과 부서번호를 하나의 칼럼으로 출력하시오.
SELECT concat(empno, ‘-‘, deptno) AS ‘사번-부서번호’
FROM employee;
● SELECT 구문 예제(중복행의 제거)
-중복되는 행이 출력되는 경우, DISTINCT 키워드로 중복행을 제거
-예: 사원 테이블의 모든 부서번호를 출력하시오. (사원 수만큼 출력된다.)
SELECT deptno FROM employee;
-예2: 사원 테이블의 부서번호를 중복되지 않게 출력하시오.
SELECT DISTINCT deptno FROM employee;
● SELECT 구문 예제(정렬하기)
ORDER BY 절
SELECT (DISTINCT) 칼럼명(ALIAS)
FROM 테이블명
ORDER BY 칼럼이나 표현식 (ASC 또는 DESC);
-ASC : 오름차순 정렬, 기본값
-DESC : 내림차순
-예 : employee 테이블에서 직원의 사번(empno), 이름(name), 직업(job)을 출력하시오.
단, 이름을 기준으로 오름차순 정렬합니다.
SELECT empno, name, job FROM employee order by name;
SELECT empno as 사번, name as 이름, job as 직업 FROM employee ORDERED BY 이름;
-SELECT 구문 예제 (ALIAS를 사용하지 않았을 경우)
-예: employee 테이블에서의 직원의 사번(empno), 이름(name), 직업(job)을 출력하시오.
단, 이름을 기준으로 내림차순 정렬합니다.
SELECT empno, name, job FROM employee ORDER BY name DESC;
● SELECT 구문 예제(특정 행 검색 – where절)
SELECT (DISTINCT) 칼럼명(ALIAS)
FROM 테이블명
WHERE 조건식
ORDDER BY 칼럼이나 표현식 (ASC 또는 DESC)
-조건식 : 컬럼이름이나 표현식의 상수, 연산자로 구성
→ 예: WHERE titlte = ‘Staff’
WHERE salary BETWEEN 1000 AND 2000
* 산술비교 연산자
-예: employee 테이블에서 고용일(hierdate)이 1981년 이전의 사원 이름과 고용일을 출력하시오.
SELECT name, hierdate FROM employee WHERE hierdate < ‘1981-01-01’
* 논리연산자
-예: employee 테이블에서 부서번호가 30인 사원이름과 부서번호를 출력하시오.
SELECT name, deptno from employee where deptno = 30;
* IN 키워드
-예: employee 테이블에서 부서번호가 10 또는 30인 사원이름과 부서번호를 출력하시오.
SELECT name, deptno FROM employee where deptno in (10, 30);
* LIKE 키워드
-와일드 카드를 사용하여 특정 문자를 포함한 값에 대한 조건을 처리
-%는 0에서부터 여러 개의 문자열을 나타냄
-_는 단 하나의 문자를 나타내는 와일드 카드
-예: employee 테이블에서 이름에 ‘A’가 포함된 사원의 이름(name)과 직업(job)을 출력하시오.
SELECT name, job FROM employee WHERE name LIKE ‘%A%’;
* UCASE, UPPER
-from 다음에 테이블이 없을 경우에는 테이블에서 조회하는 것이 아니다.
* LCASE, LOWER
* substring
* LPAD, RPAD
* TRIM, LTRIM, RTRIM
* ABS(x)
-x의 절대값을 구한다.
* MOD(n, m) % : n을 m으로 나눈 나머지 값을 출력한다.
● SELECT 구문 예제(함수의 사용)
FLOOR(x) | x보다 크지 않은 가장 큰 정수를 반환한다. BIGINT로 자동 변환한다. |
CEILING(x) | x보다 작지 않은 가장 작은 정수를 반환한다. |
ROUND(x) | x에 가장 근접한 정수를 반환한다. |
POW(x, y), POWER(x, y) | x의 y제곱 승을 반환한다. |
GREATEST(x, y, …) | 가장 큰 값을 반환한다. |
LEAST(x, y, …) | 가장 작은 값을 반환한다. |
CURDATE(), CURRENT_DATE |
오늘 날짜를 YYYY-MM-DD나 YYYYMMDD 형식으로 반환한다. |
CURTIME(), CURRENT_TIME | 현재 시각을 HH:MM:SS나 HHMMSS 형식으로 반환한다. |
NOW(), SYSDATE(),CURRENT_TIMESTAMP |
오늘 현시각을 YYYY-MM-DD HH:MM:SS나 YYYYMMDDSS 형식으로 반환한다. |
DATE_FORMAT(date, format) |
입력된 date를 format 형식으로 반환한다. |
PERIOD_DIFF(p1, p2) | YYMM이나 YYYYMM으로 표기되는 p1과 p2의 차이 개월을 반환한다. |
● SELECT 구문 (CAST 형변환)
-CAST 함수는 type을 변경(지정)하는 데 유용하다.
-CAST 함수의 사용법: CAST(expression AS type) 또는 CONVERT(expression, type)
-MySQL 타입 : BINARY, CHAR, DATE, DATETIME, SIGNED (INTEGER), TIME, UNSIGNED (INTEGER)
● SELECT 구문 (그룹함수)
COUNT(expr) |
non-NULL인 row의 숫자를 반환 |
COUNT(DISTINCT expr, [expr…]) |
non-NULL인 중복되지 않은 row의 숫자를 반환 |
COUNT(*) |
row의 숫자를 반환 |
AVG(expr) |
expr의 평균값을 반환 |
MIN(expr) |
expr의 최소값을 반환 |
MAX(expr) |
expr의 최대값을 반환 |
SUM(expr) |
expr의 합계를 반환 |
GROUP_CONCAT(expr) |
그룹에서 concatenated한 문자를 반환 |
VARIANCE(expr) |
분산 |
STDDEV(expr) |
expr의 표준 편차를 반환 |
-예: employee 테이블에서 부서번호가 30인 직원의 급여 평균과 총합계를 출력하시오.
SELECT AVG(salary), SUM(salary)
FROM employee
WHERE deptno = 30;
-예: employee 테이블에서 부서별 직원의 부서번호, 급여 평균과 총합계를 출력하시오.
다음 시간에는 또다른 DML 중 하나인 INSERT에 대해 배우도록 하겠다.
'CS > Database' 카테고리의 다른 글
[Edwith] 6. DML - UPDATE 알아보기 (0) | 2020.04.16 |
---|---|
[Edwith] 5. DML - INSERT 알아보기 (0) | 2020.04.16 |
[Edwith] 3. 테이블 관리 (0) | 2020.04.15 |
[Edwith] 2. SQL 소개 (0) | 2020.04.15 |
[Edwith] 1. Introduction (0) | 2020.04.15 |