DML(Data Manipulation Language)
DML 명령어를 수행하여 DBMS에 값을 저장(insert), 수정(update), 삭제(delete), 조회(select)하는 방법에 대해 공부한다.
– DML이란?
DML은 SQL의 분류 중 하나로, 데이터를 조작하는 명령어(insert, update 등)을 가리킨다.
SQL의 분류
- DML (Data Manipulation Language): 데이터 조작 ex) INSERT, UPDATE, DELETE, SELECT
- DDL (Data Definition Lanaguage): 데이터베이스의 스키마 정의 또는 조작. ex) CREATE, DROP, ALTER
- DCL (Data Control Lanaguage): 데이터 제어. 권한 관리, 데이터 보안, 무결성 등을 정의. ex) GRANT, REVOKE
DML(데이터 조작어, Data Manipulation Lanaguage) 의 종류
- SELECT: 검색 / 조회
- INSERT: 삽입 / 추가
- UPDATE: 수정
- DELETE: 삭제
– 데이터 조회 SELECT
SELECT 구문의 기본 문형
SELECT(DISTINCT) 컬럼명(ALIAS) FROM 테이블명;
- SELECT: 검색하고자 하는 데이터(컬럼)을 나열
- DISTINCT: 중복행을 제거 (optional)
- ALIAS: 나타날 컬럼에 대한 다름 이름 부여 (optional)
- FROM: 선택한 컬럼이 있는 테이블을 명시
SELECT 구문 활용 예시
- department 테이블의 모든 데이터를 출력
Select * from department;
- 특정 컬럼 검색 – department 테이블에서 deptno 와 name 을 출력
Select deptno, name from department;
(어떤 column을 갖고 있는지는 desc 명령으로 확인 가능하다. ex. desc department;)
- 컬럼에 별칭 부여(ALIAS 키워드) – department에서 deptno은 부서번호, name은 부서명으로 출력
select deptno 부서번호, name 부서명 from department;
select deptno as 부서번호, name as 부서명 from department;
- 컬럼의 합성(CONCAT 키워드) – employee 테이블에서 사번과 부서 번호를 결합하여 출력
select concat(empno, '-', deptno) as '사번-부서번호' from employee;
- 중복행의 제거(DISTINCT 키워드) – employee 테이블에서 deptno를 중복값 없이 출력
select distinct deptno from employee;
중복값 제거 없이 출력한 결과는 아래와 같다.
- 정렬하기(ORDER BY) – employee 테이블에서 empno, name 을 출력한다. 단, 이름을 기준으로 오름순으로 정렬하여 출력한다.
select empno, name from employee order by empno;
내림차순 정렬은 맨 뒤에 desc;를 붙여주면 된다.
select empno, name from employee order by empno desc;
– 특정 행 조회. SELECT WHERE 절
WHERE 키워드를 이용해서 특정 값을 가진 column을 검색 할 수있다. select where 절의 기본 형태는 아래와 같다.
산술비교연산자
- employee 테이블에서 empno가 7934인 컬럼 값을 모두 출력
select * from employee where empno = 7934;
- employee 테이블에서 hiredate가 1982-01-01 이전인 컬럼의 name, hiredate를 출력
select name, hiredate from employee where hiredate < '1982-01-01';
in 키워드 (OR과 같은 쓰임)
- deptno가 10 또는 30인 employee의 정보 모두 출력
select * from employee where deptno in (10,30);
산술 연산자 or를 이용하여도 같은 결과가 출력된다.
select * from employee where deptno=10 or deptno=30;
LIKE키워드 – 와일드 카드를 사용하여 특정 문자를 포함하는 값 출력
와일드카드 ‘%’는 0에서부터 여러개의 문자열를 나타내며, ‘_’는 하나의 문자를 나타낸다.
- employee 테이블에서 이름(name)이 A로 시작하는 컬럼 출력
select * from employee where name like 'A%';
- employee 테이블에서 이름(name)이 A로 끝나는 컬럼 출력
select * from employee where name like '%A';
- employee 테이블에서 이름(name)에 A가 포함되는 컬럼 출력
select * from employee where name like '%A%';
- employee 테이블에서 이름(name)의 2번째에 A가 있는 컬럼 출력
select * from employee where name like '_A%';
- employee 테이블에서 이름(name)의 3번째에 A가 있는 컬럼 출력
select * from employee where name like '__A%';
함수의 사용
- employee 테이블에서 name 값을 소문자로 변경하여 출력 – lower() 함수 이용
select lower(name) from employee;
- employee 테이블에서 name을 10자로 출력. 단, 10자가 되지 않는다면 앞에 +를 채워서 출력 – LPAD() 함수 이용
select LPAD(name, 10, '+') from employee;
사용할 수 있는 함수들은 MySQL Reference Manual – Functions and Operators 에서 확인할 수 있다.
그룹함수의 사용
여러 값으로부터 하나의 값을 구하는 함수를 사용할 수도 있다. ex) count, sum, avg 등
- employee 테이블에서 salary의 평균값을 출력
select avg(salary) from employee;
- comm의 로우 개수를 반환 (NULL 값이 아닌 값의 개수만 반환한다)
select count(comm) from employee;
위처럼 특정 column의 개수를 출력하면 NULL이 아닌 값의 개수만 출력한다. 아래 테이블을 보면 comm 값이 NULL이 아닌 row의 개수는 4이다.
만약 NULL 값을 포함하여 row 개수를 출력하고 싶으면 count(*)를 사용한다.
select count(*) from employee;
group by 키워드 – 특정 값 별로 결과값 출력하기
- 부서 번호(deptno) 별로 평균 급여와 급여의 총 합을 출력
select deptno, avg(salary), sum(salary) from employee
group by deptno;