letremove=document.querySelectorAll(".close");// 배열 형태
// console.log(remove);
for(leti=0; i<remove.length; i++){
remove[i].addEventListener("click", removeList);
// 삭제 버튼에 클릭 이벤트 리스너를 추가하여 removeList 함수를 호출
}
}
// 제거
//클릭된 삭제 버튼의 id를 가져와서 해당 id의 항목을 itemList 배열에서 제거
functionremoveList() {
letid=this.getAttribute("id");
console.log(id);
itemList.splice(id, 1);
showList();
//showList 함수를 호출하여 목록을 업데이트
}
결과
등록
삭제
매개변수 값 함수로 지정하기
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// sum 함수: 배열의 합을 구하는 함수
function sum(arr){
let len = arr.length;
let i = 0, sum = 0;
// 배열의 각 요소를 순회하며 값을 더함
for(; i < len; i++){
sum += arr[i];
}
// 합을 반환
return sum;
}
// 테스트할 배열
const arr = [1, 2, 3, 4];
// sum 함수 호출하여 결과 출력
console.log(sum(arr));
// 출력: 10 (1 + 2 + 3 + 4)
// reduce 함수: 배열을 축소하는 함수
function reduce(func, arr, memo){
let len = arr.length,
i = 0,
accum = memo;
// 배열의 각 요소를 순회하며 축소 함수를 적용하여 결과 값을 누적
for(; i < len; i++){
accum = func(accum, arr[i]);
}
// 최종 누적 값을 반환
return accum;
}
// 덧셈 함수
let sum2 = function(x,y){
return x + y;
}
// reduce 함수 호출하여 결과 출력
console.log(reduce(sum2, arr, 0));
// 출력: 10 (1 + 2 + 3 + 4)
</script>
</body>
</html>
결과
오라클
Quiz 풀기
직책이 SALESMAN인 사람들의 최고 급여보다 높은 급여를 받는 사원들의 사원정보, 급여등급 출력
select e.empno, e.ename, e.sal, s.grade
from emp e, salgrade s
where sal between s.losal and s.hisal
and e.sal > all (select sal
from emp
where job = 'SALESMAN'
)
테이블에 데이터 추가하기
DEPT 테이블을 복사해서 DEPT_TEMP 테이블 만들기
CREATE TABLE dept_temp
AS SELECT * FROM dept
INSERT 데이터 추가 하기
insert into dept_temp (deptno, dname, loc)
values(50, 'database', 'seoul');
INSERT 데이터 추가 할 때 NULL을 지정하여 입력하기
넣을 데이터가 없다면 ' ' 빈 문자열을 추가하는 것 보다 NULL로 지정하는게 좋음
insert into dept_temp (deptno, dname, loc)
values(60, 'web', null);
테이블에 날짜 데이터 입력하기
날짜 데이터를 입력할 때는 문자열로 입력하기 보다는 TO_DATE함수를 사용하는 것이 좋다.
body { background:url('../images/bg.png') repeat-x top left; }
h1 { margin-top:180px; }
p { width:400px; margin-bottom:10px; padding:10px; border:1px solid #ccc;
color: #ccc; background-color: black;}
JS
// 생성자
function Book(title, author, volume, price){
this.title = title,
this.author = author,
this.volume = volume,
this.price = price;
}
// 객체 생성
let html = new Book('웹표준의 정석', 'ko', '608', '28,000');
let youtube = new Book('유튜브 영상 만들기', 'Kim', '368', '16,000');
let python = new Book('점프 투 파이썬', 'Park', '352', '18,800');
// 배열 생성, 출력
let booklist = [html, youtube, python];
for(let i = 0; i < booklist.length; i++){
document.write(`<p>${booklist[i].title}</p>`);
}
SQL문을 실행하는 데 필요한 데이터를 추가로 조회하기 위해 SQL문 내부에서 사용하는 SELECT문 의미
조회 대상의 오른쪽에 놓이며 괄호 ( ) 로 묶어서 사용
예) 사원이름이 ALLEN인 사원의 추가 수당보다 많은 추가 수당을 받는 사원 정보를 출력
select *
from emp
where comm > (select comm
from emp
where ename = 'ALLEN'
)
실행 결과가 하나인 단일행 서브쿼리
서브쿼리에서 출력되는결과가 하나이므로 메인쿼리와 서브쿼리 결과는 단일행 연산자를 사용해서 비교
서브쿼리의 결과 값이 날짜형인 경우 ( 빨리 입사한 사원 목록 조회 )
select *
from emp
where hiredate < (select hiredate
from emp
where ename = 'SCOTT'
)
SCOTT보다 빨리 입사한 직원 목록
테이블 조인 후 SELECT문에 서브쿼리 적용 ( 서브쿼리 안에서 함수 사용 )
select e.empno, e.ename, e.job, e.sal, d.deptno, d.dname
from emp e, dept d
where e.deptno = d.deptno
and e.deptno = 20
and e.sal > (select avg(sal) from emp)
실행 결과가 여러 개인 다중행 서브쿼리
단일행 서브쿼리와 달리 서브쿼리 결과가 여러 개이므로 단일행 연산자는 사용할 수 없고 다중행 연산자를 사용해야
메인쿼리와 비교할 수 있다.
IN연산자
메인쿼리의 데이터가 서브쿼리의 결과 중 하나라도 일치한 데이터가 있다면 true
부서 번호가 20이거나 30인 사원의 정보만 출력
select *
from emp
where deptno in (20, 30);
각 부서별 최고 급여와 동일한 급여를 받는 사원 정보 출력
select *
from emp
where sal in (select max(sal)
from emp
group by deptno )
서브쿼리의 SELECT문 결과 값이 밑에 쿼리문 처럼 2850, 3000, 5000이 출력되는데 IN연산자를 사용해 메인쿼리에서는
세 값 중 일치하는 값을 가진 행만 출력한다.
select max(sal)
from emp
group by deptno
EXISTS 연산자
서브쿼리에 결과 값이 하나 이상 존재하면 조건식이 모두 true ( 전부 출력 ), 존재하지 않으면 모두 false
서브쿼리 결과 값이 존재하는 경우
모두 출력
select *
from emp
where EXISTS ( select dname
from dept
where deptno = 10);
서브쿼리 결과 값이 존재하지 않는 이유
아무것도 출력 안됨 50은 없기 때문에
select *
from emp
where EXISTS ( select dname
from dept
where deptno = 50);
비교할 열이 여러 개인 다중열 서브쿼리
서브쿼리의 SELECT절에 비교할 데이터를 여러 개 지정하는 방식
select *
from emp
where (deptno, sal) in ( select deptno, max(sal)
from emp
group by deptno);
오라클 퀴즈
Quiz-1
전체 사원 중 ALLEN과 같은 직책인 사원들의 사원 정보, 부서 정보를 출력
select e.job, e.empno, e.ename, e.sal, d.deptno, d.dname
from emp e, dept d
where e.deptno = d.deptno
and job = (select job from emp where ename = 'ALLEN')
Quiz-2
전체 사원의 평균 급여보다 높은 급여를 받는 사원들의 사원 정보, 부서 정보, 급여 등급 정보 출력
( 단 출력할 때 급여가 많은 순으로 정렬하되 급여가 같을 경우에는 사원 번호를 기준으로 오름차순 정렬 )
select e.empno, e.ename, d.dname, e.hiredate, d.loc, e.sal, s.grade
from emp e, dept d, salgrade s
where e.deptno = d.deptno
and e.sal between s.losal and s.hisal
and sal > (select avg(sal)
from emp )
order by e.sal desc, e.empno;
Quiz-3
10번 부서에 근무하는 사원 중 30번 부서에는 존재하지 않는 직책을 가진 사원들의 사원 정보, 부서 정보 출력
select e.empno, e.ename, e.job, d.deptno, d.dname, d.loc
from emp e, dept d
where e.deptno = d.deptno
and e.deptno = 10
and job not in (select distinct job from emp where deptno = 30);
결과가 해당처럼 나와야 됨
서브 쿼리 뺀 결과 값
select e.empno, e.ename, e.job, d.deptno, d.dname, d.loc
from emp e, dept d
where e.deptno = d.deptno
and e.deptno = 10