DB/MySQL

데이터베이스 CRUD

code2772 2022. 10. 13. 15:46
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