• 세로로 묶는거 union
  • 가로로 묶는거 join
    • 아무행이나 붙이는 거 : cross join
  • 테이블 수 -1 만큼의 조인 조건이 있어야함.
  • 두 개 이상인 테이블 하나의 결과 집합으로 만들어 냄
  • 직접적인 관계가 있는 경우에 많이 씀
nc join
표준화된 규격
  1. from table1 join table2 -> 표준화된 규격

 

on 

  • 조인 조건 자유롭게 줄 수 있다.
  • 동일한 얘들끼리 : 등가조인

using

  • 등가조인을 할 경우, 그 때 사용하는 테이블이 똑같을 때
  • 조인 조건하는 컬럼명이 똑같을 때

inner join

  • 일치하는 것 만 
  • 일치하는게 없으면 빼는 것
  • 기본이라서 생략 많이 함

outer join

  • 일치하지 않아도 포함하고 싶을 때, 
  • left, right, full
    • left [outer] join
    • mysql -> full outer join 지원 X
      • left outer join, right outer join union해야함
      • left, rigth적으면 자동으로 outer 조인이라고 생각함
    • 왼쪽 테이블 기준 - left join
    • 오른쪽 테이블 기준 - rigth join
select ename, emp.deptno, dname
from emp
left join dept
on emp.DEPTNO = dept.DEPTNO;
select ename, emp.deptno, dname
from emp
right join dept
on emp.DEPTNO = dept.DEPTNO;

 

full outer join 지원 안 되니깐.

select ename, emp.deptno, dname
from emp
left join dept
on emp.DEPTNO = dept.DEPTNO
UNION
select ename, emp.deptno, dname
from emp
right join dept
on emp.DEPTNO = dept.DEPTNO;

union사용하면 된다. 

 


cross join 

다 만나는 것


select * from emp join dept on emp.deptno = dept.deptno;

emp 테이블 14명이 deptno의 값을 dept값으로 매칭시키겠다. 

  1. emp : 기준테이블
  2. dept : 조인 테이블

  • dept 테이블 친구들이 emp에 붙는다
  • dept 열이 null인 친구 제외 - inner join
  • 사용할 때, 어느 테이블에 있는 DEPTNO인지 명시해줘야한다. (DEPTNO가 두 개
    • 테이블 별로 각자 들어가는 것

 

SELECT * FROM emp JOIN dept USING (deptno);

DEPNO 열이 하나만 나온다. 

 


on

SELECT ename, emp.deptno, dname
FROM emp
JOIN dept
ON emp.deptno = dept.deptno;

어느것에 있는 deptno인지 명시해줘야한다. 

SELECT ename, deptno, dname	--에러난다.
FROM emp
JOIN dept
ON emp.deptno = dept.deptno;

 

using

SELECT ename, deptno, dname
FROM emp
JOIN dept
USING (deptno);

 


직원들이 근무하는 부서명과 지역(도시) 정보 출력

using

select ename, dname, city
from emp
join dept
using (deptno)
join locations
using (loc_code);

on

SELECT ename, dname, city
FROM emp e
JOIN dept d
ON e.deptno = d.deptno
JOIN locations l
ON d.loc_code = l.loc_code;

테이블 별칭써도 됨. 

 


직원들이 근무하는 지역(도시) 정보 출력

SELECT ename, city
FROM emp e
JOIN dept
USING (deptno)
JOIN locations
using(loc_code);
SELECT ename, city
FROM emp e
JOIN dept d
ON e.DEPTNO = d.DEPTNO
JOIN locations l
ON d.LOC_CODE = l.LOC_CODE;

 


on절만 사용 가능 -> between 사용 (and)

SELECT ename, sal, grade 
FROM emp e
JOIN salgrade s
ON e.sal BETWEEN s.losal and s.hisal;

어떤 범위에 속하는가

SELECT ename, sal, concat(grade,"등급") 등급 
FROM emp e
JOIN salgrade s
ON e.sal >= s.losal AND e.sal <= s.hisal;

 


 

'study > JAVA 전문가' 카테고리의 다른 글

mysql 4 - 연습문제  (0) 2021.12.20
Mysql 1 - 연습문제  (0) 2021.12.18
mysql 3 - 연습문제  (0) 2021.12.17
mysql 3  (0) 2021.12.17
DBMS  (0) 2021.12.15

GROUP BY

  • 모든 단위는 그룹 단위로 나옴
  • group by 안 써도 집계 함수 쓸 수 있다.
    • 주로 쓰이는 게 group by라서 그렇지
  • 기준이 됐던 칼럼 명 나타내 줘야 함 옆에 - 보기 좋음
  • 그룹핑해서 select절에 올 수 있는 행이 제한되어있다.
    • ename(일반 컬럼) 같은 거 못 옴
    • 그룹핑하는데 기준이 된 칼럼,칼럼에 대한 식, 집계함수집계 함수만 올 수 있음
      • 열 단위로 카디널리티 개수가 같아야 해서
  • ORDER BY 안 해도 됨 -> 원래 정렬되어 있음
    SELECT deptno, avg(sal) from emp GROUP BY deptno;​
    부서가 정해지지 않은 사람들도 그룹으로
  • is not null
    select deptno, sum(sal) from emp where deptno is not null group by deptno;
     카디널리티 : 그룹 단위의 행
    1. from 문
    2. where절
    3. group by 절
  • count
    • count(*) -> 행의 개수 (null 상관없이 개수 세기)
    • count(특정 칼럼 명) -> null이 아닌 얘들 개수 세줌

 

  • 뒤에 올 수록 서브 칼럼 
    20번 일하는 직원 중 'CLERK' job인 직원은 1명이다.
  • select deptno, job, count(*) from emp where deptno is not null group by deptno, job;​

 

Having절

  • 어떤 조건을 충족하지 못하는 건 제외
    • 행 단위로 읽어올 때 -> where절 (행에 대한 조건, from 다음에 실행)
    • 그룹으로 나눈 다음에 그룹에 대한 조건 -> having (그룹에 대한 조건, 그룹 다음에 실행)

 

 

ROLLUP

  • 각 그룹 단위의 총합계 내줌
    • 소 합계 -> 총합계 
      select ifnull(job,'합계') 직무, sum(sal) '급여' from emp group by job with rollup;​
    • select job, sum(sal) '급여' from emp group by job with rollup;​
  • 보충
    select ifnull(job,"직원 별 합계") 잡, ifnull(deptno,"부서 별 합계"), count(*)
    from emp
    where deptno is not NULL
    group by job, DEPTNO
    with rollup;​
    부서가 null이 아닌 직원, 부서별 합계

 

Set

union 모두 포함 (중복 한번만)
union all 모두 포함 (중복 결과 모두 표현)
intersect 모두 포함한 행만 표현
minus 쿼리 1 - 쿼리 2
  • intersect, minus는 mysql에서 지원 안 함. 
  • 추출되는 컬럼의 개수가 같아야함
    • select 순서를 다르게 하면, 에러는 안 나지만 논리적 문제가 발생함 (자동으로 안 바꿔줌)
  • union
    select ename, hiredate from emp where year(hiredate) = 1981
    UNION
    select ename, hiredate from emp where deptno = 30;​

 

  • union all
    select ename, hiredate from emp where year(hiredate) = 1981
    UNION all
    select ename, hiredate from emp where deptno = 30;​

'study > JAVA 전문가' 카테고리의 다른 글

조인  (0) 2021.12.17
mysql 3 - 연습문제  (0) 2021.12.17
DBMS  (0) 2021.12.15
inner  (0) 2021.12.10
자료구조 2 - 복습  (0) 2021.12.10

DBMS : 데이터의 집합인 데이터베이스를 잘 관리하고 운영하기 위한 시스템 or SW

  • 외래키 Foreign key : 데이터 무결성 보장됨
  • 기본 키 Primary key : 행 단위 구분 데이터
  • 제약조건 
    • 새로운 데이터 들어갈 때는 부모 테이블에 먼저 넣어야함
    • 데이터 삭제 시에는 자식 테이블에서도 지워야 함

 

mysql 서버는 자동으로 구동 됨 -> 컴터 키면 

 

  • 워크벤치
    • mysql 관리하는 목적으로 쓰임

Sql

  • DDL
    • 데이터 정의
  • DML
    • 데이터 추가/수정/삭제
  • DCL
    • 데이터 관리, 접근 권한 제어

( ※ DML이 SELECT에 있다는 것은 바라보는 관점에 따라 다름,)

  • 기본키 정의 

이렇게 2가지 방법을 기본키정의를 할수 있다. 

 

  • 부호
    • 단일 인용 부호를 써야한다.
    • 별명일 경우는 더블 쓸 수도 있다 .
INSERT INTO LOCATIONS VALUES ('A1','SEOUL');

 

  • 한글

한글 설정

 

  • 정보 출력
    • desc 테이블 명;
    • 컴럼 사양들 

 

  • 객체를 통해서 사용 : 변수 
  • 메소드 or 함수 -> mysql 내장 함수
    • select user( ) : 현재 내가 어떤 계정으로 접속했는지
    • select database( ); 현재 사용하고 있는 database이름 (use한거)

 

  • DBMS, 서버 환경에 따라 데이터베이스 or 필드명이 대소문자를 구분하기도 함

 

SELECT문

추출하고자하는 데이터베이스

select now() from emp;

from이 emp이지만, now의 결과 14개를 뽑음

 

select now() form dual;

dual -> 테이블 내용 중요하지 않고, 함수의 결과 한번만 출력

그래서 from 없애도 나옴 (mysql은 from 생략 가능)

  • 테이블 내용 출력하는게 아니면 from 생략 가능

(오라클은 from 없애면 안됨)

select sysdate();

sysdate 오라클에서 추가함

 

use 구문

  • 데이터 베이스 사용하겠다.

( * 시간은 ',' 으로 구분되고, 년월일은 '-'아니면 '/'로 구분됨 )

( null 연산하면 null이기 때문에 연산할 때는 따로 바꿔줘야한다 )

 

조회

show table status;
  • 데이터 베이스에 있는 테이블 정보 조회
DESCRIBE EMP;
  • emp 테이블에 열이 무엇이 있는지

 

WHERE 절

등가 연산자 : '='

 

관계 연산자

  • BETEEN ... AND ( BETEEN A AND B ) (A<B)
    • 데이터가 숫자로 구성되어 있으며 연속된 값

 

  • IN( 값의 리스트 ) 
    • 등가 연산자랑 똑같은데, 비교하려는 값이 2개 이상일 때
    • ex) select * from emp where deptno in(20, 30)
      • select * from emo where deptno=20 or deptno=30와 같다.

 

  • Like (패턴 비교)
    • 패턴 문자 : %, _ 
      • % : 0개 이상의 모든 문자
      • _ : 임의의 한 문자
        where title like 'java%' java로 시작하는 얘들만
        where title like '%java%' 중간에 java들어가있는 것
        where title like '%java' 끝이 java로 끝나는 얘들만
        where title like 'java_'  java로 시작하는데 뒤에 한 문자만 와야함
        where title like 'java___' java뒤에 3개가 와야함 
      • where tilte = '%java%' : 진짜로 %java% 문자를 찾는다. 

 

ORDER BY

order by 안 쓰면 테이블이 가지고있는 순서에 의해서 뽑아짐 (순서는 보장할 수 없다.)

오늘날짜가 더 큰 값 ( 1970년 1월 1일 기준)

  • desc 내림차순
  • aesc 오름차순 (디폴트)

 

DISTINCT

  • SELECT distinct : 중복되는 것 골라서 하나만 보여줌
  • distinct all : 중복되는 행이 발견해도 다 표현한다.
  • 모든 컴럼이 모두 같을 때, 처리된다. (중복 처리하는 것) 
    • select distinct job, deptno from emp;

 

LIMIT IN

  • LIMIT IN : 위에서 부터 몇 개
  • as : 별칭
    • select now() as 현재시간;
    • select now() as "현재 시간"; : ""씀으로써 공백까지

 

 

'study > JAVA 전문가' 카테고리의 다른 글

mysql 3 - 연습문제  (0) 2021.12.17
mysql 3  (0) 2021.12.17
inner  (0) 2021.12.10
자료구조 2 - 복습  (0) 2021.12.10
자료구조 1  (0) 2021.12.09

1. 삽입

2 검색

3 삭제 

4 출력

 

linked list 사용

list, set, map버전

package Thread;


public class ThreadExam extends Thread{
	private int [] arr;
	public ThreadExam() {
		arr = new int[10];
		for(int i= 0; i<arr.length; i++) {
			arr[i] = i;
		}
	}
	
	//	실제 동작하는 함수 run
	public void run() {
		for(int i =0;i <arr.length; i++) {
			try {
				sleep(1000);
			}catch(InterruptedException e) {
				e.printStackTrace();
			}
			
			System.out.println(currentThread() + " " +arr[i]);
			
		}
	}
	public static void main(String[] args) {
		ThreadExam te = new ThreadExam();	//스레드 생성함
		te.start();	//	스케줄러가 보다가 동작해 : runable상 태
	}
}

implements Runnable

 

package Thread;

//run 오버라이드 해야한다.
public class ThreadExam implements Runnable{
	private int [] arr;
	public ThreadExam() {
		arr = new int[10];
		for(int i= 0; i<arr.length; i++) {
			arr[i] = i;
		}
	}
	
	public static void main(String[] args) {
		ThreadExam te = new ThreadExam();	//스레드 생성함(쓸 수 있는 환경 만듦)
//		te.start();	//	스케줄러가 보다가 동작해 : runable상 태
		
		Thread th = new Thread(te);	//	동적 바인딩 runnable가능
		th.start();
	}

	@Override
	public void run() {
		for(int i =0;i <arr.length; i++) {
			try {
				Thread.sleep(1000);
			}catch(InterruptedException e) {
				e.printStackTrace();
			}
			
			System.out.println(Thread.currentThread() + " " +arr[i]);
			
		}
		
	}
}

Runable가 보면 run이 abstract로 되어있어서

run( )함수는 무조건 구현해야한다.

 

 

동기화 문제 

package Thread;

class ATM implements Runnable{
	private long depositeMoney = 10000;
	@Override
	public void run() {
		for(int i = 0; i<10;i++) {
			try {
				Thread.sleep(1000);
			}catch(InterruptedException e) {
				e.printStackTrace();
			}
			if(getDespositeMoney() <= 0)
				break;
			withDraw(1000);
		}
	}
	public void withDraw(long howMuch) {
		System.out.println(Thread.currentThread().getName()+ ", ");
		if(getDespositeMoney() > 0) {
			depositeMoney -= howMuch;
			System.out.printf("잔액 : %d원 %s\n",depositeMoney,getDespositeMoney());
		}
		else {System.out.println("잔액이 부족합니다.");}
	}
	
	
	public long getDespositeMoney() {
		return depositeMoney;
	}
}
public class SyncroniazedEx {
	public static void main(String[] args) {
		ATM atm = new ATM();
		Thread trd_mom = new Thread(atm, "mom");
		Thread trd_son = new Thread(atm, "son");
		trd_mom.start();
		trd_son.start();
	}
}

 

동기화 블록

package Thread;

class ATM implements Runnable{
	private long depositeMoney = 10000;
	@Override
	public void run() {
		synchronized (this) {
			for(int i = 0; i<10;i++) {
				try {
					Thread.sleep(1000);
				}catch(InterruptedException e) {
					e.printStackTrace();
				}
				if(getDespositeMoney() <= 0)
					break;
				withDraw(1000);
			}
		}
	}
	public void withDraw(long howMuch) {
		System.out.println(Thread.currentThread().getName()+ ", ");
		if(getDespositeMoney() > 0) {
			depositeMoney -= howMuch;
			System.out.printf("잔액 : %d원 %s\n",depositeMoney,getDespositeMoney());
		}
		else {System.out.println("잔액이 부족합니다.");}
	}
	
	
	public long getDespositeMoney() {
		return depositeMoney;
	}
}
public class SyncroniazedEx {
	public static void main(String[] args) {
		ATM atm = new ATM();
		Thread trd_mom = new Thread(atm, "mom");
		Thread trd_son = new Thread(atm, "son");
		trd_mom.start();
		trd_son.start();
	}
}
mom, 
잔액 : 9000원 9000
mom, 
잔액 : 8000원 8000
mom, 
잔액 : 7000원 7000
mom, 
잔액 : 6000원 6000
mom, 
잔액 : 5000원 5000
mom, 
잔액 : 4000원 4000
mom, 
잔액 : 3000원 3000
mom, 
잔액 : 2000원 2000
mom, 
잔액 : 1000원 1000
mom, 
잔액 : 0원 0

 

 

먼저 선점한 스레드가 락 걸어서

다른 스레드 못 씀

기아상태 : 아들이 멈춰져 있음 (비동기 프로세스)

-> 공정하게 써야 함 : 동기화 블록 내에 wait(),notify(), notifyall() ...쓴다.

package Thread;

class ATM implements Runnable{
	private long depositeMoney = 10000;
	@Override
	public void run() {
		synchronized (this) {
			for(int i = 0; i<10;i++) {
				notify();
				try {
					wait();
				}catch(InterruptedException e) {
					e.printStackTrace();
				}
				if(getDespositeMoney() <= 0)
					break;
				withDraw(1000);
			}
		}
	}
	
	public void withDraw(long howMuch) {
		System.out.println(Thread.currentThread().getName()+ ", ");
		if(getDespositeMoney() > 0) {
			depositeMoney -= howMuch;
			System.out.printf("잔액 : %d원 %s\n",depositeMoney,getDespositeMoney());
		}
		else {System.out.println("잔액이 부족합니다.");}
	}
	
	
	public long getDespositeMoney() {
		return depositeMoney;
	}
}
public class SyncroniazedEx {
	public static void main(String[] args) {
		ATM atm = new ATM();
		Thread trd_mom = new Thread(atm, "mom");
		Thread trd_son = new Thread(atm, "son");
		
		trd_mom.start();
		trd_son.start();
	}
}

 

public class 

  • 다른 패키지에서도 사용 가능 하게

 

이클립스 단축키 정리하기!

 

inner class

처음부터 가지고 있다. 

Member Inner class

package inner;

class Outter{
	private int num = 0;
	private static int num2 = 3;
	
	class Inner{
		public void disp() {
			System.out.println(num);
			System.out.println(num2);
		}
	}
}
public class MemberInnerTest {
	public static void main(String[] args) {
		Outter o = new Outter();
		Outter.Inner inner = o.new Inner();
		inner.disp();
	}
}

 

		Outter o = new Outter();
		Outter.Inner inner =o.new Inner();
Outter.Inner inner = new Outter().new Inner();

두개는 같은 소스 코드이다. 

static inner clas

package inner;


class Outter{
	private static int num = 0;
	private static int num2 = 3;
	
	static class Inner{
		public void disp() {
			System.out.println(num);
			System.out.println(num2);
		}
	}
}
public class MemberInnerTest {
	public static void main(String[] args) {
		Outter.Inner a = new Outter.Inner();
		a.disp();
	}
}

 

local class

package inner;


class Outter{
	private static int num = 0;
	private static int num2 = 3;
	
	public void Output() {
		class Inner{
			public void disp() {
				System.out.println(num);
				System.out.println(num2);
			}
		}
		Inner in = new Inner();
		in.disp();
	}
}
public class MemberInnerTest {
	public static void main(String[] args) {
		Outter o = new Outter();
		o.Output();
	}
}

 

Anonymous inner class

package inner;
abstract class Abs{
	abstract void disp();	// "disp"
}

class Outter{
	private static int num = 0;
	private static int num2 = 3;
	
	public void output(){
		new Abs() {
			@Override
			void disp() {
				System.out.println(num);
				System.out.println(num2);
			}
		}.disp();
	}
	
}
public class MemberInnerTest {
	public static void main(String[] args) {
		Outter out = new Outter();
		out.output();
	}
}

 

'study > JAVA 전문가' 카테고리의 다른 글

mysql 3  (0) 2021.12.17
DBMS  (0) 2021.12.15
자료구조 2 - 복습  (0) 2021.12.10
자료구조 1  (0) 2021.12.09
Wrapper Class, 제너릭, ,,  (0) 2021.12.08

복습

추상화

  • 내가 물건을 파는 사람이라고 생각
  • 이것을

캡슐화

  • 어떻게 흘러가는지 100% 파악
  • 데이터 손실이 발생했을 때 찾기 쉽다 : DB

상속

  • 물려받는 것
  • 내 것이 아닌데 생기는 것
  • 관계를 명확해야한다.
  • 확장성, 유지보수
  • 설계를 잘 해야한다.
  • 남들이 봤을 때 잘 보이게
  • Class관계
    • Has ~ A관계 (~가 ~를 가지고 있다.) => 임베디드 오브젝트
      • 상식적인 선에서 관계를 맺어야 한다.
    • Is ~ A관계 (~는 ~이다.) => 상속
      • is like관계 X
      • ~는 ~와 같다 X

 

인터페이스

  • 다중상속 대체 
  • 기능 가지고 있지 않다.
    • 강제성 부여
  • 인터페이스만 봐도 '저런 동작을 하구나'를 안다. 
  • 메뉴판과 같다.

 

코드 리뷰

  • 생성자에서 상수 크기, 변수 초기화
    • 잘게 쪼개라
  • protected 
    • private : 오직 메소드를 통해서만 사용 할 수 있다. (getter/setter)
  • abstract : 
    • 행위는 똑같지만, 안에 내용이 다를 때
  • 동적 바인딩
    • 부모가 아는 것만 접근 O
  • final : 꼭 써야 할 때
  • 초기화 null 해야함

 

'study > JAVA 전문가' 카테고리의 다른 글

DBMS  (0) 2021.12.15
inner  (0) 2021.12.10
자료구조 1  (0) 2021.12.09
Wrapper Class, 제너릭, ,,  (0) 2021.12.08
arrays 클래스  (0) 2021.12.08

+ Recent posts