콘텐츠로 건너뛰기

[Spring을 이용한 웹 백엔드 기초] 1. SQL & JDBC 프로그래밍 – 3) DML(SELECT)

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;
또는 as를 명시해줘도 동일하게 동작한다.
select deptno as 부서번호, name as 부서명 from department;
  • 컬럼의 합성(CONCAT 키워드) – employee 테이블에서 사번과 부서 번호를 결합하여 출력
select concat(empno, '-', deptno) as '사번-부서번호' from employee;
두 column 값 사이에 ‘-‘를 추가하여 결합한다. column 명을 ‘사번-부서번호’로 변경하여 출력한다(alias).

 

  • 중복행의 제거(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%';

함수의 사용

함수를 query에 넣어서 함수 결과를 출력할수도 있다.

 

  • 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;