외우지말고 이해하라.

외우는 것 보단 이해해서 내것으로 만들어 활용하기

Web Back-End/MySQL

MySQL 학습 02 - IFNULL, union, TRUNCATE

hyg4196 2021. 5. 21. 11:35
반응형

1. IFNULL( 'TRUE', 'FALSE')

참일시 앞부분, 거짓일시 뒷부분이 출력.

 

 

 

2. union

여러 검색문을 묶어 검색내용을 한번에 처리

- 유니온의 규칙
  1. 하나의 ORDER BY만 사용할 수 있다.
  2. 각 SELECT의 열수, 표현식가 같아야 한다.
  3. SELECT 문들 끼리 순서는 상관없다.
  4. 유니온을 한 결과가 중복되면 하나만 나온다. (DEFAULT)
  5. 열의 타입은 같거나 반환 가능한 형태여야 한다.
  6. 중복값을 나타내고 싶다면 UNION ALL

 

 

3. TRUNCATE artcile;  

article 테이블의 모든 내용을 지운다

# a6 DB 삭제/생성/선택
CREATE DATABASE `a6`;
DROP DATABASE IF EXISTS `a6`;
USE `a6`;
# 부서(홍보, 기획, IT)
CREATE TABLE dept(
    id INT(100) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    NAME VARCHAR(100) NOT NULL,
    regDate DATETIME NOT NULL
);

DROP TABLE dept;
INSERT INTO dept SET NAME ='홍보', regDate =NOW();
INSERT INTO dept SET NAME ='기획', regDate =NOW();
INSERT INTO dept SET NAME ='IT', regDate =NOW();
SELECT * FROM dept;

# 사원(홍길동/홍보/5000만원, 홍길순/홍보/6000만원, 임꺽정/기획/4000만원)
## IT부서는 아직 사원이 없음
CREATE TABLE emp(
    id INT(100) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    NAME VARCHAR(100) NOT NULL,
    regDate DATETIME NOT NULL,
    salary INT(200) NOT NULL,
    deptId INT(100) NOT NULL
);

DESC emp;

DROP TABLE emp;
INSERT INTO emp SET NAME ='홍길동', regDate =NOW(), salary = 50000000, deptId = 1;
INSERT INTO emp SET NAME ='홍길순', regDate =NOW(), salary = 60000000, deptId = 1;
INSERT INTO emp SET NAME ='임꺽정', regDate =NOW(), salary = 4000000, deptId = 2;

SELECT * FROM emp;

# 전 사원에 대하여, [부서명, 사원번호, 사원명] 양식으로 출력
SELECT D.name AS '부서명',E.id AS '사원번호' ,E.name AS '사원번호' FROM emp AS E JOIN dept AS D ON E.deptId = D.id; 
# 전 사원에 대하여, [부서명, 사원번호, 사원명] 양식으로 출력
## IT부서는 [IT, NULL, NULL] 으로 출력
SELECT D.name AS '부서명',E.id AS '사원번호' ,E.name AS '사원번호' FROM emp AS E RIGHT JOIN dept AS D ON E.deptId = D.id; 

# 전 사원에 대하여, [부서명, 사원번호, 사원명] 양식으로 출력
## IT부서는 [IT, 0, -] 으로 출력

SELECT D.name AS '부서명',IFNULL(E.id,0) AS '사원번호' ,IFNULL(E.name,'   -') AS '사원번호' FROM emp AS E RIGHT JOIN dept AS D ON E.deptId = D.id; 
SELECT * FROM emp;
# 모든 부서별, 최고연봉, IT부서는 0원으로 표시
SELECT D.name AS '부서명',IFNULL(MAX(E.salary), 0) AS '최고연봉' FROM emp AS E RIGHT JOIN dept AS D ON E.deptId = D.id GROUP BY D.id;

# 모든 부서별, 최저연봉, IT부서는 0원으로 표시
SELECT D.name AS '부서명',IFNULL(MIN(E.salary), 0) AS '최고연봉' FROM emp AS E RIGHT JOIN dept AS D ON E.deptId = D.id GROUP BY D.id;

# 모든 부서별, 평균연봉, IT부서는 0원으로 표시
SELECT D.name AS '부서명',IFNULL(AVG(E.salary), 0) AS '최고연봉' FROM emp AS E RIGHT JOIN dept AS D ON E.deptId = D.id GROUP BY D.id;

# 하나의 쿼리로 최고액연봉자와 최저역연봉자의 이름과 연봉
SELECT NAME, MAX(salary) FROM emp;
SELECT MIN(salary) FROM emp;
SELECT E.* FROM (SELECT MIN(salary) FROM emp) E, dept;

SELECT emp.name AS '이름', emp.salary AS '연봉' FROM (SELECT MIN(salary) AS 'min' FROM emp) E, 
(SELECT NAME, MAX(salary) AS 'max' FROM emp) AS D,
emp
WHERE salary = E.min OR salary = D.max;
반응형

'Web Back-End > MySQL' 카테고리의 다른 글

JDBC, DBCP, JNDI 차이점  (1) 2024.09.08
MySQL 학습 01 - UNSIGNED, AUTO_INCREMENT , INNER JOIN  (0) 2021.05.18
MySQL 연습장 02  (0) 2021.05.18
MySQL 연습장 01  (0) 2021.05.17