본문 바로가기
DB/MySQL

데이터베이스 CRUD

by code2772 2022. 10. 13.

[ 목차 ]

    728x90
    반응형
    use aidev;
    
    # 데이터 수정
    # update 테이블명 Set 필드명1 = 값1, 필드명2 = 값2....  
    -- 전체 값이 변경되는 문제가 발생
    # update 테이블명 Set 필드명1 = 값1, 필드명2 = 값2.... where 조건절 
    -- 해당 원하는 부분만 변경하기 위해 where을 사용
     # To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect. 0.000 sec
     # 메뉴 -> edit -> preference -> SQL Editor -> safe updates 테츠 없앰
     select * from tb_member;
     
     update tb_member set mem_zipcode ='12345';
     update tb_member set mem_hobby='코딩' where mem_userid = 'banana'; 
     update tb_member set mem_hobby='코딩' where mem_idx = 5; 
     -- 많은 데이터에서 하나를 찾을 때 오래 걸릴 수 있다. 그렇기 떄문에 primary key를 이용하면 속도상 유리할 수 있다.
     
     # 이메론의 주소가 서울특별시 서초구 양재동. 데이터를 변경해보자.(던'서울특별시'를 address1,'서초구'를 address2, '양재동'을 address3에 저장) 
     update tb_member set mem_address1 = '서울특별시', mem_address2 = '서초구',mem_address3 = '양재동' where mem_idx = 7;
     
     # mem_point 컬럼을 추가(단, 타입은 int, 기본값은 0)
     alter table tb_member add mem_point int default 0;
     
     # 모든 회원에게 200p 선물하기
     update tb_member set mem_point = mem_point + 200; 
     
     /*
       SQL 연산자
    1. 산술 연산자
       +, -, *, /, div(나누기를 한 후 소수부분을 버림), mod(나머지 연산)
    2. 대입 연산자
       =
    3. 비교 연산자
       =, <, >, >=, <=, <>(다르다)
        is(왼쪽 피연산자와 오른쪽 피연산자가 같으면 참, 다르면 거짓) 예) mem_address1 is null
        between A and B (값이 A보다는 크거나 같고 B보다 작거나 같으면 참) 예) mem_point between 100 and 200
        in (연산자의 값이 매개변수로 전달받은 리스트에 존재하면 참을 반환) 예) mem_hobby in ('잠자기', '코딩', '게임')
       like (패턴으로 문자열을 검색) 예) mem_userid like 'a%' 
    4. 논리 연산자 
       and, or, not, xor
     */
     
     # 데이터 삭제
     # delete from 테이블명;
     # delete from 테이블명 where 조건절;
     
     delete from tb_member; -- 전체 테이블 삭제
     delete from tb_member where mem_point = 300;
     delete from tb_member where mem_idx = 8;
     
      select * from tb_member;
      
      # 데이터 검색
      # select 필드1, 필드2... from 테이블명 
      select 100 ;
      select 100 +50;
      
      # 별명
      select 100+50 as 'sum';-- ' ' 싱글쿼트를 사용하는 이유는 띄어쓰기 때문
      select 100+50 as sum;
      select 100 +50 sum;
      
      select null; # 해당 셀에 insert가 되지 않은 것을 의미
      select ''; # 해당 셀에 ' '  데이터가 삽입된 것을 의미
      
     select 100 + null; -- null은 연산할 수 없음 결과는 null이 나오게 된다.
     
     select * from tb_member; -- * : 모든 컬럼, * 사용시 프로그램 속도가 저하 가능성 多
     select mem_userid, mem_name, mem_hp, mem_email, mem_regdate, mem_point from tb_member; 
     select mem_userid,mem_point, mem_name, mem_hp, mem_email, mem_regdate from tb_member; 
     -- 컬럼명이 아무리 많다고 하더라도 *를 사용하는 것 보다는 일일히 전부 다치는것이 속도면에서 좋다.
     -- 테이블 구현 순서는 불러올 때 순서를 조정하면 됨으로 만들 때 신경을 쓸 필요가 없다.
     
     
     # select 필드1, 필드2... from 테이블명  where 조건절
     select mem_userid,mem_name,mem_hp,mem_email from tb_member where mem_userid = 'apple';
     # 로그인 쿼리 
     select mem_userid,mem_name from tb_member where mem_userid = 'apple' and mem_userpw = '1111';
     select mem_userid,mem_name , mem_point from tb_member where mem_point = 300 or mem_point =  400 or mem_point = 500;
     select mem_userid,mem_name , mem_point from tb_member where mem_point in (300, 400, 500);
     
     # between 연산자
    select mem_userid,mem_name , mem_point from tb_member where mem_point between 300 and 500;
    select mem_userid,mem_name , mem_point from tb_member where mem_point >= 300 and mem_point <=500;
     
     # null 사용
     select mem_userid, mem_name, mem_hobby from tb_member where mem_hobby is null; -- null을 찾을 때
     select mem_userid, mem_name, mem_hobby from tb_member where mem_hobby is  not null; -- null을 찾지 않을 때
     # like 연산자
     select mem_userid, mem_name from tb_member where mem_userid like 'a%';
     select mem_userid, mem_name from tb_member where mem_userid like '%a';
     select mem_userid, mem_name from tb_member where mem_userid like '%a%';-- a가 어디에든지 들어가는
     select mem_userid, mem_name from tb_member where mem_userid like 'app__'; -- app로 시작하고 5글자인 데이터 검색
     
     # select 필드1, 필드2... from 테이블명  where 조건절 order by 필드 [asc(오름차순), desc(내림차순)]
     select mem_userid,mem_name , mem_point from tb_member order by mem_point asc; -- 오름차순
     select mem_userid,mem_name , mem_point from tb_member order by mem_point; -- 오름차순 asc는 생략이 가능하다.
     select mem_userid,mem_name , mem_point from tb_member order by mem_point desc; -- 내림차순
     # 포인트순으로 내림차순으로 데이터 조회(단, 같은 포인트인 경우 최근 가입순으로 정렬)
     select mem_userid,mem_name , mem_point, mem_regdate from tb_member order by mem_point desc, mem_regdate desc;
     
     # 성별 필드 추가
     alter table tb_member add mem_gender enum('남자','여자'); -- 남자, 여자만 업데이트 할 수 있다. 
     update tb_member set mem_gender ='남' where mem_userid = 'orange'; -- (X)
     
     update tb_member set mem_gender ='남자' where mem_userid = 'orange';
     
     select * from tb_member;
     
    # 성별이 여자인 회원을 point가 많은순으로 정렬(단, 포인트가 같을 경우 먼저 가입한 순으로 정렬하자)
     select mem-idx, mem_userid, mem_name, mem_point, mem_gender, mem_regdate 
     from tb_member 
     where mem_gender = '여자' 
     order by mem_point desc, mem_regdate;
     
     # select 필드1, 필드2... from 테이블명 limit 가져올 행의 갯수
     select mem_userid, mem_name , mem_hp,mem_email from tb_member limit 3;
     select mem_userid, mem_name , mem_hp,mem_email from tb_member limit 3, 2; # 4번째 행부터 2개를 가여옴
     
     # 집계함수
     # count : 행의 갯수를 세는 함수
     -- 회원 숫자와 같은 수를 확인하기 위해거는 절대 null값이 나올 수 없는것을 기준으로 한다.
     select count(mem_idx) from tb_member;
     select count(mem_hobby) from tb_member;
     select count(mem_point) from tb_member; -- null을 제외하고 갯수를 셈
     select count(mem_idx) user from tb_member where mem_userid = 'apple' and mem_userpw = '1111';
     -- 결과값이 1이면 로그인, 왜냐하면 아이디, 비밀번호 가 같은것은 하나만 있기 때문이다.
     
     # distinct : 뒤에 나오는 필드에 대하여 같은 값을 가진 중복된 행을 제외
     select distict mem_gender from tb_member;
     select distict mem_userid,mem_gender from tb_member;
     insert into tb_member (mem_userid,mem_userpw,mem_name,mem_hp,mem_email,mem_ssn1,mem_ssn2,mem_gender)
     value ('cherry','1111','김사과','010-1111-1111','apple@apple.com','001011','4068518','여자');
      select distict mem_userpw,mem_gender from tb_member; -- 2개의 필드 값이 모두 일치하므로 중복으로 판정
     
     
     select distinct count(mem_gender) from tb_member; -- 6
     select count(distinct mem_gender) from tb_member; -- 2
     
     # sum : 행의 값을 더함
     select mem_userid, sum(mem_point) total from tb_member; -- X / 관련 집계함수만 사용하여야 한다.
     select sum(mem_point) total from tb_member;
     
     # avg: 행의 값의 편균울 구함
     select avg(mem_point) avg from tb_member;
     
     # min max : 행의 최대값 또는 최소값을  
      select min(mem_point) min from tb_member;
      select max(mem_point) max from tb_member;
     
     # select 그룹을 맺은 컬럼 또는 집계함수 from 테이블명 [where 조건절] group by 필드 haviong 조전절 order by 필드 [asc, desc]
     select mem_gender from tb_member group by mem_gender;
     select mem_gender, count(mem_idx) cnt from tb_member group by mem_gender;
     select mem_gender, sum(mem_point) cnt from tb_member group by mem_gender;
     -- where은 모든 행의 조건이다. having은 그룹에관한 조건이다.
     select * from tb_member;
      select mem_gender, count(mem_point) cnt from tb_member  where mem_point >0 group by mem_gender;
      select mem_gender, count(mem_point) cnt from tb_member  where mem_point >0 group by mem_gender having mem_gender = '남자';
     
     # 포인트가 0이 아닌 회원의 집합에서 남자 여자로 그룹을 나눠 포인트의 평균을 구하고 포인트가 300 이상인 성별을 검색하여 포인트로 내림차순 정렬
     select mem_gender, avg(mem_point) avg 
     from tb_member 
     where mem_point > 0 
     group by mem_gender 
     having avg > 300 
     order by avg desc; 
     
    # 프로필 테이블 생성
    create table tb_profile(
       pro_idx int not null,
        pro_age int,
        pro_height double,
        pro_weight double,
        pro_blood varchar(5),
        pro_mbti varchar(10),
        foreign key(pro_idx) references tb_member(mem_idx)
    );
    select * from tb_profile;
    select * from tb_member;
    insert into tb_profile values (2,30,170,70,'B','INTP'); -- foreign key 제약조건 위배/ 주키에 없어서 
    insert into tb_profile values (1,20,160,50,'A','INTP'); 
    insert into tb_profile values (4,25,160,50,'B','INTP'); 
    insert into tb_profile values (5,30,160,50,'C','INTP'); 
    insert into tb_profile values (6,28,160,50,'D','INTP'); 
    
    # 조인
    /* select 필드1, 필드2 .. 
       from 테이블1[inner, leftm right] join 테이블2 on 테이블1.필드 = 테이블2.필드; 
     */
     # left
     select mem_userid,mem_name,mem_hp,pro_age,pro_blood,pro_mbti 
     from tb_member left join tb_profile on tb_member.mem_idx = tb_profile.pro_idx;
     
     # inner
      select mem_userid,mem_name,mem_hp,pro_age,pro_blood,pro_mbti 
     from tb_member inner join tb_profile on tb_member.mem_idx = tb_profile.pro_idx;
     
     # right - inner와 동일하게 나온다 왜냐하면 오른쪽에 있는 테이블은 foreign으로 교집합에 포함되기 때문이다.
      select mem_userid,mem_name,mem_hp,pro_age,pro_blood,pro_mbti 
     from tb_member right join tb_profile on tb_member.mem_idx = tb_profile.pro_idx;
     
     # 테이블 필드명 동일한 경우 
     select A.mem_userid,A.mem_name,A.mem_hp,B.pro_age,B.pro_blood,B.pro_mbti 
     from tb_member A right join tb_profile B on A.mem_idx = B.pro_idx;
     
    create table tb_order(
       or_idx int,
        or_num varchar(8) not null,
        or_zipcode varchar(5),
        or_address1 varchar(100),
        or_address2 varchar(100),
        or_address3 varchar(100)
    ); 
     insert into tb_order values(null,'00000001','12345','서울','서초구','양재동');
     insert into tb_order values(1,'00000002','12345','서울','서초구','양재동');
     insert into tb_order values(4,'00000003','12345','서울','서초구','양재동');
     insert into tb_order values(5,'00000004','12345','서울','서초구','양재동');
     insert into tb_order values(null,'00000005','12345','서울','서초구','양재동');
     insert into tb_order values(1,'00000006','12345','서울','서초구','양재동');
     
     select * from tb_order;
     
     
     select mem_userid,mem_name,mem_hp,or_num,or_zipcode
     from tb_member inner join tb_order 
     on tb_member.mem_idx = tb_order.or_idx;
     
     select mem_userid,mem_name,mem_hp,or_num,or_zipcode
     from tb_member left join tb_order 
     on tb_member.mem_idx = tb_order.or_idx;
     
     select mem_userid,mem_name,mem_hp,or_num,or_zipcode
     from tb_member right join tb_order 
     on tb_member.mem_idx = tb_order.or_idx;
     
     # 뷰(view)
     # 가상의 테이블을 생성
     # 실제 테이블 처럼 행과 열을 가지고 있지만, 데이터를 저장하고 있지는 않음
     # SQL 코드를 간결하게 만들기 위함, 보안상 내부 데이터를 전체 공개하고 싶지 않을 때
     # 삽입, 삭제, 수정 작업에 제한 사항을 가짐
     # 자신만의 인덱스를 가질 수 없음
     # 한 번 정의된 뷰는 변경할 수 없음
     
     /*
       create view 뷰이름 
        as
        select 쿼리...
     */
     select * from tb_member;
     create view vw_member_simple
     as 
     select mem_idx, mem_userid, mem_userpw, mem_name, mem_hp
     from tb_member;
     
     select * from vw_member_simple;
     
     create view vw_member_inner_profile as 
      select mem_userid,mem_name,mem_hp,pro_age,pro_blood,pro_mbti 
     from tb_member left join tb_profile on tb_member.mem_idx = tb_profile.pro_idx;
     
     select * from vw_member_inner_profile;
     
     /*
       뷰 대체
        create or replace view 뷰이름
        as
        select 쿼리...
        
        뷰 삭제
        drop view 뷰이름
     */
     
     drop view vw_member_inner_profile;
     
     create view vw_member_left_profile as 
      select mem_userid,mem_name,mem_hp,pro_age,pro_blood,pro_mbti 
     from tb_member left join tb_profile on tb_member.mem_idx = tb_profile.pro_idx;
     
      select * from vw_member_left_profile;
     
     
     
     
     
     
     
     
    반응형

    'DB > MySQL' 카테고리의 다른 글

    MySQL 계정관리  (0) 2022.10.17
    데이터베이스 테이블  (0) 2022.10.12
    데이터베이스 기본  (0) 2022.10.12