--데이터베이스생성.
/*
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

--1. 사원테이블에서 부서별 최대 월급을 출력하라.

select deptno,max(sal) as [최대월급]
from emp
group by deptno

--2. 사원테이블에서 직위별 최소 월급을 구하되 직위가
-- CLERK인 것만 출력하라.

select job,min(sal) as [최소월급]
from emp
where job = 'clerk'
group by job

--3. 커미션이 책정된 사원은 모두 몇 명인가?

select count(comm)
from emp

--4. 직위가 'SALESMAN'이고 월급이 1000이상인 사원의
-- 이름과 월급을 출력하라.

select ename,sal
from emp
where job = 'SALESMAN' and SAL >= 1000

--5. 부서별 평균월급을 출력하되, 평균월급이 2000보다
-- 큰 부서의 부서번호와 평균월급을 출력하라.

select DEPTNO ,avg(sal) as [평균월급]
from emp
group by DEPTNO
having avg(SAL) >= 2000

 

--6. 사원테이블에서 커미션을 가장 많이 받는 사원 2명을
-- 출력하되 랭킹이 중복될 경우 동률처리를 하여 출력하라.

select top 2 with ties ename, comm
from emp
order by comm desc

--7. 직위가 MANAGER인 사원을 뽑는데 월급이 높은 사람
-- 순으로 이름, 직위, 월급을 출력하라.

select ename,job,sal
from emp
where job = 'manager'
order by sal desc


--8. 각 직위별로 총월급을 출력하되 월급이 낮은 순으로
-- 출력하라.

select job, SUM(sal) as [합계]
from emp
group by job
order by sum(sal)

--9. 직위별 총월급을 출력하되, 직위가 'MANAGER'인
-- 사원들은 제외하라. 그리고 그 총월급이 5000보다
-- 큰 직위와 총월급만 출력하라.

select job, sum(SAL) as [합계]
from emp
where job != 'manager'
group by job
having sum(SAL) > 5000

--10. 직위별 최대월급을 출력하되, 직위가 'CLERK'인
-- 사원들은 제외하라. 그리고 그 최대월급이 2000 이상인
-- 직위와 최대월급을 최대 월급이 높은 순으로 정렬하여
-- 출력하라.

select job,max(sal) as[최대월급]
from emp
where job != 'clerk'
group by job
 having max(sal) > 2000
order by max(sal) desc

--11. WITH ROLLUP  구문을 이용하여 직위별 사원의 이름과
-- 월급, 그리고 직위별 월급의 합을 구하라.

select sal, job, ename , sum(sal)
from emp
group by job,ename,sal with rollup


select GETDATE()+10 --10일후로 입력.
dateadd
/*년 yy
월 mm
일 dd
시 hh
분 mi
초 ss,
dy(day of year), dw(day of week), qq
*/
select DATEADD(yy,5,GETDATE());
select DATEDIFF(dd,'2011-12-31',GETDATE()); -- 년도끼리 연산.

select DATENAME(DW,GETDATE()); --문자형반환. /목요일
select DATEPART(DW,GETDATE()); --숫자형 반환 /5일

select YEAR(GETDATE()); --GETDATE에서 YEAR값리턴.
select MONTH(GETDATE()); --GETDATE에서 MONTH값리턴.
select DAY(GETDATE()); -- GETDATE에서 DAY값리턴.

--정수형 문자형을 합치는 방법.
select ename, empno --ename은 문자형 empno가 숫자형일때
from emp;

--CONVERT로 문자형으로 형변환.
select ename + CONVERT(varchar(10), empno)
from emp

--CAST로 문자형으로 형변환.
select ename + CAST(empno as VARCHAR(10))
from emp

--년월일 표기식 변경.
select convert(varchar(20),GETDATE(),101); -- 미국표기식 년월일.
select convert(varchar(20),GETDATE(),102); -- ansi식 년월일.
select convert(varchar(20),GETDATE(),112); -- ios식 년월일


--집계함수는 null을 배제하고 사용한다.
/*
평균 avg
최대값 max
최소값 min
합계 sum
  count
*/

--empno안에 총 몇가지 값이 있는지 갯수 체크.
select count(isnull(empno,0))
from emp

select SUM(comm) as [합계]
from emp

select AVG(isnull(comm,0)) as [평균]
from emp

--clerk를 제외
select job, AVG(sal) as [합 계]
from emp
where job != 'clerk'
group by job

select MAX(SAL)
from emp

select min(sal)
from emp

select job, deptno,avg(sal)
from emp
group by job


--distinct
중복제거

select distinct job
from emp


--exec sp_help
시스템 내장변수
테이블정보.
exec sp_help emp

비트 연산
2진수변환


--in
Select ename, sal, deptno, job
from emp
where deptno in(10,20)

10보다 크고 20보다 적다.

--like
select ename, sal
from emp
where ename like '%e%'

문자열에서 시작하는 위치

where ename like '_a%' 두번째가 a인사람
where ename like '[as]%' a나 s로 시작하는 사람.
where ename like '[^s]%' s로 시작하지 않는 사람.

 

select reverse('abcdef') as reverse; // 역방향정렬
select replace('abcdef','bc','kkk'); // bc를 kkk로 대체
select STUFF('abcdef',2,3,'kkk'); // 2~3번까지를 kkk로 대체
select round(123.456,1); // 소수점이하 1자리까지 출력
select round(123.456,-1); // 1번자리까지 출력
select power(2,3); // 제곱
select ceiling(123.456);//124 가로안에 있는 숫자보다 큰 정수 출력.
select ceiling(-123.456); //-123가로안에 있는 숫자보다 큰 정수 출력.
select floor(123.456);// 123 // 보다 작은 최대정수
select floor(-123.456);//-124 // 보다 작은 최대정수
select sqrt(9);//제곱근함수(루트)
select SQUARE(9);//81
select abs(100);//절대값
select abs(-100);//절대값


select reverse('abcdef') as reverse;
select replace('abcdef','bc','kkk') as replace;
select STUFF('abcdef',2,3,'kkk') as STUFF;
select round(123.456,1) as round;
select round(123.456,-1) as round;
select power(2,3) as power;
select ceiling(123.456) as ceiling;
select ceiling(-123.456) as ceiling;
select floor(123.456) as floor;
select floor(-123.456) as floor;
select sqrt(9) as sqrt;
select SQUARE(9) as SQUARE;
select abs(100) as abs;
select abs(-100) as abs;


//소스
--select * from emp

/*select empno, ename
from emp
go*/
/*
use master

select *
from test408.dbo.emp
*/

/*select 7+5
select 7*4
select 'tom' + 'bill'*/

select ename as [사원이름], deptno as [부서이름]
from emp

select distinct job
from emp

exec sp_help emp

Select empno, sal, sal*12 As [연봉]
From emp

Select ename, sal, comm, sal+isnull(comm,0)
From emp

Select ename, sal, deptno, job
from emp
where job = 'salesman'

Select ename, sal, deptno, job
from emp
where sal >= 1500 and sal < 3000

Select ename, sal, deptno, job
from emp
where deptno in(10,20)
--where sal between 1500 and 3000

select ename, sal
from emp
where ename like '[s]%'

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

MS-SQL 기초문제  (0) 2011.05.18
MS-SQL 문법 [ DATE ]  (0) 2011.05.18
기초 문법 [ pivot , ROW_NUMBER , Rank , DENSE_RANK , NTILE ]  (0) 2011.05.18
기초문법 [ GROUPING , with rollup , is not null ]  (0) 2011.05.18
sql 기초문법  (0) 2011.05.18

+ Recent posts