8/4 [JAVA]-연산자 [DATABASE]-데이터 제한 및 정렬
<오전 자바 수업>
[연산자]
연산: 정해진 규칙에 따라 데이터를 처리하여 결과를 산출하는 것
식: 연산의 과정을 기술한 것
a++ 단한연산자
a+b 이항연산자
a?b:c 삼항연산자
단항 연산자: 증감연산자
이항 연산자: 대입연산자, 산술연산자, 비교연산자, 논리연산자, 비트연산자, 시프트연산자
삼항 연산자: 삼항연산자
산술연산자: 숫자를 연산하는 연산자
+:더하기
-: 빼기
*: 곱하기
/: 몫
%: 나머지
예제1)
int num1 =10;
int num2 = 7;
System.out.println(num1/num2); ->1
System.out.println(num1%num2); ->3
예제2)
int num1 = 10;
int num2 = 7;
float num3 = 10f; //10.0
float num4 = 7f; //7.0
System.out.println(num1/num2); //정수,정수->1
System.out.println(num3/num4); //실수,실수->1.4285715
System.out.println(num3/num2); //실수,정수->1.4285715
예제3)
int num1 = 10; ->숫자
int num2 = 7; -> 숫자
System.out.println(num1+num2); ->17
String num1="10" -> 문자열
String num2="7" -> 문자열
System.out.println(num1+num2); ->107
int num1 = 10;
String num2 = "7";
System.out.println(num1+num2); ->107
예제4)
String a= 10 + 7 + "";
String b= 8 + "" + 2;
String c= "" + 5 + 2;
System.out.println(a); ->17
System.out.println(b); ->82
System.out.println(c); ->52
* f붙으면 실수랑 10f=10.0
정수+실수 더하면 무조건 실수가 된다
숫자+문자 더하면 무조건 문자열이 된다
예제5)
num1, num2 의 더하기, 빼기, 곱하기, 나누기 결과 값을 출력하세요.
(단, 나누기 결과 값은 아래와 같은 실수로 표현하세요.)
(num1 = 7, num2 =3)
10
4
21
2.3333333
package 연산자;
public class Ex01산술연산 {
public static void main(String[] args) {
int num5 =7;
int num6 =3;
//합
int sum = num5+num6;
//차
int minus = num5-num6;
//곱
int mul = num5*num6;
//나누기
double div = (double)num5/num6;
System.out.println("더하기 결과 : "+ sum);
System.out.println("뺀 결과 : " + minus);
System.out.println("곱하기 결과 : "+ mul);
System.out.println("나누기 결과 : "+ div);
//정수값 2 나온다.
System.out.printf("나누기 결과 : %.2f",div);
//%f: 실수 %d: 정수 %s: 문자열
//%.2f=> 실수는 소수점 2번째 짜리 까지 출력하고 싶어요
}
}
System.out.println((float)num5/num6); -> 강제 형변환
%d: 정수 ex) 1,2,3,4,5,6,7
%f: 실수 ex) 1.213547
%s: 문자열
예제
백의 자리 아래를 버리는 코드를 작성하세요
출력값-> 결과 확인 : 400
package 연산자;
public class Ex02산술연사2 {
public static void main(String[] args) {
int num1 =456; //400 123->100
int result = num1/100*100;
System.out.println("결과 확인 : "+ result);
}
}
예제
JAVA,Web,Android 점수를 키보드로 입력 받아 합계와 평균을 출력하세요.
출력값
JAVA 점수 입력: 25
WEB 점수 입력: 32
ANDROID 점수 입력 : 37
합계: 94
평균: 31.33
package 연산자;
import java.util.Scanner;
public class Ex03산술연사3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("JACA 점수 입력: ");
int javaScore = sc.nextInt();
System.out.print("WEB 점수 입력: ");
int webScore = sc.nextInt();
System.out.print("ANDROID 점수 입력: ");
int andScore = sc.nextInt();
//합계
int total = javaScore+ webScore + andScore;
//평균
double avg = total/3.0;
//3.0 -> 실수로 바뀌는것
System.out.println("합계: " + total);
System.out.printf("평균: %.2f\n" , avg);
//%.2f 실수를 소수점 둘째자리까지 나타나게 하겠금 사용
}
}
예제
초를 입력 받아 [시,분,초] 형태로 출력하세요.
초 입력: 3723
1시 2분 3초
package 연산자;
import java.util.Scanner;
public class Ex04산술연사자4 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//1분->60초 5분->300초 10분 -> 600초, 60분->3600초
// /=>몫 %나머지
System.out.print("초 입력 : ");
int input = sc.nextInt();
//시
int hour = input/3600;
//->3723에서 시간을 구하기 위해 input 3600으로 나는 몫을 구하면 몫은 1이다.
//분
int min = input%3600/60;
//3723에서 분을 구하기 위해 input 3600으로나는 나머지에서 분을 구해야 되니까60으로 나눠서 몫을 구해준다.
//초
int sec = input%3600%60;
//3723에서 분을 구하기 위해 sec를 3600으로 나누어 나머지를 구한다
System.out.print(hour +"시 ");
System.out.print(min + "분 ");
System.out.print(sec + "초 ");
}
}
[대입연산자]
: 연산의 결과를 담을 때 사용하는 연산자
대입연산자 예제1
int num = 29;
num -=2; -> num=num(29)-2;
System.out.println(num); ->27
대입연산자 예제2
int num =29;
num -=2+3*4; -> num = num(29)-(2+3*4);
system.out.println(num); -> 15
[증감연산자]
: 변수에 저장된 값을 1증가 혹은 1감소해주는 연산자
증감연산자 예제1
int i = 3;
System.out.println(++i) ->4(1증가후 출력)
System.out.println(i++) ->4(출력후 1증가)
System.out.println(i) ->5
증감연산자 예제2
int i = 5;
System.out.println(--i); ->4(1감소 후 출력)
int j = 5;
System.out.println(j--); ->5(출력 후 1감소)
증감연산자 예제3
int opr=0;
opr+=3; ->3
System.out.println(opr++); ->3(출력 후 1증가)
System.out.println(opr); ->4
System.out.println(++opr); ->5(1증가 후 출력)
System.out.println(opr); ->5
System.out.println(opr--); ->5(출력 후 1감소)
System.out.println(opr; ->4
System.out.println(--opr); ->3(1감소 후 출력)
System.out.println(opr); ->3
[비교연산자]
:부등호 연산, 같다/ 다르다 연산자
비교연산자 예제1
int a = 3;
int b = 10;
System.out.println(a==b); -> false
System.out.println(a!=b); -> true
System.out.println(a>b); -> false
System.out.println(a<b); -> true
[논리연산자]
: NOT, AND, OR 연산자
[논리연산자]
1) NOT 연산자: 명제의 반대
!(참 명제) ->false
!(거짓 명제) ->true
2) AND 연산자 : 둘 다 참일 경우에만 true
(참 명제) && (참 명제) -> true
(거짓 명제) && (거짓 명제) -> false
(참 명제) && (거짓 명제) -> false
(거짓 명제) && (참 명제) -> false
2) OR 연산자 : 둘 다 거짓일 경우에만 false
(참 명제) || (참 명제) -> true
(거짓 명제) || (거짓 명제) -> false
(참 명제) || (거짓 명제) -> true
(거짓 명제) || (참 명제) -> true
논리연산자 예제1
int a =3;
int b =10;
System.put.println(!(a>b); ->true
System.out.println((1<3)&&(4<5)); ->true
System.out.println((2<1)&&(4<5)); ->false
System.out.println((1<3)||(4<2)); ->true
System.out.println((2<1)||(4<2)); ->false
[삼항연산자]
:간단한 제어 처리
삼항연산자 예제1
int i = 3;
int j =10;
System.out.println(i==j ? "같다" : "다르다" ); -> 다르다
삼항연산자 예제2
정수를 입력받아 홀수인지 짝수인지 판별하세요.
package 연산자;
import java.util.Scanner;
public class EX05삼항연산1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("정수 입력 :");
int num =sc.nextInt();
String result = (num%2==0)? "짝수" : "홀수";
System.out.printf("%d는(은) %s입니다", num, result);
}
}
Baekjoon Online Judge
Baekjoon Online Judge 프로그래밍 문제를 풀고 온라인으로 채점받을 수 있는 곳입니다.
www.acmicpc.net
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
<오후 data base>
[전날 복습]
3 select distinct * column alias
// colum_name을 쓰는 select list절이다 -> 보고자하는 data 소유
명시된 colum의 data가 결과로 출력이된다
// 여기서 distinct는 중복제거 이고 전체 문법에서 단 한번만 사용한다
// * -> 모든 column 볼때 사용
// column의 특정 column의 데이터를 보고 자할때 작성 -> 열머리글로 출력이 된다
// alias ->출력이되는 열, 1개의 column 당 1개의 alias 사용가능
[alias 주는 방법]
as = 단일문장 출력
공백 = 대문자 출력
" " = 복수문장을 alias로 주고 싶을때, 대소문자구분해서 사용할때
1 from
여기에 table_name작성해서 처리한다
2 where
행을 제안하는 조건절이다
1. 조건식 명시 -> column 연산자 value
2. 값 명시 할때는 날짜 값과 문자값에 ' ' 붙여라
3. 값 명시 할때는 table에 저장된 data 형식을 그대로 사용해야 한다
[산술연산]
column + 산술연산
column + column
1. 숫자데이터에서 가능
2. 문자 데이터에서는 불가능
3. 날짜 데이터에서는 일수 + - 가능
null에 대한 산술연산자는 null 이다.
SQL*Plus: Release 11.2.0.2.0 Production on 목 8월 4 21:36:30 2022
Copyright (c) 1982, 2014, Oracle. All rights reserved.
SQL> conn hr/hr
Connected.
SQL> column last_name format a20
SQL>
// conn hr/hr 로 접속을 한다음에 column last_name format a20을 사용하여 출력문장을 깔끔하게 만들어 준다
[다른 비교 조건]
between...and... 두 값 사이(지정한 값 포함), 두 값 사이의 범위에서 구한다
in(set) 값 목록 중의 값과 일치, 복수 연산자, 똑같은것 여러개를 동시에 찾을때
like 문자 패턴 일치
is null 널값
[between 조건 사용]
between 조건을 사용하여 값의 범위에 따라 행을 표시합니다.
SQL> select last_name, salary
2 from employees
3 where salary between 2500 and 3500;
//사원의 이름과, 2500~3500 급여 사이를 받는 사원들을 구하여라
// 2500은 하한, 3500은 상한
between 범위 조건을 사용하면 값의 범위에 따라 행을 표시할 수 있으며 지정 범위에는 하한값과 상한값이 포함됩니다.
슬라이드의 select문은 employess 테이블에서 급여가 $2,500 이상이고 3,500 이하인 사원의 행을 반환합니다.
between 조건으로 지정한 값도 범위에 포함되며 하한값을 먼저 지정해야 합니다.
[in 조건 사용]
in 멤버 조건을 사용하면 값이 목록에 있는지 확인할 수 있습니다.
SQL> 1 select employee_id, last_name, salary, manager_id
2 from employees
3* where manager_id in (100,101,201)
// 관리자의 사원 번호가 100,101,201인 모든 사원의 번호.이름. 급여, 관리자 사원 번호를 표시합니다.
// 괄호안의 숫자는 ,로 구별해서 쭉 작성하여도 된다
SQL> 1 select employee_id, manager_id, department_id
2 from employees
3* where last_name in('Hartstein', 'Vargas')
//목록에 사용되는 문자 또는 날짜는 작은 따옴표('')로 묶어야 합니다.
[like 조건사용]
- like 조건을 사용하면 유효한 검색 문자열 값인 대체 문자를 사용하여 검색할 수 있습니다
- 검색 조건은 리터럴 문자 또는 숫자를 포함할 수 있습니다
- %에는 문자가 오지 않거나 여러개 올 수 있습니다, 문장 전체 의미
- _ 에는 문자가 하나만 올 수 있습니다, 문자 하나 의미
SQL> 1 select first_name
2 from employees
3* where first_name like 'S%'
//이름이 S로 시작하는 모든 사원의 이름을 출력합니다. 이 경우 대문자 S를 사용했으므로 소문자 s로 시작하는 이름은 반환되지 않습니다.
SQL> 1 select first_name, hire_date
2 from employees
3* where hire_date like '06%'
//2006년에 입사한 모든 사원의 이름과 입사일을 출력하시오
//6월에 입사한 사원을 찾으려면 '___06%' 이렇게 해주면 값이 출력된다(_언더바 3개)
* 이름 = '이%' -> 이름을 찾아라는 뜻이다
- 패턴 일치 문자를 결합할수 있다
ex) '%d_'
[null 조건 사용]
is null 연산자를 사용하여 널 여부를 테스트 합니다.
SQL> select last_name, manager_id
2 from employees
3* where manager_id is null
//관리자가 없는 모든 사원의 이름과 관리자를 츨력한다.
- null 조건에는 is null 조건과 is not null 조건이 있습니다.
is null 조건은 널 여부를 테스트 합니다. 널 값은 알 수 없는 값으로서 사용, 할당 및 적용할 수 없습니다.
널 값은 어떤 값과도 동일성 여부를 판별할 수 없으므로 = 를 사용하여 테스트할 수 없습니다.
[논리 조건]
AND -> 구성 요소 조건이 모두 true면 true를 반환합니다.
OR -> 구성 요소 조건 중 하나라도 true면 true를 환합니다.
NOT -> 뒤따르는 조건이 false면 true를 반환 합니다.
[and 연산자 사용]
and 는 조건이 모두 true여야 합니다.
SQL> 1 select employee_id, last_name, job_id, salary
2 from employees
3 where salary>=10000
4* and job_id like '%MAN%'
// 사번, 이름, 업무 ID에 MAN이 포함되는 급여가 10,000이상인 사원만 출력하시오
[and 진리표]
다음 표는 and로 두 표현식을 결합한 결과를 표시합니다.
and | true | false | null |
true | true | false | null |
false | false | false | false |
null | null | false | null |
[or 연산자 사용]
or는 조건 중 하나가 true면 됩니다.
SQL> 1 select employee_id, last_name, job_id, salary
2 from employees
3 where salary>=10000
4* or job_id like '%MAN%'
// 직원의 사번,직종,급여가 10000이상 이거나 직종에 MAN단어를 포함하는 사원을 출력하시오
[or 진리표]
다음 표는 or 로 두 표현식을 결합한 결과를 표시합니다.
or | true | false | null |
true | true | true | true |
false | true | false | null |
null | true | true | null |
[not 연산자 사용]
SQL> 1 select last_name, job_id
2 from employees
3* where job_id not in('IT_PROG', 'ST_CLERK','SA_REP')
// 업무ID가 IT_PROG, ST_CLERK, SA_REP가 아닌 모든 사원의 이름과 업무ID를 표시합니다.
[우선순위 규칙]
우선순위 규칙은 표현식을 평가하고 계산하는 순서를 결정합니다. 먼저 계산할 식의 좌우에 괄호를 사용하여 기본 순서를 무시하고 우선순위를 변경할 수 있습니다.
계산 순서 | 연산자 |
1 | 산술 연산자 |
2 | 연결 연산자 || |
3 | 비교 조건 |
4 | is[not] null,like,[not]in |
5 | [not] between |
6 | not 논리 조건 |
7 | and 논리 조건 |
8 | or 논리 조건 |
SQL> 1 select last_name, job_id, salary
2 from employees
3 where job_id= 'SA_REP'
4 or job_id = 'AD_PRES'
5* and salary>15000
// 첫번째 조건은 업무id가 AD_PRES면서 급여가 15,000을 넘어야 한다
// 두번째 조건은 업무ID가 SA_REP여야 합니다.
SQL> 1 select last_name, job_id, salary
2 from employees
3 where (job_id= 'SA_REP'
4 or job_id = 'AD_PRES')
5* and salary>15000
// 첫번째 조건은 업무id가 AD_PRES 또는 SA_REP여야 합니다.
// 두번째 조건은 급여가 15,000을 넘어야 한다
[order by절]
- order by절을 사용하여 행을 정렬합니다.
asc:오름차순, 기본값
desc: 내림차순
- order by 절은 select 문의 가장 끝에 둡니다.
SQL> select last_name, job_id, department_id, hire_date
2 from employees
3 order by hire_date;
// 사원이 이름, 직종,부서이름, 입사일을 입사일 순서대로 정의한다
// asc를 붙여도 되지만 기본값이므로 작성안하여도 된다
[내림차순으로 정렬]
-기본 정렬 순서는 오름차순 입니다.
- 숫자 값은 작은 값부터 표시됩니다. (예: 1-999)
- 날짜 값은 이른 값부터 표시됩니다. (예: 01-jan-92 가 01-jan-95보다 먼저 표시됨)
- 문자 값은 영문자순으로 표시됩니다(예: A가 먼저 표시되고 Z가 나중에 표시됨)
- 널 값은 오름차순에서는 마지막에 표시되고 내림차순에서는 처음에 표시됩니다.
SQL> select last_name, job_id, department_id, hire_date
2 from employees
3 order by hire_date desc;
// 모든 사원의 직업, 부서이름, 입사일에서 가장 최근에 입사한 사원 순으로 결과를 출력하시오
[열 별칭을 기준으로 정렬]
SQL> select employee_id, last_name, salary*12 annsal
2 from employees
3 order by annsal;
// 사번, 이름, 연봉에서 연봉을 ANNSAL로 작성하여 출력한다.
[여러 열을 기준으로 정렬]
- order by 목록의 순서가 정렬 순서입니다.
- select 목록에 없는 열을 기준으로 정렬할 수도 있습니다.
//모든 사원의 이름과 급여를 표시하고 부서 번호를 기준으로 정렬한 후 급여를 기준으로 내림차순으로 결과를 정렬합니다.
SQL> 1 select last_name, department_id salary
2 from employees
3* order by department_id, salary desc
[SQL 연습문제]
1. 연봉이120000 이상되는 사원들의 이름 및 연봉을 출력하시요.
SQL> select last_name, salary*12
2 from employees
3 where salary*12>=120000;
2. 사원번호가 176인 사원의 이름과 부서 번호를 출력하시오.
SQL> select last_name, department_id
2 from employees
3 where employee_id=176;
3. 연봉이 150,000 에서 200,000의 범위 이외인 사원들의 이름 및 연봉을 출력하시오. 단 연봉은 AnnSal로 출력하시오
SQL> 1 select last_name, salary*12 "AnnSal"
2 from employees
3 where salary*12 not between 150000 and 200000;
4. 2003/01/01 일부터 2005/05/30 일 사이에 고용된 사원들의 이름, 사번, 고용일자를 출력하시오. 고용일자를 역순으로 정렬하시오.
SQL> 1 select last_name, employee_id, hire_date
2 from employees
3 where hire_date between '03/01/01' and '05/05/30'
4* order by hire_date desc
5. 20번 및 50번 부서에서 근무하는 모든 사원들의 이름 및 부서 번호를 알파벳순으로 출력하시오
SQL> 1 select last_name, department_id
2 from employees
3 where department_id in (20,50)
4* order by department_id asc;
//asc는 기본값 오름차순이므로 생략 가능
6. 20번 및 50번 부서에 근무하며, 연봉이 200,000 ~ 250000 사이인 사원들의 이름 및 연봉을 출력하시오
SQL> 1 select last_name, salary*12
2 from employees
3 where department_id in (20,50)
4* and salary*12 between 200000 and 250000
7. 2006년도에 고용된 모든 사람들의 이름 및 고용일을 조회한다
SQL>1 select last_name, hire_date
2 from employees
3* where hire_date like '06%'
8. 매니저가 없는 사람들의 이름 및 업무를 출력하시오.
SQL> select last_name, job_id
2 from employees
3 where manager_id is null;
9. 매니저가 있는 사람들의 이름 및 업무, 매니저번호를 조회한다.
SQL> select last_name, job_id, manager_id
2 from employees
3 where manager_id is not null;
10. 커미션을 받는 모든 사원들의 이름, 연봉 및 커미션을 출력하시오.
- 연봉을 역순으로 정렬하고, 연봉은 ANNSAL로 출력하시오/
SQL> select last_name, salary*12 as ANNSAL, commission_pct
from employees
where commission_pct is not null
order by ANNSAL desc;
11. 이름의 네번째 글자가 a인 사원의 이름을 조회하시오
SQL> 1 select last_name
2 from employees
3* where last_name like '___a%'
12. 이름에 a 및 e 글자가 있는 사원의 이름을 조회하시오
SQL> select last_name
2 from employees
3 where last_name like '%a%' and last_name like '%e%';
13. 급여가 2500,3500,7000이 아니며 직업이 SA_REP나 ST_CLERK인 사원의 이름과, 급여, 직업을 출력하시오
SQL>1 select last_name, salary, job_id
2 from employees
3 where salary not in(2500,3500,7000)
4* and job_id in ('SA_REP', 'ST_CLERK')