package java18_0129;


import java.util.List;


public class Main {


public static void main(String[] args) {


SingerDao dao = SingerDao.sharedInstance();


SingerView view = new SingerView();

while (true) {

String menu = view.menuDisplay();

switch (menu) {

case "1":

List<Singer> list = dao.getSingerlist();

view.listView(list);

break;

case "2":

String userid = view.setSingerUserId();

Singer s = dao.lookUserid(userid);

// 껍데기 형태로 있다.

view.singerDisplay(s);

break;

case "3":

Singer singerinput = view.insertview();

int r = dao.insertSinger(singerinput);

if (r > 0) {

System.out.println("성공");

List<Singer> list1 = dao.getSingerlist();

view.listView(list1);

break;

} else {

System.out.println("삽입에 실패했습니다");

}

case "4":

Singer update = view.UpdateView();

r = dao.UpdateSinger(update);

if (r > 0) {

System.out.println("수정완료");

Singer singer4= dao.lookUserid(update.getUserid());

view.singerDisplay(singer4);

} else {

System.out.println("수정실패");

}

break;

case "5":

userid = view.deleteView();

r = dao.deleteSinger(userid);

if (r > 0) {

System.out.println("삭제 성공");


break;

} else {

System.out.println("실패");

}

}

}

}

}



'Java > 자바 공부' 카테고리의 다른 글

클래스와 인스턴스와 생성자 정의  (0) 2018.02.12
테이블  (0) 2018.02.06
dao  (0) 2018.01.29
view  (0) 2018.01.29
스트링을 숫자로 바꾸기  (0) 2018.01.21

package java18_0129;


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;


public class SingerDao implements SingerDB {

// 생성자를 private으로 만듭니다.

private SingerDao() {

}


// 자신의 클래스 타입으로 된 static 변수를 생성

private static SingerDao dao;


// 앞에서 만든 static 변수가 null 일 때만 객체를 생성하고

// 리턴하는 static 메소드를 생성

public static SingerDao sharedInstance() {

if (dao == null) {

dao = new SingerDao();

}

return dao;

}


// 데이터베이스 사용에 필요한 변수를 선언

private Connection con;

private PreparedStatement pstm;

private ResultSet rs;


// 데이터 베이스 연결 메소드

private void connect() {

try {

con = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.200:1521:xe", "scott", "tiger");

System.out.println("<★Connect Complete★>");

} catch (Exception e) {

System.out.println("예외(커넥트문제)" + e.getMessage());

e.printStackTrace();

}

}


private void close() {

try {

if (rs != null)

rs.close();

if (pstm != null)

pstm.close();

if (con != null)

con.close();

} catch (Exception e) {

System.out.println("예외(Close문제)" + e.getMessage());

e.printStackTrace();

}


}


// 전체보기 : Singer 테이블의 데이터를 전부 가져와서 리턴해주는 메소드

// 테이블의 데이터를 가져올 때는 매개변수 자리에 데이터가 필요가 없다.

// 세로로 여러개가 나올거 같으면, List

public List<Singer> getSingerlist() {

// 여러 개의 데이터를 저장할 List를 생성

List<Singer> list = new ArrayList<Singer>();

// Singer 테이블의 전체 데이터를 가져오는 SQL

String sql = "select userid, username, age, birthday from singer order by userid";

try {

// 데이터베이스 연결

connect();

// SQL 실행 객체 생성

pstm = con.prepareStatement(sql);

// select 구문 실행

rs = pstm.executeQuery();

// 데이터 읽기

while (rs.next()) {


Singer singer = new Singer();

singer.setUserid(rs.getString("userid"));

// 공백제거를 위한 trim

singer.setUsername(rs.getString("username").trim());

singer.setAge(rs.getInt("age"));

singer.setBirthday(rs.getDate("birthday"));


list.add(singer);


}

} catch (Exception e) {


System.out.println("예외" + e.getMessage());

e.printStackTrace();

} finally {

close();

}

return list;


}


// 상세보기 : Singer 테이블에서 userid를 가지고

// 데이터를 찾아오는 메소드

// id를 가지고 하나의 데이터를 가져오는 메소드 

public Singer lookUserid(String userid) {

// 데이터를 못찾으면 null을 리턴하고 데이터를 찾으면

// 그 데이터를 리턴

Singer singer = null;

String sql = "select * from singer where userid=?";

try {

// 데이터베이스 연결

connect();

// SQL 실행 객체 생성

pstm = con.prepareStatement(sql);

// pstm에 값을 바인딩

pstm.setString(1, userid);

// SQL 실행

rs = pstm.executeQuery();

// 읽어온 데이터가 있으면 singer에 대입

while (rs.next()) {

// while문 밖에다가 만들면, 없어도 만들어버리기 때문에 null이 나온다

singer = new Singer();

singer.setUserid(rs.getString("userid"));

singer.setUsername(rs.getString("username").trim());

singer.setAge(rs.getInt("age"));

singer.setBirthday(rs.getDate("birthday"));

}


} catch (SQLException e) {

System.out.println("예외" + e.getMessage());

e.printStackTrace();

} finally {

close();

}

System.out.println(singer);

return singer;

}


/****************** 데이터를 삽입하는 메소드 ********************/

public int insertSinger(Singer singer) {

int result = -1;

String sql = "insert into singer (userid, username, age, birthday) values(?,?,?,?)";


try {

// 데이터베이스 연결

connect();

// 데이터 바인딩 데이터에 값을 집어 넣기

pstm = con.prepareStatement(sql);

pstm.setString(1, singer.getUserid());

pstm.setString(2, singer.getUsername());

pstm.setInt(3, singer.getAge());

pstm.setDate(4, singer.getBirthday());


// sql실행

result = pstm.executeUpdate();


} catch (Exception e) {

System.out.println("예외(삽입메소드)" + e.getMessage());

} finally {

close();

}

return result;

}

/****************** 데이터를 삭제하는 메소드 ********************/

public int deleteSinger(String userid) {

int result = -1;

String sql = "delete singer where userid=? ";

try {

connect();

Singer singer= new Singer();

// 데이터 바인딩해서 넣기 

pstm =con.prepareStatement(sql);

pstm.setString(1, userid);

result = pstm.executeUpdate();

} catch (Exception e) {

System.out.println("예외(삭제메소드)" + e.getMessage());

}finally {

close();

}

return result ;

}

/****************** 데이터를 수정하는 메소드 ********************/

public int UpdateSinger(Singer singer ) {

int result= -1;

//userid 인 데이터를 찾아서 username을 수정

String sql = "update singer set username =? where userid=? ";

try {

connect();

pstm = con.prepareStatement(sql);

pstm.setString(1, singer.getUsername());

pstm.setString(2, singer.getUserid());

result = pstm.executeUpdate();

} catch (SQLException e) {

System.out.println("예외(삭제메소드)" + e.getMessage());

e.printStackTrace();

}finally {

close();

}

return result;

}

}


'Java > 자바 공부' 카테고리의 다른 글

테이블  (0) 2018.02.06
main  (0) 2018.01.29
view  (0) 2018.01.29
스트링을 숫자로 바꾸기  (0) 2018.01.21
꼭공부) 로또번호  (0) 2018.01.21

package java18_0129;


import java.sql.Date;

import java.util.Calendar;

import java.util.GregorianCalendar;

import java.util.List;

import java.util.Scanner;


//화면 출력을 위한 클래스

public class SingerView {

Scanner sc;


// 생성자 : 객체가 만들어 질 때 바로 수행

public SingerView() {

sc = new Scanner(System.in);

}


// 메뉴 화면을 출력하고 사용자로부터 메뉴를 입력받아서

// 리턴하는 메소드

public String menuDisplay() {

System.out.println("1.전체보기 2.상세보기 3.데이터삽입 " + "4.데이터 수정 5.데이터삭제:");

System.out.print("메뉴 선택:");

String menu = sc.nextLine();

return menu;

}


// 전체 데이터를 출력하는 메소드

public void listView(List<Singer> list) {

// 제목 출력

System.out.printf("%15s%20s%15s%15s", "아이디", "이름", "나이", "생년월일");

// 전체 데이터를 순회하면서 출력

for (Singer singer : list) {

System.out.println();

System.out.printf("%15s%15s%15d%15s", singer.getUserid(), singer.getUsername(), singer.getAge(),

singer.getBirthday());

}

System.out.println();

}


// 데이터를 조회하거나 삭제하기 위해서

// userid를 입력받는 화면출력을 하고, 입력받은 id를 리턴하는 메소드


public String setSingerUserId() {

System.out.print("Id를 입력:");

String userId = sc.nextLine();


return userId;

}


// 데이터 1개를 받아서 출력하는 메소드

public void singerDisplay(Singer singer) {

if (singer == null) {

System.out.println("찾고자 하는 아이디가 없습니다.");


} else {

System.out.print("아이디 : " + singer.getUserid());

System.out.print("이름 : " + singer.getUsername());

System.out.print("나이 : " + singer.getAge());

System.out.print("생년월일 : " + singer.getBirthday());

}

}

// 아이디, 이름, 나이, 생년월일을 입력받아서 Singer 객체로 만든 후

// 리턴해주는 메소드


public Singer insertview() {

Singer singer = new Singer();

/********************* 아이디입력 ************************/

while (true) {

System.out.println("아이디 입력 : ");

String userid = sc.nextLine();

// 아이디 필수 입력 검사

if (userid.trim().length() < 1) {

System.out.println("아이디는 필수 입력입니다/.");

continue;

}

// 아이디 중복 검사

SingerDao dao = SingerDao.sharedInstance();

Singer check = dao.lookUserid(userid);

if (check != null) {

System.out.println("중복된 아이디입니다./");

continue;

} else {

singer.setUserid(userid);


}

/********************* 이름입력 **************************/

System.out.println("이름 입력");

String username = sc.nextLine();

if (username.trim().length() < 1) {

System.out.println("이름은 필수입력 입니다 !!!!!");

continue;

} else {

singer.setUsername(username);

}

/********************* 나이입력 **************************/

System.out.println("나이 입력");

String age = sc.nextLine();

if (age.trim().length() < 1) {

System.out.println("나이는 필수 입력입니다~");

continue;

}

// 모두 숫자로 되어 있는지 검사

boolean flag = true;

for (int i = 0; i < age.length(); i = i + 1) {

char ch = age.charAt(i);

if (ch < '0' || ch > '9') {

flag = false;

break;

}

}

if (flag == false) {

System.out.println("나이는 숫자로만 구성되어야합니다. ");

continue;

} else {

singer.setAge(Integer.parseInt(age));

}


/********************* 날짜입력 **************************/

Calendar cal = new GregorianCalendar();

Date birthday = new Date(cal.getTimeInMillis());

singer.setBirthday(birthday);

break;

}

return singer;

}

//삭제할 userid를 입력받아서 리턴하는 메소드 

public String deleteView() {

System.out.print("삭제하고 싶은 아이디를 입력하시오");

String userid = sc.nextLine();

return userid;

}

//갱신할 userid 와 나머지 데이터를 입력받아서 리턴하는 메소드 


public Singer UpdateView() {

Singer singer = new Singer();

System.out.print("아이디를 입력하시오");

String userid = sc.nextLine();

singer.setUserid(userid);

System.out.print("이름 입력 : ");

String username = sc.nextLine();

singer.setUsername(username);

return singer;

}

}



'Java > 자바 공부' 카테고리의 다른 글

main  (0) 2018.01.29
dao  (0) 2018.01.29
스트링을 숫자로 바꾸기  (0) 2018.01.21
꼭공부) 로또번호  (0) 2018.01.21
버블정렬  (0) 2018.01.20

**오라클이 제공하는 함수 

1. 숫자 관련 함수 

round( 값 이나 컬럼 , 자릿 수 ) : 값이 컬럼의 값을 자릴 수 아래에서 반올림 

자릿수를 지정하지 않으면 소수 첫째자리에서 반올림해서 정수로 표현 


2) trunc는 round와 동일한 데 소수를 버림


3)  mod는 나머지 구해주는 함수 


2) 문자 함수 

1) upper, lower : 대문자나 소문자로 변경해주는 함수 

영문 검색을 할 때 대소문자 구분없이 검색을 하는 경우에 사용 

2) TRIM,LTRIM, RTRIM  : 좌우 공백 제거 


3) substr :  문자열을 잘라주는 함수 

게시판에서 제목을 일정 부분만 출력하고 상세보기

4) LPAD, RPAD : 왼쪽이나 오른쪽에 특정한 문자를 채우는 함수 

5) length : 문자의 길이를 리턴해주는 함수 


--문자 관련 함수 

select length('오라클'), upper('Oracle'), lpad('Oracle', 20,'*'),

        substr('Oracle',2),substr('Oracle',2,3),trim(' Oracle  ')

from dual


3. 형변환 함수 

숫자나 날짜를 문자열로 변환 : to_char

문자열을 숫자로 변환 : to_number

문자열을 날짜로 변환 : to_date

=> 년도는 yy, yyyy,로 나타내고 월은 mm 일은 dd 시간은 h24, h12 분은 MI 초는 ss


4. NVL  

=> null 인 데이터가 있을 때 변환해주는 함수 

=> 데이터베이스에서는 NULL은 아직 알려지지 않은 값 

=> NULL은 다른 데이터와 연산할 수 없어서 NULL을 가지고 연살을 하면 결과도 NULL이됩니다. 

=> 집계 함수 Sum, AVG,COUNT, Min,MAX) 는 NULL인 경우 연산에서 제외합니다. 

=> 집계함수 연산이나 다른데이터와 연산할 때  NULL을 다른 데이터로 치환해서 수행해야합니다. 


=> NVL( 컬럼이름이나 연산식, 치환할 값) 



5. 그룹함수 

sum, avg, max, min, count : null을 제외하고 연산 

=> 평균을 구할 때 null 포함여부를 고려해야 합니다. 

=> count 를 사용할 때는 컬럼이름을 직접 사용하는 것보다는 *을 이용하는 것이 좋습니다,. 

=> emp 테이블에는 comm이 null인 데이터가 포함되어 있습니다 



-- emp 테이블에서 comm의 평균 구하기 

--null인 데이터를 제외하고 평균을 구하기  

select avg (comm)

from emp ;


-- comm이 null인 데이터는 0으로 간주하고 평균을 구하기 

select avg(nvl(comm, 0))

from emp;


--null인 데이터를 포함한 평균 

select sum(comm)/count(*)

from emp;


**group by 

=> 그룹화를 위한 절 

 select 조회할 컬럼이름이나 연산식을 나열하거나 *

 from 조회할 테이블이름을 기재하거나 나열 

where 조회할 조건 

group by  그룹화 할 컬럼이름이나 연산식

having 그룹화 한 이후의 조건 

order by  정렬할 컬럼이름이나 연산식 


수행 순서 from -> where -> group by -> having -> select -> order by 순으로 실행 됩니다 .



 => emp 테이블에서 job 별로 sal의 평균을 조회 

 

 select job, round(avg(sal))

 from emp 

 group by job ; 

 

 => group by를 사용할 때 주의할 점은 select 절에 그룹화 한 컬럼이름 또는 계산을 수행한 연산식을 제외한 컬럼을 기재하면 에러가 발생하거나 이상한 결과가 

 나올 수 있습니다. 

 

 -- emp 테이블에서  job 별로 sal의 평균을 조회 

 select job, round(avg(sal))

 from emp 

 group by job ; 

 

 -- job 별로 그룹화하면 select 절에는 job과 집계함수를 이용하는 컬럼만 작성해야합니다. 

 -- 그 이외의 컬럼을 출력하려고 하면 에러가 발생 

 select job ename round(avg(sal))

 from emp 

 group by job;

 

 => group by 이후의 조건 

 집계함수는 group by 이후에 사용할 수 있는 함수여서 where절에서 집계 함수를 이용한 

 조건은 작성할 수 없습니다. 

 집계함수를 이용한 조건은 having에 작성합니다. 

 

 

  --emp태이블에서 인원수 , 최대급여(sal), 최소급여 , 급여의 합을 

 --계산하여 출력하는 SELECT문자을 작성 

 

 select count(*)"인원수", max(sal)"최대급여", min(sal)"최소급여",sum(sal)"급여의 합"

 from emp

 

 

--EMP 테이블에서 각 업무별(job)로 최대 급여(sal), 최소 급여, 급여의 합을 출력하는 SELECT 문장을 작성


--EMP 테이블에서 업무별(job) 인원수를 구하여 출력하는 SELECT 문장을 작성하여라.


--EMP 테이블에서 최고 급여(sal)와 최소 급여의 차이는 얼마인가 출력하는 SELECT 문장을 작성하여라.




**join -  2 개 이상의 테이블을 합쳐서 하나의 테이블을 만드는 것을 Join이라고 한다. 

 

 1. Cross Join  - > Cartesian product 

 

 => 2개의 테이블의 모든 데이터 조합 

 => from 절에 테이블을 2개 이상 기재하면  Cross Join이 수행됩니다.

 => 앞에 기재된 테이블의 모든 데이터와 뒤에 기재된 테이블의 모든 데이터를 결합 

 

 => 컬럼의 개수는 양쪽 테이블의 컬럼 개수를 합친것과 같고, 행의 개수는 양쪽 테이블의 

 행 개수를 곱한 것과 같습니다. 

 

 select *

 from emp, dept ; 

 =위 처럼 작성하면 catesian product입니다. 

 emp 테이블은 14개의 행과 9개의 열로 이루어져있습니다. 

 (empno, ename, job, sal, comm, deptno, mgr, hiredate )

 

 dept 테이블은 4개의 행과 3개의 열로 구성 되어있습니다. 

 (deptno, dname, loc)

 

 2. join의 종류

 

 1) cross join  : catesian product, 2개 테이블의 모든 조합 

 2) equi join : 동일한 의미를 갖는 컬럼끼리 비교해서 일하는 경우에만 join하는 것 

 3) non-equi join: 일치하는 경우가 아닌 !=, >,>=.<=와 같은 연산자를 이용해서 비교한 후 join

 4) outer join : 한쪽 테이블에만 존재하는 데이터도 join 

 5) self join : 하나의 테이블을 가지고 join

 6) semi join : 서브쿼리를 가지고 join

 

 3. equi join - where 절에 양쪽 테이블에서 동일한 의미를 갖는 컬럼의 값이 일치하는 경우에만 조회하도록 설정하면 됩니다.  


=> emp 테이블과 dept 테이블은 deptno 라는 동일한 의미를 갖는 컬럼을 소유하고 있습니다. 

=> emp 테이블과 dept 테이블을 join 할 때는 deptno의  값이 같은 경우메나 join 하도록 합니다. 


ex1)-- emp 테이블과 dept 테이블을 equi join 

=> 2개의 테이블에서 데이터를 조회할 때는 where절에 join 조건을 만들어 주는 것이 좋습니다. 


select * 

from emp, dept 

where emp.deptno=dept.deptno;



ex2) emp 테이블의 ename과 dept 테이블의 dname과 loc를 조회 사원 이름과 부서이름과 지역을 조회

=> 조건이 있는 데이터를 조회할 때는 보통 조건은 Join 조건 뒤에 기술합니다. 

select ename,loc

from emp, dept 

where emp.deptno =dept.deptno

order by  ename, loc



ex3 ) emp의 sal  값이 1500 이상인 데이터의 ename과 sal 그리고 deptno와 dname을 출력 

=> join을 했을 때 양쪽 테이블에 공통으로 존재하는 컬럼을 출력하고자 하면 이 때 

컬럼 이름 앞에 테이블이름. 을 추가해야 합니다 


select ename sal, dept.deptno dname

from emp, dept

where emp.deptno = dept.deptno and sal >=1500;




4.non-equi join 

=> 2개 테이블의 조인 조건이 =가 아닌 경우 

=> emp 테이블에서는 sal이라는 급여 컬럼이 있습니다. 

salgrade라는 테이블에는 급여 등급과 losal(급여의 최소값), hisal(급여의 최대값) 이라는 컬럼이 있습니다. 

=>emp 테이블에서 ename과 sal을 조회한 후 sal의 salgreade에 있는 등급이 얼마인지 조회 



select ename, sal, salgrade 

from emp, salgrade


-- emp 테이블에서 ename과 sal을 조회한 후 sal의 

--salgrade에 있는 등급이 얼마인지 조회

-- 중복2번 넣어서 distinct 

select distinct ename, sal, grade

from emp, salgrade

where emp.sal >= salgrade.losal and emp.sal <= salgrade.hisal;


5. Outer join 

=> 한쪽 테이블에만 존재하는 데이터도 join에 참여하는 것 

=> left outer join, right outer join, full outer join 이 있습니다. 

=> 표준 SQL에서는 full outer join을 지원하지 않습니다. 

=> 추가 시켜주고자 하는 join 조건에 (+) 를 기재 하면 됩니다. 



--emp 테이블의 demptno를 확인

-- 10, 20, 30 

select distinct deptno

from emp; 


--dept 테이블의 deptno를 확인 

--10,20,30,40

select deptno

from dept 

group by deptno


--equi join 을 하게되면 dept테이블에만 있는 40번은 제외 됩니다. 

select *

from emp, dept 

where emp.demptno = dept.deptno;



--40번추가

--dept 테이블에만 존재하는 40을 추가해서 join 

--대신 없는 값은 전부 null로 채워집니다. 

-- 양쪽에 (+)를 붙일 수 없습니다. 

select *

from emp, dept 

where emp.deptno(+) = dept.deptno;



6. selfjoin


=> 자신의 테이블과 join 

=> 하나의 테이블에 동일한 의미를 갖는 컬럼이 2개 이상 존재하는 경우에 사용하는 join입니다. 

=> emp 테이블에는 empno라고 하는 자신의 사원번호 컬럼이 있고 mgr이라고 하는 자신의 상관 사원번호 컬럼이 있습니다. 



=> selfjoin은 from절에서 자신의 테이블이름을 2번 기재해야 하기 때문에 구별하기 위해서 테이블 이름에 별명을 부여해서 작업합니다. 

=> 테이블 이름에 별명을 부여할 때는 테이블 이름 다음에 공백을 추가하고 별명을 기재하면 됩니다. 

=> 테이블 이름이 길 때도 별명을 붙여서 짧게 사용하는 경우가 있습니다. 

=> emp 테이블의 자신의 이름(ename) 과 자신의 상관이름을 같이 조회 



--emp  테이블에서 사원이름과 관리자의 이름을 같이 출력 

--emp 테이블의 mgr 컬럼이 관리자의 사원번호(empno)입니다. 

--

select s1.ename 사원이름, e2.ename 관리자 이름 

-- 테이블 이름 두개적기 

-- e1에가서 뭘 가져와

from emp e1, emp e2

where e1.mgr=e2.empno



**ANSI join 

 ANSI ( 미국 표준 협회 ) 에서 재정한 Join 문법 

 => 관계형 데이터 베이스 종류에 따라 지원하는 경우도 있고 그렇지 않은 경우도 있습니다.

 

1. cross join - cartesian product - 2개 테이블의 모든 조합이 전부 조회되는 것 


=> from 절에 

테이블 이름 cross join 테이블 이름 

--emp 테이블과 dept  테이블의 cross join 

-- 양쪽 테이블의 행의 개수를 곱한 결과인 56개의 행이 출력되고 

-- 양쪽 테이블의 컬럼의 개수를 더한 결과인 11개의 커럶이 출력됩니다. 

select * 

from emp cross join detp


2. inner join 

=> from 절에 

2개 테이블을 나열 할 때 , 대신에 inner join 이라는 예약어 추가하고 on절에 join조건을 추가합니다. 


select 

from 테이블 이름  inner join  테이블이름2

on 테이블이름1.컬럼이름 = 테이블이름2.컬럼이름 



-- ex)emp 테이블에 ename에 L이 2자 이상 포함 되어 있는 사원의 ename과 dept 테이블의 dname을 조회 

=> 2개 테이블의 공통 컬럼 :deptno


3.using 과 natural join 

=> join 하고자 하는 컬럼의 이름이 동일 할 때 사용할 수 있는 Join 

=> 컬럼의 이름이 동일할 때는 on 대신에 using이라고 적고 공통 컬럼이름을 기재하면 됩니다. 

=> 컬럼의 이름이 같을 때는 inner join이라는 예약어 대신에 natural join 이라고 적고 join조건을 생략해도 됩니다.



--

select ename, dname

from emp inner join dept 

using (deptno)

where ename like '%L%L%';


--

select ename, dname

from emp natural dept 

where ename like '%L%L%';

'데이터베이스 > 데이터베이스' 카테고리의 다른 글

조인  (0) 2018.01.23
ANSI Join  (0) 2018.01.23

6.조인.ppt

7.서브 쿼리.ppt


'데이터베이스 > 데이터베이스' 카테고리의 다른 글

오라클 정리  (0) 2018.01.23
ANSI Join  (0) 2018.01.23

**ANSI join 

 ANSI ( 미국 표준 협회 ) 에서 재정한 Join 문법 

 => 관계형 데이터 베이스 종류에 따라 지원하는 경우도 있고 그렇지 않은 경우도 있습니다.

 

1. cross join - cartesian product - 2개 테이블의 모든 조합이 전부 조회되는 것 


=> from 절에 

테이블 이름 cross join 테이블 이름 

--emp 테이블과 dept  테이블의 cross join 

-- 양쪽 테이블의 행의 개수를 곱한 결과인 56개의 행이 출력되고 

-- 양쪽 테이블의 컬럼의 개수를 더한 결과인 11개의 커럶이 출력됩니다. 

select * 

from emp cross join detp


2. inner join 

=> from 절에 

2개 테이블을 나열 할 때 , 대신에 inner join 이라는 예약어 추가하고 on절에 join조건을 추가합니다. 


select 

from 테이블 이름  inner join  테이블이름2

on 테이블이름1.컬럼이름 = 테이블이름2.컬럼이름 



-- ex)emp 테이블에 ename에 L이 2자 이상 포함 되어 있는 사원의 ename과 dept 테이블의 dname을 조회 

=> 2개 테이블의 공통 컬럼 :deptno


3.using 과 natural join 

=> join 하고자 하는 컬럼의 이름이 동일 할 때 사용할 수 있는 Join 

=> 컬럼의 이름이 동일할 때는 on 대신에 using이라고 적고 공통 컬럼이름을 기재하면 됩니다. 

=> 컬럼의 이름이 같을 때는 inner join이라는 예약어 대신에 natural join 이라고 적고 join조건을 생략해도 됩니다.



--

select ename, dname

from emp inner join dept 

using (deptno)

where ename like '%L%L%';


--

select ename, dname

from emp natural dept 

where ename like '%L%L%';




4. ANSI  Outer Join 

+ 기호 대신에 from 절에  [left |right | full] outer join 이라고 기재하면 outer join이 됩니다. 

=> 한쪽에 테이블에 있는 데이터도 join에 참여하는게 ANSI outer join입니다. 


ex) emp 테이블의 데이터와 dept 테이블의 데이터를 full outer join을 수행 

join 조건은 deptno 컬럼 


select * 

from emp full outer join dept 

on emp. deptno = dept.deptno



**set 연산 

=> 집합연산 

=> 2개의 select 구문결과를 가지고 만들어내는 연산으로 2개 테이블의 결과 컬럼의 개수가 동일하고 자료형이 같은 경우에만 연산이 가능 


1.UNION -> 합집합

2.UNION ALL -> 합집합

3.INTERSECT -> 교집합

4.MINUS ->차집합 


-- EMP 테이블에서 모든 사원에 대한 이름(ename), 

--부서번호(deptno) DEPT 테이블에서 부서명(dname)을 출력하는 SELECT 문장을 작성



select ename, emp.deptno, dname

from emp,dept 

where emp.deptno= dept.deptno;



-- DEPT 테이블의 LOC가 NEW YORK에서 근무하고 있는 사원에 대하여 EMP 

--테이블의 이름(ename), 업무(job), 급여(sal), DEPT 테이블의 부서명(dname)을 출력하는 SELECT 문장을 작성


select  ename, job, sal, dname

from emp,dept 

where emp.deptno = dept.deptno and loc= 'NEW YORK';



--EMP 테이블에서 보너스(comm)가 null 이 아닌 사원에 대하여 이름(ename),

--DEPT 테이블의 부서명(dname), 위치(loc)를 출력하는 SELECT 문장을 작성


select ename, dame,loc

from emp, dept 

where emp.deptno = dept.deptno and comm is not null ;



-- EMP 테이블에서 이름(ename) 중 L자가 있는 사원에 대하여 이름(ename), 업무(job),

-- DEPT 테이블의 부서명(dname), 위치(loc)를 출력하는 SELECT 문장을 작성


select ename, job,dname, loc

from emp, dept 

where emp.deptno = dept.deptno and ename like '%L%';




-- EMP 테이블에서 그들의 관리자(mgr) 보다 먼저 입사한 사원에 대하여 이름(ename), 

--입사일(hiredate), 관리자(mgr) 이름,  관리자(mgr) 입사일을 출력하는 SELECT 문장을 작성하여라.


select e1.ename 이름, e1.hiredate 입사일, e2.ename 관리자, e2.hiredate "관리자 입사일" 

from emp e1, emp e2 

where e1.mgr = e2.empno and e1.hiredate <e2.hiredate;

'데이터베이스 > 데이터베이스' 카테고리의 다른 글

오라클 정리  (0) 2018.01.23
조인  (0) 2018.01.23



[문제]


getMiddle메소드는 하나의 단어를 입력 받습니다. 단어를 입력 받아서 가운데 글자를 반환하도록 getMiddle메소드를 만들어 보세요. 단어의 길이가 짝수일경우 가운데 두글자를 반환하면 됩니다.
예를들어 입력받은 단어가 power이라면 w를 반환하면 되고, 입력받은 단어가 test라면 es를 반환하면 됩니다.



[나의 문제 풀이]

class StringExercise {

String getMiddle(String word) {

// 입력받은 문자열을 배열에 담을 것인가 ?

// 입력받은 문자열을

// 3 5 7 9 = 1씩증가

// 2 4 6 8 = 0, 1,2,3 1씩증가

String result= "";

int count = word.length();

Character[] a = new Character[count];

int idx = 0;

while (idx < count) {

a[idx] = word.charAt(idx);

idx +=1;

}

int x = count/2 ;

if(count%2 !=0 )

result = a[x]+"";

else if (count%2 ==0)

result = a[x-1]+""+a[x];

return result;

}


// 아래는 테스트로 출력해 보기 위한 코드입니다.

public static void main(String[] args) {

StringExercise se = new StringExercise();

System.out.println(se.getMiddle("test"));

}

}





[다른사람 사람 문제 풀이 ] 
class StringExercise{
    String getMiddle(String word){

        return word.substring((word.length()-1)/2, word.length()/2 + 1);    
    }
    // 아래는 테스트로 출력해 보기 위한 코드입니다.
    public static void  main(String[] args){
        StringExercise se = new StringExercise();
        System.out.println(se.getMiddle("power"));
    } 

}

'알고리즘' 카테고리의 다른 글

서울에서김서방찾기  (0) 2018.02.22
수박수박수박수박수박수?  (0) 2018.02.22
<공부가 더필요 > 삼각형 출력하기  (0) 2018.01.21
역삼각형 출력하기  (0) 2018.01.14
약수의 모든 합을 구하시오.  (0) 2018.01.14

'알고리즘 공부' 카테고리의 다른 글

삽입 정렬  (0) 2018.03.28
유클리드 알고리즘  (0) 2018.03.11
선택정렬 정리  (0) 2018.03.06
최대값, 최소값  (0) 2018.01.21

+ Recent posts