ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 231013_DB 설계와 SQL 활용
    Coding Class 2023. 10. 13. 17:27

    오전에는 설명 위주로, 오후에는 오전 설명을 바탕으로 한 실습 위주로 진행 예정 

    오늘은 DML를 배움, 데이터 인서트(넣기) 변경, 업데이트, 데이터 키우기, 딜리트 하기, 셀렉스트 하기. IUDS,,,,  

     

    테이블과 테이블 간 관계가 갖게 됨

    1:1 관계, 1:N관계, N:M 관계...

    관계에 따라 테이블 스키마를 할 때 중요한 컬럼이 있어야 함.

    테이블을 만들때 primary key... 테이블을 만들 때 항상 컬럼 중 기본 키가 무조건 들어가야 함. 

    내가 만든 컬럼 중 데이터가 중복되지 않은 데이터가 들어갈 수 있는 컬럼이 있으면 그걸 기본 키로 설정.

    가령 학번, 주민번호 등...

    마땅한게 없거나 주민번호 같은 숫자체계로 되어있으면 기본 키로 잡기에 별로 좋지 않음. 

     

    포린은 외부를 뜻함

    프리마린 키라는건 다른 애를 찾을 떄 쓰는 것

    외래 키는 관계에 따라 만드는 규칙이 있음...

     

    1:1일 떈 어디에 넣어도 상과나 없음

    그러나 1:N의 관계를 가진다면 아무데나 없으면 안되고 N에 넣어줘야 함... 

    1 쪽에 넣을 수 있지만 데이터를 넣다 보면 중복될 수  밖에 없음.

     

    n:M 관계가 특이함.

    가령 한명의 교수가 여러 학생을 지도할 수 있고, 한명으 ㅣ학생이여러 지도교수를 가질 수 있음.

    이런 룰이 있다면 새로운 테이블을 하나 만들어서 학생과 교수의 각각 외래키를 가짐. 

    기본키는 두개의 외래 키를 하나로 묶어서 만들어야 함. 이러면 중복이 없음.

     

    1:N인지 N:M인지는 데이터를 만들어 달라고 한 사람의 요구 사항에따라 결정.

    foreign key(p_id) reference 를 먼저 실행하면..

    실행의 순서가 우선이기 때문에 에러가 뜸...

    저럴 경우 테이블의 순서를 바꿔주는것이 바람직...

    create table professor 먼저 실행한 뒤 create table student 를 실행하면 실행 순서에 따라 professor 테이블을 먼저 읽었으므로 문제없이 foreign key(`p_id`) reference `professor`(`id`)가 실행될 수 잇음. 

    데이터는 집합의 개념을 가짐. 

    정렬해서 넣어도 딱히 데이터 안에서 의미는 없음. 그냥 데이터의 종류가 중요.

    외래키는 있는 값을 넣어야 함.

    없는 값을 넣을수는 없음... 아마 에러가 뜰듯?

    참조되고 있는 데이터를 먼저 지울수는 없음.

    데이터의 삭제는 늘 참조하는 곳을 지운 뒤 참조되고 있는데이터를 삭제하는게 바람직.

    그냥 업데이트를 이렇게 쓰면 모든 이름이 바뀜

    Where 로 조건을 줌,,, 아이디가 12인 애 이름만 kim으로 바꿔줘... 하면 12아이디만 바뀜

    실행 전

    실행 후

    이것도 그냥 쓰면 다 지워짐
    park 이라는 이름의 사람만 지우게끔 조건 설정

     

    만약 park 이라는 이름이 두명일떈 추가 조건
    워크벤치에서 지워지지 않도록 설정을 해놔서 안 지워지는걸로 추정

    이름으로 지우니까 오류가 떠서 아이디로 지움...

     

     

    데이터를 지울 땐 참조를 하는 쪽을 지울 수 있도록 함.
    검색할 때 id를 추가로 지정해서 검색할 수 있다...

     

    외래키는 한 테이블에 여러개 있을 수 있고 기본키는 무조건 한개

    대신 여러개의 컬럼을 묶어서 만들 수 있고, 외래키도 여러개 묶어서 만들 수 있음

    외래키를 만들 떄 다른 테이블에서 기본키를 지정하는게 일반적

    그런데 반드시 기본키일 필요는 없음

    유니크한 값을 가지는 키는 기본키로 지정할 수 있음

     

    위와 같이 이름을 기본키로 쓸 경우 Unique 유니크 속성값을 주면 됨

    단 이렇게 쓸 경우 이름에는 중복값을 넣을수가 없음

    이렇게 쓰면 다른 곳에서 외래키로 쓰기 가능

     

     

    새롭게 만드는건 아래와 같이

     

    기존에 만들어놨던 테이블에 프라이머 키를 넣으려고 했는데 되지 않았다

    알고 보니 이미 만들어진 테이블에 자동으로 집어넣어지는게 아니었다

    (1) 만들었던 테이블을 지우고 (2) 프라이머 키를 포함해서 테이블을 만든 뒤 (3) 데이터를 집어 넣어야 하는 단계로 진행해야 했던 것 같다

    3번. 데이터 집어넣기

    해보려고 햇는데 잘 안된다

    select * from student;
    select id, age from student;
    
    insert into student(id, name, age) values(12,'kim',25);
    insert into student(id, name, age) values(13,'lee',15);
    insert into student(id, name, age) values(14,'joo',43);
    insert into student values(15,'lee',64);
    insert into student(name, id, age) values('go',16, 82);
    update student set name = "kim" where id = 14;
    delete from student where id = 15;
    delete from student where name = 'kim' and id = 14;
    insert into student(id, name, age) values(1,'jang',31);
    insert into student(id, name, age) values(2,'hong',54);
    insert into student(id, name, age) values(3,'Lee',25);
    update student set name = "Lee" where id = 13;
    delete from student where id = 16;
    
    use customer_list;
    select * from confirmation_of_deposit;
    insert into confirmation_of_deposit (ustomer_name,tell,email,deposit_type,card_number,price,product_number) values ('kim', 01011112222, 'qwer@gmail', 'card', 589, 59.6, '01');
    insert into confirmation_of_deposit (ustomer_name,tell,email,deposit_type,card_number,price,product_number) values ('park', 01012123434, 'asdf@gmail', 'card', 596, 100, '02');
    insert into confirmation_of_deposit (ustomer_name,tell,email,deposit_type,card_number,price,product_number) values ('hong', 01012452356, 'zxcv@gmail', 'card', 785, 86.4, '03');
    insert into confirmation_of_deposit (ustomer_name,tell,email,deposit_type,card_number,price,product_number) values ('joung', 01078986545, 'wert@gmail', 'card', 196, 76, '04');
    insert into confirmation_of_deposit (ustomer_name,tell,email,deposit_type,card_number,price,product_number) values ('Lee', 01032651298, 'sdfg@gmail', 'card', 346, 185, '05');
    insert into confirmation_of_deposit (ustomer_name,tell,email,deposit_type,card_number,price,product_number) values ('Park', 01065389561, 'xcvb@gmail', 'card', 528, 96, '06');
    insert into confirmation_of_deposit (ustomer_name,tell,email,deposit_type,card_number,price,product_number) values ('Joo', 01048956231, 'erty@gmail', 'card', 692, 21, '07');
    insert into confirmation_of_deposit (ustomer_name,tell,email,deposit_type,card_number,price,product_number) values ('Moon', 01085693652, 'dfgh@gmail', 'card', 348, 34, '08');
    insert into confirmation_of_deposit (ustomer_name,tell,email,deposit_type,card_number,price,product_number) values ('Gang', 01047852365, 'cvbn@gmail', 'card', 627, 65.4, '09');
    insert into confirmation_of_deposit (ustomer_name,tell,email,deposit_type,card_number,price,product_number) values ('kim', 01075361598, 'rtyu@gmail', 'card', 618, 84.7, '10');
    
    select * from questions;
    insert into questions (ustomer_name,tell,Inquiry_code,email,date_of_inquiry) values ('kim',01011112222,01,'qwer@gmail','2023-05-12');
    insert into questions (ustomer_name,tell,Inquiry_code,email,date_of_inquiry) values ('park',01012123434,02,'asdf@gmail','2023-01-27');
    insert into questions (ustomer_name,tell,Inquiry_code,email,date_of_inquiry) values ('hong', 01012452356,03,'zxcv@gmail','2022-08-13');
    
    select * from product_reservation;
    insert into product_reservation (ustomer_name,Product_number,confirmation_of_deposit,Address,tell)values('kim',01,,'Asdfa','01011112222');
    insert into product_reservation (ustomer_name,Product_number,confirmation_of_deposit,Address,tell)values(,,,,);
    insert into product_reservation (ustomer_name,Product_number,confirmation_of_deposit,Address,tell)values(,,,,);
    
    select * from 
    
    drop table customer_information;
    create table customer_information
    (
    	seq int AUTO_INCREMENT,
        customer_name varchar(20),
        tell varchar(20),
        email varchar(20),
        deposit_type varchar(40),
        card_number varchar(50),
        price int,
        product_number varchar(50),
        primary key(`seq`)
    );
    
    drop table product_name;
    create table product_name
    (
    	seq int AUTO_INCREMENT,
    	top_number varchar(30),
    	bottom_number varchar(30),
    	Accessory_number varchar(30),
    	shoe_number varchar(30),
        primary key(`seq`)
    );
    	
    drop table confirmation_of_deposit;
    create table confirmation_of_deposit
    (
    	customer int,
        product_name int,
        primary key(`customer`,`product_name`),
        foreign key(`customer`) references `customer_information`(`seq`),
        foreign key(`product_name`) references `customer_information`(`seq`)
        
    );

    장렬하게 망한 흔적.

    집에가서 마저 해봐야겠다...
    5개의 테이블을 만들고, 테이블의 우선순위를 따져서 생성+프라이머 키를 설정해서 N:M이 되는 테이블을 새롭게 생성,,, 복잡한듯 안 복잡한듯 복잡하당 

    'Coding Class' 카테고리의 다른 글

    231012_Java  (0) 2023.10.17
    231016_HTML과 CSS  (0) 2023.10.16
    231012_Java  (0) 2023.10.13
    231012_JAVA  (0) 2023.10.12
    231010_Java  (0) 2023.10.10
Designed by Tistory.