지구정복
[SQL] 11/30 | SELECT문(WHERE, LIKE, IS NULL, IN, BETWEEN, %, _, NOT, ORDER BY, LIMIT), 내장함수(단일행함수, 그룹함수), GROUP BY절, 연습문제 본문
[SQL] 11/30 | SELECT문(WHERE, LIKE, IS NULL, IN, BETWEEN, %, _, NOT, ORDER BY, LIMIT), 내장함수(단일행함수, 그룹함수), GROUP BY절, 연습문제
eeaarrtthh 2020. 11. 30. 16:35서버는 ip주소가 있어서 다른 pc에 있어도 원격으로 접속이 가능하다.
접속하는 주체는 클라이언트이다.
클라이언트가 서버의 명령을 내리는 언어가 SQL이다.
접속하는 동시에 데이터베이스를 사용하는 방법
mysql -u root -p 데이터베이스명
원격접속하는법
mysql -u 사용자명 -p 데이터베이스명 -h ip
이번에는 마리아디비를 끄고 접속되는지 확인해보자.
서비스에서 서비스 일시정지를 한다.
접속이 안되는 것을 확인할 수 있다.
DML 사용 - SELECT문
부서번호가 20번인 사원에 대한 사원번호, 사원명, 급여, 부서번호를 출력하라.
사원명이 S로 시작하는 사원에 대한 사원번호, 사원명, 급여, 부서번호를 출력하라.
(LIKE % 사용하지 않고하기)
부서번호가 20번이면서 사원명이 S로 시작하는 사원에 대한 사원번호, 사원명, 급여, 부서번호를 출력하라.
COMM이 NULL인 사원명 급여, COMM 출력하기
아래처럼하면 'NULL'은 0으로 인식해서 0인 사원이 출력된다.
IS NULL 을 이용한다.
직책(JOB)이 CLEAK, MANAGER, ANYLIST인 사원에 대한 사원번호, 사원명, 직책을 출력하라.
( IN과 OR 두 가지 방법 사용해보기)
SELECT EMPNO, ENAME, JOB
FROM EMP
WHERE JOB IN ('CLECK', 'MANAGER', 'ANALYST');
SELECT EMPNO, ENAME, JOB
FROM EMP
WHERE JOB = 'CLERK' OR JOB = 'MANAGER' OR JOB = 'ANALYST';
부서번호가 10, 20인 부서인 사원에 대한 사원번호, 사원명, 직책, 부서번호를 출력하라.
급여가 1000이상, 2000이하인 사원에 대한 사원번호, 사원명, 급여를 출력하라.
(일반 AND와 BETWEEN문 사용)
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE SAL >=1000 AND SAL <= 2000;
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE SAL BETWEEN 1000 AND 2000;
이름이 S로 시작하는 사원의 사원번호, 사원명을 출력하라
(BETWEEN 절 사용)
BETWEEN 절은 시간과 날짜도 적용가능하다.
-부분문자열
~시작하는
~으로 끝나는
~포함 되어진
_ : 어떤 문자 한 개를 의미 (_A 는 1A, 2A, 3A 와 같은 문자열 출력)
% : 개수에 상관없이 여러 글자를 의미
(%A 는 11A, 222A, ASA, RKRA 등과 A로 끝나는 모든 문자열 출력)
(A% 는 A로 시작하는 문자열, %A%는 A가 포함되어진 문자열을 의미)
위 부분문자열을 LIKE 뒤에 같이 쓰인다.
LIKE A%; 와 같이 쓰인다.
사원명이 S로 시작하는 사원번호, 사원명을 출력하라.
만약에 아래와 같이 쓰이면 이름이 'S%'인 사원을 찾는다는 의미이다.
SELECT EMPNO, ENAME
FROM EMP
WHERE ENAME = 'S%';
Empty set (0.000 sec)
사원명이 H로 끝나는 사원번호, 사원명 출력하라.
사원명에 CO가 들어가는 사원의 사원번호, 사원명을 출력하라.
사원명이 네 글자인 사원의 사원번호, 사원명을 출력하라.
입사일자가 2월인 사원에 대한 사원번호, 사원명, 입사일자를 출력하라.
사원명이 4글자가 아닌 사원의 번호, 사원명을 출력하라.
(NOT 사용)
부서번호가 10,20이 아닌 사원의 사원번호, 사원명, 부서번호를 출력하라.
급여가 1000과 2000사이가 아닌 사원의 사원번호, 사원명, 급여를 출력하라.
COMM이 NULL이 아닌 사원의 사원번호, 사원명, COMM을 출력하라.
-ORDER BY 사용하기
ORDER BY 컬럼명 [ASC / DESC]
ASC : 오름차순 (기본값)
DESC : 내림차순
직책에 따라 오름차순으로 사원데이터를 출력하라.
문자의 경우 A의 아스키코드값이 Z보다 아래이므로 오름차순은 아래와 같다.
반대로 내림차순으로 정렬해보자.
부서번호를 정렬하고 JOB도 정렬한 다음 사원번호, 사원명, 부서번호, 직책을 출력하자.
ORDER BY DEPTNO, JOB;
DEPTNO의 별칭은 D, JOB의 별칭은 J라고 하고 별칭으로 정렬해보자.
이게 가능한 이유는 SQL 실행순서와 관련이 있다. SQL문은 먼저 FROM 절로 데이터를 가져온뒤 SELECT문에 해당되는 컬럼들만 뽑아내고 마지막으로 ORDER BY절을 실행하기 때문에 가능하다.
컬럼 순서값으로도 정렬이 가능하다.
SELECT 절에 나오는 컬럼 순서대로 1, 2, 3, 4...가 된다.
SELECT절에 DEPTNO를 세 번째 컬럼명으로 쓴 뒤
DEPTNO으로 정렬해보자.
원하는 행의 개수만 출력하기
LIMIT 행의수;
이때 첫 행은 0번째이다.
마리아디비에만 있는 기능이다.
이번에는 1부터 3까지의 행을 출력해보자.
이번에는 사원번호 순으로 정렬해서 상위 5개 사원에 대한 사원번호, 사원이름 출력해보자.
-내장함수
단일행 함수
단일행함수는 하나의 행으로 하나의 결과로 나타난다.
아래는 모두 단일행 함수이다.
마이아디비의 내장함수를 알아보자.
https://mariadb.com/kb/en/buil-in-functions/
위 사이트 들어가면 사용가능한 내장함수가 적혀있다.
-information function
현재 내가 있는 데이터베이스를 아는 명령어
select database();
접속사용자 알아내기
select user();
마리아디비의 버전정보
select version();
-numeric function
절대값
select abs(123), abs(-123);
올림
select ceil(4.4), ceil(4.5), ceil(4.6);
//5 5 5
내림
select floor(4.4), floor(4.5), floor(4.6);
//4 4 4
반올림
select round(4.4), round(4.5), round(4.6);
//4 5 5
절삭 : 지정위치에서 숫자값 버리기
select truncate(999.999, 0);
//999
select truncate(999.999, 2);
//999.99
select truncate(999.999, -2);
//900
제곱
select power(2, 2), power(2, 3);
//4 8
나눈 나머지
select 5%2, mod(5, 2);
//1 1
-string function
아스키코드 구하기
select ascii('a'), ascii('A');
//97 65
문자열 길이구하기
select length('abc');
//3
문자 길이구하기
select char_length('테스트');
//3
이름이 4자인 사원에 대한 사원번호, 사원명을 length 함수를 이용해서 출력하기
문자열 연결하기
select concat('asp', 'php');
//aspphp
select concat('asp', 'php', 'aaa');
//aspphpaaa
emp테이블의 모든 사원에 대해서 ename님의 잭책은 job입니다 라는 문구를 출력해보자.
30번 부서의 사원들에 대한 직책을 출력하라.
20번 부서의 사원에 대한 연봉정보(SAL*12)를 출력하는데 출력예시는 다음과 같다.
'Clark 님의 연봉은 3000원 입니다.'
-특정문자열의 자리값(인덱스값) 출력
SELECT INSTR('mysql database study', 'study');
//16
16번째 자리에 study란 단어가 시작됨을 알 수 있다.
문자열 첫번째 자리는 1이다.
SELECT INSTR('mysql database study', 'my');
//1
사원명에 co가 들어간 사원의 사원번호와 사원명을 출력하기
-특정 문자를 추출하기1
SELECT LEFT('MYSQL DATABASE STUDY', 5);
//MYSQL
왼쪽부터 5개
SELECT RIGHT('MYSQL DATABASE STUDY', 5);
//STUDY
오른쪽부터 5개
SELECT MID('MYSQL DATABASE STUDY', 5);
//L DATABASE STUDY
중간 5번째 자리부터 오른쪽 끝까지
사원명이 S로 시작하는 사원에 대한 사원번호, 사원명을 출력하라.
(LEFT를 사용하기)
-특정 문자열 추출하기2
SELECT SUBSTRING('MYSQL DATABASE STUDY', 5, 5);
//L DAT
문자열의 5번째 자리에서 오른쪽으로 5번째 자리까지
-특정 문자열 치환하기1
SELECT REPLACE('MYSQL DATABASE STUDY', 'STUDY', '스터디');
//MYSQL DATABASE 스터디
특정 문자열을 바꾸고싶은 문자열로 치환하기
-특정 문자열 치환하기2
SELECT INSERT('MYSQL DATABASE STUDY', 7, 8, '데이터베이스');
//MYSQL 데이터베이스 STUDY
7번째 자리에서 시작해서 8자리까지의 단어를 특정 단어로 치환하기
-대소문자 변환
SELECT LCASE('ABC'), UCASE('abc');
//abc ABC
-문자열 순서 뒤집어서 쓰기
SELECT REVERSE('ABC');
//CBA
-문자열에 공백지우기
SELECT LTRIM(' MYSQL STUDY');
//MYSQL STUDY
왼쪽 공백 지우기
-특정 문자열 채워넣기
SELECT LPAD('HI', 4, '?');
//??HI
왼쪽부터 4개의 자리를 주고 특정문자열을 집어넣고 공백에는 ?를 집어넣는다.
SELECT LPAD('HI22', 4, '?');
//HI22
공백이 없으므로 문자열만 채워넣어진다.
-date and time function
-현재시간 얻어오기
SELECT NOW(), SYSDATE(), CURRENT_TIMESTAMP();
-날짜만 가져오기
SELECT CURDATE(), CURRENT_DATE();
-시간만 가져오기
SELECT CURTIME(), CURRENT_TIME();
-시간연산하기
SELECT NOW(), NOW()+1;
날짜 형식이 사라지면서 1초가 늘어난다.
-덧셈
SELECT NOW(), DATE_ADD(NOW(), INTERVAL 2 SECOND);
위 SQL은 날짜형식은 유지되면서 2초 뒤의 값이 출력된다.
-뺄셈
SELECT NOW(), DATE_SUB(NOW(), INTERVAL 2 DAY);
이틀을 뺀 날짜가 출력된다.
-특정 날짜 추출하기
SELECT NOW(), YEAR(NOW());
//2020
SELECT YEAR('20200130');
//2020
SELECT YEAR('2020-11-30');
//2020
-특정 날짜를 다른 형식으로 만들기
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');
//2020-11-30
SELECT DATE_FORMAT(NOW(), '%Y:%m:%d');
//2020:11:30
30번 부서번호의 사원에 대한 사원번호, 사원명, 부서번호, 입사일자를 출력하는데
입사일자를 '년도-월-일'형태로 출력하라.
-특정 리스트에서 최대값, 최소값 구하기
SELECT GREATEST(100, 101, 102);
//102
SELECT LEAST(100, 101, 102);
//100
SELECT GREATEST(SAL, 100) FROM EMP;
100보다 큰(이상의) SAL들을 모두 출력하라.
-COMPARISON FUNCTION
-조건문 사용
SELECT IF( 1 != 2, '참', '거짓');
//거짓
SELECT ENAME, SAL, IF(SAL<2000, '적음', '많음')
FROM EMP
WHERE DEPTNO = 30;
-널값 여부 확인하기
SELECT IFNULL(A, '참');
//참
A가 널이면 참, 아니면 A 출력
사원테이블에서 사원의 연봉+COMM을 더한 값을 출력해보자.
-CASE문
1. SWITCH문과 비슷
CASE 값
WHEN 값 THEN 결과
WHEN 값 THEN 결과
ELSE 결과 END;
2. IF ELSE ELSE문과 비슷
CASE
WHEN 조건 THEN 결과
WHEN 조건 THEN 결과
ELSE 결과 END;
SELECT
CASE 1
WHEN 1 THEN 'ONE'
WHEN 2 THEN 'TWO'
ELSE 'MORE' END;
+------------------------------------------------------------+
| CASE 1
WHEN 1 THEN 'ONE'
WHEN 2 THEN 'TWO'
ELSE 'MORE' END |
+------------------------------------------------------------+
| ONE |
+------------------------------------------------------------+
1 row in set (0.000 sec)
SELECT EMPNO, ENAME, JOB, SAL,
CASE JOB
WHEN 'ANALYST' THEN SAL *1.1
WHEN 'CLERK' THEN SAL *1.2
WHEN 'PRESIDENT' THEN SAL *1.3
ELSE SAL
END 내년월급
FROM EMP;
+-------+--------+-----------+---------+----------+
| EMPNO | ENAME | JOB | SAL | 내년월급 |
+-------+--------+-----------+---------+----------+
| 7369 | SMITH | CLERK | 1600.00 | 1920.000 |
| 7499 | ALLEN | SALESMAN | 1600.00 | 1600.000 |
| 7521 | WARD | SALESMAN | 1250.00 | 1250.000 |
| 7566 | JONES | MANAGER | 2975.00 | 2975.000 |
| 7698 | BLAKE | MANAGER | 2850.00 | 2850.000 |
| 7782 | CLARK | MANAGER | 2450.00 | 2450.000 |
| 7788 | SCOTT | ANALYST | 3000.00 | 3300.000 |
| 7839 | KING | PRESIDENT | 5000.00 | 6500.000 |
| 7844 | TURNER | SALESMAN | 1500.00 | 1500.000 |
| 7876 | ADAMS | CLERK | 1100.00 | 1320.000 |
| 7900 | JAMES | CLERK | 950.00 | 1140.000 |
| 7902 | FORD | ANALYST | 3000.00 | 3300.000 |
| 7934 | MILLER | CLERK | 1300.00 | 1560.000 |
+-------+--------+-----------+---------+----------+
13 rows in set (0.000 sec)
-SQL파일 만들고 불러오기(SQL 스크립트 실행)
sql문을 메모장에 적은 다음 아래 처럼 저장하기
확장자명은 .sql
인코딩 타입은 ANSI 안되면 UTF-8
SOURCE 파일경로
아래처럼 실행된다.
source c:\sql\ex01.sql
+-------+--------+-----------+---------+----------+
| EMPNO | ENAME | JOB | SAL | 내년월급 |
+-------+--------+-----------+---------+----------+
| 7369 | SMITH | CLERK | 1600.00 | 1920.000 |
| 7499 | ALLEN | SALESMAN | 1600.00 | 1600.000 |
| 7521 | WARD | SALESMAN | 1250.00 | 1250.000 |
| 7566 | JONES | MANAGER | 2975.00 | 2975.000 |
| 7698 | BLAKE | MANAGER | 2850.00 | 2850.000 |
| 7782 | CLARK | MANAGER | 2450.00 | 2450.000 |
| 7788 | SCOTT | ANALYST | 3000.00 | 3300.000 |
| 7839 | KING | PRESIDENT | 5000.00 | 6500.000 |
| 7844 | TURNER | SALESMAN | 1500.00 | 1500.000 |
| 7876 | ADAMS | CLERK | 1100.00 | 1320.000 |
| 7900 | JAMES | CLERK | 950.00 | 1140.000 |
| 7902 | FORD | ANALYST | 3000.00 | 3300.000 |
| 7934 | MILLER | CLERK | 1300.00 | 1560.000 |
+-------+--------+-----------+---------+----------+
13 rows in set (0.001 sec)
그룹함수
그룹함수는 여러개의 행을 묶어서 한 개의 결과를 나타낸다.
-COUNT
행의 개수를 의미
NULL이 있으면 제외된다.
SELECT COUNT(SAL)
FROM EMP;
+------------+
| COUNT(SAL) |
+------------+
| 13 |
+------------+
1 row in set (0.001 sec)
COMM의 COUNT를 하면 NULL이 사라진다.
SELECT COUNT(COMM)
FROM EMP;
+-------------+
| COUNT(COMM) |
+-------------+
| 4 |
+-------------+
1 row in set (0.001 sec)
따라서 보통 * 눈송이를 많이 사용한다.
SELECT COUNT(*)
FROM EMP;
+----------+
| COUNT(*) |
+----------+
| 13 |
+----------+
1 row in set (0.000 sec)
-SUM() / AVG()
모두 NULL이 계산이 안된다.
SELECT SUM(SAL)
FROM EMP;
+----------+
| SUM(SAL) |
+----------+
| 28575.00 |
+----------+
1 row in set (0.000 sec)
SELECT AVG(SAL)
FROM EMP;
+-------------+
| AVG(SAL) |
+-------------+
| 2198.076923 |
+-------------+
1 row in set (0.000 sec)
SELECT AVG(COMM) '함수사용한 평균', SUM(COMM)/COUNT(*) '직접계산한 평균'
FROM EMP;
+-----------------+-----------------+
| 함수사용한 평균 | 직접계산한 평균 |
+-----------------+-----------------+
| 275.000000 | 84.615385 |
+-----------------+-----------------+
1 row in set (0.000 sec)
위에 AVG(COMM)과 SUM(COMM)/COUNT(*)의 결과가 다른 이유는 AVG(COMM)은 NULL값을 빼고 계산해서 그렇다.
따라서 아래코드처럼 바꿔주면 동일한 값이 나온다.
SELECT AVG(IFNULL(COMM, 0)) '함수사용한 평균', SUM(COMM)/COUNT(IFNULL(COMM,0)) '직접계산한 평균'
FROM EMP;
+-----------------+-----------------+
| 함수사용한 평균 | 직접계산한 평균 |
+-----------------+-----------------+
| 84.615385 | 84.615385 |
+-----------------+-----------------+
1 row in set (0.000 sec)
-MAX(), MIN()
급여가 가장 높은 사람과 가장 낮은 사람의 급여를 출력하기
SELECT MAX(SAL), MIN(SAL)
FROM EMP;
+----------+----------+
| MAX(SAL) | MIN(SAL) |
+----------+----------+
| 5000.00 | 950.00 |
+----------+----------+
1 row in set (0.000 sec)
그룹화
GROUP BY 절 사용
보통 그룹함수와 같이 쓰인다.
부서별 최고급여를 받는 사원의 정보를 출력하라.
SELECT ENAME, DEPTNO, MAX(SAL)
FROM EMP
GROUP BY DEPTNO;
+-------+--------+----------+
| ENAME | DEPTNO | MAX(SAL) |
+-------+--------+----------+
| KING | 10 | 5000.00 |
| JONES | 20 | 3000.00 |
| SMITH | 30 | 2850.00 |
+-------+--------+----------+
3 rows in set (0.001 sec)
부서별 평균급여를 출력하라.
SELECT DEPTNO, TRUNCATE(AVG(SAL),0) '평균급여'
FROM EMP
GROUP BY DEPTNO;
+--------+----------+
| DEPTNO | 평균급여 |
+--------+----------+
| 10 | 3150 |
| 20 | 2518 |
| 30 | 1742 |
+--------+----------+
3 rows in set (0.001 sec)
직책별 최고급여를 받는 사원들을 출력하라.
SELECT ENAME, JOB, MAX(SAL)
FROM EMP
GROUP BY JOB;
+-------+-----------+----------+
| ENAME | JOB | MAX(SAL) |
+-------+-----------+----------+
| SCOTT | ANALYST | 3000.00 |
| SMITH | CLERK | 1600.00 |
| JONES | MANAGER | 2975.00 |
| KING | PRESIDENT | 5000.00 |
| ALLEN | SALESMAN | 1600.00 |
+-------+-----------+----------+
5 rows in set (0.001 sec)
부서별, 직책별 최고급여를 받는 사원들을 출력하라.
SELECT ENAME, DEPTNO, JOB, MAX(SAL)
FROM EMP
GROUP BY DEPTNO, JOB;
+--------+--------+-----------+----------+
| ENAME | DEPTNO | JOB | MAX(SAL) |
+--------+--------+-----------+----------+
| MILLER | 10 | CLERK | 1300.00 |
| KING | 10 | PRESIDENT | 5000.00 |
| SCOTT | 20 | ANALYST | 3000.00 |
| ADAMS | 20 | CLERK | 1100.00 |
| JONES | 20 | MANAGER | 2975.00 |
| SMITH | 30 | CLERK | 1600.00 |
| BLAKE | 30 | MANAGER | 2850.00 |
| ALLEN | 30 | SALESMAN | 1600.00 |
+--------+--------+-----------+----------+
8 rows in set (0.001 sec)
GROUP BY 절에서 그룹함수에 조건을 주고 싶으면
HAVING절에 그룹함수에 대한 조건을 써야한다.
부서별, 직책별 최대급여가 2000이상인 사원만 출력하기
SELECT ENAME, DEPTNO, JOB, MAX(SAL)
FROM EMP
GROUP BY DEPTNO, JOB
HAVING MAX(SAL) > 2000;
+-------+--------+-----------+----------+
| ENAME | DEPTNO | JOB | MAX(SAL) |
+-------+--------+-----------+----------+
| KING | 10 | PRESIDENT | 5000.00 |
| SCOTT | 20 | ANALYST | 3000.00 |
| JONES | 20 | MANAGER | 2975.00 |
| BLAKE | 30 | MANAGER | 2850.00 |
+-------+--------+-----------+----------+
4 rows in set (0.001 sec)
이번에는 부서번호 10번을 제외한 부서별, 직책별 최대급여가 2000이상인 사원 출력을 해보자.
SELECT ENAME, DEPTNO, JOB, MAX(SAL)
FROM EMP
WHERE DEPTNO != 10
GROUP BY DEPTNO, JOB
HAVING MAX(SAL) > 2000;
+-------+--------+---------+----------+
| ENAME | DEPTNO | JOB | MAX(SAL) |
+-------+--------+---------+----------+
| SCOTT | 20 | ANALYST | 3000.00 |
| JONES | 20 | MANAGER | 2975.00 |
| BLAKE | 30 | MANAGER | 2850.00 |
+-------+--------+---------+----------+
3 rows in set (0.001 sec)
이는 SQL실행순서가 FROM - WHERE - GROUP BY - HAVING - SELECT 이기 때문에 먼저 DEPTNO 10인 부서를 삭제후
그룹화하고 그룹함수에 조건을 주어서 검색을 하는 것이다.
WHERE에는 일반 컬럼에 대한 조건이 들어가고
HAVING에는 그룹함수의 조건 또는 단일행 함수가 들어간다.
연습문제
1. 데이터베이스의 목록을 확인할 수 있는 SQL 문장을 기술하십시오.
2. 테이블의 목록을 확인할 수 있는 SQL 문장을 기술하십시오.
3. 테이블의 구조를 확인할 수 있는 SQL 문장을 기술하십시오.
* 현재 사용하는 있는 데이터베이스의 이름을 출력하는 SQL 문장을 기술하십시오.
* 현재 사용자 이름을 출력하는 SQL 문장을 기술하십시오.
4. 사원 테이블에서 직원들의 연봉(SAL*12+comm)을 계산하여, 컬럼명은 "사원 연봉"으로 출력하는 SQL 문장을 기술하십시오.
5. 사원 테이블을 이용하여 다음과 같은 결과를 얻을 수 있는 SQL 문장을 기술하십시오.
사원정보
-----------------------------------------------------------------------
SMITH의 업무는 CLERK이고 급여는 800만원입니다
ALLEN의 업무는 SALESMAN이고 급여는 1600만원입니다
WARD의 업무는 SALESMAN이고 급여는 1250만원입니다
JONES의 업무는 MANAGER이고 급여는 2975만원입니다
MARTIN의 업무는 SALESMAN이고 급여는 1250만원입니다
BLAKE의 업무는 MANAGER이고 급여는 2850만원입니다
CLARK의 업무는 MANAGER이고 급여는 2450만원입니다
SCOTT의 업무는 ANALYST이고 급여는 3000만원입니다
KING의 업무는 PRESIDENT이고 급여는 5000만원입니다
TURNER의 업무는 SALESMAN이고 급여는 1500만원입니다
ADAMS의 업무는 CLERK이고 급여는 1100만원입니다
JAMES의 업무는 CLERK이고 급여는 950만원입니다
FORD의 업무는 ANALYST이고 급여는 3000만원입니다
MILLER의 업무는 CLERK이고 급여는 1300만원입니다
6. 사원 테이블에서 입사일이 2011년도인 사원의 사원번호, 사원이름, 입사일, 업무, 급여를 검색하는 SQL 문장을 기술하십시오.
7. 사원 테이블에서 입사일이 2011년이고 업무가 'SALESMAN'이 아닌 사원의 사원번호, 사원이름, 입사일, 업무, 급여를 검색하는 SQL 문장을 기술하십시오.
8. 사원 테이블의 사원번호, 사원이름, 입사일, 업무, 급여를 급여가 높은 순으로 정렬하고, 급여가 같으면 입사일이 빠른 사원으로 정렬하는 SQL 문장을 기술하십시오.
9. 사원 테이블에서 사원이름의 세 번째 알파벳이 'N'인 사원의 사원번호, 사원이름을 검색하는 SQL 문장을 기술하십시오.
10. 사원 테이블에서 연봉(SAL*12)이 35000 이상인 사번, 사원명, 연봉을 검색하는 SQL 문장을 기술하십시오.
11. 사원 테이블의 사원명에서 2번째 문자부터 3개의 문자를 추출하여 출력하는 SQL 문장을 기술하십시오.
12. 사원 테이블에서 입사일이 12월인 사원의 사번, 사원명, 입사일을 검색하는 SQL 문장을 기술하십시오.
13. 다음과 같은 결과를 출력하는 SQL 문장을 기술하십시오.
EMPNO ENAME 입사일
---------- ---------- ----------
7369 SMITH 1980-12-17
7499 ALLEN 1981-02-20
7521 WARD 1981-02-22
...
7934 MILLER 1982-01-23
14 개의 행이 선택되었습니다.
* 다음과 같은 결과를 출력하는 SQL 문장을 기술하십시오.
EMPNO ENAME 급여
---------- ---------- --------------------
7369 SMITH *******800
7499 ALLEN ******1600
7521 WARD ******1250
...
7934 MILLER ******1300
14 개의 행이 선택되었습니다.
해답
1. 데이터베이스의 목록을 확인할 수 있는 SQL 문장을 기술하십시오.
SHOW DATABASES;
2. 테이블의 목록을 확인할 수 있는 SQL 문장을 기술하십시오.
SHOW TABLES;
3. 테이블의 구조를 확인할 수 있는 SQL 문장을 기술하십시오.
DESC 테이블명;
* 현재 사용하는 있는 데이터베이스의 이름을 출력하는 SQL 문장을 기술하십시오.
SELECT DATABASE();
* 현재 사용자 이름을 출력하는 SQL 문장을 기술하십시오.
SELECT USER();
4. 사원 테이블에서 직원들의 연봉(SAL*12+comm)을 계산하여, 컬럼명은 "사원 연봉"으로 출력하는 SQL 문장을 기술하십시오.
SELECT EMPNO, ENAME, TRUNCATE(SAL*12+IFNULL(COMM, 0), 0) '사원 연봉'
FROM EMP;
5. 사원 테이블을 이용하여 다음과 같은 결과를 얻을 수 있는 SQL 문장을 기술하십시오.
사원정보
SELECT CONCAT(ENAME, '의 업무는 ', JOB, '이고 급여는 ', TRUNCATE(SAL, 0), '만원 입니다.')
FROM EMP;
-----------------------------------------------------------------------
SMITH의 업무는 CLERK이고 급여는 800만원입니다
ALLEN의 업무는 SALESMAN이고 급여는 1600만원입니다
WARD의 업무는 SALESMAN이고 급여는 1250만원입니다
JONES의 업무는 MANAGER이고 급여는 2975만원입니다
MARTIN의 업무는 SALESMAN이고 급여는 1250만원입니다
BLAKE의 업무는 MANAGER이고 급여는 2850만원입니다
CLARK의 업무는 MANAGER이고 급여는 2450만원입니다
SCOTT의 업무는 ANALYST이고 급여는 3000만원입니다
KING의 업무는 PRESIDENT이고 급여는 5000만원입니다
TURNER의 업무는 SALESMAN이고 급여는 1500만원입니다
ADAMS의 업무는 CLERK이고 급여는 1100만원입니다
JAMES의 업무는 CLERK이고 급여는 950만원입니다
FORD의 업무는 ANALYST이고 급여는 3000만원입니다
MILLER의 업무는 CLERK이고 급여는 1300만원입니다
6. 사원 테이블에서 입사일이 2011년도인 사원의 사원번호, 사원이름, 입사일, 업무, 급여를 검색하는 SQL 문장을 기술하십시오.
SELECT EMPNO, ENAME, HIREDATE, JOB, SAL
FROM EMP
WHERE HIREDATE LIKE '2011%';
7. 사원 테이블에서 입사일이 2011년이고 업무가 'SALESMAN'이 아닌 사원의 사원번호, 사원이름, 입사일, 업무, 급여를 검색하는 SQL 문장을 기술하십시오.
SELECT EMPNO, ENAME, HIREDATE, JOB, SAL
FROM EMP
WHERE HIREDATE LIKE '2011%' AND JOB != 'SALESMAN';
8. 사원 테이블의 사원번호, 사원이름, 입사일, 업무, 급여를 급여가 높은 순으로 정렬하고, 급여가 같으면 입사일이 빠른 사원으로 정렬하는 SQL 문장을 기술하십시오.
SELECT EMPNO, ENAME, HIREDATE, JOB, SAL
FROM EMP
ORDER BY SAL, HIREDATE;
9. 사원 테이블에서 사원이름의 세 번째 알파벳이 'N'인 사원의 사원번호, 사원이름을 검색하는 SQL 문장을 기술하십시오.
SELECT EMPNO, ENAME
FROM EMP
WHERE INSTR(ENAME, 'N') = 3;
10. 사원 테이블에서 연봉(SAL*12)이 35000 이상인 사번, 사원명, 연봉을 검색하는 SQL 문장을 기술하십시오.
SELECT EMPNO, ENAME, TRUNCATE(SAL*12 ,0) '연봉'
FROM EMP
WHERE TRUNCATE(SAL*12 ,0) >= 35000;
11. 사원 테이블의 사원명에서 2번째 문자부터 3개의 문자를 추출하여 출력하는 SQL 문장을 기술하십시오.
SELECT ENAME, SUBSTRING(ENAME, 2, 3)
FROM EMP;
12. 사원 테이블에서 입사일이 12월인 사원의 사번, 사원명, 입사일을 검색하는 SQL 문장을 기술하십시오.
SELECT EMPNO, ENAME, HIREDATE
FROM EMP
WHERE HIREDATE LIKE '%-12-%';
13. 다음과 같은 결과를 출력하는 SQL 문장을 기술하십시오.
SELECT EMPNO, ENAME, HIREDATE '입사일'
FROM EMP;
EMPNO ENAME 입사일
---------- ---------- ----------
7369 SMITH 1980-12-17
7499 ALLEN 1981-02-20
7521 WARD 1981-02-22
...
7934 MILLER 1982-01-23
14 개의 행이 선택되었습니다.
* 다음과 같은 결과를 출력하는 SQL 문장을 기술하십시오.
SELECT EMPNO, ENAME, LPAD(SAL, 11, '*') '급여'
FROM EMP;
EMPNO ENAME 급여
---------- ---------- --------------------
7369 SMITH *******800
7499 ALLEN ******1600
7521 WARD ******1250
...
7934 MILLER ******1300
14 개의 행이 선택되었습니다.