본문 바로가기
수업노트

23.2.23 (목)

by MIniLabo 2023. 2. 23.

 [where 조건절]
   -조건을 만족하는 행들에 대해서
   -조건에 만족하는 레코드만 대상으로 조회(select), 수정(update), 삭제(delete)하기 위해서
   
   
   [between A and B] 연산자 - A부터 B까지
   --국어점수 80~89점 사이 행 조회
   
   alter table sungjuk rename column korea to kor;--어제 변경한 칼럼명 다시 kor로 변경
   
   
   select uname, kor
   from sungjuk
   where kor between 80 and 89;
   
   
   
   [in 연산자] - 목록에서 찾기
   --이름이 '무궁화', '봉선화'를 조회
   select uname
   from sungjuk
   where uname in ('무궁화','봉선화');
   
   
   select uname, kor
   from sungjuk
   where kor in (10, 20, 30);
   
   
   
   [LIKE 연산자] - 목록에서 찾기
   - 문자열 데이터에서 비슷한 유형 찾기
   - % 글자 개수와 무관
   - _ 글자 개수가 일치되어야 
   
   select uname
   from sungjuk
   where uname = '대한민국';
   
--문1) '홍'으로 시작하는 이름 조회

select uname
from sungjuk
where uname like '홍%'; --홍으로 시작하는 모든 문자
   


--문2) '화'로 끝나는 이름 조회  

select uname
from sungjuk
where uname like '%화';

--문3) '나'글자가 있는 이름 조회
select uname
from sungjuk
where uname like '%나%';

   
--문4) 두 글자 이름에서 '화'로 끝나는 것 조회
select uname
from sungjuk
where uname like '_화';--글자수만큼 (언더라인+조회글자)


--문5) 세 글자 이름에서 '나' 있는 행 조회
select uname
from sungjuk
where uname like '_나_';

select count(uname)
from sungjuk
where uname like '_나_';


--문6) 제목+내용을 선택하고 검색어가 '파스타'일때
select uname
from sungjuk
where subject like '%pasta%' or content like '%pasta%'
--제목(subject)이나 내용(content)에 파스타가 들어간 칼럼 찾기 


--문7) 국어 점수가 50점 이상인 행에 대해 총점과 평균 구하기
update sungjuk
set tot = (kor + eng + mat), aver = (kor + eng + mat)/3
where kor >= 50;

rollback

select * from sungjuk;
///////////////////////////////////////////////// 
   
   [NULL] - 비어 있는 값
   --총점의 개수 구하기
   select count(tot) from sungjuk;--null은 카운트되지 않음
   
   --총점에 null이 있는 행 개수 구하기
   
   select count(*) from sungjuk  where tot = null;--null값 확인 못함
   
   select count(*) from sungjuk  where tot is null;--null값 확인 가능
   
   --평균에 비어있지 않은 행의 개수 구하기(null이 아닌 값)
   select count(*) from sungjuk where aver is not null;
   
   
   --문8) 비어있는 총점과 평균을 모두 채우기
 update sungjuk 
 set tot = (kor + eng + mat), aver = (kor + eng + mat)/3
   where tot is null or aver is null; --총점 또는 평균이 비어있는 곳에 한정하여
   
   select * from sungjuk;
   
   commit;
   ///////////////////////////////////////////////////////////////////

 

  
[sort 정렬]
- 특정값(keyfield)을 기준으로 순서대로 재배치
  - 오름차순 Ascending Sort   ASC  생략하면 기본값  1->10  A->Z  a->z  ㄱ->ㅎ
  - 내림차순 Descending Sort  DESC
  - 형식) order by 칼럼명1, 칼럼명2, 칼럼명3, ~~ --중복된 값이 있을 경우 칼럼명을 늘려 정렬가능
  
  
  --sungjuk 테이블 조회
  select * from sungjuk;
  
  --전체 레코드를 이름순으로 정렬해 조회
 select uname  
  from sungjuk
  order by uname asc; --이름기준 오름차순 정렬( asc 생략가능 )
  
  select uname 
  from sungjuk
  order by uname desc;
  
  select uname, kor
  from sungjuk
  order by kor asc;
  
  
  --1차정렬: 국어점수순으로 정렬
  --2차정렬: 국어점수가 같다면 이름을 기준으로 내림차순 정렬
  select uname, kor
  from sungjuk
  order by kor, uname desc;--국어점수 오름차순 정렬 후 국어점수 같을 경우 이름 내림차순 정렬

 --1차(ker), 2차(eng), 3차(mat) 정렬
 select kor, eng, mat
 from sungjuk
order by kor desc, eng desc, mat desc;
  
  
  
  --문제) 평균 7 이하 행 이름순으로 정렬
 
 select uname, aver
  from sungjuk
  where aver <= 70;
  --내가 원하는 정보를 다 만든 다음에,
 
  select uname, aver
  from sungjuk
  where aver <= 70
  order by uname;
  --정렬을 해야 에러 없이 조회 가능
   
   
   select * 
   from sungjuk
   order by uname
   where aver <= 70;--ORA-00933: SQL 명령어가 올바르게 종료되지 않았습니다
   ////////////////////////////////////////////////////////////
   
   [자동으로 일련번호 부여]
   -Oracle Datanase : sequence 생성
   -M*SQL Database  : indentity 제약조건
   
   ///////////////////////////////////
   
   
   --sungjuk테이블 삭제
   drop table sungjuk;
   commit;
   
   
   --sungfuk 테이블 생성
   
  create table sungjuk (
      sno int                 not null
    , uname varchar(50)     not null
    , kor int               not null
    , eng int               not null
    , mat int               not null
    , tot int               
    , aver int              
    , addr varchar(20)
    , wdate date
    ); 
    
    
    --행추가
    insert into sungjuk(sno, uname, kor, eng, mat, addr, wdate)
    values(1, '홍길동', 89, 88, 87, 'Seoul', '2023-02-23');--날짜 데이터는 문자열 형태로 추가
    
    
    select * from sungjuk;
    delete from sungjuk;--전체 행 삭제
    commit;

 

 

    //////////////////////////////
    [시퀀스 Sequence]
    - 일련번호를 자동 생성
    -시퀀스 생성 : create sequence 시퀀스명;
    -시퀀스 삭제 : drop sequence 시퀀스명;
    
--시퀀스 생성 형식)
    create sequence 시퀀스명
    increment by 증가값 start with 시작값;
    
    --sungjuk 테이블에서 사용할 시퀀스 생성 >>한 개의 테이블에서 한 개의 시퀀스만 사용 추천
    create sequence sungjuk_seq;
    
    --시퀀스 삭제
    drop sequence sungjuk_seq;    
    
    ////////////////////////////////
    
    [sysdate 함수] - 시스템의 현재 날짜 정보
    --괄호가 붙지 않는 함수
    
    /////////////////////////////////////////////
    
    --시퀀스와 sysdate 함수를 이용한 행추가 테스트 
     insert into sungjuk(sno, uname, kor, eng, mat, addr, wdate)
    values(sungjuk_seq.nextval, '홍길동', 89, 88, 87, 'Seoul', sysdate);
    
    select * from sungjuk;
    
    //////////////////////////////////////////////////////////
    
    --문제) sno =2 행 삭제
    
    delete  from sungjuk  where sno = 2; 
    
    commit;
    
    select * from sungjuk;

 

 

o 성적테이블 조회 문제

      --sungjuk 테이블 생성
    
    create table sungjuk (
      sno int                 not null
    , uname varchar(50)       not null
    , kor int               not null
    , eng int               not null
    , mat int               not null
    , tot int               
    , aver int              
    , addr varchar(20)
    , wdate date
    ); 
    
    //////////////////////////////////////////////
    [sungjuk 테이블 입력 데이터]
    
    
insert into sungjuk(sno, uname, kor, eng, mat, addr, wdate)
values(sungjuk_seq.nextval,'아이티윌', 90, 85, 95, 'Seoul',sysdate);

insert into sungjuk(sno,uname,kor,eng,mat,addr,wdate)
values(sungjuk_seq.nextval,'무궁화',40,50,20,'Seoul',sysdate);

insert into sungjuk(sno,uname,kor,eng,mat,addr,wdate)
values(sungjuk_seq.nextval,'진달래',90,50,90,'Jeju',sysdate);

insert into sungjuk(sno,uname,kor,eng,mat,addr,wdate)
values(sungjuk_seq.nextval,'개나리',20,50,20,'Jeju',sysdate);

insert into sungjuk(sno,uname,kor,eng,mat,addr,wdate)
values(sungjuk_seq.nextval,'봉선화',90,90,90,'Seoul',sysdate);

insert into sungjuk(sno,uname,kor,eng,mat,addr,wdate)
values(sungjuk_seq.nextval,'나팔꽃',50,50,90,'Suwon',sysdate);

insert into sungjuk(sno,uname,kor,eng,mat,addr,wdate)
values(sungjuk_seq.nextval,'선인장',70,50,20,'Seoul',sysdate);

insert into sungjuk(sno,uname,kor,eng,mat,addr,wdate)
values(sungjuk_seq.nextval,'소나무',90,60,90,'Busan',sysdate);

insert into sungjuk(sno,uname,kor,eng,mat,addr,wdate)
values(sungjuk_seq.nextval,'참나무',20,20,20,'Jeju',sysdate);

insert into sungjuk(sno,uname,kor,eng,mat,addr,wdate)
values(sungjuk_seq.nextval,'홍길동',90,90,90,'Suwon',sysdate);

insert into sungjuk(sno,uname,kor,eng,mat,addr,wdate)
values(sungjuk_seq.nextval,'무궁화',80,80,90,'Suwon',sysdate);
    
    
    commit;
    
    select count(*) from sungjuk; --전체 레코드 개수
    select * from sungjuk;
    
    
-- 문1) 전체행에 대해서 총점(tot), 평균(aver)을 구하시오
    update sungjuk
    set tot = ( kor + eng + mat ), aver = ( kor + eng + mat )/3;


-- 문2) 이름에 '나' 글자가 있는 행을 조회하시오
    select uname,sno
    from sungjuk
    where uname like('%나%');


-- 문3) 주소가 서울, 제주 행을 조회하시오
    select addr,sno
    from sungjuk
    where addr = 'Seoul' or addr = 'Jeju'; --논리연산자 뒤에는 새롭게 시작한다고 보아야
    
    select addr,sno
    from sungjuk
    where addr in ('Seoul', 'Jeju');--소괄호 안의 것 조회 


-- 문4) 국영수 세과목 모두 90점 이상 행이 몇개인지 조회하시오
    select count(*) as cnt --칼럼명 변경(as 생략가능)
    from sungjuk
    where kor >= 90 and  eng >= 90 and  mat >= 90;


-- 문5) 주소별로 정렬해서 조회하시오. 주소가 같다면 일련번호 순으로 다시 정렬해서 조회하시오
    select *
    from sungjuk
    order by addr, sno;
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


   create table sungjuk (
    sno     int primary key --기본키(유일성), 각각의 레코드를 대표하는 유일한 컬럼은 반드시 존재해야, 접근가능성을 위해
   , uname varchar(50) not null
   , kor    int         check(kor between 0 and 100) --국어 점수는 0~100점 사이만 입력가능
    , eng    int         check(eng between 0 and 100) --영어 점수는 0~100점 사이만 입력가능
    , mat    int         check(mat between 0 and 100) --수학 점수는 0~100점 사이만 입력가능
    , addr  varchar(50)  check(addr in ('Seoul', 'Busan', 'Jeju', 'Suwon')) 
    , tot   int         default 0
    , aver int          default 0
    , wdate   date    default sysdate  --인서트 되는 시점의 날짜기 기록되는 함수
    );
   
   ////////////////////////////////////////
   
   select * from sungjuk;
   
   [테이블 제약조건 에러 메시지]
   --primary key 제약조건
   insert into sungjuk(sno, uname) values(1, '홍길동');
   --2번 실행했을 때, ORA-00001: 무결성 제약 조건(SYSTEM.SYS_C007314)에 위배됩니다
   --sno 칼럼은 기본키(pk)이므로 중복값 허용X
   
   
   --not null 조건
   --ORA-01400: NULL을 ("SYSTEM"."SUNGJUK"."UNAME") 안에 삽입할 수 없습니다
   --아래의 것은 uname칼럼에 대한 입력값이 없기 때문에 오류 발생
   insert into sungjuk(sno) values(2);
   
    insert into sungjuk(sno, uname) values(2, '1234567890');
    insert into sungjuk(sno, uname) values(3, 'asdfjklasd');
    insert into sungjuk(sno, uname) values(5, '무궁화');
    
    
    --ORA-12899: "SYSTEM"."SUNGJUK"."UNAME" 열에 대한 값이 너무 큼(실제: 11, 최대값: 10)
    insert into sungjuk(sno, uname) values(4, '12345678901');
    
    
    --ORA-12899: "SYSTEM"."SUNGJUK"."UNAME" 열에 대한 값이 너무 큼(실제: 12, 최대값: 10)
    insert into sungjuk(sno, uname) values(6, '대한민국');
    
    
    --check제약조건
    insert into sungjuk(sno, uname, kor, eng, mat)
    values(1, '홍길동', -10, 20, 300);
    --ORA-02290: 체크 제약조건(SYSTEM.SYS_C007329)이 위배되었습니다, 점수범위 체크조건에 위배
     insert into sungjuk(sno, uname, kor, eng, mat, addr)
    values(2, '장길산', 10, 20, 30, 'Incheon');
    --ORA-02290: 체크 제약조건(SYSTEM.SYS_C007330)이 위배되었습니다, 주소 체크조건에 위배
    
    select * from sungjuk;
    
    
    --default 제약조건
    --tot와 aver는 0 , wdate는 현재날짜가 조회됨
     insert into sungjuk(sno, uname, kor, eng, mat, addr)
    values(1, '홍길동', 10, 20, 30, 'Seoul');
    
        insert into sungjuk(sno, uname, kor, eng, mat, addr)
    values(1, '홍길동', 10, 20, 30, 'Seoul');

//////////////////////////////////////////////////////////////////

 [데이터그룹화]
    
    select * from sungjuk order by addr;
    
    [distinct()]
    -칼럼에 중복 내용이 있으면 대표값 1개만 출력
    -형식) distinct(칼럼명)
    
    select addr from sungjuk;
    select addr from sungjuk order by addr; --asc생략가능
    select addr from sungjuk order by addr desc;
    
    select distinct(addr) from sungjuk;
    select distinct(uname) from sungjuk;
    
    
    //////////////////////////////////////
    [group by]
    -칼럼에 동일 내용끼리 그룹화
    -형식) group by 칼럼1, 칼럼2, 칼럼3, (칼럼1, 칼럼2 그룹 칼럼3에 의한 그룹)
    
    --주소가 동일한 값을 그룹화시키고 결과값 동일
    select addr
    from sungjuk
    group by addr; --distinct와 결과값 동일
    
    
    --ORA-00979: GROUP BY 표현식이 아닙니다. "not a GROUP BY expression"
    --group화된 곳에서는 한 개 데이터만 select할 수 있으므로 group내에서 uname과 같이 여러 값이 있는 경우에는 에러
     select addr, uname 
    from sungjuk
    group by addr; 
    
    

'수업노트' 카테고리의 다른 글

23.2.28(화)  (0) 2023.02.28
23.2.27 (월)  (0) 2023.02.27
23.2.22(수)  (0) 2023.02.22
카카오 우편번호, 맵  (1) 2023.02.21
23.2.21(화)  (0) 2023.02.21