(1)SELECT문 모든 행을 선택해서 생성!
(2)SELECT문 일부 행을 선택해서 생성! (스키마 미리 확인해서 선택)
(3)SELECT문의 산술연산 활용
(4)SELECT문의 더미테이블
-- ******************************************************
-- SELECT 문의 기본구조와 각 절의 실행순서
-- ******************************************************
-- - Clauses - - 실행순서 -
--
-- SELECT clause (5) 생량 불가능 Oracle 안에서 (ORDER가 나오면 항상 마지막에서 2번째로 수행)
-- FROM clause (1) 생략 불가능 Oracle 안에서
-- [WHERE clause] (2) 생략가능
-- [GROUP BY clause] (3) 생략가능
-- [HAVING clause] (4) 생략가능
-- [ORDER BY clause] (6) 생략가능 항상 마지막 수행
-- ******************************************************
-- ------------------------------------------------------
-- *** SELECT 문의 기본문법 구조 ***
-- ------------------------------------------------------
-- SELECT [DISTINCT] { *, column [AS] [alias], ... }
-- ->[] 안에오면 생략가능 {}안에오면 설명 /SELECT 보여줄 컬럼을 정해서 보여준다 /*= 모든것을 선택하겠다.
-- FROM <테이블명>
-- -> <>안에 오면 필수 / FROM은 테이블의 행을 하나씩 추출해서 SELECT절에 줌
-- ------------------------------------------------------
-- ------------------------------------------------------
-- 1. To project all columns of the table
-- ------------------------------------------------------
-- SELECT *
-- FROM table;
-- ------------------------------------------------------
DESC EMPLOYEES --무슨 속성을 가지고 있는지 테이블 속성 등 테이블 스키마 확인 방법
SELECT
EMPLOYEE_ID,
LAST_NAME,
HIRE_DATE,
SALARY
FROM EMPLOYEES;
-- ------------------------------------------------------
-- 3. 산술연산자의 활용 ( +, - , *, / )
-- ------------------------------------------------------
-- SELECT column1 + column2 FROM table;
-- SELECT column1 - column2 FROM table;
-- SELECT column1 * column2 FROM table;
-- SELECT column1 / column2 FROM table;
-- ------------------------------------------------------
SELECT
SALARY,
SALARY + 100
FROM EMPLOYEES;
SELECT
SALARY,
SALARY - 100
FROM EMPLOYEES;
SELECT
SALARY,
SALARY * 100
FROM EMPLOYEES;
SELECT
SALARY,
SALARY / 100
FROM EMPLOYEES;
SELECT
last_name,
salary, --봉급 속성
salary * 12 --연봉 속성
FROM
employees; --직원테이블
-- ------------------------------------------------------
-- 4. About SYS.DUAL table -- Dummy table.
-- ------------------------------------------------------
-- SYS account owns this DUAL table.
-- If you don't need a table, the DUAL table needed.
-- ------------------------------------------------------
DESC sys.dual; -- 객체참조 연산자를 사용 dual의 소속을 적는다.
DESC dual; --생략은 나중에 배운다.
--Name Null? Type
--DUMMY VARCHAR2(1)
SELECT
245 * 567 -- 테이블이 필요없는 연산
FROM
dual; -- 더미 테이블/SELECT절에서 테이블이 필요없을때 FROM을 생략불가하니 추가하는 무의미한 테이블
SELECT
*
FROM
dual;
SELECT
*
FROM
sys.dual;
(1)SELECT문 AS 별칭
(2)SELECT문 AS 별칭의 규칙
(3)SELECT문 속성 데이터의 NULL값
(4)SELECT문 속성 NULL값의 기본값
-- ------------------------------------------------------
-- 1. 특정 컬럼에 alias(별칭) 만들기
-- ------------------------------------------------------
-- SELECT column1 [[as] alias]
-- FROM table;
-- ------------------------------------------------------
SELECT
last_name ,
salary ,
salary * 12
FROM
employees;
-- 테이블에 속성에 이름부여 알리아스(별칭) AS 키워드여서 대문자로 해줘야함
SELECT
last_name AS 이름,
salary 월급,
salary * 12 AS 연봉
FROM
employees;
-- ------------------------------------------------------
-- 2. To test alias including special characters or whitespaces
-- ------------------------------------------------------
-- (Whitespace: 공백문자, 탭문자 등)
-- Caution) In this case, you should use double quotation mark("")
-- ------------------------------------------------------
SELECT
last_name AS 이름, --사원 이름 이렇게하면 오류남 /공백이나 특수문자,대소영문 구분 등 있을때는 > / "사원 이름" 오류안남
salary 월급, -- '사원 월급'싱글은 오류남 "사원 월급" 더블로 해야함. 이미 목적이 정해져 있다. 자바와 같지 않음.
salary * 12 AS 연봉
FROM
employees;
-- ------------------------------------------------------
-- 3. NULL 값 이해하기
-- ------------------------------------------------------
-- 분석입장에서는, "결측치(Missing Value)"라고 함.
-- 이러한 결측치가 발생하는 경우는,
-- (1) 실험측정시, 측정이 안되는 경우
-- (2) 실험측정장치의 오동작
-- (3) 관찰로 얻어지는 경우라면, 관찰이 안된 경우
-- (4) 관찰자(사람)의 실수 등 다양함
-- ------------------------------------------------------
-- * Caution: To test NULL
-- ------------------------------------------------------
SELECT
EMPLOYEE_ID 직원코드, -- AS 키워드 생략
LAST_NAME 이름,
JOB_ID 직업코드,
COMMISSION_PCT 수수료
FROM
EMPLOYEES;
SELECT
last_name 이름,
salary 월급,
commission_pct 수수료,
salary * 12 + commission_pct AS 연봉 --수술료가 NULL이어서 연봉이 NULL
FROM
employees;
-- ------------------------------------------------------
-- 4. NULL 값의 기본값 처리: NVL() 함수 사용하기
-- 결측치의 처리: 분석에서는, 결측치 처리가 매우 다양하고
-- 사용방법에 따라, 통계량이 변경되기 때문에
-- 매우 주의해서 처리함
--
-- 결측치 처리예: 대표값(= 특성값) - 평균/중위수/최빈값/
-- 합계/제거!/보간(interpolation)
-- ------------------------------------------------------
-- * Caution: To use NVL(column, defaultValue) built-in function
-- ------------------------------------------------------
SELECT
last_name 이름,
salary 월급,
commission_pct 수수료,
(salary*12) * (1+NVL(commission_pct,0)) AS 연봉 --NVL(속성명,기본값)
FROM
employees;
(1)SELECT문 문자열속성과 || 연산자를 통한 날짜,숫자속성결합
(2)SELECT문 문자열속성과 리터럴속성의 || 통한 결합
(3)SELECT문 || 연산자와 WHERE절을 이용한 체크조건통한 조회
-- ------------------------------------------------------
-- 1. Concatenation Operator: ||
-- ------------------------------------------------------
-- SELECT column1 || column2 2개의 컬럼의 값을 연결해버림
-- FROM table;
-- ------------------------------------------------------
-- (1) 문자열 + 숫자
SELECT
last_name || salary AS "이름 월급"
FROM
employees;
- (2) 문자열 + 날짜
SELECT
last_name || hire_date AS "이름 월급"
FROM
employees;
-- (2) 문자열 + 날짜
SELECT
last_name || hire_date || salary AS "이름 월급" -- 문자열 날짜 숫자 해놓으면 전부 문자열로 먹힌다.
FROM
employees;
--(1) 숫자
--(2) 문자열
--(3) 날짜
--Oracle 자동형변환(promotion 발생)
-- <날짜> <--형변환가능--> <문자열> <--형변환가능--><숫자> / <날짜> --형변환불가--<숫자>
-- ------------------------------------------------------
-- 2. Concatenation Operator: ||
-- ------------------------------------------------------
-- SELECT column || literal
-- FROM table;
-- ------------------------------------------------------
-- (3) 문자열 + 리터럴(문자열)
SELECT
last_name || '사원'
FROM
employees;
-- ------------------------------------------------------
-- 3. Concatenation Operator: ||
-- ------------------------------------------------------
-- SELECT column1 || literal || column2 || literal || column3
-- FROM table;
-- ------------------------------------------------------
SELECT
last_name || '의 직업은 ' || job_id || ' 입니다.' AS "사원별 직급"
FROM
employees;
SELECT
last_name || ' 의 직업은 ' || job_id
FROM
employees
WHERE --1차 필터링 : 행을 필터링
last_name = 'Smith'; -- << check 조건이라고 부름 // sql에서는 == 이 아닌 = 동등비교연산자
SELECT문 DISTINCT명령어를 통한 컬럼의 중복제거
-- ------------------------------------------------------
-- 1. To remove duplicated data (중복제거)
-- ------------------------------------------------------
-- SELECT DISTINCT column1[, column2, ..., columnN]
-- FROM table;
-- ------------------------------------------------------
SELECT
job_id
FROM
employees;
SELECT
DISTINCT job_id -- SELECT절에 나열된 ~~ 컬럼에 대하여 중복을 제거
FROM
employees;
SELECT
DISTINCT last_name, first_name --나열된 컬럼에 대해서 중복을 판단한다. 두개의 컬럼을 합친 조건이 해당되어야함 따라서 107개 나옴
-- SELECT DISTINCT * -- 107개나옴
FROM
employees;
(1)SELECT문 where절에서 비교연산자를 통한 체크조건을 거쳐 조회
(2)SELECT문 where절에서 BETWEEN a AND b > a와 b 사이를 조회
-- ------------------------------------------------------
-- 1. Comparison Operators (비교연산자)
-- ------------------------------------------------------
-- 1. operand1 = operand2
-- 2. operand1 != operand2,
-- operand1 <> operand2,
-- operand1 ^= operand2
-- 3. operand1 > operand2
-- 4. operand1 < operand2
-- 5. operand1 >= operand2
-- 6. operand1 <= operand2
-- ------------------------------------------------------
SELECT
employee_id,
last_name,
job_id,
salary
FROM
employees
WHERE
salary >= 10000;
SELECT
employee_id,
last_name,
job_id,
salary
FROM
employees
WHERE
last_name = 'King';
-- WHERE
-- last_name = 'KING';
-- Date output format: RR/MM/DD only in the oracle SQL*Developer
SELECT
employee_id,
last_name,
salary,
hire_date
FROM
employees
-- <NUMBER> <-> <CHARACTER> <-> <DATE> 간에는,
-- 자동형변환이 됨!!! (*****)
-- 따라서, 아래의 조건식은 <DATE> > <CHARACTER> 의 비교식으로
-- 자동형변환에 의해, 당연히 비교가 가능해짐!
WHERE
hire_date > '07/12/31';
-- 자동형변환을 포기하고, 강제형변환 함수인 to_date()로 직접
-- DATE 타입으로 형변환시켜서, 비교하는 이유는: 가독성 확보
-- WHERE
-- hire_date > to_date('07/12/31', 'RR/MM/DD');
-- ------------------------------------------------------
-- 2. BETWEEN operator:
-- ------------------------------------------------------
-- WHERE column BETWEEN start AND end ( start <= X <= end )
-- ------------------------------------------------------
SELECT
employee_id,
last_name,
salary,
hire_date
FROM
employees
WHERE
salary BETWEEN 7000 AND 8000;
SELECT
employee_id,
last_name,
salary,
hire_date
FROM
employees
-- OK only on the Oracle SQL*Developer
WHERE
hire_date BETWEEN '07/01/01' AND '08/12/31';
-- WHERE
-- hire_date
-- BETWEEN to_date('07/12/31', 'RR/MM/DD')
-- AND to_date('08/12/31', 'RR/MM/DD');
public class WildCardExample2 {
//잊지맙시다!: 제네릭타입이 매개변수의 타입으로 지정되면 ==>"사용"이다!!
// public static void rehisterCourse(Course<?> course) {
// 와일드 카드 타입 (구체타입으로 그 어떤 참조타입이든 수용하겠다는 의미)
// public static void rehisterCourse(Course<? extends Student> course) {
// 와일트카드의 제약1 학생을 상속받는 객체만 등록가능
public static void rehisterCourse(Course<? super Student> course) {
//와일드 카드의 제약2 학생의 부모 객체만 등록가능
// 와일드카드를 사용하면서 깨달은 것 제네릭자체가 자손이 되는건 허용이 안되기 때문에 범위를 정해줌
System.out.println(course.getName() + "수강생: " + Arrays.toString(course.getStudents()));
} // registerCourse
public static void main(String[] args) {
// Generic Class : Course<T>
Course<Person> personCourse = new Course<Person>("일반인과정", 5);
// 다형성-1: 부모타입의 참조변수에는, 모든 자식객체가 대입가능하다!!
// add(T t) => add (Person t)
personCourse.add(new Person("일반인"));
personCourse.add(new Worker("직장인"));
personCourse.add(new Student("학생"));
personCourse.add(new HighStudent("고등학생"));
System.out.println(personCourse);
// ------
Course<Worker> workerCourse = new Course<>("직장인과정",5);
workerCourse.add(new Worker("직장인"));
// workerCourse.add(new Person("일반인"));
// workerCourse.add(new Student("학생"));
// workerCourse.add(new HighStudent("고등학생"));
System.out.println(workerCourse);
// ------
Course<Student> studentCourse = new Course<>("학생과정",5);
studentCourse.add(new HighStudent("고등학생"));
studentCourse.add(new Student("학생"));
System.out.println(studentCourse);
// ------
Course<HighStudent> highStudentCourse = new Course<>("고등학생과정",5);
highStudentCourse.add(new HighStudent("고등학생"));
System.out.println(highStudentCourse);
// ---------
// rehisterCourse(highStudentCourse);
rehisterCourse(studentCourse);
// rehisterCourse(workerCourse); >> 와일드카드에 제약을 줘서 오류
rehisterCourse(personCourse);
}// main
}//end class
중요포인트 와일드카드의 이유 제네릭메소드타입을 통해 제네릭타입 클래스의 매개변수를 받을 때 제네릭끼리의 다형성은 적용이 안된다.
---------------------------------<익명구현객체>-------------------------------
public static void main(String[] args) {
// Runnable task = new Runnable() {
//
// @Override
// public void run() {
// ;;
// }// run
// }; //익명구현객체 코딩기법
---------------------------------<람다식>---------------------------
Runnable task = () -> {System.out.println("람다요!");};
// Lamda Expression
System.out.println(task);
task.run();
} // main
public class tttt {
public static void main(String[] args) {
//람다식의 구현대상 ===> 함수적 인터페이스이다!!
//람다식의 구현대상이 되는, 함수적 인터페이스를 해당 람닥식의 "Target Type"이라 부른다.
}// main
}// end class
<함수형 인터페이스>
@FunctionalInterface
interface OurInterface{
public static final double PI =3.14159; // 상수와는 무관하다.
public default void defaultMethod() {;;} // default메소드와는 무관하다.
public static void staticMethod() {;;} // static 메소드와도 무관하다.
public abstract void abstractMethod();
// public abstract void abstractMethod2(); -> 오류 펑셔널 인터페이스 선언해서 추상메소드 1개만 가질 수있음
}// end interface
다음주에 이어서 한다 하심!
중요한점! 람다는 스트림을 통한 객체구조를 위해 반드시 알고 가야한다 !.