오늘은
오늘은 금요일입니다 내일부터 주말이라 오늘은 늦은 시간까지
쉬엄쉬엄 공부를 하였습니다
결국 감기에 걸리긴 했는데 내일부터 주말이니
컨디션 조절을 하며 쉬엄쉬엄 해야겠습니다
학원 수업
<<SQL>>
내장 함수 - 수학, 날짜, 문자열
- 숫자 : ABS(), ROUND(), TRUNC(FLOOR)
- 문자 : REPLACE(), SUBSTR(), UPPER(), LOWER(), LENGTH()
-- 숫자 타입 내장 함수
-- 제공 테이블 : dual
-- 절대값 구하기 : ABS(숫자)
SELECT ABS(-10) FROM dual;
-- 반올림 : ROUND(숫자, 자리수)
SELECT ROUND(127.67, 1) FROM dual; -- 소수 첫째 자리
SELECT ROUND(127.67, 0) FROM dual; -- 소수에서 반올림
SELECT ROUND(127.67, -1) FROM dual; -- 1의 자리 에서 반올림
SELECT ROUND(127.67, -2) FROM dual; -- 10의 자리에서 반올림
-- 버림(내림) : TRUNC(숫자, 자리수)
SELECT TRUNC(127.67, 1) FROM dual; -- 소수 첫째자리까지 표시
SELECT TRUNC(127.67, 0) FROM dual; -- 소수 자리 버림 = SELECT FLOOR(숫자, 자리수) FROM 테이블; = 정수만 표시
SELECT TRUNC(127.67, -1) FROM dual; -- 1의자리 버림
SELECT TRUNC(127.67, -2) FROM dual; -- 10의 자리 버림
-- 거듭제곱 : POWER(밑, 지수)
SELECT POWER(2, 3) FROM dual;
-- 문자 타입 내장 함수
-- 소문자로 변경 : LOWER('대문자')
SELECT LOWER('ABCD') FROM dual;
-- 대문자로 변경 : UPPER('소문자')
SELECT UPPER('abc') FROM dual;
-- 문자열의 일부 추출 :SUBSTR(문자열, 시작 인덱스, 추출개수)
-- 인덱스는 1번부터 시작
SELECT SUBSTR('abcd', 1, 2) FROM dual;
-- 문자열을 찾아 바꾸기 : REPLACE(문자열, 변경 전 문자, 변경 후 문자)
SELECT UPPER(REPLACE('abcd', 'c', 'e')) FROM dual;
-- 문자열의 길이 : LENGTH(문자열)
SELECT LENGTH('abcd') FROM dual;
-- 마스킹 : LPAD(문자열, 전체길이, 특정문자) => 왼쪽부터 특정 문자로 채움
SELECT LPAD('today', 10, '*') FROM dual;
-- 마스킹 : RPAD(문자열, 전체길이, 특정문자) => 오른쪽부터 특정 문자로 채움
SELECT RPAD('today', 10, '*') FROM dual;
-- 주문 테이블
-- 고객별 평균 주문 금액을 100원 단위로 반올림
SELECT custid,
SUM(saleprice) AS 합계금액,
COUNT(saleprice) AS 주문건수,
ROUND(AVG(saleprice), -2) AS 평균주문금액
FROM orders
GROUP BY custid;
-- 도서 테이블
-- 책 제목의 글자수 : 공백문자 포함
-- 책 제목의 바이트수 : 한글 - 3byte, 영어, 특수문자 - 1byte
SELECT bookname,
LENGTH(bookname) AS 글자수,
LENGTHB(bookname) AS 바이트수
FROM book;
-- 책 제목 '축구'를 '농구'로 변경
SELECT bookname ,
REPLACE(bookname, '축구', '농구') AS bookname
FROM book;
-- 고객 테이블
-- 고객 이름별 같은 성을 가진 고객의 인원수
SELECT SUBSTR(name, 1, 1) 성,
COUNT(*) 인원
FROM customer
GROUP BY SUBSTR(name, 1, 1);
COMMIT;
- 날짜와 시간 - 현재 날짜 : SYSDATE
- 특정한 날짜 : TO_DATE('날짜')
- 날짜 형식 변환 : TO_CHAR(날짜, 형식) = 지정한 VARCHAR2 형식
- 날짜 연산 - 일수 = 숫자연산
- 월수 - ADD_MONTHS : 월 더하기
- MONTH_BETWEEN : 개월수 계산
-- 날짜와 시간
-- 현재 날짜 출력
SELECT SYSDATE FROM dual;
-- 현재 날짜와 시간 출력
SELECT SYSTIMESTAMP FROM dual;
-- 현재 날짜 형식 변환 => TO_CHAR()함수 사용
SELECT TO_CHAR(SYSDATE, 'YYYY') AS 년도,
TO_CHAR(SYSDATE, 'MM') AS 월,
TO_CHAR(SYSDATE, 'DD') AS 일,
TO_CHAR(SYSDATE, 'YYYY-MM-DD') AS 날짜
FROM dual;
-- 현재 날짜와 시간 형식 변환
SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH:MI:SS') 시간형식
FROM dual;
-- 변환 함수 : TO_NUMBER() = 문자를 숫자로 바꿔줌
SELECT TO_NUMBER('320')
FROM dual;
-- 날짜 연산
-- 현재날짜에서 10일 전, 후 출력
SELECT SYSDATE - 10 FROM dual;
SELECT SYSDATE + 10 FROM dual;
-- 특정 날짜에서 10일 전, 후 출력
SELECT TO_DATE('2023-09-01') + 10 FROM dual;
SELECT TO_DATE('2023-09-01') - 10 FROM dual;
-- 월 더하기 빼기
-- ADD_MONTHS()
SELECT ADD_MONTHS(SYSDATE, 3) 결과 FROM dual;
SELECT ADD_MONTHS(SYSDATE, -3) 결과 FROM dual;
SELECT ADD_MONTHS(TO_DATE('2023-05-01'), 3) 결과 FROM dual;
SELECT ADD_MONTHS(TO_DATE('2023/5/1'), -3) 결과 FROM dual;
-- 개월수 계산하기
-- MONTHS_BETWEEN(종료일, 시작일)
SELECT FLOOR(MONTHS_BETWEEN(SYSDATE,'2023-1-1')) 총개월수1,
ROUND(MONTHS_BETWEEN(SYSDATE,'2023-1-1'), 0) 총개월수2
FROM dual;
SELECT FLOOR(MONTHS_BETWEEN('2023-12-31','2023-1-1')) 총개월수1, -- 버림
ROUND(MONTHS_BETWEEN('2023-12-31','2023-1-1'), 0) 총개월수2 -- 반올림
FROM dual;
-- orders 테이블에서 날짜 시간 함수 사용하기
-- 서점은 주문일로부터 10일 후 매출을 확정한다
-- 각 주문의 확정일자를 구하시오
SELECT orderid 주문번호,
orderdate 주문일,
TO_DATE(orderdate) + 10 확정일자
FROM orders;
-- 주문 일에 3개월을 더하고 빼기
-- 주문 번호가 6번에서 10번까지 출력
SELECT orderid 주문번호,
orderdate 주문일,
ADD_MONTHS(TO_DATE(orderdate), 3) 더한결과,
ADD_MONTHS(TO_DATE(orderdate), -3) 뺀결과
FROM orders
-- WHERE orderid >= 6 AND orderid <= 10;
WHERE orderid BETWEEN 6 AND 10;
-- 주문번호가 10인 도서의 주문일로부터 오늘까지의 총 개월수를 구하시오
SELECT orderid 주문번호,
orderdate 주문날짜,
TO_CHAR(SYSDATE, 'YYYY-MM-DD') 오늘날짜,
ROUND(MONTHS_BETWEEN(SYSDATE, orderdate), 0) AS 총개월수
FROM orders
WHERE orderid = 10;
COMMIT;
조건 관련 명령어(구문), 함수(DECODE( ))
Case
when then
Else
End
NVL() - null값을 처리해주는 함수
-- 조건에 관련된 함수
-- DECODE(칼럼명, 조건, 참인값, 거짓인값) -- 단점 : 값 지정 가능, 범위 지정 불가능
-- 성별이 남자이면 'M', 여자이면 'F'로 출력
SELECT ename 사원,
gender 성별,
DECODE(gender, '남자', 'M', 'F') gender
FROM emp;
-- 조건에 관련된 구문(if ~ else구문과 유사)
-- CASE WHEN THEN END 구문
/*
CASE
WHEN 조건1 THEN 결과1
WHEN 조건2 THEN 결과2
ELSE 결과3
END 칼럼명(레이블)
*/
SELECT ename 사원번호,
gender 성별,
CASE
WHEN gender = '남자' THEN 'M'
ELSE 'F'
END gender
FROM emp;
-- 급여에 따른 직급 표시
-- 급여가 350만원 이상이면 직급 -> '과장'으로 표시
-- 급여가 250만원 이상이면 직급 -> ' 대리'로 표시
-- 나머지 -> '사원'으로 표시
SELECT ename 사원번호,
salary 급여,
CASE
WHEN salary >= 3500000 THEN '과장'
WHEN salary >= 2500000 THEN '대리'
ELSE '사원'
END 직급
FROM emp
ORDER BY salary DESC;
-- salary의 개수
SELECT COUNT(salary)
FROM emp;
-- null값에 0을 표시 : NVL()
-- NVL(인수1, 인수2)
-- 인수1이 null이 아니면 인수1 출력
-- 인수1이 null이면 인수2 출력
SELECT ename 사원이름,
NVL(salary, 0) 급여 -- UPDATE 가 아님, 보이는 것만 0
FROM emp;
-- NVL() 0으로 처리 후에 개수를 세면 COUNT 된다
SELECT COUNT(NVL(salary, 0))
FROM emp;
-- 실습 테이블 생성
CREATE TABLE k1(
ID VARCHAR2(3),
CNT NUMBER(2)
);
INSERT INTO k1 VALUES('가', 5);
INSERT INTO k1 VALUES('나', NULL);
INSERT INTO k1 VALUES('다', 5);
INSERT INTO k1 VALUES('라', NULL);
INSERT INTO k1 VALUES('마', 10);
SELECT * FROM k1;
-- NVL() 0으로 처리 후에 개수를 세면 COUNT 된다
SELECT COUNT(CNT) FROM k1; -- 3
SELECT COUNT(NVL(CNT, 0)) FROM k1; -- 5
-- 평균 구하기
SELECT SUM(CNT) / COUNT(CNT) -- 6.6666...
FROM k1;
SELECT SUM(CNT) / COUNT(NVL(CNT,0)) -- 4
FROM k1;
SELECT AVG(CNT) -- 6.6666...
FROM k1;
SELECT AVG(NVL(CNT,0)) -- 4
FROM k1;
-- 최소값 구하기
SELECT MIN(CNT) FROM k1; -- 5
SELECT MIN(NVL(CNT, 0)) FROM k1; -- 0
COMMIT;
<<JAVA>>
* 바이너리 파일 쓰기 함수
InputStream is = blob.getBinaryStream();
OutputStream os = new FileOutputStream("저장경로" + board.getBfileName());
is.transferTo(os);
* CRUD
- INSERT : 게시글 추가
- SELECT : 전체목록조회, 1건 조회(상세보기)
- UPDATE : 게시글 수정
- DELETE : 게시글 삭제
package dbcrud;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import domain.Board;
public class BoardSelectAllTest {
public static void main(String[] args) {
Connection conn = null; // 네트워크 연결 클래스
PreparedStatement pstmt = null; // sql을 처리해주는 인터페이스
try {
// JDBC 드라이버 등록
Class.forName("oracle.jdbc.OracleDriver");
// 연결하기 - getConnection(url, user, password)
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521/xe",
"c##mydb",
"pwmydb");
System.out.println("연결 성공!");
// db 처리 작업
// 매개변수화된 sql문 작성 - 동적 바인딩
String sql = "SELECT * FROM boards "
+ "ORDER BY bno DESC";
pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery(); // sql 실행
List<Board> boardList = new ArrayList<>();
while(rs.next()) {
Board board = new Board();
board.setBno(rs.getInt("bno"));
board.setBtitle(rs.getString("btitle"));
board.setBcontent(rs.getString("bcontent"));
board.setBwriter(rs.getString("bwriter"));
board.setBdate(rs.getDate("bdate"));
board.setBfileName(rs.getString("bfilename"));
board.setBfileData(rs.getBlob("bfiledata"));
boardList.add(board); // 리스트에 객체 저장
}
// boardList 출력
for(Board board : boardList) {
System.out.println(board);
}
rs.close();
pstmt.close();
} catch (Exception e) {
e.printStackTrace();
} finally{ // 반드시 수행되는 구간
if(conn != null) { // 연결이 되어 있다면
try {
conn.close();
System.out.println("연결 끊음");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
BankArrayList
main() - main.java
사용자정의 함수() - AccountDAO.java
HTML 공부
<<입력값>>
<체크박스>
= type="checkbox"
->
<div>
<input type="checkbox" id="scales" name="scales"
checked>
<label for="scales">Scales</label>
</div>
=> 체크박스는 꼭 <label>처리 해야 한다
그렇지 않으면 복잡해져서 무엇과 관련되어 있는지 알아보기 힘들다
=> 체크박스가 처음부터 체크되어 있도록 만들 수도 있다
=> 체크박스에 이름을 붙여주고 id를 입력한 후에
그 아이디를 라벨에 넣어주고 라벨 태그 사이에 내용을 넣어주면
라벨과 체크박스를 연결시킬 수 있다
= <label>을 클릭해서 체크할 수 있다
<라디오버튼>
= 체크박스와 거의 비슷하지만 한 가지가 다름
= 라디오 버튼 그룹에서는 딱 하나만 선택할 수 있다
그래서 어느 한 가지를 클릭해서 선택한 것을 브라우저가 인식한 경우
나머지는 절대로 선택되지 않아야 한다
=> 체크박스는 모두 체크할 수도 있고 아무것도 체크하지 않을 수 있다는 점과 차이
->
<p>
<input type="radio" id="xs" name="size">
<label for="xs">XS:</label>
<input type="radio" id="s" name="size">
<label for="s">S:</label>
<input type="radio" id="m" name="size">
<label for="m">M:</label>
</p>
=> 라디오 버튼을 여러개 만든 경우
처음은 각각 따로 독립적이고 연결되어 있지 않다
이 라디오 버튼들을 그룹으로 묶어서
정확히 같은 name을 부여하면 서로 연결시킬 수 있다
= 브라우저가 보기에 모두 같은 것을 나타낸다
= 각 라디오 버튼의 아이디를 정해주고 라벨에 각각 넣어준다
=> 그러면 라벨과 라디오 버튼이 한 쌍이 되고, 같은 name을 부여했기 때문에
서로서로 연결되어 있는 한 그룹이 된다
=> 페이지에서 버튼을 누르고 제출을 하면
size = on 이라고만 되는데
이때 XS, S, M중 어느것이 선택됐는지 알 수 있게 해주려면
value라는 속성을 추가해 주어야 한다
=> value=" "
= 이 value 안에 입력한 것은 사용자에게 표시되지 않음
-> 대신 폼이 제출되면 그게 전송된다
=> 즉 value라는 것은 제출했을 때 서버에 전송되는 값이다
그러니 각각 value가 있어야 하고 또 각각 달라야 한다
<select>태그
=> select 요소는 사실상 드롭다운 메뉴이다
* 드롭다운 메뉴는 사실상 <select>요소와 <option>요소가 함께 기능하여 나오는 결과물이다
<select> = 상위요소
<option> = 하위요소
=> <select>요소가 여러 <option>을 한 그룹으로 묶는다
->
<select name="pets" id="pet-select">
// 가끔씩 첫번째 옵션이 더미이거나 플레이스홀더일때가 있는데
// 이런 경우의 value는아무 의미없는것
<option value="">--Please choose an option--</option>
<option value="dog">Dog</option>
<option value="cat">Cat</option>
<option value="hamster">Hamster</option>
<option value="parrot">Parrot</option>
<option value="spider">Spider</option>
<option value="goldfish">Goldfish</option>
</select>
=> value 속성이 있는데 라디오 버튼처럼
정보를 제출하면 이 value가 전송된다
=> label을 하려면 <select>에 name과 id를 넣어야한다
=> <select>내에서 <option>을 사용하는 것이고 둘은 함께 작동한다
<<form control>>
<input type ="range'>
= 슬라이더를 만들어서 사용자가 그 범위 내에서 그 값을 선택하게 한다
최소값과 최대값은 조정할 수 있다
->
<p>
<label for="cheese">Amount of cheese:</label>
<input type="range" id="cheese" min="1" max="10" name="cheese_level">
</p>
=> 단위를 만들어서 처음 시작했던 값에서 그 단위만큼씩 증가되게 만들 수도 있다
범위를 0부터 100까지 설정하고나서 최초값을 그 중간값으로 정할수도 있다
=> <input type="number" placeholder="enter a number" min="1" max"1000">
이런식으로 number type에도 최대값과 최소값을 설정해줄 수 있다
<<독립적인 다른 요소>>
<textarea>
= 기본적으로 여러 줄의 텍스트 입력이다
Enter 키를 치면서 타이핑을 할 수 있고
문단, 에세이 등등을 쓸 수 있다
=> 그러나 이것들은 입력값은 아니다
->
<p>
<label for="requests">Any Special Requests?:</label>
<textarea id="requests"></textarea>
</p>
=> 페이지에 텍스트 영역이 나와서 타이핑을 할 수 있게 된다
=> 행 수의 최초값을 조정할 수 있다(높이를 조정할 수 있다)
열을 바꾸어서 너비를 조정할 수 있다(열은 줄여서 cols라고 쓴다)
= name은 꼭 입력해야 한다
Coding Test Practice
Description
문자열 myString과 pat가 주어집니다. myString의 부분 문자열중 pat로 끝나는 가장 긴 부분 문자열을 찾아서 return 하는 solution 함수를 완성해 주세요.
function solution(myString, pat) {
var answer = '';
var last = myString.lastIndexOf(pat);
return myString.substr(0, (last + pat.length));
}
lastIndexOf(검색할 값 , 시작위치) - 끝에서부터 검색할 값을 찾기 시작, 시작 위치를 정해주지 않으면 끝에서부터 찾음
substr(시작점, 끝지점) - 문자열의 시작점에서 시작하여 끝지점 앞 인덱스 까지의 문자들을 반환
Description
임의의 문자열이 주어졌을 때 문자 "a", "b", "c"를 구분자로 사용해 문자열을 나누고자 합니다.
예를 들어 주어진 문자열이 "baconlettucetomato"라면 나눠진 문자열 목록은 ["onlettu", "etom", "to"] 가 됩니다.
문자열 myStr이 주어졌을 때 위 예시와 같이 "a", "b", "c"를 사용해 나눠진 문자열을 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.
단, 두 구분자 사이에 다른 문자가 없을 경우에는 아무것도 저장하지 않으며, return할 배열이 빈 배열이라면 ["EMPTY"]를 return 합니다.
function solution(myStr) {
var answer = [];
var part = "";
for(var i = 0; i < myStr.length; i++){
if(myStr[i] =="a" || myStr[i] =="b" || myStr[i] =="c"){
if(part != ""){
answer.push(part);
part = "";
}
}else{
part += myStr[i];
}
}
if(part != ""){
answer.push(part);
}
if(answer.length == 0){
return ["EMPTY"];
}
return answer;
}
a,b,c를 만나면 part가 비어있지 않은 경우 answer추가
두번째 if문 안에 part = "";는 현재 문자열 부분인 part를 비워주는 역할
반복문이 끝나고 나서 남은 부분이 있다면 answer에 추가
문제들이 점점 어려워지고 있습니다
한문제 한문제 하나씩 무언가가 걸리적거려서
풀이를 하는데에 시간이 꽤나 걸리게 되었습니다
2023. 10. 13 (금)
프로그래머 도전기 46일차 (0) | 2023.10.16 |
---|---|
프로그래머 도전기 45일차 (2) | 2023.10.15 |
프로그래머 도전기 43일차 (0) | 2023.10.13 |
프로그래머 도전기 42일차 (4) | 2023.10.12 |
프로그래머 도전기 41일차 (0) | 2023.10.11 |