SQL(2)
해당 Post는 DML에 대해 정리한 파일입니다.
DML (Data Manipulation Language)
데이터 조작어(Data Manipulation Language, DML)의 종류
데이터 조작어는 모두 동사로 시작합니다.
시작하는 동사에 따라서 다음과 같은 4가지 조작어가 있습니다.
SELECT – 검색
INSERT - 등록
UPDATE - 수정
DELETE - 삭제
SELECT 구문 예제(전체 데이터 검색)
전체 데이터 검색
SELECT 뒤에 * 를 기술함으로써 나타낼 수 있습니다.
> mysql> select * from department;
+--------+------------+----------+
| deptno | name | location |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
4 rows in set (0.00 sec)
Desc(Describe의 약자)
특정 테이블에 어떤 컬럼이 있는지 조회하는 명령어 입니다.
mysql> desc department;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| deptno | int | NO | PRI | NULL | |
| name | varchar(14) | YES | | NULL | |
| location | varchar(13) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
SELECT 구문 예제(컬럼에 Alias부여하기)
컬럼에 대한 ALIAS(별칭)을 부여해서 나타내는 칼럼의 HEADING을 변경할 수 있습니다.
mysql> select deptno 부서번호 ,name 부서명 from department;
+----------+------------+
| 부서번호 | 부서명 |
+----------+------------+
| 10 | ACCOUNTING |
| 20 | RESEARCH |
| 30 | SALES |
| 40 | OPERATIONS |
+----------+------------+
4 rows in set (0.00 sec)
ALIAS(별칭)는 as로 표현이 가능하나 생략이 가능합니다.
mysql> select empno as 직원의사번, name as 이름, job as 직업 from employee;
+------------+--------+-----------+
| 직원의사번 | 이름 | 직업 |
+------------+--------+-----------+
| 7369 | SMITH | CLERK |
| 7499 | ALLEN | SALESMAN |
| 7521 | WARD | SALESMAN |
| 7566 | JONES | MANAGER |
| 7654 | MARTIN | SALESMAN |
| 7698 | BLAKE | MANAGER |
| 7782 | CLARK | MANAGER |
| 7788 | SCOTT | ANALYST |
| 7839 | KING | PRESIDENT |
| 7844 | TURNER | SALESMAN |
| 7876 | ADAMS | CLERK |
| 7900 | JAMES | CLERK |
| 7902 | FORD | ANALYST |
| 7934 | MILLER | CLERK |
+------------+--------+-----------+
14 rows in set (0.00 sec)
concat으로 구문 붙이기
concat을 이용하면 여러개의 컬럼을 붙여서 사용이 가능합니다.
mysql> select concat(empno, '-', deptno)as '사번-부서번호' from employee;
+---------------+
| 사번-부서번호 |
+---------------+
| 7782-10 |
| 7839-10 |
| 7934-10 |
| 7369-20 |
| 7566-20 |
| 7788-20 |
| 7876-20 |
| 7902-20 |
| 7499-30 |
| 7521-30 |
| 7654-30 |
| 7698-30 |
| 7844-30 |
| 7900-30 |
+---------------+
14 rows in set (0.00 sec)
SELECT 구문 예제(중복행의 제거)
중복되는 행이 출력되는 경우, DISTINCT 키워드로 중복행을 제거
mysql> select deptno from employee;
+--------+
| deptno |
+--------+
| 10 |
| 10 |
| 10 |
| 20 |
| 20 |
| 20 |
| 20 |
| 20 |
| 30 |
| 30 |
| 30 |
| 30 |
| 30 |
| 30 |
+--------+
14 rows in set (0.00 sec)
위에서 distinct를 추가한 모습입니다.
mysql> select distinct deptno from employee;
+--------+
| deptno |
+--------+
| 10 |
| 20 |
| 30 |
+--------+
3 rows in set (0.00 sec)
SELECT 구문 예제(정렬하기)
ORDER BY 절을 이용해서 정렬이 가능합니다.
mysql> select empno, name from employee;
+-------+--------+
| empno | name |
+-------+--------+
| 7369 | SMITH |
| 7499 | ALLEN |
| 7521 | WARD |
| 7566 | JONES |
| 7654 | MARTIN |
| 7698 | BLAKE |
| 7782 | CLARK |
| 7788 | SCOTT |
| 7839 | KING |
| 7844 | TURNER |
| 7876 | ADAMS |
| 7900 | JAMES |
| 7902 | FORD |
| 7934 | MILLER |
+-------+--------+
14 rows in set (0.00 sec)
기존 테이블에서 이름을 기준으로 정렬한다면 아래와 같습니다.
mysql> select empno, name from employee order by name;
+-------+--------+
| empno | name |
+-------+--------+
| 7876 | ADAMS |
| 7499 | ALLEN |
| 7698 | BLAKE |
| 7782 | CLARK |
| 7902 | FORD |
| 7900 | JAMES |
| 7566 | JONES |
| 7839 | KING |
| 7654 | MARTIN |
| 7934 | MILLER |
| 7788 | SCOTT |
| 7369 | SMITH |
| 7844 | TURNER |
| 7521 | WARD |
+-------+--------+
14 rows in set (0.00 sec)
desc를 이용하면 역순으로 정렬도 가능합니다.
mysql> select empno, name from employee order by name desc;
+-------+--------+
| empno | name |
+-------+--------+
| 7521 | WARD |
| 7844 | TURNER |
| 7369 | SMITH |
| 7788 | SCOTT |
| 7934 | MILLER |
| 7654 | MARTIN |
| 7839 | KING |
| 7566 | JONES |
| 7900 | JAMES |
| 7902 | FORD |
| 7782 | CLARK |
| 7698 | BLAKE |
| 7499 | ALLEN |
| 7876 | ADAMS |
+-------+--------+
14 rows in set (0.00 sec)
SELECT 구문 예제(특정 행 검색- where절)
where문은 프로그래밍에서 if문과 같다고 생각하면 됩니다.
mysql> select * from employee;
+-------+--------+-----------+------+------------+---------+---------+--------+
| empno | name | job | boss | hiredate | salary | comm | deptno |
+-------+--------+-----------+------+------------+---------+---------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1983-01-12 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)
mysql> select * from employee where empno = 7934;
+-------+--------+-------+------+------------+---------+------+--------+
| empno | name | job | boss | hiredate | salary | comm | deptno |
+-------+--------+-------+------+------------+---------+------+--------+
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
+-------+--------+-------+------+------------+---------+------+--------+
1 row in set (0.00 sec)
mysql> select * from employee where deptno = 10;
+-------+--------+-----------+------+------------+---------+------+--------+
| empno | name | job | boss | hiredate | salary | comm | deptno |
+-------+--------+-----------+------+------------+---------+------+--------+
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
+-------+--------+-----------+------+------------+---------+------+--------+
3 rows in set (0.00 sec)
SELECT에서 글자 검색
설명보다는 예시가 이해하기 편합니다.
mysql> select * from employee where name like 'A%';
+-------+-------+----------+------+------------+---------+--------+--------+
| empno | name | job | boss | hiredate | salary | comm | deptno |
+-------+-------+----------+------+------------+---------+--------+--------+
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1983-01-12 | 1100.00 | NULL | 20 |
+-------+-------+----------+------+------------+---------+--------+--------+
2 rows in set (0.00 sec)
mysql> select * from employee where name like '%A%';
+-------+--------+----------+------+------------+---------+---------+--------+
| empno | name | job | boss | hiredate | salary | comm | deptno |
+-------+--------+----------+------+------------+---------+---------+--------+
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7876 | ADAMS | CLERK | 7788 | 1983-01-12 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
+-------+--------+----------+------+------------+---------+---------+--------+
7 rows in set (0.00 sec)
mysql> select * from employee where name like '_A%';
+-------+--------+----------+------+------------+---------+---------+--------+
| empno | name | job | boss | hiredate | salary | comm | deptno |
+-------+--------+----------+------+------------+---------+---------+--------+
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
+-------+--------+----------+------+------------+---------+---------+--------+
3 rows in set (0.00 sec)
% 는 이후 단어들에 대해서 모든 조건을 검색한다.
_는 ‘_A’라면 A앞에 단 한글자만 올 수 있도록 조건을 정한다.
SELECT 구문 예제(함수의 사용)
mysql> select upper('seoUL'), ucase('Seoul'), lower('seOUL'), lcase('SeOul');
+----------------+----------------+----------------+----------------+
| upper('seoUL') | ucase('Seoul') | lower('seOUL') | lcase('SeOul') |
+----------------+----------------+----------------+----------------+
| SEOUL | SEOUL | seoul | seoul |
+----------------+----------------+----------------+----------------+
1 row in set (0.00 sec)
upper, ucase = 대문자로 변경
lower, lcase = 소문자로 변경
mysql> select substring('happy Day',4,4);
+----------------------------+
| substring('happy Day',4,4) |
+----------------------------+
| py D |
+----------------------------+
1 row in set (0.00 sec)
substring은 단어 추출하는 것을 도와줍니다.
mysql> select lpad(name, 10,'+'),rpad(name,10,'*') from employee;
+--------------------+-------------------+
| lpad(name, 10,'+') | rpad(name,10,'*') |
+--------------------+-------------------+
| +++++SMITH | SMITH***** |
| +++++ALLEN | ALLEN***** |
| ++++++WARD | WARD****** |
| +++++JONES | JONES***** |
| ++++MARTIN | MARTIN**** |
| +++++BLAKE | BLAKE***** |
| +++++CLARK | CLARK***** |
| +++++SCOTT | SCOTT***** |
| ++++++KING | KING****** |
| ++++TURNER | TURNER**** |
| +++++ADAMS | ADAMS***** |
| +++++JAMES | JAMES***** |
| ++++++FORD | FORD****** |
| ++++MILLER | MILLER**** |
+--------------------+-------------------+
14 rows in set (0.00 sec)
lpad, rpad는 좌측 우측의 글자를 고정시켜서 ‘내용’을 빈 공간에 추가시켜서 테이블로 보여줍니다.
이외 다른 함수들
- 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나 YYYYMMDDHHMMSS 형식으로 반환합니다.
- DATE_FORMAT(date,format) : 입력된 date를 format 형식으로 반환합니다.
- PERIOD_DIFF(p1,p2) : YYMM이나 YYYYMM으로 표기되는 p1과 p2의 차이 개월을 반환합니다.
SELECT 구문(그룹함수)
mysql> select * from employee;
+-------+--------+-----------+------+------------+---------+---------+--------+
| empno | name | job | boss | hiredate | salary | comm | deptno |
+-------+--------+-----------+------+------------+---------+---------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1983-01-12 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)
mysql> select avg(salary), sum(salary) from employee where deptno=30;
+-------------+-------------+
| avg(salary) | sum(salary) |
+-------------+-------------+
| 1566.666667 | 9400.00 |
+-------------+-------------+
1 row in set (0.00 sec)
mysql> select avg(salary), sum(salary) from employee group by deptno;
+-------------+-------------+
| avg(salary) | sum(salary) |
+-------------+-------------+
| 2916.666667 | 8750.00 |
| 2175.000000 | 10875.00 |
| 1566.666667 | 9400.00 |
+-------------+-------------+
3 rows in set (0.00 sec)
mysql> select deptno,avg(salary), sum(salary) from employee group by deptno;
+--------+-------------+-------------+
| deptno | avg(salary) | sum(salary) |
+--------+-------------+-------------+
| 10 | 2916.666667 | 8750.00 |
| 20 | 2175.000000 | 10875.00 |
| 30 | 1566.666667 | 9400.00 |
+--------+-------------+-------------+
3 rows in set (0.00 sec)
group 함수를 이용하면 원하는 결과를 하나씩이 아닌 한번에 보여줄 수 있습니다.
데이터 삭제 실습(DELETE문)
delete from ROLE where role_id = 200;(예시 날아감)
- where절을 안줄 경우 모든 데이터가 삭제되니 조심해야 합니다.