JHB의 프로그래밍 삽질기

[DB] MS-SQL 따라해보자 본문

PROGRAMMING/Etc

[DB] MS-SQL 따라해보자

roter 2011.01.20 17:16

from http://asp.tipi.co.kr/mssql.htm

M S - S Q L http://my.dreamwiz.com/hideny/study/sql/sql.html


도움말은 F1 이나 SHIFT + F1


☞ SHIFT + F1 은 보고자 하는 명령어를 블록을 잡아 실행시키면 된다.

 

● 데이터베이스 생성
(1)Create Database mydb ON
(Name ='mydb.dat' , FileName = 'D:\MSSQL7\Data\mydb.mdf', size=10)
Log on (Name = 'mydb.log' , FileName = 'D:\MSSQL7\Data\mydb.ldf', size=3)

drop database mydb
☞ D 드라이브 상에서 자신의 DB를 생성하기
☞ drop database mydb 는 자신의 DB인 mydb를 삭제하는 것이다.

(2) Create Database  exdb ON (Name ='ex.dat' , FileName = 'D:\MSSQL7\Data\ex.mdf',
  Size = 10, Maxsize = 50, Filegrowth = 1)
  Log on (Name = 'ex.log' , FileName = 'D:\MSSQL7\Data\ex.ldf', Size = 3mb, Maxsize = 25mb, Filegrowth = 1mb)

  drop database exdb

● SQL 명령어

1) DCL명령어(Data Control Language) : 사용자 관리 명령

Grant, Rovoke, Deny 등

2) DDL 명령어)Data DEfinetion Language) : DB, Table 에 관한 구조 정의

Create, Alter,Drop 등
☞ Create 생성, Alter 추가, Drop 삭제

3)DML 명령 (data Manepution Language) :Col 과 Row 작업 (레코드에 관한 작업)

Select, Insert, Delete,Updata

 
 

★ 자료형에 대하여.....
select * from systypes
select name, prec, scale from systypes
☞ select (필드명) from (테이플 명)

● Table의 제한
데이타 베이스당 20억개의 테이블을 갖을 수 있다.
최대 1024개의 칼럼을 가질수 있다.
행당 8096바이트를 가질수 있다.(단 이미지와 TEXT는 제외)

● 테이블의 제약조건
Not NullNull값을 허용하지 않는다
Unique중복을 허용하지 않는다
Default기본값 설정
CheckValidation Rule을 설정
Identity 칼럼의 값을 자동으로 증가,감소할 수 있도록 설정.
테이블당 1개만 허용한다. 갱신될 수 없다.
Null을 허용하지 않는다.
Integer자료형(Int, Smallint, Tinyint)이나 Numeric, Decimal사용(scale은 0이어야 한다).
형식 IDENTITY(초기값,증가감소)
IDENT_INCR('테이블명') - 증가값을 보여준다
IDENT_SEED('테이블명') - 시작값을 보여준다
사용자에 의해서 자료 삽입이 가능하게 하려면
SET IDENTITY_INSERT db명..테이블명 {ON|OFF}
Identity는 Unique 속성은 갖지 않는다.
=======================================================================================================

 

☞ 지금 부터는 Table을 생성


Buseo table(primary-부서 코드)

부서 코드

부서명

부서위치

전화

Buseono

Buseoname

BuseoLoc

Buseotel

Int

Varchar(10)

Varchar(10)

Varchar(15)

Sawon table(primary-사번)
Buseo 의 부서코드 (Buseono)종속키(상대방은 반드시 기본키)

사번

이름

부서 코드

직책

급여

입사일

Sabun

Saname

Buseono

sajob

sapay

sahire

Int

Varchar(10)

Int

Varchar(10)

Numeric(10,0)

Datetime

Gogek table(primary-고객 번호

sawon 의 사번(sabun) 종속키

고객 번호

이름

전화

성별

담당자

Gobun

Goname

Gotel

Gosex

godam

Int

Varchar(10)

Varchar(20)

Varchar(2)

Int

☞부서 코드( Buseo table )와 부서 코드(Sawon table )그리고 사번( Sawon table )과 담당자( Gogek table )가 서로 연결
☞ /* ~~~~~~ */ 은 주석
(1) 테이블 작성 buseo

● 생성하자 (10개의 데이터)
create table buseo(buseono int identity(10,10), /* 부서코드, Not Null이 생략 */
buseoname varchar(10), /* 부서명 */
buseoloc varchar(10), /* 부서위치 */
buseotel varchar(15),/* 전화 */
constraint buseo_buseono_pk primary key(buseono))

insert into buseo values('총무부', '부산', '123-1234') /* 부서명, 부서위치, 전화 */
insert into buseo values('영업부', '광주', '234-2234')
insert into buseo values('전산부', '서울', '133-4444')
insert into buseo values('총무부', '서울', '456-5678')
insert into buseo values('영업부', '대구', '678-1256')
insert into buseo values('전산부', '부산', '784-3756')
insert into buseo values('총무부', '대전', '376-8367')
insert into buseo values('영업부', '부산', '397-3089')
insert into buseo values('전산부', '안양', '265-6836')
insert into buseo values('관리부', '인천', '609-2834')

☞ constraint 테이블명_필드명_pk(성격) primary key(buseono))

● 간단한 연습
1) 결과출력
select * from buseo

2) 중복연습 (Unique의 연습)
alter table buseo add constraint buseo_buseoname_uq unique(buseoname) --안된다(총무부 ...)
alter table buseo add constraint buseo_buseotel_uq unique(buseotel)
insert into buseo values('생산부', '대구', '111-1111') --2번을 insert하면 안된다
alter table buseo drop constraint buseo_buseotel_uq

3) 필드추가
: 단 필드는 6.5는 삭제할 수 없지만 7.0은 가능하다
: Oracle 8.0과의 형식이 다르다
alter table buseo add address varchar(15) /*7.0식 */
alter table buseo add address varchar(15) null /*6.5식 */
select * from buseo
alter table buseo drop column address
alter table buseo drop column buseotel/* Oracle8.0은 안된다 (☞ 레코드가 있는 것은 지울 수 가 없다.
단, 레코드가 없는 것만 지운다.)
4) Update의 연습
㉠ update buseo set address='' where buseono=10
☞ ''는 큰 따움표가 아니라 싱글 마크 ' 를 두 번 쓴다.
㉡ update buseo set address='' where buseono >= 20 and buseono <= 40
☞ 20~40 까지 null 을 없앴다.
㉢ update buseo set address='' where buseono between 50 and 70
㉣ update buseo set address='' where address = null --안된다(마치 되는것처럼...)
㉤ update buseo set address='' where address is null
㉥ update buseo set address='' /*가능 하다.*/
㉦update buseo set address='gg' where buseono address=10
☞ buseono 10 값에 address 값에 gg 가 추가 된다.

5) 삭제 (Delete는 DML명령, Drop은 DDL명령)
delete from buseo where buseoname='총무부'
☞ 레코드 단위
truncate table buseo

☞ 페이지 단위
truncate table buseo where buseoname='총무부' --안된다

☞ 조건부 형식은 되지 않는다.
drop table buseo
☞ 테이블 단위

=======================================================================================

(2) 테이블 작성 Sawon (27개의 데이터)
create table sawon(sabun int identity(1,1),/* 사번 */
saname varchar(10),/* 이름 */
buseono int,/* 부서코드 */ ☞buseono int 에서 int 인 이유는 Primary가 int 이므로 sajob varchar(4) default '사원',/* 직책 */
sapay numeric(10,0),/* 급여 */
sahire datetime,/* 입사일 */
constraint sawon_sabun_pk primary key(sabun),
constraint sawon_buseono_fk foreign key(buseono) references buseo(buseono))
☞ 사원과 부서가 연결될 경우: 사원은 지워야 부서가 지워짐

☞ references buseo(buseono)) 참조하는 primary 표시

insert into sawon values('엄정화', 10, '사원', 10000, '2-12-1999') /* 이름 이후 입력 */
insert into sawon values('룰라', 20, '대리', 10000, '2-12-1999')
insert into sawon values('강수지', 30, '부장', 20000, '2-13-1999')
insert into sawon values('설운도', 40, '차장', 30000, '2-22-1999')
insert into sawon values('서태지', 50, '대리', 40000, '2-26-1999')
insert into sawon values('송대관', 60, '사장', 50000, '2-28-1999')
insert into sawon values('남진', 70, default, 60000, '3-1-1999')
insert into sawon values('나훈아', 80, default, 70000, '3-3-1999')
insert into sawon values('영턱스', 90, '회장', 150000, '3-7-1999')
insert into sawon values('신성우', 10, '주임', 90000, '4-1-1999')
insert into sawon values('박진영', 20, '주임', 180000, '5-1-1999')
insert into sawon values('송창식', 40, '부장', 110000, '6-1-1999')
insert into sawon values('혜은이', 30, '주임', 110000, '7-1-1999')
insert into sawon values('이은하', 20, '대리', 130000, '8-1-1999')
insert into sawon values('양파', 60, '이사', 140000, '9-1-1999')
insert into sawon values('이선희', 10, '담당', 70000, '3-1-1999')
insert into sawon values('신성훈', 10, '대리', 80000, '4-1-1999')
insert into sawon values('김건모', 10, '과장', 90000, '5-1-1999')
insert into sawon values('이미자', 10, '주임', 180000, '6-1-1999')
insert into sawon values('현철', 50, default, 90000, '9-22-1999')
insert into sawon values('김추자', 30, '과장', 190000, '5-3-1999')
insert into sawon values('소찬희', 40, '주임', 280000, '6-5-1999')
insert into sawon values('안재욱', 20, '과장', 60000, '5-2-1999')
insert into sawon values('주영훈', 20, '주임', 280000, '6-21-1999')
insert into sawon values('이문세', 30, '과장', 190000, '5-11-1999')
insert into sawon values('이기찬', 40, '주임', 120000, '6-17-1999')
insert into sawon values('윤태운', 20, default, 120000, '6-17-1999')

insert into sawon values('윤희경', 20, 120000, '6-17-1999')
--디폴트 생략시 Error

insert into sawon values('윤희경', 20, null, 120000, '6-17-1999')
insert into sawon values('윤희경', 20, default, 120000, '6-17-1999')

select * from sawon

drop table sawon

(3) 테이블 작성 Gogek
Create Table table (col명 type [제약규칙], col명 type [제약규칙],...)

생성하자
create table gogek(gobun int identity(1,1),/* 고객번호 */
goname varchar(10),/* 이름 */
gotel varchar(20),/* 전화 */
gosex varchar(2),/* 성별 */
godam int,/* 담당자 */

☞ 사본이 primary int 로 되어 있기 때문에 godam 도 역시 int(일련 번호는 int로 잡혔있다.)

constraint gogek_gobun_pk primary key(gobun),
constraint gogek_gosex_ck check(gosex in('남','여')),

☞ gosex in('남','여')에서 in 은 꼭 써주어야 한다.

constraint gogek_godam_fk foreign key(godam) references sawon(sabun))

insert into gogek values('이주일', '123-1234', '남', 1) /* 이름 이후 입력 */
insert into gogek values('김미화', '223-1234', '여', 2)
insert into gogek values('이용식', '323-1234', '남', 3)
insert into gogek values('배연정', '423-1234', '여', 4)
insert into gogek values('김국진', '583-1234', '남', 5)
insert into gogek values('이경규', '873-1234', '남', 1)
insert into gogek values('김옥주', '863-1234', '여', 2)
insert into gogek values('이기동', '853-1234', '남', 3)
insert into gogek values('이영자', '843-1234', '여', 4)
insert into gogek values('남성남', '533-1234', '남', 5)
insert into gogek values('심형래', '133-1234', '남', 1)
insert into gogek values('홍진경', '223-1234', '여', 2)
insert into gogek values('김형곤', '373-1234', '남', 3)
insert into gogek values('조혜련', '483-1234', '여', 4)

insert into gogek values('최양락','123-1234','중',5)
/* Error의 이유는? */

☞체크 속성이 되어 있지 않기 때문이다.

insert into gogek values('최양락', '123-1234', '남', 5)

select * from gogek

) 제약조건 설정과 해제 (Oracle과 형식이 다르다)
Alter table gogek NOCHECK Constraint gogek_gosex_ck
Alter table gogek CHECK Constraint gogek_gosex_ck

Alter table gogek NOCHECK Constraint ALL
Alter table gogek CHECK Constraint ALL

) 제약조건 삭제
Alter table gogek DROP Constraint gogek_gosex_ck
drop table gogek

★ DTS(Data Transformation Services) : Excel,Access,Oracle 등으로 Export, Import

★ DB(Oracle,SyBase, Paradox)와 App(VB,PB,Delphi) 등과 MS-SQL의 연결

★ 단 Oracle은 조금은 난해한 연결을 하여야 한다
Oracle Net8 Easy Config를 이용.
CR과 연결시 Connect에 odbc;dsn=aaa;uid=scott;pwd=tiger을 명기.
Oracle시 Select * from “emp” ;

==================================================================================================

● 테이블 이름, 구조 보기 (DB선택하고, EM에서도 실습)
(1) Master DB 또는 mydb 등이 가지고 있는 서버의 정보보기
예) Use master
예) Use mydb

☞ 서버의 정보 보기

) Select * from sysobjects order by name

☞ sysobjects(시스템에 관련)order by name(이름 별로)

) Select name,id,uid,type, userstat from sysobjects order by name

(2) DB에 있는 테이블 정보보기 (SP_를 Help로 보는 시간을 가진다)
형식)SP_TABLES 테이블명,소유자명,DB명
예) SP_TABLES
예) SP_TABLES gogek, dbo, mydb
예) SP_TABLES null, dbo
Oracle의 select * from tab;

(3) Table의 칼럼정보 보기
형식)SP_COLUMNS 테이블명
예) SP_COLUMNS gogek

(4) 현재 선택된 DB에 접속하여 사용할 수 있는 모든유저명 보기
예) select * from sysusers

(5) 오브젝트이름이나 칼럼명 바꾸기(일반유저가 사용가능)

형식1)sp_rename old테이블명, new테이블명
예) sp_rename gogek, go
sp_rename go, gogek

☞ gogek을 go로 바꾸기

형식2)sp_rename '테이블명.old칼럼명', new칼럼명
예) sp_rename 'gogek.gobun', gobun1
select * from gogek
sp_rename 'gogek.gobun1', gobun

(6) 데이타베이스명 바꾸기
형식)sp_renamedb olddb명, newdb명
예) sp_renamedb mydb, youdb
sp_renamedb youdb, mydb

☞ 기본 기법이 멀티 유저(user) 이기에 단독 user 로 바꿔져야 한다.

Server의 mydb \ Properties \ Option에서 Single_User로 선택되어야 한다
또한 mydb가 사용하지 않아야 한다 (mydb가 Query에서 선택되어 있지 않아야 한다)

(7) sp_명령으로 Login의 만들기 (User와 혼동해서는 안된다)
☞ 간단히 말해 동호회에서 사용자명을 생각하면된다.
로그인 해서 동호회 가입시 다른 사용자명을 사용할수 있다는 걸..
간단히 permissions의 개념도 한다
☞ 오른쪽 마우스를 통해서 propertion 에서 권한을 줄 수도 있다.

(8) 패스워드 바꾸기 (매우 중요.....)
형식)sp_password old, new [, login_id]
예) SA가 다른사람의 패스워드를 바꿀때는 login id를 사용한다.
현재 접속되어 있는 사람이 패스워드를 바꿀때는 login id는 생략가능하다.
sp_password null, '123', SA
sp_password '123', null, SA

SA에 대한 소유권을 다른 유저에게 이전할 수 있다(단 Master DB는 이전할 수 없다)
DB를 만들수 있는 사람은 SA만 가능하므로 모든 DB의 소유권은 SA가 갖는다.
그러나 SA가 바쁜일로 특정 DB를 관리할 수 없는 경우 해당 DB에 대한 소유권을
다른 유저에게 이전 할 수 있다.
소유권을 이전받은 유저는 해당 DB에 대해서만 모든 관리 권한을 갖는다.
물론 소유권을 이전한 SA도 양도한 DB를 관리할 수 있다.
주)SA는 모든일을 할 수 있다.

(9) 소유권이전(SA로 접속),
형식> sp_changedbowner login_id [, true]
예) sp_changedbowner ywh , true

(10) 소유권 가져오기(SA로 접속)-SA가 다시 SA로 주면 된다.
예) sp_changedbowner sa , true

================================================================

● 아래는 적용범위에 대하여 이해를 하여야 한다

(1) 쿼리분석기에서...
1) 사용자 정의 유형 (User Defined Data Types)
생성> sp_addtype 새로운이름의 type명, 내부 datatype명 [null에 대한 설정]
예1> sp_addtype irum, 'varchar(10)'
☞ varchar(10)인 이유는 saname irum 값을 표현하기 위해서
sp_addtype pay, 'money'
예2> create table ex1(saname irum, sapay pay)
select * from ex1
삭제> sp_droptype 새로운이름의 type명
sp_droptype pay
바인딩이 되어 있으므로 안된다(ex1 Table). 그러므로 Table을 삭제하면 된다

2) default 정의 하기
형식> create default default_name as constraint_expression
예> create default namedef as '영구'
☞ 만들기만 하고 연결이 되어 있지 않기 때문에 3) 을 먼저 실행해야 한다.
insert into ex1 values(default, 10000)
select * from ex1 --Null이 된다, 바인딩이 안되었으므로...

3) default 를 table의 컬럼에 바인드 시키기
형식> sp_bindefault defaultname, 'table명.field명'
예> sp_bindefault namedef, 'ex1.saname'
insert into ex1 values(default, 10000)
select * from ex1

4) default 를 table의 컬럼에 바인드 해제 시키기
형식> sp_unbindefault 'table_name.field명'
예> sp_unbindefault 'ex1.saname'
다시> insert into ex1 values(default,20)
select * from ex1

5) default 삭제
형식> drop default default_name, default_name, default_name,.....
예> drop default namedef

6) 데이타 type에 바인드하기 (3번과 형식의 차이가 있다)
: 내장된 데이타 타입에는 바인드 할수 없고 사용자 정의 타입에만 정의가 가능
형식> sp_bindefault namedef, '사용자정의자료형'
먼저> create default namedef as '영구'
예> sp_bindefault namedef, 'irum'
insert into ex1 values(default,20)
select * from ex1

7) Rule 만들기
형식> create rule rulename as @condition_expression
예> create rule payrule as @sapay between 10 and 100
create rule namerule as @saname in('영구','kim','park','han')
Delete from ex1
insert into ex1 values('han', 150)--적용되지 않는다
insert into ex1 values('kkk', 50)--적용되지 않는다
select * from ex1

8) Rule을 table의 컬럼에 바인드 시키기
형식> sp_bindrule rule_name, 'table.col_name'
예) sp_bindrule payrule, 'ex1.sapay'
Delete from ex1
insert into ex1 values('han', 150)

☞실행되지 않는다.
insert into ex1 values('kkk', 50)--적용되지 않는다
☞ 실행은 된다.
select * from ex1

9) Rule의 bind 풀기
형식> sp_unbindrule 'table.col명'
예) sp_unbindrule 'ex1.sapay'
Delete from ex1
insert into ex1 values('han', 150)--적용되지 않는다

☞ 실행은 된다.
insert into ex1 values('kkk', 50)--적용되지 않는다

☞ 실행은 된다.
select * from ex1

10) 삭제
형식> drop rule rule_name,rule_name,rule_name,....
예) drop rule payrule

==========================================================================

여태 까지는 DDL명령, 지금부터는 DML명령이다

===========================================================================

select, insert, delete, update

형식>selectcollist, collist, collist,.....
from table_name, table_name, table_name,......
where 조건식, 조건식,..... /* Where가 생략되면 모든 레코드 */
group by 1차그룹, 2차그룹.....
having 그룹에 대한 조건, 그룹에 대한 조건, .....
order by collist [asc|desc], collist [asc|desc]......
compute 계산식, 계산식,...... /* Oracle은 Break On */
/* where절과 having절이 같이 쓰이면 having절이 우선 */

1) 모든것을 보자
select * from sawon

2) 원하는 필드만 보자
select saname, buseono, sapay from sawon

3) 표제를 변경하자
select saname as '사원이름', sapay as '급여' from sawon --Oracle 및 MS-SQL 기법
select saname as 사원이름, sapay as 급여 from sawon --문자는 ' ' 이다
select saname as 사원 이름, sapay as 급여 from sawon --안된다
select saname as '사원 이름', sapay as '급여' from sawon
select '사원이름'=saname, '급여'=sapay from sawon ☞ SQL에서만 된다.

4) 사원이름과 급여로 표제를 바꾸고 sapay의 내림차순으로 출력
select saname as '사원이름', sapay as '급여' from sawon
order by sapay desc ☞ asc 는 내림차순

5) 사원Table에서 과장과 주임만 sapay를 내림차순으로 보자
☞ 반드시 필드명이 있어야 한다.
select * from sawon where sajob='과장' or sajob='주임'
order by sapay desc
select * from sawon where sajob='과장', '주임' --안된다
order by sapay desc
select * from sawon where sajob in('과장','주임')
order by sapay desc
☞ in 비교 연산자

6) 원하는 자료를 하나의 그룹으로만 출력
select sajob from sawon
select distinct sajob from sawon

☞ distinct 중복되는 것은 제외
select distinct gosex from gogek
select distinct godam from gogek
select distinct gosex, godam from gogek

===============================================================================

● 연산자 공부하자

1. 산술연산자+(덧셈),-(뺄셈),*(곱셈),/(나눗셈), %(나머지)
2. 관계연산자=,>,<,>=,<=,<>, !=같지않다, !<크지않다, !>작지않다
3. 논리연산자NOT,AND,OR

4. 비교연산자
1) between 10 and 100, 또는 not between 10 and 100
예> sawon의 buseono가 10부터 30까지
select * from sawon where buseono between 10 and 30
select * from sawon where buseono between 30 and 10 --안된다

2) in(값1, 값2,....) 또는 not in
예> sawon의 sajob이 '대리' or '과장'
select * from sawon where sajob in('대리','과장')

3) is null, is not null

4) like, not like
%:모든 문자(Like와....)
_(UnderBar):1문자 해당
[ ]:대괄호안에 있는 문자중에 1개
[^]:대괄호안에 없는 문자

>
saname like '김%':김씨만 출력하라 ☞ "김*"은 Access 기법이다
sabun like '[0-9]':0부터 9까지
saname like 'a[^b]%':첫글자가 a로 시작하고 두번째 문자 b가 아닌것

1) sawon 테이블에서 김씨가 아닌 사람을 출력
select * from sawon where saname not like '김%'
select * from sawon where saname like '김%' -- 안된다
select * from sawon where saname = '김%' -- 안된다
select * from sawon where saname not like "김*"-- 안된다

2) sawon 테이블에서 김씨, 이씨, 신씨가 아닌 사람
select * from sawon where saname not like '[김, 이, 신]%'
select * from sawon where saname not in ('[김%, 이%, 신%]') -- 안된다.....
-- 즉 saname='김%' or saname='이%' or saname='신%' 이다

select * from sawon where saname not in ('김%', '이%', '신%') -- 안된다.....
-- 즉 Like와 %는 실과 바늘...

3) gogek 테이블에서 gotel이 1번부터 3번으로 시작하는 것을 출력
select * from gogek where gotel like '[1-3]%'
select * from gogek where goname like '[박-이]%'

4) sawon 테이블에서 직책별로 인원수와 급여합을 구하라
select sajob as '직책', count(*) as '인원수', sum(sapay) as '급여합' from sawon
group by sajob

select sajob as '직책', count(*) as '인원수', sum(sapay) as '급여합' from sawon
-- 안된다 일반필드는 그룹필드와 같이 쓸 수 없다

5) sawon 테이블에서 직책별로 인원수와 급여합을 구하는데 직책별이 2이상 내림차순..
select sajob as '직책', count(*) as '인원수', sum(sapay) as '급여합'
from sawon
group by sajob
having count(*)>=2
order by count(*) desc, sum(sapay) -- 2차 Sort Key(sum(sapay))의 기본값은 ASC

6) sawon 테이블에서 사원과 대리를 제외한 table (18)
select *
from sawon
where sajob not in('사원','대리')

select *
from sawon
where sajob not like('[사원,대리]%') --안된다(사장이 없으므로...),
-- [ ]는 대괄호안에 있는 문자중에 1개

7) sawon 테이블에서 부서번호는 10,20이고 직책은 부장,과장인 사람찾기 (2)
select *
from sawon
where buseono in(10,20)
and
sajob in('부장','과장')

8) sawon 테이블에서 부서번호는 10,20이고 급여가 100000~200000이 아닌 사람찾기 (8)
select *
from sawon
where buseono in (10,20)
and
sapay not between 100000 and 200000

9) 날짜가 99년 2월을 출력하라
select * from sawon where sahire between '2-1-99' and '2-28-99' --날짜형식이므로...
select * from sawon where sahire between 99-2-1 and 99-2-28
select * from sawon where sahire between '99-2-1' and '99-2-28'
select * from sawon where sahire like '2-%-99' --문자형식이므로 안된다...
select * from sawon where sahire between #99-2-1# and #99-2-28# --Access와 VB이다

10) gogek 테이블에서 전화번호가 없는 사람찾기 (0)
select * from gogek where gotel is null --안된다
select * from gogek where gotel = null --안된다
select * from gogek where gotel = ''

11) sawon테이블에서 이름의 두번째 글자가 '은'인 사람찾기 (2)
select * from sawon where saname like'_은%'
select * from sawon where saname like'_은_' -- 안된다
select * from sawon where saname like'%은%' -- 안된다

12) sawon테이블에서 이름이 두글자로 되어 있으며 두번째 글자가 ' 현'인 사람찾기 (0)
select saname from sawon where saname like '_현'

13) sawon 테이블에서 이름이 두글자로 되어 있는 사람찾기 (4)
select saname from sawon where saname like '__'

====================================================================================

● 간단한 JOIN
INNER JOIN두 테이블의 일치하는 자료만 출력
LEFT OUTER JOIN왼쪽 테이블의 자료는 모두출력하고 오른쪽 것은 일치하는 것만
RIGHT OUTER JOIN오른쪽 테이블의 자료는 모두출력하고 왼쪽것은 일치하는 것만
SELF JOIN자신의 테이블에 결합
CROSS JOIN
--두 table간의 곱(Cartesian product)이 나온다. 잘 사용 안함(학술적 의미)
--where절이 없다.
--양쪽 table의 모든 행에 대해 서로 연결
select * from sawon cross join buseo
select * from sawon cross join gogek
select * from gogek cross join buseo

문제1> buseo 테이블과 sawon 테이블이 일치(inner join이다)
select *
from buseo, sawon
where buseo.buseono = sawon.buseono

☞ sawon.buseono 은 테이플명. 필드명

문제2> buseo테이블과 sawon 테이블이 일치에서 일부분만 출력(inner join이다)
select buseo.buseono, buseo.buseoname, sawon.saname, sawon.sajob
from buseo, sawon
where buseo.buseono = sawon.buseono

select buseo.buseono, buseoname, saname, sajob
from buseo, sawon
where buseo.buseono = sawon.buseono

★★★ ANSI-SQL과 T-SQL의 의미★★★
-- 아래는 ANSI-SQL Join 기법이다
select buseo.buseono, buseoname, saname, sajob
from buseo inner join sawon
on buseo.buseono = sawon.buseono

문제3> buseo테이블과 sawon 테이블에서 buseo를 전부 출력(outer join이다)
select buseo.buseono, buseo.buseoname, sawon.saname, sawon.sajob
from buseo, sawon
where buseo.buseono *=sawon.buseono

Oracle은?

☞ left outer join

select buseo.buseono, buseo.buseoname, sawon.saname, sawon.sajob
from buseo, sawon
where buseo.buseono=sawon.buseono(+)

☞ buseo.buseono(+)=sawon.buseono 은 right outer join

======================================================================================

★ Self Join에 대해서
drop table self
create TABLE self(sabun int,
sanamevarchar(10) not null,
sajob varchar(10),
sapay numeric(10,0),
sahire datetime,
sasex varchar(4),
saMgr int,
constraint self_sabun_PK primary key(sabun),
constraint self_samgr_FK foreign key(samgr) references self(sabun))

select * from self

Insert Into self Values(1,'윤위현','회장',5000,'2-12-1990','남자',null)
Insert Into self Values(2,'한국남','부장',3000,'2-12-1992','남자',1)
Insert Into self Values(3,'이순신','과장',3500,'3-13-1993','남자', 2)

Alter table self NOCHECK Constraint self_samgr_fk

☞ 위 문장을 실행하지 않고 바로 실행 할 경우 에러 발생

이유는 다음 17번에서 연결되어 있는 문서가 없기 때문이다.

Insert Into self Values(4,'이미라','대리',2503,'3-16-1996','여자', 17)
Insert Into self Values(5,'윤희경','사원',1200,'3-19-1999','여자', 3)
Insert Into self Values(6,'공부만','과장',4003,'4-15-1993','남자', 17)
Insert Into self Values(7,'놀기만','과장',2300,'4-20-1993','여자', 2)
Insert Into self Values(8,'채송화','대리',1703,'4-30-1996','여자', 17)
Insert Into self Values(9,'무궁화','사원',1100,'5-1-1999','여자', 12)
Insert Into self Values(10,'공부해','사원',1303,'5-3-1998','남자', 4)
Insert Into self Values(11,'배은주','과장',1600,'5-8-1994','여자', 2)
Insert Into self Values(12,'류명한','대리',1800,'5-20-1997','남자', 20)
Insert Into self Values(13,'무궁화','부장',3000,'6-1-1992','여자', 1)
Insert Into self Values(14,'채시라','사원',3400,'3-20-1999','여자', 3)
Insert Into self Values(15,'최진실','사원',2000,'2-28-1999','여자', 12)
Insert Into self Values(16,'김유신','사원',400,'4-1-1998','남자', 4)
Insert Into self Values(17,'이성계','부장',2803,'11-9-1993','남자', 1)
Insert Into self Values(18,'강감찬','사원',1003,'2-9-1998','남자', 4)
Insert Into self Values(19,'임꺽정','사원',2200,'5-3-1999','남자', 7)
Insert Into self Values(20,'윤태운','과장',4500,'7-8-1994','남자', 13)

Alter table self CHECKConstraint self_samgr_fk

☞ 체크 표시를 다시 하여 문서 간에 연결을 다시 함

1> 어느 사원의 관리자는 누구인가?
SANAME SAMGR SANAME
---------- --------- ---------- ------------------
한국남 1 윤위현
이순신 2 한국남
이미라 17 이성계

select saname, samgr, saname from self --안된다

Select A.Saname, A.Samgr, B.Saname
From self A, self B
Where A.Samgr=B.Sabun

☞ Select A.Saname,B.Saname 이란 가상의 테이블을 만드는 것이다.


예2) 회장이 관리하는 사람을 출력
SANAME SAJOB SANAME
---------------- --------- ---------- -----------
한국남 부장 윤위현
무궁화 부장 윤위현
이성계 부장 윤위현

SELECT A.SANAME, A.SAJOB, B.SANAME
FROM self A, self B
WHERE A.SAMGR = B.SABUN AND B.SABUN=1

☞ 회장이 1이으모 (고유성 때문)


예3) 사원의 목록을 전부 출력하고, 그 사원의 관리자를 SELF JOIN하여 출력하여라.
SANAME SAJOB SANAME SAJOB
---------- ---------- ---------- -------------------------------
윤위현 회장
한국남 부장 윤위현 회장
이순신 과장 한국남 부장
이미라 대리 이성계 부장
윤희경 사원 이순신 과장
공부만 과장 이성계 부장
놀기만 과장 한국남 부장

SELECT A.SANAME, A.SAJOB, B.SANAME, B.SAJOB
FROM self A , self B
WHERE A.SAMGR*=B.SABUN

4) 6번 공부만 보다 급여를 많이 받는 사람의 목록을 SELF JOIN하여 출력하여라.
SANAME SAPAY SANAME SAPAY
---------- --------- ---------- ---------------- -------------
공부만 4003 윤위현 5000
공부만 4003 윤태운 4500

SELECT A.SANAME, A.SAPAY, B.SANAME, B.SAPAY
FROM self A, self B
WHERE A.SANAME='공부만' AND A.SAPAY<B.SAPAY

================================================================================


● 산술함수
abs(n), acos, asin, cos, sin, tan, exp()지수값을 구하는 정수 , log(), pi()

ceiling(n):n보다 큰 정수값,
ceiling(10.3)=11, ceiling(-10.3)=-10, 즉 오른쪽값

floor:n보다 작은 정수값
floor(10.3)=10, floor(-10.3)=-11, 즉 왼쪽값

degrees(n):라디안 값(호도)을 각도로 계산
log10():상용 로그 값
power(n,m):n의 m승
radians():호도를 라디안으로
sign():양수 음수 0을 표시
sqrt():루트
round(n,p):round(10.7568,2)는 10.76

☞ round(n,p) :p 값이 양수 이면 소수점 오른쪽 p째 자리 까지
음수 이면 수수점 왼쪽으로 p 째 자리 까지 계산

실습>
select ceiling(10.5)/* 11 */
select floor(-10.5)/* -11*/
select degrees(pi()/6)/* 29.999999*/
select log10(100)/* 2.0*/
select power(2,5)/* 32*/
select sqrt(2)/* 1.4142135623731*/

select ceiling(10.5), floor(-10.5), degrees(pi()/6), log10(100), power(2,5), sqrt(2)

Oracle은
select saname, sabun, power(sabun,3), sapay, round(sapay,-3), trunc(sapay,-3) from sawon;
select distinct abs(-5), sin(30*3.141592/180), sqrt(2), log(10,1000) from sawon;

저작자 표시 비영리 변경 금지
신고
0 Comments
댓글쓰기 폼