본문 바로가기
SQL

SQL. 기본키 / 외래키 / join / default / check / 오라클 db 불러오기

by yunzzang-c 2024. 6. 27.
반응형

CREATE TABLE 제품(
    제품ID NUMBER PRIMARY KEY, -- PK : 기본키 FK: 외래키
    제품명 VARCHAR2(50) NOT NULL
    );

CREATE TABLE 제품상세 (
    상세ID NUMBER PRIMARY KEY,
    제품ID NUMBER, -- 제품의 외래키 제품 ID와 묶여있음
    설명 VARCHAR(100) NOT NULL,

    -- 외래키 지정문
    -- CONSTRAINT [제약조건 명] FOREIGN KEY([컬럼명]) REFERENCES [참고할 테이블 이름]([참조할 컬럼])
    -- [ON DELETE CASCADE | ON DELETE SET NULL]
    -- ON DELETE CASCADE:
    -- 부모 테이블의 데이터가 삭제되면, 연결된 자식 테이블의 데이터도 함께 삭제
    -- ON DELETE SET NULL:
    -- 부모 테이블의 데이터가 삭제되면, 연결된 자식 테이블의 외래키 열이 NULL 값으로 설정됩니다.
    CONSTRAINT FK_제품상세_제품ID FOREIGN KEY (제품ID) REFERENCES 제품(제품ID)
    );


INSERT INTO 제품 VALUES(1,'제품A');
INSERT INTO 제품 VALUES(2,'제품B');
INSERT INTO 제품 VALUES(3,'제품C');
INSERT INTO 제품상세 VALUES(1,1,'제품A 상제정보');
INSERT INTO 제품상세 VALUES(2,1,'제품B 상제정보');
INSERT INTO 제품상세 VALUES(3,1,'제품C 상제정보');

DELETE FROM 제품상세
WHERE 상세ID = 4;

INSERT INTO 제품상세 VALUES(4,4,'제품D 상세정보');

SELECT P.제품명, D.설명
FROM 제품 P
JOIN 제품상세 D ON P.제품ID = D.제품ID
ORDER BY D.상세ID;

SELECT*FROM 제품상세;
DELETE FROM 제품상세 WHERE 상세ID = 3;
DELETE FROM 제품 WHERE 제품ID = 1;

-- DEFAULT : 디폴드 값 주기
-- CHECK : 검사

CREATE TABLE 회원(
    회원ID NUMBER PRIMARY KEY,
    아이디 VARCHAR2(50) NOT NULL UNIQUE,
    성별 CHAR(1) NOT NULL CHECK (성별 IN ('M', 'F')),
    이용료 NUMBER DEFAULT 10000
    );
    
SELECT * FROM 회원;

INSERT INTO 회원
VALUES(1, 'USER1', 'M', 12000);
INSERT INTO 회원
VALUES(2, 'USER2', 'F', 15000);
INSERT INTO 회원
VALUES(3, 'USER3', 'M', 10000);

-- DEFAULT : 10000값 자동기입
INSERT INTO 회원 (회원ID, 아이디, 성별)
VALUES(5, 'USER5', 'M');

-- DEFAULT 값 간편하게 사용하기
INSERT INTO 회원
VALUES(6, 'USER6', 'F', DEFAULT);

오라클 db 비주얼 스튜디오 / 파이썬으로 불러오기

방법.1

import oracledb

# 데이터 베이스 연결
oracledb.init_oracle_client() #파이썬 버전
username = 'hr'  #오라클 사용자 이름
password = '1234' #오라클 비밀번호
dsn = 'localhost:1521/xe' #데이터베이스 연결문자열 (예:호스트이룸:포트/서비스이름')

conn = oracledb.connect (user = username, password = password, dsn = dsn)


#커서 생성
cur = conn.cursor()

#SQL 쿼리실행
cur.execute('SELECT MEM_ID,MEM_NAME,ADDR,DEBUT_DATE FROM MEMBERS')

#결과 출력
print('----------------멤버ID 멤버이름 주소 데뷔년도---')
print('-'*100)

while True:
   row = cur.fetchone()     #쿼리 결과에서 한 행을 가져옴
   if row is None: #더 이상 가져올 행이 없으면 루프 종료
     break
   print(f'{row[0]:<5} {row[1]:<15} {row[2]:<20} {row[3].strftime('%Y-%m-%d'):<10}')

cur.close()
conn.close()

방법.2

import oracledb

# 데이터 베이스 연결
oracledb.init_oracle_client() #파이썬 버전
username = 'hr'  #오라클 사용자 이름
password = '1234' #오라클 비밀번호
dsn = 'localhost:1521/xe' #데이터베이스 연결문자열 (예:호스트이룸:포트/서비스이름')

conn = oracledb.connect (user = username, password = password, dsn = dsn)


#커서 생성
cur = conn.cursor()

#SQL 쿼리실행
cur.execute('SELECT MEM_ID,MEM_NAME,ADDR,DEBUT_DATE FROM MEMBERS')

#결과 출력
print('멤버ID 멤버이름 주소 데뷔년도')
print('-'*100)

for row in cur:
    print(f'{row[0]:<5} {row[1]:<15} {row[2]:<20} {row[3].strftime('%Y-%m-%d'):<10}')

cur.close()
conn.close()

방법.3

import oracledb

# 데이터 베이스 연결
oracledb.init_oracle_client() #파이썬 버전
username = 'hr'  #오라클 사용자 이름
password = '1234' #오라클 비밀번호
dsn = 'localhost:1521/xe' #데이터베이스 연결문자열 (예:호스트이룸:포트/서비스이름')

conn = oracledb.connect (user = username, password = password, dsn = dsn)


#커서 생성
cur = conn.cursor()

#SQL 쿼리실행
cur.execute('SELECT MEM_ID,MEM_NAME,ADDR,DEBUT_DATE FROM MEMBERS')

#결과 출력
print('----------------멤버ID 멤버이름 주소 데뷔년도---')
print('-'*100)

while True:
   row = cur.fetchone()     #쿼리 결과에서 한 행을 가져옴
   if row is None: #더 이상 가져올 행이 없으면 루프 종료
     break
   data1 = row[0]
   data2 = row[1]
   data3 = row[2]
   data4 = row[3].strftime('%Y-%m-%d')  

   print('%5s %15s %20s %s' % (data1, data2, data3, data4))

cur.close()
conn.close()


반응형