begin tran
/** BEGIN TRAN... ROLLBACK TRAN으로 EMP 테이블의 무결성을
유지할 것***/

--1. 30번 부서 사원들의 직위, 이름, 월급을 담는 VIEW를 만들어라.
create view view01
as
select job,ename,sal
from emp
where deptno = 30

select * from view01


--2. 30번 부서 사원들의  직위, 이름, 월급을 담는 VIEW를 만드는데,
-- 각각의 컬럼명을 직위, 사원이름, 월급으로 ALIAS를 주고 월급이
-- 300보다 많은 사원들만 추출하도록 하라.

alter view view02
as
select job  as [직위]
,  ename as [이름]
,  sal  as [월급]
from emp
where sal > 300

--3. 부서별 최대월급, 최소월급, 평균월급을 담는 VIEW를 만들어라.

create view view03 as
select max(sal) as[max]
,  min(sal) as[min]
,  avg(sal) as[avg]
from emp
group by deptno

select * from view02

--4. 부서별 평균월급을 담는 VIEW를 만들되, 평균월급이 2000 이상인
-- 부서만 출력하도록 하라.

alter view view02 as
select avg(sal) as [avgsal]
from emp
where sal > 2000
group by deptno

exec sp_help view03

--5. 직위별 총월급을 담는 VIEW를 만들되, 직위가 MANAGER인
-- 사원들은 제외하고 총월급이 3000이상인 직위만 출력하도록 하라.

alter view view02 as
select sum(sal) as[sal]
from emp
where job != 'manager'
group by deptno
 having sum(sal) > 3000


--6. 30번 부서 사원의 부서번호, 사원번호, 사원이름, 월급을 담는
-- VIEW를 작성하되 다른 부서에서 근무하는 사원들의 레코드는
-- 입력 및 수정하지 못하도록  WITH CHECK OPTION을 사용하라.

create view view06
as
select deptno, empno, ename, sal
from emp
where deptno = 30
with check option;

 

--7. 20번 부서에서 근무하는 사원의 이름, 월급, 커미션, 부서번호를
-- 담는 VIEW를 작성하되, 그 누구도 VIEW의 정의를 보지 못하도록 하라.

create view view07 with encryption
as
select ename, sal, comm, deptno
from emp
where deptno = 20

exec sp_helptext view07

--8. 7번 문제에서 만든 VIEW를 20번 부서에서 근무하는 사원의 이름과
-- 월급만 담는 VIEW가 되도록 수정하고 다시 암호화하여라.
alter view view07 with encryption
as
select ename, sal
from emp
where deptno = 20

-- 9. 위의 VIEW를 삭제하라.
drop view view01,view02,view03,view04,view05,view06,view07


begin tran
--view
/*
보다, 실제테이블은 아니며, 실제 테이블의 특정 부분을 보기 위한
구문을 담고있는 객체.
보안 , 편리성
view를수정할경우 기본값도 수정됨
*/

create view view01
as
select empno, ename, sal
from emp

select * from view01

create view view02
as
select empno, emp.deptno, dname
from emp, dept
where emp.deptno = dept.deptno
 and emp.deptno in(10,20)
 
select* from view02

update view01
set sal = 9999
where ename = 'smith'

select * from emp

insert view01 values(8888,'tom',500)

alter view view01 with encryption
as
select empno, ename, sal
from emp


/*
view03
직업별 평균 월급을 담는 뷰 생성.
*/

alter view view01
as
select job , avg(sal) as [avgsal]
from emp
group by job

update view01
set avgsal = 3000
where job = 'clerk'


/*
view04
사원이름, 월급을 담는 뷰 생성 단, 월급이 높은 사람부터 출력(내림차순)
*/

--order by는 바로 view에 담길수없다.
alter view view02
as
select top 50 ename, sal
from emp
order by sal desc

/*
view05
사원번호, 이름, 월급을 담는 뷰, 단 월급이 2000이상
*/

alter view view02
as
select empno,ename,sal
from emp
where sal > 2000

insert view02 values(7777,'tom',2500)
insert view02 values(8888,'kim',1500)
insert view02 values(9999,'lee',500)

select * from emp

select * from view02

delete from emp
where empno in(7777,8888,9999)


--1. 아래와 같은 조건으로 'SQL좌석번호'이름의 데이터베이스를 만들어라.
CONDITION
/*1. FILE_GROUP: PRIMARY ONLY
2. DATA_FILE
 - LOGICAL_NAME: SQL좌석번호_DATA
 - PHYSICAL_NAME:
   C:\Program Files\Microsoft SQL Server\MSSQL\Data\sql좌석번호data.mdf
 - SIZE: 3MB
 - MAXSIZE: 10MB
 - FILE_GROWTH: 10%
3. LOG_FILE
 - LOGICAL_NAME: SQL좌석번호_LOG
 - PHYSICAL_NAME:
   C:\Program Files\Microsoft SQL Server\MSSQL\Data\sql좌석번호log.ldf
 - SIZE: 1MB
 - MAXSIZE: 8MB
 - FILE_GROWTH: 10%
*/
create database SQLNum
on primary
(
 name='SQLNum_DATA'
, filename='d:\test\SQLNumData.mdf'
, size=3mb
, maxsize=10mb
, filegrowth=10%
)
log on
(
 name='SQLNum_LOG'
, filename='d:\test\SQLNumLog.lef'
, size=1mb
, maxsize=8mb
, filegrowth=10%
)

exec sp_help SQLNum

-- 2. SQL좌석번호 데이터베이스에서 아래와 같이 EMP02라는 테이블을 만들고
-- 데이터를 입력하라.

create table EMP02
(
 EMPNO int
, ENAME varchar(12)
, SAL int
, HIREDATE datetime
)

alter table EMP02
add DEPTNO int


/*
COLUMN_NAME EMPNO ENAME  SAL HIREDATE DEPTNO
DATA_TYPE INT VARCHAR(12) MONEY SMALLDATETIME INT
  111 JOHN  3000 2000-06-30 1
  112 HUNTER  2500 2001-08-03 2
  113 SMITH  3500 1999-09-23 3
  114 CARRY  2500 2001-08-02 3
*/

-- 3. EMP02 테이블에 MGR 컬럼(INT)을 추가하라.

alter table emp02
add MGR int

-- 4. EMP02 테이블에서 SAL 컬럼의 데이터형을 INT로 바꾸어라.

alter table emp02
alter column SAL int


exec sp_help emp02

-- 5. EMP02 테이블에서 MGR 컬럼을 삭제하라.

alter table emp02
drop column MGR

-- 6. EMP02 테이블을 삭제하라.

 

-- 7. SQL좌석번호 데이터베이스를 삭제하라.

drop database SQLNum

create table test01
(
 eid int not null
, ename char(10)
)

'개발 > SQL' 카테고리의 다른 글

MS-SQL 문제 9문  (0) 2011.05.18
MS-SQL Veiw  (0) 2011.05.18
MS-SQL 데이터베이스 만들기 [ create table , create database ]  (0) 2011.05.18
MS-SQL 문제 50문  (0) 2011.05.18
MS-SQL 문제 12문  (0) 2011.05.18

--데이터베이스생성.
/*
testdb
d:\test
데이터파일 이름 testdb.mdf
처음크기 : 5mb
증가단위 : 1mb
최대크기 :10mb
로그파일 이름 testdblog.ldf

*/


create database testdb
on primary
( name='testdata'
, filename='d:\test\testdb.mdf'
, size=5mb
, maxsize=10mb
, filegrowth=1mb
)
log on
( name='testlog'
, filename='d:\test\testdblog.ldf'
, size=6
, maxsize=10mb
, filegrowth=10%
)

--select * from test01

 

drop database testdb

create table test01
(
 empno int,
 ename char(10)
)

exec sp_help test01

--alter 열추가
alter table test01
add hiredata datetime

--교체
alter table test01
alter column ename char(5)

--삭제
alter table test01
drop column hiredata


--@@ 대소문자구분

create table test01
(
 eid int
, ename char(10)
)

 

insert test01 values(1,'aaa')
insert test01 values(2,'AAA')
insert test01 values(3,'Aaa')
insert test01 values(4,'aAa')
insert test01 values(5,'aaA')
insert test01 values(6,'AAa')
insert test01 values(7,'aAA')
insert test01 values(8,'AaA')

select * from test01
where ename = 'aaa'


create table test02
(
 eid int
, ename char(5) collate korean_wansung_cs_ai
)

insert test02 values(1,'aaa')
insert test02 values(2,'AAA')
insert test02 values(3,'Aaa')
insert test02 values(4,'aAa')
insert test02 values(5,'aaA')
insert test02 values(6,'AAa')
insert test02 values(7,'aAA')
insert test02 values(8,'AaA')

select * from test02 where ename = 'Aaa'

 

exec sp_help emp
select * from emp

--테이블명 수정.
exec sp_rename test02 , test05

exec sp_rename 'test05.ename' , 'sname'

exec sp_renamedb test408 , test

create table test03
(
 eid int
, ename char(10)
)

exec sp_help test03

alter table test03
alter column eid char(5)

alter table test03
alter column ename int

insert test03 values('12345',345)

alter table test03
alter column eid char(3)

alter table test03
alter column ename char(10)

create table test04
(
 eid int
, ename char(10)
)

insert test04 values (1,'a');
insert test04 values (2,'bbb');
insert test04 values (3,'cccc');

alter table test04
alter column ename int


insert test01 values(1,'aaa')
insert test01 values(2,'bbb')
insert test01 values(null,'ccc')
insert test01 values(3,null)

select * from test01

2. unique
/*
유일한 값, 중복되는 값이 없다.
테이블에 여러 컬럼에 선언이 가능하다.
null이 한번만 가능하다.
*/


create table test02
(
 eid int unique
, ename char(10)
)

insert test02 values(1,'aaa')
insert test02 values(2,'bbb')
insert test02 values(1,'ccc') --에러
insert test02 values(null,'bbb')
insert test02 values(null,'ddd') --에러
insert test02 values(3,'aaa')


exec sp_help test02
exec sp_helpconstraint test02

create table test03
(
 eid int constraint uq_test03 unique
, ename char(10)
)

alter table test03
drop constraint uq_test03

alter table test03
add constraint uq_test03_01 unique(eid)

exec sp_helpconstraint test03

3. default

create table test04
(
 eid int
, ename char(10)
, city char(10) constraint df_test04 default '서울'
)

insert test04 values(1,'aaa','대구')
insert test04 values(2,'bbb','인천')
insert test04 values(3,'ccc','광주')
insert test04 values(3,'ccc','광주')
insert test04 (eid, ename) values(4,'ddd')
insert test04 (eid, ename)values(5,'eee')
insert test04 (eid, ename)values(6,'fff')


select * from test04

4. check
/*
컬럼에 원하는 특정한 값만 입력을 받고싶을 때 사용
insert,update에서만 검사한다.
*/

create table test05
(
 eid int
, ename char(10)
, deptno int constraint ch_test05 check(deptno in(10,20,30))
)


insert test05 values(1,'aaa',10)
insert test05 values(2,'bbb',20)
insert test05 values(3,'ccc',30)
insert test05 values(4,'ddd',20)
insert test05 values(5,'eee',50) --에러

alter table test05
drop constraint ch_test05

select * from test05

alter table test05 with nocheck
add constraint ch_test05 check (deptno in(10,20,30))

exec sp_helpconstraint test05


create table test06
( eid int
, ename char(10)
, deptno int
)

alter table test06
alter column eid int not null

alter table test06
add constraint uq_test06 unique(ename)

exec sp_helpconstraint test06

alter table test06
add constraint df_test06 default 10 for deptno

5. primary key
/*
테이블당 하나의 제약 조건만 선언 가능하다.
not null 속성, unique 속성을 갖고 있다.
*/

create table test07
(
 eid int constraint pk_test07 primary key
, ename char(10)
)

insert test07 values (1,'aaa')
insert test07 values (2,'bbb')
insert test07 values (3,'ccc')
insert test07 values (1,'ddd')--에러
insert test07 values (null,'eee')--에러


create table test08
( eid int
, ename char(10)
)


exec sp_help test08

alter table test08
alter column eid int not null

alter table test08
add constraint pk_test08 primary key(eid)

alter table test08
drop constraint pk_test08

6.foreign key
/*
primary key 를 참조하는 제약 조건
*/

create table pktest
( eid int
, ename char(10)
, deptno int constraint pk_pktest primary key
)

add constraint pk_pktest primary key


create table fktest
( saname char(10)
, sadept int constraint fk_fktest foreign key
 references pktest(deptno)
)

insert pktest values(1,'aaa',10)
insert pktest values(2,'aaa',20)
insert pktest values(3,'aaa',30)
insert pktest values(3,'aaa',40)

insert fktest values('tom',10)
insert fktest values('bill',20)
insert fktest values('kim',30)
insert fktest values('lee',40)
insert fktest values('park',50)--에러

alter table fktest
drop constraint fk_pktest

alter table fktest
drop constraint fk_fktest

alter table pktest
add constraint pk_pktest primary key(sadept)

alter table fktest
add constraint fk_fktest foreign key(sadept)
references pktest(deptno)

'개발 > SQL' 카테고리의 다른 글

MS-SQL Veiw  (0) 2011.05.18
MS-SQL 문제 7문  (0) 2011.05.18
MS-SQL 문제 50문  (0) 2011.05.18
MS-SQL 문제 12문  (0) 2011.05.18
MS - SQL 수정문법 [ insert into , insert ~ select ]  (0) 2011.05.18

--1> 부서테이블의 모든 데이터를 출력하라.
select *
from dept;

--2> EMP테이블에서 각 사원의 직업, 사원번호, 이름, 입사일을 출력하라.

--3> EMP테이블에서 직업을 출력하되, 각 항목(ROW)가 중복되지 않게
-- 출력하라.

select job
from emp
group by job;


--4> 급여가 2850 이상인 사원의 이름 및 급여를 출력하라.

--5> 사원번호가 7566인 사원의 이름 및 부서번호를 출력하라.

select ename, deptno
from emp
where empno = 7566

--6> 급여가 1500이상 ~ 2850이하의 범위에 속하지 않는 모든 사원의 이름
-- 및 급여를 출력하라.

--7> 1981년 2월 20일 ~ 1981년 5월 1일에 입사한 사원의 이름,직업 및
--입사일을 출력하라. 입사일을 기준으로 해서 오름차순으로 정렬하라.

select ename, job, hiredate
from emp
where DATEDIFF(dd,'1981-2-20',HIREDATE) > 0
 and DATEDIFF(dd,HIREDATE,'1981-5-1') > 0
order by HIREDATE

--8> 10번 및 30번 부서에 속하는 모든 사원의 이름과 부서 번호를
-- 출력하되, 이름을 알파벳순으로 정렬하여 출력하라.

--9> 10번 및 30번 부서에 속하는 모든 사원 중 급여가 1500을 넘는
-- 사원의 이름 및 급여를 출력하라.
--(단 컬럼명을 각각 employee 및 Monthly Salary로 지정하시오)

select ename as [employee]
,  sal as  [Monthly Salary]
from emp
where (deptno = 10 or deptno = 30)
 and sal >= 1500

--10> 관리자가 없는 모든 사원의 이름 및 직위를 출력하라.


--11> 커미션을 받는 모든 사원의 이름, 급여 및 커미션을 출력하되,
-- 급여를 기준으로 내림차순으로 정렬하여 출력하라.

select ename, sal, comm
from emp
where comm is not null
order by sal desc

 

--12> 이름의 세 번째 문자가 A인 모든 사원의 이름을 출력하라.

--13> 이름에 L이 두 번 들어가며 부서 30에 속해있는 사원의 이름을
--출력하라.

select *
from emp
where ename like '%L%%L%'
 and deptno = '30'
 


--14> 직업이 Clerk 또는 Analyst 이면서 급여가 1000,3000,5000 이
-- 아닌 모든 사원의 이름, 직업 및 급여를 출력하라.

--15> 사원번호, 이름, 급여 그리고 15%인상된 급여를 정수로 표시하되
--컬럼명을 New Salary로 지정하여 출력하라.

select empno
,  ename
,  sal
,  Cast(sal*1.15 as int) as [New Salary]
from emp

--16> 15번 문제와 동일한 데이타에서 급여 인상분(새 급여에서 이전
-- 급여를 뺀 값)을 추가해서 출력하라.(컬럼명은 Increase로 하라).


--17> 각 사원의 이름을 표시하고 근무 달 수를 계산하여 컬럼명을
-- Months_Works로 지정하고, 근무 달수를 기준으로 오래된
-- 사람부터 정렬하여 출력하라.

select ename, HIREDATE, MONTH(HIREDATE) as [Months_Works]
from emp
order by Months_Works desc

--18> 이름이 J,A 또는 M으로 시작하는 모든 사원의 이름(첫 글자는
-- 대문자로, 나머지 글자는 소문자로 표시) 및 이름 길이를 표시하는
-- 쿼리를 작성하고 컬럼 별칭은 적당히 넣어서 출력하라.


--19> 사원의 이름과 커미션을 출력하되, 커미션이 책정되지 않은
-- 사원의 커미션은 'no commission'으로 출력하라.

select ename, isnull(convert(varchar(20),comm),'no commission') as comm
from emp

--20> 모든 사원의 이름,부서번호,부서이름을 표시하는 질의를 작성하라.


--21> 30번 부서에 속한 사원의 이름과 부서번호 그리고 부서이름을 출력하라.
select ename, emp.deptno, dname
from emp, dept
where emp.deptno = dept.deptno

--22> 30번 부서에 속한 사원들의 모든 직업과 부서위치를 출력하라.
--(단, 직업 목록이 중복되지 않게 하라.)


--23> 커미션이 책정되어 있는 모든 사원의 이름, 부서이름 및 위치를 출력하라.

select ename, dname
from emp, dept
where emp.deptno = dept.deptno
 and comm is not null


--24> 이름에 A가 들어가는 모든 사원의 이름과 부서 이름을 출력하라.


--25> Dallas에서 근무하는 모든 사원의 이름, 직업, 부서번호 및 부서이름을
-- 출력하라.

select ename, job, emp.deptno, dept.dname
from emp, dept
where emp.deptno = dept.deptno
 and dept.loc = 'Dallas'

--26> 사원이름 및 사원번호, 해당 관리자이름 및 관리자 번호를 출력하되,
-- 각 컬럼명을 employee,emp#,manager,mgr#으로 표시하여 출력하라.

--27> 모든 사원의 이름,직업,부서이름,급여 및 등급을 출력하라.

select ename, job, dname, sal, grade
from emp, dept, salgrade
where emp.deptno = dept.deptno
 and sal > salgrade.Losal
 and sal < salgrade.Hisal

--28> Smith보다 늦게 입사한 사원의 이름 및 입사일을 출력하라.

--29> 자신의 관리자보다 먼저 입사한 모든 사원의 이름, 입사일,
-- 관리자의 이름, 관리자의 입사일을 출력하되 각각 컬럼명을
-- Employee,EmpHiredate, Manager,MgrHiredate로 표시하여
-- 출력하라.

select e.ename  as [Employee]
,  e.hiredate as [EmpHiredate]
,  p.ename  as [Manager]
,  p.hiredate as [MgrHiredate]
from emp e,emp p
where e.MGR = p.empno
 and DATEDIFF(dd,e.hiredate,p.hiredate) > 0

--30> 모든 사원의 급여 최고액,최저액,총액 및 평균액을 출력하되
-- 각 컬럼명을 Maximum,Minimum,Sum,Average로 지정하여 출력하라.

--31> 각 직업별로 급여 최저액.최고액,총액 및 평균액을 출력하라.

select job
,  min(sal) as [최저액]
,  max(sal) as [최고액]
,  sum(sal) as [총액]
,  avg(sal) as [평균액]
from emp
group by job

--32> 직업이 동일한 사람 수를 직업과 같이 출력하라.

--33> 관리자의 수를 출력하되, 관리자 번호가 중복되지 않게하라.
-- 그리고, 컬럼명을 Number of Manager로 지정하여 출력하라.

select Count(distinct MGR) as [Number of Manager]
from emp
where MGR is not null

--34> 최고 급여와 최저 급여의 차액을 출력하라.

--35> 관리자 번호 및 해당 관리자에 속한 사원들의 최저 급여를 출력하라.
-- 단, 관리자가 없는 사원 및 최저 급여가 1000 미만인 그룹은 제외시키고
-- 급여를 기준으로 출력 결과를 내림차순으로 정렬하라.

select p.empno  as [관리자]
,  min(e.sal) as [최저급여]
from emp e, emp p
where e.MGR = p.empno
 and e.sal > 1000
group by p.empno


--36> 부서별로 부서이름, 부서위치, 사원 수 및 평균 급여를 출력하라.
-- 그리고 각각의 컬럼명을 부서명,위치,사원의 수,평균급여로 표시하라.


--37> Smith와 동일한 부서에 속한 모든 사원의 이름 및 입사일을 출력하라.
-- 단, Smith는 제외하고 출력하시오

select ename, hiredate
from emp
where deptno = (select deptno from emp where ename = 'smith')
 and ename != 'smith'
 
--38> 자신의 급여가 평균 급여보다 많은 모든 사원의 사원 번호, 이름, 급여를
--    표시하는 질의를 작성하고 급여를 기준으로 결과를 내림차순으로 정렬하라.


--39> 이름에 T가 들어가는 사원의 속한 부서에서 근무하는 모든 사원의 사원번호
-- 및 이름을 출력하라.

select empno, ename
from emp
where deptno = any( select deptno from emp where ename like '%T%' )

--40> 부서위치가 Dallas인 모든 사원의 이름,부서번호 및 직위를 출력하라.


--41> KING에게 보고하는 모든 사원의 이름과 급여를 출력하라.

select ename, sal
from emp
where MGR = (select empno from emp where ename = 'king')

--42> Sales 부서의 모든 사원에 대한 부서번호, 이름 및 직위를 출력하라.


--43> 자신의 급여가 평균 급여보다 많고 이름에 T가 들어가는 사원과 동일한
-- 부서에 근무하는 모든 사원의 사원 번호, 이름 및 급여를 출력하라.

select empno, ename, sal
from emp
where deptno = any( select deptno from emp where ename like '%T%' )
 and sal > ( select avg(sal) from emp )

--44> 커미션을 받는 사원과 급여가 일치하는 사원의 이름,부서번호,급여를
-- 출력하라.


--45> Dallas에서 근무하는 사원과 직업이 일치하는 사원의 이름,부서이름,
--     및 급여를 출력하시오

select ename, dname, sal
from emp, dept
where emp.deptno = dept.deptno
 and job = any(
      select job
      from emp, dept
      where emp.deptno = dept.deptno
       and Loc = 'Dallas'
     )


--46> Scott과 동일한 급여 및 커미션을 받는 모든 사원의 이름, 입사일 및
-- 급여를 출력하시오


--47> 직업이 Clerk 인 사원들보다 더 많은 급여를 받는 사원의 사원번호,
-- 이름, 급여를 출력하되, 결과를 급여가 높은 순으로 정렬하라.

select empno, ename, sal
from emp
where sal > (select max(sal) from emp where job = 'clerk')
order by sal desc
  
--48> 이름에 A가 들어가는 사원과 같은 직업을 가진 사원의 이름과
-- 월급, 부서번호를 출력하라.


--49> New  York 에서 근무하는 사원과 급여 및 커미션이 같은 사원의
-- 사원이름과 부서명을 출력하라.

select ename, dname
from emp, dept
where emp.deptno = dept.deptno
 and 
  comm = (select comm from emp, dept where emp.deptno = dept.deptno
          and loc = 'new york' and comm is not null)
 and
  sal = any(select sal from emp, dept where emp.deptno = dept.deptno and loc = 'new york')
 


--50> Dallas에서 근무하는 사원과 직업 및 관리자가 같은 사원의 사원번호,사원이름,
--    직업,월급,부서명,커미션을 출력하되 커미션이 책정되지 않은 사원은 NoCommission
--    으로 표시하고, 커미션의 컬럼명은 Comm으로 나오게 출력하시오.
--    단, 최고월급부터 출력되게 하시오


select empno, ename, job, sal, dname, comm as [comm]
from emp, dept
where emp.deptno = dept.deptno
 and job = any(select job from emp,dept where emp.deptno = dept.deptno and loc = 'dallas')
 and MGR = any(select MGR from emp,dept where emp.deptno = dept.deptno and loc = 'dallas')
order by sal desc

'개발 > SQL' 카테고리의 다른 글

MS-SQL 문제 7문  (0) 2011.05.18
MS-SQL 데이터베이스 만들기 [ create table , create database ]  (0) 2011.05.18
MS-SQL 문제 12문  (0) 2011.05.18
MS - SQL 수정문법 [ insert into , insert ~ select ]  (0) 2011.05.18
MS-SQL 조건문  (0) 2011.05.18

-- 모든 실습문제는 EMP 테이블의 데이터 보존을 위해 BEGIN TRAN...
-- ROLLBACK TRAN 구문을 사용할 것
begin tran
ROLLBACK TRAN
-- 1. EMP 테이블에서 사원번호가 7499번인 사원의 월급을 5000달러로 바꿔라.
select * from EMP

update EMP
set SAL = 5000
where EMPNO = 7499

-- 2. EMP테이블에서 부서번호가 20번인 사원들의 월급을 4000달러로 바꿔라.

update EMP
set SAL = 4000
where DEPTNO = 20

-- 3. DEPT 테이블에 아래의 조건으로 데이터를 입력하라.
-- 부서번호: 50, 부서위치: BOSTON,  부서명: RESERCH

select * from DEPT

insert into DEPT values (50, 'BOSTON', 'RESERCH')

-- 4. 사원번호가 7698번인 사원의 부서번호를 7499번 사원의
--부서번호로 바꿔라.

 

update EMP
set DEPTNO = (select DEPTNO from EMP where EMPNO = 7369)
where EMPNO = 7698

-- 5. EMP 테이블에 아래와 같은 데이터를 삽입하라.
-- 사원번호: 9900, 사원이름: JACKSON, 직업: SALESMAN, 부서번호: 10

insert into EMP(EMPNO, ENAME, JOB, DEPTNO) values (9900,'JACKSON','SALESMAN',10)

-- 6. INSERT...SELECT 문을 이용하여 직업이 'SALESMAN'인
-- 사원의 사원번호, 이름, 직업을 EMP 테이블에 입력하라.

select * from EMP

insert EMP(EMPNO,ENAME,JOB)
select EMPNO,ENAME,JOB from EMP where JOB = 'salesman'

-- 7. 사원번호가 7369번인 사원과 같은 직업을 가진 사원들의
-- 월급을 7698번 사원의 월급으로 수정하라.


update EMP
set SAL = (select SAL from EMP where EMPNO = 7369)
where JOB = (select JOB from EMP where EMPNO = 7369)


-- 8. SCOTT과 같은 직업을 가진 사원을 모두 삭제하라.

delete from EMP
where JOB = (select JOB from EMP where ENAME = 'SCOTT')

-- 9. 'SCOTT'의 월급을 'SMITH'의 월급과 같게 수정하라.

update EMP
set SAL = (select SAL from EMP where ENAME = 'SMITH')
where ename = 'SCOTT'

-- 10. 'ALLEN'의 직업을 'SCOTT'의 직업과 같게 수정하라.
select * from EMP

update EMP
set JOB = (select JOB from EMP where ENAME = 'SCOTT')
where ENAME = 'ALLEN'

-- 11. 사원번호가 7499번인 사원과 같은 직업을 가진 사원들의
-- 입사일을 오늘날짜로 변경하라.
update EMP
set HIREDATE = GETDATE()
where JOB = (select JOB from EMP where EMPNO = 7499)

-- 12. SCOTT과 같은 직업을 가진 사원들의 월급을 0으로 수정하라.

update EMP
set SAL = 0
where JOB = (select JOB from EMP where ENAME = 'SCOTT')

'개발 > SQL' 카테고리의 다른 글

MS-SQL 데이터베이스 만들기 [ create table , create database ]  (0) 2011.05.18
MS-SQL 문제 50문  (0) 2011.05.18
MS - SQL 수정문법 [ insert into , insert ~ select ]  (0) 2011.05.18
MS-SQL 조건문  (0) 2011.05.18
MS-SQL 기본문제 9문  (0) 2011.05.18

/*
자기 부서의 평균월급보다 월급이 많은 사원의 이름, 월급, 부서번호, 부서 평균월급출력.
*/

select job , AVG(sal) as [평균연봉] , DEPTNO
from emp
where job != 'clerk'
group by job

select ENAME, SAL, e.DEPTNO, sample.avgsal
from emp e, (select DEPTNO, AVG(SAL) as [avgsal] from emp group by DEPTNO) sample
where e.DEPTNO = sample.DEPTNO
 and e.SAL > sample.avgsal
 
 
select  ENAME,SAL
from EMP
where SAL > ( select avg(SAL) from EMP )

exec sp_help emp

--insert into 테이블에값 입력

insert into EMP values(9999,'tom','salesman',7902,GETDATE(),800,25,30)

select *
from emp

insert EMP(EMPNO,ENAME) values(8888,'bill')

--update 테이블에 입력되어있는 값을 수정
update EMP
set SAL = 7800
where ENAME = 'tom'

--delete
delete from EMP
where ENAME in('tom','bill')

/*
insert ~ select
기존의 테이블에서 레코드를 가져다가
기존의 테이블에 입력시키는 것.

select ~ into
기존의 테이블에서 레코드를 가져다가
새로운 테이블을 만들면서 입력시키는 것
*/


--select ~ into
select empno, ename, DEPTNO into t_table
from emp
where DEPTNO = 10


select * from t_table

insert t_table select empno, ENAME, DEPTNO from EMP where DEPTNO = 20

'개발 > SQL' 카테고리의 다른 글

MS-SQL 문제 50문  (0) 2011.05.18
MS-SQL 문제 12문  (0) 2011.05.18
MS-SQL 조건문  (0) 2011.05.18
MS-SQL 기본문제 9문  (0) 2011.05.18
MS-SQL 정렬문법 [order by , top ]  (0) 2011.05.18


--allen보다 월급이 높은사람의 이름과 월급 출력

select SAL
from emp
where ENAME = 'allen'

select ENAME, SAL
from emp
where SAL >=( select SAL from emp where ENAME = 'allen' );

select ENAME, SAL
from EMP
where SAL in(( select SAL from emp where JOB = 'salesman' ))

select ENAME, SAL
from EMP
where SAL > ( select MAX(SAL)  from EMP  where DEPTNO = 20);

--all 연산자 조건문에서 안에들어있는 모든값을 포함.
select ENAME, SAL
from EMP
where SAL > all( select SAL  from EMP  where DEPTNO = 20);

--any 연산자조건 안에들어있는 값중 하나라도 만족하는경우
select ENAME, DEPTNO
from EMP
where deptno = any(select DEPTNO from EMP where ename like '%T%')

'개발 > SQL' 카테고리의 다른 글

MS-SQL 문제 12문  (0) 2011.05.18
MS - SQL 수정문법 [ insert into , insert ~ select ]  (0) 2011.05.18
MS-SQL 기본문제 9문  (0) 2011.05.18
MS-SQL 정렬문법 [order by , top ]  (0) 2011.05.18
MS-SQL 기초문제  (0) 2011.05.18


-- 1. 사원들의 이름, 부서번호, 부서이름을 출력하라.
select ENAME, emp.DEPTNO, DNAME
from emp, DEPT
where emp.DEPTNO = DEPT.DEPTNO


-- 2. DALLAS에서 근무하는 사원의 이름, 직위, 부서번호, 부서이름을
-- 출력하라.

select ENAME, JOB, emp.DEPTNO, DEPT.DNAME
from emp, dept
where dept.LOC = 'DALLAS'
 and emp.DEPTNO = DEPT.DEPTNO

-- 3. 이름에 'A'가 들어가는 사원들의 이름과 부서이름을 출력하라.
select ENAME, DEPT.DNAME
from emp, DEPT
where emp.DEPTNO = DEPT.DEPTNO
 and ENAME like 'A%'

-- 4. 사원이름과 그 사원이 속한 부서의 부서명, 그리고 월급을
--출력하는데 월급이 3000이상인 사원을 출력하라.

select ENAME,DNAME, SAL
from emp, DEPT
where SAL >= 3000
 and emp.DEPTNO = DEPT.DEPTNO

-- 5. 직위가 'SALESMAN'인 사원들의 직위와 그 사원이름, 그리고
-- 그 사원이 속한 부서 이름을 출력하라.

select JOB, ENAME, DNAME
from EMP, DEPT
where JOB = 'SALESMAN'
 and EMP.DEPTNO = DEPT.DEPTNO

-- 6. 커미션이 책정된 사원들의 사원번호, 이름, 연봉, 연봉+커미션,
-- 급여등급을 출력하되, 각각의 컬럼명을 '사원번호', '사원이름',
-- '연봉','실급여', '급여등급'으로 하여 출력하라.

select EMPNO     as [사원번호]
,  ENAME     as [이름]
,  SAL*12     as [연봉]
,  SAL*12+isnull(COMM,0) as [실급여]
,  GRADE     as [급여등급]
from emp,DEPT, SALGRADE
where emp.DEPTNO = DEPT.DEPTNO
 and emp.SAL >= SALGRADE.LOSAL
 and emp.SAL <= SALGRADE.HISAL

-- 7. 부서번호가 10번인 사원들의 부서번호, 부서이름, 사원이름,
-- 월급, 급여등급을 출력하라.
 
 select emp.DEPTNO, DNAME, ENAME, SAL, GRADE
 from EMP, DEPT, SALGRADE
 where emp.DEPTNO = DEPT.DEPTNO
 and SAL >= LOSAL
 and SAL <= HISAL
 and dept.DEPTNO = '10'
 
 

-- 8. 부서번호가 10번, 20번인 사원들의 부서번호, 부서이름,
-- 사원이름, 월급, 급여등급을 출력하라. 그리고 그 출력된
-- 결과물을 부서번호가 낮은 순으로, 월급이 높은 순으로
-- 정렬하라.

select dept.DEPTNO, dept.DNAME, ENAME, SAL, GRADE
from EMP, DEPT, SALGRADE
where emp.DEPTNO = DEPT.DEPTNO
 and SAL between LOSAL and HISAL
 and (emp.DEPTNO = 10 or emp.DEPTNO = 20)
order by emp.DEPTNO asc, SAL desc


-- 9. 사원번호와 사원이름, 그리고 그 사원을 관리하는 관리자의
-- 사원번호와 사원이름을 출력하되 각각의 컬럼명을 '사원번호',
-- '사원이름', '관리자번호', '관리자이름'으로 하여 출력하라.

select e.EMPNO  as [사원번호]
,  e.ENAME  as [사원이름]
,  f.DEPTNO as [관리자번호]
,  f.ENAME  as [관리자이름]
from EMP e, EMP f
where e.MGR = f.EMPNO

'개발 > SQL' 카테고리의 다른 글

MS - SQL 수정문법 [ insert into , insert ~ select ]  (0) 2011.05.18
MS-SQL 조건문  (0) 2011.05.18
MS-SQL 정렬문법 [order by , top ]  (0) 2011.05.18
MS-SQL 기초문제  (0) 2011.05.18
MS-SQL 문법 [ DATE ]  (0) 2011.05.18

-- order by 오름차순 desc입력시 내림차순.
select ename, sal
from emp
order by sal

select job, avg(sal) as [avgsal]
from EMP
group by JOB
order by avgsal desc

--top 상위 5개만 보여줌.
select top 5 ename, SAL
from emp
order by SAL desc

select top 30 percent ename, SAL
from EMP
order by SAL desc

--with ties 동률. 같은값이 있는경우에는 같이 표시.
select top 2 with ties ename, SAL
from EMP
order by sal desc


--group by 이후 처리가 필요할경우 having으로 처리하여줌.
select job , AVG(sal) as [평균연봉]
from emp
where job != 'clerk'
group by job
having avg(SAL) >= 3000
order by avg(sal)

--with rollup 시 이전 값에대한 전체값을 리턴.
select job, deptno, avg(sal)
from emp
group by deptno,job with rollup


select deptno, job, sal
from emp
order by DEPTNO desc
compute avg(sal) by deptno

'개발 > SQL' 카테고리의 다른 글

MS-SQL 조건문  (0) 2011.05.18
MS-SQL 기본문제 9문  (0) 2011.05.18
MS-SQL 기초문제  (0) 2011.05.18
MS-SQL 문법 [ DATE ]  (0) 2011.05.18
MS-SQL 숫자,텍스트,문법 [ in , like , Math ]  (0) 2011.05.18

+ Recent posts