오늘은
오늘은 날씨가 굉장히 추웠습니다
주말에 걸렸던 감기가 낫질 않아서 고생중입니다
날씨도 이런탓에 컨디션 관리가 힘드네요 ㅠㅠ
그래도 코딩 공부는 계속입니다!!
학원 수업
정규화(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 (화)
프로그래머 도전기 50일차 (1) | 2023.10.20 |
---|---|
프로그래머 도전기 49일차 (2) | 2023.10.19 |
프로그래머 도전기 47일차 (4) | 2023.10.17 |
프로그래머 도전기 46일차 (0) | 2023.10.16 |
프로그래머 도전기 45일차 (2) | 2023.10.15 |