정해진 정답이란 없다고 생각합니다.
추가적으로 다른 방식으로 구현하신분 께서는 아래 댓글란에 작성해주시면 감사하겠습니다.
# 1. 사원테이블의 모든 레코드를 조회하시오
select * from emp;
/*(mysql은 대체로 영작문을 하는대로 해석하면 된다고 생각한다.)
select = 선택하다또는 선발하다라고 생각하면 되고
* = 전체, 또는 모든것 이라고 생각하면 될거 같다.
from = 어떤 장소에서나 누구에서 ~ 에서로 풀이하면 된다.
emp = 테이블의 이름을 넣어주면 된다.
; = 이것은 세미콜론으로 어디까지가 DBMS(데이터베이스 관리 시스템)의 명령어인지 구분하기위한 것으로 보면된다
선택하다 모든것 ~에서 [테이블명];*/
# 2. 사원명과 입사일을 조회하시오
select ename 사원명, hiredate as '입 사 일' from emp;
/*ename 과 hiredate는 emp테이블 안에 있는 컬럼 명이며
위 답과 같이 분리해서 사용이 가능하다. 분리하게 되면 해당 컬럼만 조회할 수 있는걸 알수 있다.
ename뒤에 붙은 것은 alias 라고 말한다.
alias 란?
부사:…라는 가명으로 알려진, 일명 …라 불리는
명사:(특히 범죄자의) 가명
사용법은 위와 같으며, as '' 를 사용할때만 자릿수 사이에 띄어쓰기가 가능하다는 점을 알면 좋다.
# 3. 사원 번호와 이름을 조회하시오
select empno '사원 번호', ename 이름 from emp;
# emp테이블에서 empno, ename 컬럼을 선택한다.
# 4. 사원테이블에 있는 직책의 목록을 조회하시오
select distinct(job) as '직책의 목록' from emp;
/*distinct는 중복된 내용을 무시하고 한가지의 데이터만 가져오는 문법이다.
즉, 테이블의 필드가
[결과물] (distinct 사용 전)
JOE
JOE (이런식으로 두개가 있으면)
[결과물] (distinct 사용 후)
JOE (이와같이 결과물이 나온다)*/
# 5. 총 사원수를 구하시오
select count(*) '총 사원수' from emp;
/*count(*)문법은 해당 테이블의 전체 열의 갯수를 구하는 문법이다.
(소 괄호 안에 어떤 값, 컬럼을 넣느냐에 따라서 카운트하는 갯수가 다르다)*/
# 6. 부서번호가 10인 사원을 조회하시오.
select * from emp where deptno = 10;
/* where문법 조건을 정해주는 문법이라고 생각하면되는데
위에서는 deptno 컬럼에서 필드가 10인 정보만 가져오라는 뜻이다.*/
# 7. 월 급여가 2500 이상 되는 사원을 조회하시오.
select * from emp where sal >= 2500;
# 6번 문제와 동일하게 where문법을 사용해서 sal이 2500이상이 되는 직원들의 데이터만 가져온다.
# 8. 이름이 'king'인 사원을 조회하시오.
select * from emp where ename like '___k%';
/* like는 =과 비슷하게 사용이 된다. like에서 추가적으로 k으로 시작하는 문자열('k%')이나 k가 포함된 문자열('%k%')을
조회할 수 있다
'_k%' << 이와같은 식으로 사용하게되면 두번째 자리가 k인 문자열을 선택 할수 있게 된다.*/
# 9. 사원들중 이름이 S로 시작하는 사원의 사원번호와 이름을 조회하시오.
select * from emp where ename like 's%';
# 해설은 8번과 동일하다.
# 10. 사원 이름에 T가 포함된 사원의 사원번호와 이름을 조회하시오.
select * from emp where ename like '%t%';
# 11. 커미션이 300, 500, 1400 인 사원의 사번,이름,커미션을 조회하시오.
select * from emp where comm in (300,500,1400);
select * from emp where comm = 300 or comm = 500 or comm = 1400;
/*첫번째 정답은 comm의 컬럼 안에 필드로 300 500 1400이 있는것을 선택한다는 뜻이고,
두번째 정답은 or(또는) 을 사용해서 구현한 방식입니다.
정답은 같게 도출됩니다.*/
# 12. 월급여가 1200 에서 3500 사이의 사원의 사번,이름,월급여를 조회하시오.
select deptno 사번, ename 이름, sal 월급여 from emp where sal between 1200 and 3500;
# 13. 직급이 매니저이고 부서번호가 30번인 사원의 이름,사번,직급,부서번호를 조회하시오.
select ename 이름, deptno 사번, job 직급 ,deptno 부서번호 from emp
where job = 'manager' and deptno = 30;
# 14. 부서번호가 30인 아닌 사원의 사번,이름,부서번호를 조회하시오.
select empno 사번, ename 이름, deptno 부서번호 from emp
where deptno != 30;
# 15. 커미션이 300, 500, 1400 이 모두 아닌 사원의 사번,이름,커미션을 조회하시오.
select * from emp;
select empno 사번, ename 이름, comm 커미션 from emp
where comm not in (300,500,1400) or comm is null;
# 16. 이름에 S가 포함되지 않는 사원의 사번,이름을 조회하시오.
select deptno 사번, ename 이름 from emp
where ename not like '%s%';
# 17. 급여가 1200보다 미만이거나 3700 초과하는 사원의 사번,이름,월급여를 조회하시오.
select deptno 사번, ename 이름, sal 월급여 from emp
where sal not between 1200 and 3700;
# 18. 직속상사가 NULL 인 사원의 이름과 직급을 조회하시오.
select ename 이름, job 직급 from emp
where mgr is null;
# 19. 부서별 평균월급여를 구하는 쿼리
select deptno 부서,avg(sal) 평균월급여 from emp
group by deptno;
# 20. 부서별 전체 사원수와 커미션을 받는 사원들의 수를 구하는 쿼리
select deptno 부서, count(*) '부서별 전체 사원수', count(comm) '커미션 받는 사원들의 수' from emp
group by deptno;
# 21. 부서별 최대 급여와 최소 급여를 구하는 쿼리
select deptno 부서,max(sal) '최대 급여', min(sal) '최소 급여' from emp
group by deptno;
# 22. 부서별로 급여 평균 (단, 부서별 급여 평균이 2000 이상만)
select deptno 부서, avg(sal) from emp
where sal >= 2000
group by deptno;
# 23. 월급여가 1000 이상인 사원만을 대상으로 부서별로 월급여 평균을 구하라. 단, 평균값이 2000 이상인 레코드만 구하라.
select deptno, avg(sal) from emp
where sal >= 1000
group by deptno having avg(sal) >= '2000';
# 24. 급여가 높은 순으로 조회하되 급여가 같을 경우 이름의 철자가 빠른 사원순으로 사번,이름,월급여를 조회하시오.
select empno, ename, sal from emp
order by sal desc, ename;
# 25. 사원명과 부서명을 조회하시오.
select e.ename, d.dname from emp e,dept d
where e.deptno = d.deptno; # join구문
/*
emp에서 deptno 와,
dept 에서 deptno 가 join되어서 연결 시켜준다.
내가 생각한 로직은 이름을 갖고있는 필드에서 deptno필드를 참조하고, where 에서 e.deptno 가 d.deptno와 같다고 했으니까 dept 에서 deptno와 같은 dname을 찾아서 반환 해준다고 생각했다.
*/
# 26. 이름,월급여,월급여등급을 조회하시오.
select e.ename, e.sal , s.grade
from emp e, salgrade s
where e.sal between s.losal and s.hisal;
# 27. 이름,부서명,월급여등급을 조회하시오
select e.ename 이름, d.dname 부서명, s.grade 월급여등급
from emp e, dept d, salgrade s
where e.deptno = d.deptno and e.sal between s.losal and s.hisal;
# 28. 이름,직속상사이름을 조회하시오
select * from emp;
select e.ename 이름, m.ename 직속상사이름
from emp e, emp m
where e.mgr = m.empno;
# where에서 주의해야할 점이 있다. 처음에 e.empno = e.mgr이런식으로 쿼리를 짜게 되면, 순서가 바뀌게 되고 바뀌는 이유는 필드에서 찾을때 mgr을 찾아야하는데 empno를 먼저 찾고 =에 조인을 하기 위해 mgr를 하게 되기 떄문이다.
SELECT E.ENAME,M.ENAME
FROM EMP E
LEFT JOIN EMP M ON E.MGR = M.EMPNO;
# left join은 항목에서 제외된 데이터를 가져와서 넣어줄 수 있다.
# 29. 이름,부서명을 조회하시오.단, 사원테이블에 부서번호가 40에 속한 사원이 없지만 부서번호 40인 부서명도 출력되도록 하시오.
select e.ename, d.dname
from dept d
left join emp e on e.deptno= d.deptno ;
select e.ename, d.dname
from dept d
left join emp e on d.deptno = e.deptno ;
select e.ename, d.dname
from dept d
left join emp e on d.deptno = e.deptno
union
select e.ename, d.dname
from dept d
right join emp e on d.deptno = e.deptno;
# 30. 이름,부서번호,부서이름을 조회하시오.
select e.ename, e.deptno , d.dname
from emp e, dept d
where e.deptno = d.deptno;
SELECT ENAME,E.DEPTNO,DNAME
FROM EMP E
INNER JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
# 위 아래 같은 의미이다. 아래의 의미를 좀더 이해하자.
select ename, e.deptno, dname
from emp e
inner join dept d on e.deptno = d.deptno;
# e.deptno 는 inner 조인을 위해서 붙여준다.
select ename, d.deptno, dname
from emp e
inner join dept d on e.deptno = d.deptno;
# d.deptno 는 inner 조인을 위해서 붙여준다. inner join 에서 e와 d 조인 해주는 테이블 알리아스를 선언 해줘도 같은 의미이다. 단, 없으면 안됨
# 31. 부서번호가 30번인 사원들의 이름, 직급, 부서번호, 부서위치를 조회하시오.
select * from dept;
select ename, job, e.deptno, loc
from emp e
inner join dept d on e.deptno = d.deptno;
# 32. 커미션을 받는 사원의 이름, 커미션, 부서이름,부서위치를 조회하시오.
select ename, comm, dname, loc
from emp e
inner join dept d on e.deptno = d.deptno
where e.comm is not null and e.comm != 0;
SELECT ENAME,COMM,DNAME,LOC
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND EMP.COMM IS NOT NULL AND EMP.COMM != 0;
SELECT ENAME,COMM,DNAME,LOC
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND EMP.COMM IS NOT NULL AND EMP.COMM <> 0;
SELECT ENAME,COMM,DNAME,LOC
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND EMP.COMM IS NOT NULL AND EMP.COMM NOT IN(0);
SELECT ENAME,COMM,DNAME,LOC
FROM EMP INNER JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO
WHERE EMP.COMM IS NOT NULL AND EMP.COMM <> 0;
# 위 내용은 다 같은 말이다.
# 33. DALLAS에서 근무하는 사원의 이름,직급,부서번호,부서명을 조회하시오.
select ename 이름, job 직급, e.deptno 부서번호, dname 부서명
from emp e
inner join dept d on e.deptno = d.deptno;
# 34. 이름에 A 가 들어가는 사원의 이름,부서명을 조회하시오
select ename, dname
from emp e
inner join dept d on e.deptno = d.deptno
where ename like '%a%';
# 35. 이름, 직급, 월급여, 월급여등급을 조회하시오
select ename 이름, job 직급, sal 월급여, grade 월급여등급
from emp e
inner join SALGRADE s on e.sal between s.LOSAL and s.HISAL;
# 36. ALLEN과 같은 부서에 근무하는 사원의 이름, 부서번호를 조회하시오.
select c.ename, e.deptno
from emp e
inner join emp c on e.deptno = c.deptno
where e.ename = 'allen'
order by c.ename;
# <> 는 != 와 같은 뜻이다.
SELECT C.ENAME,C.DEPTNO
FROM EMP E
INNER JOIN EMP C ON E.DEPTNO = C.DEPTNO
WHERE E.EMPNO <> C.EMPNO
AND E.ENAME = 'ALLEN'
ORDER BY C.ENAME;
SELECT C.ENAME,C.DEPTNO
FROM EMP E,EMP C
WHERE E.EMPNO <> C.EMPNO
AND E.DEPTNO = C.DEPTNO
AND E.ENAME = 'ALLEN'
ORDER BY C.ENAME;
# 37. 사원명 'JONES'가 속한 부서명을 조회하시오
select d.dname
from emp e
inner join dept d on e.deptno = d.deptno
where e.ename = 'jones';
# 서브쿼리 사용
select dname
from dept
where deptno = (select deptno from emp where ename = 'jones');
# 38. 10번 부서에서 근무하는 사원의 이름과 10번 부서의 부서명을 조회하시오.
select ename 이름, dname 부서명
from emp e
inner join dept d on e.deptno = d.deptno
where e.deptno = 10;
# from 에서 부분으로 선택한다. 부서번호와 부서명을. 부서명이 10인 것만. 그것을 알리 d로 선언한다.
select e.ename 이름, d.dname 부서명}
from emp e, (select deptno, dname from dept where deptno = 10) d
where e.deptno = d.deptno; # 조인한다
SELECT E.ENAME,D.DNAME
FROM EMP E,DEPT D
WHERE E.DEPTNO = D.DEPTNO
AND D.DEPTNO = 10;
SELECT E.ENAME,D.DNAME
FROM EMP E,
(SELECT DEPTNO,DNAME
FROM DEPT
WHERE DEPTNO = 10) D
WHERE E.DEPTNO = D.DEPTNO;
# 39. 평균 월급여보다 더 많은 월급여를 받은 사원의 사원번호,이름,월급여 조회하시오.
select empno 사원번호, ename 이름, sal 월급여
from emp
where sal > (select avg(sal) from emp);
# 40. 부서번호가 10인 사원중에서 최대급여를 받는 사원과 동일한 급여를 받는 사원의 사원번호, 이름을 조회하시오.
select empno 사원번호, ename 이름
from emp
where deptno = 10 and sal = (select max(sal) from emp);
select empno, ename
from emp
where sal = (select max(sal) from emp where deptno = 10);
# 41. 번호라는 이름의 컬럼에 int형으로 primary key와 생성할때 마다 숫자를 증가 시키고, 이름은 varchar(20), primary key를 선언하세요, 나이는 int형으로 무조건 입력, 성별은 char(5)의 컬럼을 갖는 'Students'라는 이름의 테이블을 만드세요.
create table Students (
번호 int auto_increment primary key,
이름 varchar(20),
나이 int not null,
성별 char(5)
);
# 42. Students 테이블에서 번호는 1 이름은 훈빠 나이는 20 성별은 남자의 값을 갖는 쿼리는 추가하세요.
insert into students values (1,'훈빠',20,'남자');
# 43. Students 테이블에서 훈빠의 나이를 25로 바꿔주세요.
update students set 나이 = 21 where 번호 = 1;
# 44. 부서 번호가 10번인 부서의 사람 중 사원번호, 이름, 급여를 출력하라"
select empno 사원번호, ename 이름,sal 급여 from emp;
# 45. 사원번호가 7639인 사람 중 이름, 입사일자, 부서번호를 출력하라.
select ename 이름, hiredate 입사인자, deptno 부서번호
from emp;
# 46. 이름이 ALLEN인 사람의 모든 정보를 출력하라.
select * from emp where ename = 'allen';
# 47. 입사일자가 81/02/20인 사원의 이름, 부서 번호, 급여를 출력하라.
select ename 이름, deptno '부서 번호', sal 급여
from emp
where hiredate = 19830112;
# 48. 직업이 MANAGER가 아닌 사람의 모든 정보를 출력하라.
select *
from emp
where job != 'manager';
# 49. 입사일자가 81/04/02 이후에 입사한 사원의 정보를 출력하라.
select *
from emp
where hiredate > '19810402';
# 50. 급여가 $800이상인 사람의 이름, 급여, 부서 번호를 출력하라.
select ename 이름, sal 급여, deptno '부서 번호'
from emp
where sal >= 800;
# 51. 부서번호가 20번 이상인 사원의 모든 정보를 출력하라.
select * from emp
where deptno >= 20;
# 52. 성명이 K로 시작하는 사람들의 평균 급여보다 높은 급여를 가진 사람의 모든 정보를 출력하라.
select * from emp
where sal > (select avg(sal) from emp
where ename like 'k%') and ename not like 'k%';
# 53. 입사일자가 81/12/09 보다 먼저 입사한 사람들의 모든 정보를 출력하라.
select * from emp where hiredate < '19811209';
# 54. 입사번호가 7698 보다 작거나 같은 사람들의 입사번호와 이름을 출력하라.
select deptno 입사번호, ename 이름 from emp where deptno <= 7698;
# 55. 입사일자가 81/04/02 보다 늦고 82/12/09 보다 빠른 사원의 이름, 월급, 부서 번호를 출력하라.
select ename 이름, hiredate 월급, deptno '부서 번호'
from emp
where hiredate between '19810403' and '19821210';
# 56. 급여가 1,600 보다 크고 3,000보다 작은 사람은 이름, 직무, 급여를 출력하라.
select ename 이름, job 직무, sal 급여 from emp
where sal between 1601 and 2999;
# between 은 이상 이하로 판단한다.
# 57. 사원번호가 7654와 7782 사이 이외의 사원의 모든 정보를 출력하라.
select * from emp
where empno between 7654 and 7782;
# 58. B와 J 사이의 스펠링이 맨 앞글자에 포함된 이름의 모든 사원의 정보를 출력하라.
select * from emp
where ename between 'b%' and 'j%';
select * from emp;
# 59. 입사일자가 81년 이외에 입사한 사람의 모든 정보를 출력하라.
select * from emp
where hiredate not between 19810101 and 19811231;
select * from emp
where hiredate not like '1981%';
# 60. 직무가 MANAGER와 SALESMAN이 아닌 모든 사람의 정보를 출력하라.
select * from emp
where job not in ('manager','salesman');
# 61. 부서 번호가 20, 30번호인 사람들을 제외한 모든 사람의 이름, 사원번호, 부서 번호를 출력하라.
select ename 이름, empno 사원번호, deptno '부서 번호' from emp
where deptno not in (20,30);
# 62. 이름이 S로 시작하는 사원의 사원번호, 이름, 입사일자, 부서번호를 출력하라.
select empno 사원번호, ename 이름, hiredate 입사일자, deptno 부서번호 from emp
where ename like 's%';
# 63. 입사일자가 81년도인 사람의 모든 정보를 출력하라.
select * from emp
where hiredate like '1981%';
# 64. 이름 중 S자가 들어가 있는 사람만 모든 정보를 출력하라.
select *
from emp
where ename like '%s%';
# 65. 이름이 S로 시작하고 마지막 글자가 T인 사람의 모든 정보를 출력하라 (단, 이름은 전체 5자리이다.)
select * from emp
where ename like 's___t';
# 66. 이름의 두 번째 문자가 A인 사람의 모든정보를 출력하라.
select * from emp
where ename like '_a%';
# 67. 커미션이 NULL인 사람의 정보를 출력하라.
select * from emp
where comm is null;
# 68. 커미션이 NULL이 아닌 사람의 모든 정보를 출력하라.
select * from emp
where comm is not null;
# 69. 부서가 30번 부서이고 급여가 1,500 이상인 사람의 이름, 부서이름, 월급을 출력하라.
select ename 이름, dname 부서이름, sal 월급
from emp e
inner join dept d on e.deptno = d.deptno;
# 70. 부서번호로 정렬된 이름의 첫 글자가 K로 시작하거나 부서 번호가 30인 사람들의 사원번호, 이름, 부서 번호를 부서번호기준으로 조회하라.
select empno 사원번호, ename 이름, deptno '부서 번호' from emp
where ename like 'k%' or deptno = 30
order by deptno;
# 71. 급여가 1,500이상이고 부서 번호가 30번인 사원 중 직업이 MANAGER인 사람의 정보를 출력하라.
select * from emp
where sal > 1500 and deptno = 30 and job = 'manager';
# 72. 부서 번호가 30인 사람들을 출력하고 사원번호로 정렬 하라.
select * from emp
where deptno = 30
order by deptno;
# 73. 급여가 많은 순으로 SORT하라.
select * from emp
order by sal desc;
# 74. 부서 번호로 ASCENDING SORT한 후 급여가 많은 사람 순으로 출력하라.
select * from emp
order by deptno asc , sal desc;
# 75. 부서 번호로 DESCENDING NSORT하고 이름 순으로 ASCENDING SORT, 급여 순으로 DESCENDING SORT하라.
select * from emp
order by deptno desc, ename asc, sal desc;
# 76. EMP와 DEPT TABLE을 JOIN하여 부서 번호, 부서명, 이름, 급여를 출력하라.
select e.deptno '부서 번호', dname 부서명, ename 이름, sal 급여 from emp e
inner join dept d on e.deptno = d.deptno;
select e.deptno, d.dname, e.ename, e.sal
from emp e, dept d
where e.deptno = d.deptno;
select deptno, dname, ename, sal
from emp natural join dept;
# 77. 이름이 'ALLEN'인 사원의 부서명을 출력하라.
select dname 부서명 from emp
natural join dept
where ename = 'allen';
select dname
from emp e, dept d
where e.deptno = d.deptno
and e.ename = 'ALLEN';
select d.dname
from emp e join dept d
on e.ename = 'ALLEN' and e.deptno = d.deptno;
# 78. EMP Table의 데이터를 출력하되 해당사원에 대한 상관번호와 상관의 성명을 함께 출력하라.
select e.*, d.empno 상관번호, d.ename 상관성명
from emp e
left join emp d on e.mgr = d.empno;
# 79. DEPT Table 에는 존재하는 부서코드이지만 해당부서에 근무하는 사람이 존재하지 않는 경우의 결과를 출력하라.
select * from dept
where deptno is null;
# 80. 'ALLEN'의 직무와 같은 사람의 이름, 부서명, 급여, 직무를 출력하라.
select ename 이름, dname 부서명, sal 급여, job 직무
from emp e
inner join dept d on e.deptno = d.deptno
where e.job = (select job from emp where ename = 'allen');
select e.ename, d.dname, e.sal, e.job
from emp e, dept d
where e.deptno = d.deptno
and e.job = (select job from emp where ename = 'ALLEN');
# 81. 'JONES'가 속해있는 부서의 모든 사람의 사원번호, 이름, 입사일자, 급여를 출력하라.
select empno 사원번호, ename 이름, hiredate 입사일자, sal 급여
from emp e
join dept d on e.deptno = d.deptno
and d.dname = (select dname from emp e inner join dept d on e.deptno = d.deptno where ename = 'jones');
select e.empno, e.ename, e.hiredate, e.sal
from emp e
where e.deptno = (select deptno from emp where ename = 'JONES');
# 82. 전체 사원의 평균 임금보다 많은 사원의 사원번호, 이름, 부서명, 입사일, 지역, 급여를 출력하라.
select empno 사원번호, ename 이름, dname 부서명, hiredate 입사일, loc 지역, sal 급여 from emp e
inner join dept d on e.deptno = d.deptno
where sal >= (select avg(sal) from emp);
select e.empno, e.ename, d.dname, e.hiredate, d.loc, e.sal
from emp e
inner join dept d on e.deptno = d.deptno and e.sal > (select avg(sal) from emp);
# 83. 10번 부서 사람들 중에서 20번 부서의 사원과 같은 업무를 하는 사원의 사원번호, 이름, 부서명, 입사일, 지역을 출력하라.
select empno, ename, dname, hiredate, loc
from emp e, dept d
where e.deptno = d.deptno
and e.job in (select job from emp where deptno = 20 );
select empno, ename, dname, hiredate, loc
from emp e
inner join dept d on e.deptno = d.deptno and e.job in (select job from emp where deptno = 20 );
#주의할 사항 : in 을 사용해서 서브쿼리에 있는 것들을 하나씩 참조 해야한다.
# 84. 10번 부서 중에서 30번 부서에는 없는 업무를 하는 사원의 사원번호, 이름, 부서명, 입사일자, 지역을 출력하라.
select empno 사원번호, ename 이름, dname 부서명, hiredate 입사일자, loc 지역
from emp e
inner join dept d on e.deptno = d.deptno and e.job not in (select job from emp where deptno = 30);
select e.empno, e.ename, d.dname, e.hiredate, d.loc
from emp e, dept d
where e.deptno = d.deptno
and e.job not in (select job from emp where deptno = 30);
# 85. 10번 부서에 근무하는 사원의 사원번호, 이름, 부서명, 지역, 급여를 급여가 많은 순으로 출력하라.
select empno 사원번호, ename 이름, dname 부서명, loc 지역, sal 급여
from emp e
inner join dept d on e.deptno = d.deptno and d.deptno = 10
order by e.sal desc;
select e.empno, e.ename, d.dname, d.loc, e.sal
from emp e, dept d
where e.deptno = d.deptno
and e.deptno = 10;
# 86. 'MARTIN'이나 'SCOTT'의 급여와 같은 사원의 사원번호, 이름, 급여를 출력하라.
select empno 사원번호, ename 이름, sal 급여
from emp e
inner join dept d on e.deptno = d.deptno and e.sal in (select sal from emp where ename = 'scott' or ename = 'martin');
select empno, ename, sal
from emp
where sal in (select sal from emp where ename in ('MARTIN', 'SCOTT'));
# 87. 급여가 30번 부서의 최고 급여보다 높은 사원의 사원번호, 이름, 급여를 출력하라.
select empno 사원번호, ename 이름, sal 급여
from emp
where sal > (select max(sal) from emp where deptno = 30);
# 88. 급여가 10번 부서의 최저 급여보다 낮은 사원의 사원번호, 이름, 급여를 출력하라.
select empno 사원번호, ename 이름, sal 급여
from emp
where sal < (select min(sal) from emp where deptno = 10);
# 89. 급여가 1000 이상인 사원들의 부서별 평균 급여를 출력해보세요 단, 부서별 평균 급여가 2000 이상인 부서만 출력하세요.
select dname, avg(sal) from emp e
inner join dept d on e.deptno = d.deptno and sal >= 1000
group by dname having avg(sal) >= 2000;
SELECT DEPTNO, AVG(SAL)
FROM EMP
WHERE SAL >= 1000
GROUP BY DEPTNO
HAVING AVG(SAL) >= 2000;
# 90. 각 부서별 같은 업무(job)를 하는 사람의 인원수를 구해서 부서번호, 업무(job), 인원수를 부서번호에 대해서 오름차순 정렬해서 출력해 보세요.
SELECT DEPTNO, JOB, COUNT(*)
FROM EMP
GROUP BY DEPTNO, JOB
ORDER BY DEPTNO ASC;
# 주의 : group by를 정확하게 이해해야 됨. 이해못하면 쿼리 구현이 더 어려워 질 수 있다.
# 91. 사원번호,부서번호,부서명을 출력하세요 단, 사원이 근무하지 않는 부서명도 같이 출력해보세요.
select empno 사원번호, empno 부서번호, dname 부서명
from emp e
right join dept d on e.deptno = d.deptno;
# 92. 'DALLAS' 에서 근무하는 사원의 이름, 부서번호를 출력해보세요.
select ename '사원의 이름' , e.deptno 부서번호
from emp e
inner join dept d on e.deptno = d.deptno and d.loc = 'dallas';
select ename '사원의 이름' , e.deptno 부서번호
from emp e, dept d
where e.deptno = d.deptno and d.loc = 'DALLAS';
SELECT ENAME '사원의 이름', DEPTNO 부서번호
FROM EMP
WHERE DEPTNO =(SELECT DEPTNO FROM DEPT WHERE LOC='DALLAS');
# 93. 급여를 3000 이상받는 사원이 소속된 부서와 동일한 부서에서 근무하는 사원들의 이름과 급여, 부서번호를 출력해 보세요 그리고 부서번호와 급여가 높은 순으로 정렬하세요.
select ename 이름, sal 급여, deptno 부서번호
from emp
where deptno in (select deptno from emp where sal >= 3000)
order by deptno, sal desc;
# 94. IN 연산자를 이용, 이용하지 않고 부서별로 가장 급여를 많이 받는 사원의 사원번호, 급여, 부서번호를 출력해보세요.
select ename 사원번호, sal 급여, deptno 부서번호
from emp
where sal in (select max(sal)
from emp
where deptno is not null
group by deptno);
select deptno, max(sal)
from emp
where deptno is not null
group by deptno;
# 95. 30번 부서의 사원중에서 급여를 가장 많이 받는 사원보다 더 많은 급여를 받는 사원의 이름과 급여를 출력해보세요.
select ename '사원의 이름' , sal 급여
from emp
where sal > (select max(sal) from emp where deptno = 30);
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ALL(SELECT SAL FROM EMP WHERE DEPTNO=30);
# 96. 부서번호가 30번인 사원들의 급여중 평균 급여보다 높은 급여를 받는 사원의 이름, 급여를 출력해보세요.
select ename '사원의 이름', sal 급여
from emp
where sal > (select avg(sal) from emp) and deptno = 30;
# 97. 월급여가 1000 이상인 사원만을 대상으로 부서이름 별로 월급여 평균을 구하라. 단, 평균값이 2000 이상인 레코드만 구하라.
select dname 부서, avg(sal) 월급여평균
from emp e
inner join dept d on e.deptno = d.deptno and sal >= 1000
group by dname having avg(sal) >= 2000;
# 98. 급여가 높은 순으로 조회하되 급여가 같을 경우 이름의 철자가 빠른 사원순으로 사번,이름,월급여를 조회하시오.
select empno 사번, ename 이름, sal 월급여
from emp
order by sal desc, ename;
# 99. 이름에 W 가 들어가는 사원의 이름,부서명을 조회하시오
select ename '사원의 이름', dname 부서명
from emp e
inner join dept d on e.deptno = d.deptno
where ename like '%w%';
# 100. 이름, 직급, 월급여, 월급여등급을 조회하시오
select ename 이름, job 직급, sal 월급여, grade 월급여등급
from emp e
inner join SALGRADE s on e.sal between s.LOSAL and s.HISAL;
select ename 이름, job 직급, sal 월급여, grade 월급여등급
from emp e, salgrade s
where e.sal between s.losal and s.hisal;
'workSpace > MYSQL' 카테고리의 다른 글
[mysql][mac] mac에 mysql 설치/삭제/재설치 하는 방법 (4) | 2020.12.16 |
---|---|
[mysql] 접근 권한 시스템 (0) | 2020.12.05 |
[mysql] 주석 사용법 (0) | 2020.12.05 |
[mysql][백문백답] 기본 문법 연습 문제 (0) | 2020.12.05 |
[mysql]데이터 베이스 만들기 (0) | 2020.12.05 |