상세 컨텐츠

본문 제목

프로그래머 도전기 48일차

프로그래머가 될거야!

by Choyee 2023. 10. 17. 23:49

본문

오늘은

오늘은 날씨가 굉장히 추웠습니다

주말에 걸렸던 감기가 낫질 않아서 고생중입니다

날씨도 이런탓에 컨디션 관리가 힘드네요 ㅠㅠ

그래도 코딩 공부는 계속입니다!!

 

 

 

학원 수업

정규화(normaliztion)
-이상현상이 발생하는 테이블을 정상으로 만드는 과정
원인) 한 테이블(릴레이션)에 두 가지 이상의 정보가 저장되어 있기 때문에 발생
 해결방법은 릴레이션(relation, 엔티티)을 분해하여 제거한다.
 이상현상이 남아있다면 이상현상이 없어질때까지 분해한다.

 

-이상현상(anormaly)
  삽입, 수정, 삭제시 이상현상

CREATE TABLE summer_class(
    sid     NUMBER,              -- 학번
    subject  VARCHAR2(20),    -- 수강과목
    price   NUMBER              -- 수강료
);

INSERT INTO summer_class VALUES (100, 'C', 30000);
INSERT INTO summer_class VALUES (101, 'JAVA', 45000);
INSERT INTO summer_class VALUES (200, 'Python', 40000);
INSERT INTO summer_class VALUES (201, 'JAVA', 45000);

-- 계절학기를 수강하는 학생의 학번과 수강하는 과목은?
SELECT sid 학번, subject 수강과목 
FROM summer_class;


-- 'Python' 강좌의 수강료는?
SELECT subject 수강과목, price 수강료
FROM summer_class
WHERE subject = 'Python';

-- 여름학기를 듣는 학생수와 수강료 총액은?
SELECT COUNT(sid) 학생수,
          SUM(price) 수강료총액
FROM summer_class;

-- 200번 학생이 수강취소
DELETE FROM summer_class
WHERE sid = 200;
-- 삭제이상 => sid를 지웠는데 subject, price 모두 사라짐

-- 삽입이상
-- C++ 강좌 개설 - 신청한 학생이 없음
INSERT INTO summer_class VALUES (NULL, 'C++', 35000);

-- 학생 3명, 튜플은 4개 => 불일치 발생
SELECT COUNT(sid) 수강인원
FROM summer_class;

SELECT COUNT(*) 수강인원
FROM summer_class;

-- 수정 이상
-- JAVA 수강료가 45000에서 40000원으로 변경
UPDATE  summer_class
SET price = 40000
WHERE subject = 'JAVA';

-- 수정이상 => 만약 UPDATE문을 다음처럼 사용하면 이상 현상 발생
-- 1건만 수정
UPDATE  summer_class
     SET price = 40000
WHERE subject = 'JAVA'
   AND sid = 101;

-- JAVA 수강료 검색
SELECT price FROM summer_class
WHERE subject = 'JAVA';

OMMIT;

ROLLBACK;

 

단일행, 다중행 서브쿼리
WHERE절 -> 결과가 한개 = 단일행 = '=' 사용
            -> 결과가 여러개 = 다중행 => 'IN'사용

-- 서브 쿼리(Sub Query) = 부속질의(중첩 쿼리)
-- SELECT문 내부에 또 다른 SELECT문이 존재

-- 도서 중 가격이 가장 높은 도서를 검색
SELECT MAX(price) FROM book;

-- 도서 중에서 가장 비싼 도서의 이름을 검색하시오
-- 단일행 = 결과가 한개 => '='사용
SELECT bookname 
FROM book
WHERE price = (SELECT MAX(price) FROM book);

-- 도서를 구매한 적이 있는 고객의 이름을 검색하시오
SELECT custid FROM orders;

SELECT name
FROM customer
WHERE custid IN(1, 2, 3, 4);

-- 다중행 서브쿼리 = 결과가 여러개 => 'IN' 사용
SELECT name
FROM customer
WHERE custid IN(SELECT custid FROM orders);

-- 조인 방식(ORACLE JOIN)
SELECT DISTINCT cus.name
FROM customer cus, orders ord
WHERE cus.custid = ord.custid;
-- 조인 방식(INNER JOIN)
SELECT DISTINCT cus.name
FROM customer cus INNER JOIN orders ord
    ON cus.custid = ord.custid;


-- FROM절에 있는 서브쿼리 - 인라인뷰라고도 함
-- 고객 번호가 2 이하인 고객의 이름과 그 고객의 판매액 검색
SELECT cs.name, SUM(od.saleprice)
FROM customer cs, orders od
WHERE cs.custid = od.custid
   AND cs.custid <= 2
GROUP BY cs.name;

-- 서브쿼리 사용
SELECT cs.name, SUM(od.saleprice)
FROM (SELECT * FROM customer
          WHERE customer.custid <= 2) cs,
         orders od
WHERE cs.custid = od.custid
GROUP BY cs.name;

-- 동등조인
-- 서브쿼리 사용
SELECT cs.name, SUM(od.saleprice) total
FROM customer cs, orders od
WHERE cs.custid = od.custid
AND cs.custid <= 2
GROUP BY cs.name
Having SUM(od.saleprice) >= 30000;

/*
    실행 순서
    1. FROM절 테이블명
    2. WHERE, GROUP BY
    3. SELECT절
    4. ORDER절
*/

SELECT * FROM product;
SELECT * FROM product_review;
-- 스칼라 서브쿼리 : SELECT 절에 있는 SELECT문을 말함
-- 상품 리뷰 테이블에 있는 상품 이름 검색
SELECT r.product_code, 
          r.member_id,
          r.content,
          (SELECT product_name FROM product d
          WHERE r.product_code = d.product_code) product_name
FROM product_review r;



LOLLUP(칼럼명, 칼럼명) = GROUP BY의 칼럼에 대해서 소계를 만들어준다

-- department 테이블
CREATE TABLE department(
    deptno       VARCHAR2(4) PRIMARY KEY,
    deptname    VARCHAR2(20) NOT NULL,
    office          VARCHAR2(20)
);

INSERT INTO department VALUES('1000', '인사팀', '서울');
INSERT INTO department VALUES('1001', '전산팀', '인천');
INSERT INTO department VALUES('1002', '전산팀', '수원');
INSERT INTO department (deptno, deptname) VALUES('1003', '영업팀');
-- '1002번' 부서 이름을 '총무팀'으로 바꾸기
UPDATE department
SET deptname = '총무팀'
WHERE deptno = '1002';

-- employee 테이블 생성 
CREATE TABLE employee(
    empno      NUMBER(3) PRIMARY KEY,
    empname   VARCHAR2(20) NOT NULL,
    sal           NUMBER(10),
    createdate DATE DEFAULT SYSDATE,
    deptno     VARCHAR2(4),
    FOREIGN KEY(deptno) REFERENCES department(deptno) -- 외래키
);

INSERT INTO employee VALUES (100, '이강', 2500000, SYSDATE, '1000');
INSERT INTO employee VALUES (101, '김산', 2000000, SYSDATE, '1001');
INSERT INTO employee VALUES (102, '박달', 3000000, SYSDATE, '1002');
INSERT INTO employee VALUES (103, '강태양', 3500000, SYSDATE, '1000');
INSERT INTO employee VALUES (104, '최우주', 5000000, SYSDATE, '1001');
INSERT INTO employee VALUES (105, '우영우', 4000000, SYSDATE, '1002');
-- '강태양' 사원의 급여를 '3000000'원으로 변경
UPDATE employee
SET sal = 3000000
WHERE empname = '강태양';

COMMIT;


SELECT * FROM employee;

-- 부서별 급여 총액을 구하시오
SELECT deptno, SUM(sal) 
FROM employee
GROUP BY deptno; 

-- 부서이름과 부서별 급여 총액을 출력하시오
-- employee, department 테이블 사용(조인)
SELECT d.deptno,
          d.deptname,
          SUM(e.sal)
FROM department d, employee e
WHERE d.deptno = e.deptno
GROUP BY d.deptno, d.deptname;

-- ROLLUP(칼럼1, 칼럼2) : GROUP BY절에서 소계, 총계를 만들어 줌
SELECT d.deptno,
          SUM(e.sal)
FROM department d, employee e
WHERE d.deptno = e.deptno
GROUP BY ROLLUP(d.deptno);

-- CUBE(칼럼1, 칼럼2) : GROUP BY절에서 모든 소계, 총계를 입체적으로 만듬
SELECT d.deptno,
          d.deptname,
          SUM(e.sal)
FROM department d, employee e
WHERE d.deptno = e.deptno
GROUP BY CUBE(d.deptno, d.deptname)
ORDER BY deptname;

-- SUM(칼럼) OVER(정렬) - 누적합계
SELECT empno,
         empname,
         sal,
         SUM(sal) OVER (ORDER BY empno) SAL_SUM  -- 칼럼명 출력시 소문자로 사용하는 방법 = ""쌍따옴표로 묶어준다 => "sal_sum"
FROM employee;

-- 순위 RANK() OVER(ORDER BY 칼럼) 함수
SELECT empno,
         empname,
         sal,
         RANK() OVER (ORDER BY sal DESC) 급여_RANK, 
         DENSE_RANK() OVER(ORDER BY sal DESC) 급여_DENSE_RANK
FROM employee;

 

 

 

 

CSS 공부

<<가상 클래스>>
= 선택자 끝에 붙여 상태를 특정하는 키워드
   -> 체크된 체크박스나 커서를 올려둔 요소, 각각의 버튼 등을 선택할 수 있다
=> ':' 로 시작한다
     = 가상 클래스를 사용한다는 것을 알리려면 : 를 입력해야 한다

<:hover>
= 우리의 선택지를 바꿔준다
->
a:hover {
    color: orange;
}
// 모든 앵커 태그를 선택한 뒤 커서가 올려져 있는 특정 상황에서의 효과를 설명해 준다
=> 커서를 올려 두었을 때 시각적 효과를 통해
     상호작용할 수 있음을 알려주는 방식은 매우 널리 사용된다

<:active>
= 현재 무언가가 활성화되어 있다는 뜻
   활성화 되었을 때 다른 색이나 상태를 부여하는 것
    => 클릭한채로 누르고 있으면 색이 변한다거나 상태가 변하게 되는 것

<:check>
= 체크된 라디오 버튼이나 체크박스를 선택할 수 있다
   체크하면 텍스트가 나온다거나 색이 바뀌거나 스타일이 적용되거나 한다

<:nth-of-type>
= 포스트가 많을 경우 -> 각각에 혹은 매5번째에 뭔가를 적용하고 싶을 경우 사용
=> nth-of-type(3)을 입력하면 -> 3번째를 선택해서 그 요소에만 적용된다
             3n을 입력하는 경우 -> 3번째 마다 적용된다


<<가상 요소>>
= 덧붙일 수 있는 요소로써 선택된 요소의 특정 부분만 선택
=> 어떤 요소의 첫 줄의 첫 글자에만 스타일을 넣을 수도 있다
-> 두개의 '::' 콜론을 사용한다


<::first-letter>
= 특정 선택에서 첫 글자를 선택하는 방법
   모든 단락이나 모든 스팬의 첫 글자를 선택할 수 있는 것

<::first-line>
= 첫 줄에 대한 스타일 적용 방법

<::selection>
= 문서의 강조 표시한 부분에 적용
   문서의 특정 부분이 아니라 선택한 요소의 일부라도 상관없이 적용


<<캐스케이드>>
(CSS = 케스케이딩스타일의 약자)
= 적용된 스타일의 순서가 중요하다는 의미
    => 맞닥뜨린 순서서가 브라우저의 표시에 반영된다 
         모든 스타일을 순서대로 만나고 다음 링크된 스타일시트로 넘어간다
          -> 넘어가서 다음 스타일시트를 적용하고 이전의 내용을 덧쓴다


<<CSS 우선순위>>
= 동일한 선택자인 경우 -> 순서대로 적용
= 선택자가 다른 경우 -> 특이도에 따라 적용
* 특이도 = 충돌이 생길 경우 브라우저에서 규칙을 적용하는 방법
           => 하나 이상의 스타일이 동일한 요소에 적요오디거나 적용될 수 있는 경우 충돌이 발생
                주어진 선택자가 얼마나 구체적인지 측정한 뒤 -> 더 구체적인 선택자를 우선 적용
           => 가장 구체적 = ID -> 어떤 클래스 선택자보다 우선한다 -> 마지막은 요소 선택자

.post button:hover {
    background-color: #e63946;
    color: #f1faee;
}

.post a:hover {
    text-decoration:underline;
}

button:active{
    background-color: #02c39a;
}

.post:nth-of-type(3n) {
    background-color: #dfe8dc;
}

h2::first-letter {
    font-size: 50px;
}

p::selection {
    background-color: #fcbf49;
}

button:hover {
    background-color: olive;
    font-size: 10px;
}

 

 

 

2023. 10. 17 (화)

관련글 더보기