-- 테이블


--DROP TABLE employee; --테이블 잘못 생성시 이걸로 삭제하세요 !


--테이블 생성

CREATE TABLE employee( /*테이블 소괄호 */

     empno NUMBER(6), name VARCHAR2(20) NOT NULL, salary NUMBER(8,2)/*소숫점 2짜리 까지 명시*/, hire_date DATE DEFAULT SYSDATE, 

     CONSTRAINT employee_pk_empno PRIMARY KEY(empno) 

) ; 


--기본키와 외래키를 적용해서 테이블 생성


CREATE TABLE suser(

     id VARCHAR2(20) ,

     name VARCHAR2(20),

     CONSTRAINT suser_pk_id PRIMARY KEY (id)

);


--아이디를 참조하는 테이블


CREATE TABLE sboard(

     num NUMBER,

     id VARCHAR2(20) NOT NULL ,

     content VARCHAR2(4000) NOT NULL,

     CONSTRAINT sboard_pk_num PRIMARY KEY(num),

     CONSTRAINT sboard_suser_fk1 FOREIGN KEY(id) REFERENCES suser(id)

);


--테이블 관리 


--add 연산자 : 테이블에 새로운 컬럼을 추가


ALTER TABLE employee ADD(addr VARCHAR2(50)); --addr VARCHAR2(50)의 컬럼을 생성


-- 제약조건추가


ALTER TABLE employee ADD CONSTRAINT employee_pk PRIMARY KEY (id); --원래 있는거라 에러남


--modify 연산자 : 테이블의 컬럼을 수정하거나 NOT NULL 컬럼으로 변경


ALTER TABLE employee MODIFY (salary NUMBER(10,2) NOT NULL);


--drop 연산자 : 컬럼의 삭제 


ALTER TABLE employee DROP COLUMN addr;


--rename 연산자 : 컬럼명 변경


ALTER TABLE employee RENAME COLUMN salary to sal;


--테이블명 변경


RENAME employee to employee2;


--테이블의 삭제


DROP TABLE employee2;


--join : 둘이상의 테이블을 연결하여 데이터를 검색하는 방법


--CARTESIAN PRODUCT (카티션 곱) : 검색하고자 했던 데이터뿐 아니라 조인에 사용된 테이블의 모든 데이터가 반환되는 현상


SELECT * FROM emp,dept;


--카티션 곱은 다음과 같은 경우 발생

-- 1-조인 조건을 정의하지 않았을 경우

-- 2-조인 조건이 잘못된 경우

-- 3-첫 번째 테이블의 모든 행들이 두 번째 테이블의 모든 행과 조인이 되는 경우


-- join 방법 


--<oracle 전용>

--조건절 Equality condition (=)에 의하여 조인이 이루어짐


SELECT emp.ename, dept.loc FROM emp,dept WHERE emp.deptno = dept.deptno;


-- 테이블에 알리아스 부여하기


SELECT e.ename, d.dname FROM emp e , dept d WHERE e.deptno = d.deptno;


-- 추가적인 조건 명시하기


SELECT e.ename, d.dname FROM emp e , dept d WHERE e.deptno = d.deptno AND e.ename = 'ALLEN';


SELECT e.ename, e.sal, d.dname FROM emp e ,dept d WHERE e.deptno = d.deptno AND e.sal BETWEEN 3000 AND 4000;


-- 비 동등 조인 (non equi join)

-- 테이블의 어떤 column도 join할 테이블의 column에 일치하지 않을 때 사용하고 조인 조건은 동등 (=) 이외의 연산자를 갖음

-- (Between and , is null, is not null, in not in)


-- 사원이름, 급여 , 급여등급 구하기 (emp,salgrade 테이블 이용)


SELECT e.ename, e.sal, s.grade FROM emp e, salgrade s WHERE e.sal Between s.losal and s.hisal;


-- self Join 


-- 사원이름과 해당 사원의 관리자 이름 구하기 (관리자가 없는 사원 제외)


SELECT a.ename 사원이름 , m.ename 관리자이름 FROM emp a, emp m WHERE a.mgr = m.empno;


-- 외부 조인(outer Join) 누락된 내용을 볼 수 있음

-- equi join 문장들은 두개의 테이블의 두개 컬럼에서 공통된 값이 없다면 테이블로부터 데이터를 반환하지 않는 다는 것.

-- 정상적으로 조인 조건을 만족하지 못하는 행들을 보기 위해 outer join 사용


SELECT distinct /* 중복값을 제거 해줌*/ (e.deptno)  , d.deptno FROM emp e , dept d WHERE e.deptno (+)= d.deptno;


--사원이름과 해당 사원의 관리자 이름 구하기 ( 관리자가 없는 사원도 표시)


SELECT a.ename 사원이름 , m.ename 관리자이름 FROM emp a, emp m WHERE a.mgr = m.empno(+);


--[실습문제]


-- 1) 모든 사원의 이름,부서번호,부서이름을 표시하시오 (emp, dept)

-- 2) 업무가 MANAGER인 사원의 정보를 이름,업무,부서명,근무지 순으로 출력하시오. (emp, dept)


SELECT a.ename 이름,a.deptno 부서번호, d.dname 부서이름 FROM emp a ,dept d WHERE a.deptno = d.deptno;

SELECT a.ename 이름, a.job 업무, d.dname 부서명,d.loc 근무지 FROM emp a , dept d WHERE a.deptno = d.deptno and a.job = 'MANAGER';


-- 3) 커미션 계약을 맺고 급여가 1,600 이상인 사원의 사원이름,부서명,근무지 출력

-- 4) 근무지가 시카고(CHICAGO)인 모든 사원의 이름,업무,부서번호 및 부서이름을 출력

-- 5) 근무지(loc)별로 근무하는 사원의 수가 5명 이하인 경우, 인원이 적은 도시 순으로 정렬하시오.(근무 인원이 0명인 곳도 표시)


SELECT e.ename 사원이름,e.sal 급여, d.dname 부서명 ,d.loc 근무지 FROM emp e, dept d WHERE e.deptno = d.deptno and e.comm IS NOT NULL and e.sal>=1600;

SELECT e.ename 사원이름,e.job 업무 , e.deptno 부서번호, d.dname 부서이름 FROM emp e, dept d WHERE e.deptno = d.deptno and  d.loc ='CHICAGO';

SELECT  d.loc 도시, count(e.empno) emp_number   FROM emp e, dept d WHERE e.deptno(+) = d.deptno  GROUP BY d.loc  Having count(e.empno)<=5 ORDER BY  emp_number;


-- 6) 사원의 이름 , 사원번호, 관리자의 이름, 관리자번호를 표시하고 각각의 열 레이블은 Employee , emp# , manager, mgr# 으로 지정 (관리자가 없으면 출력 x)

-- 7) 관리자보다 먼저 입사한 모든 사원의 이름 및 입사일을 관리자의 이름 및 입사일과 함께 표시하고 열 레이블을 각각  Employee , emp hired , manager, mgr hired 로 지정 (관리자가 없으면 출력 x)


SELECT a.ename Employee ,a.empno emp#,  m.ename manager ,m.empno manager# FROM emp a, emp m WHERE a.mgr = m.empno;

SELECT a.ename Employee ,a.empno "emp hired",  m.ename manager ,m.empno "mgr hired" FROM emp a, emp m WHERE a.mgr = m.empno and a.hiredate<m.hiredate;


-- 8) 지정한 부서번호, 사원이름 , 지정한 사원과 동일한 부서에서 근무하는 모든사원을 표시하도록 질의를 작성하고 부서번호 department 사원이름 employee, 동일한 부서에서 근무하는 사원은 colleague 표시

--   (부서번호,사원이름,동료순으로 오름차순 정렬)

-- 9) 10번 부스에서 근무하는 사원들의 부서번호 ,부서이름, 사원이름, 월급, 급여등급을 출력하시오. 


SELECT e.deptno department, e.ename employee, c.ename colleage FROM emp e , emp c WHERE e.deptno=c.deptno AND e.empno<>c.empno ORDER BY e.deptno,e.ename,c.ename;

SELECT e.deptno, d.dname , e.ename, e.sal, s.grade FROM emp e , dept d, salgrade s WHERE e.deptno=d.deptno AND e.sal  BETWEEN s.losal and s.hisal AND e.deptno=10;


-- 표준 SQL

-- 내부조인(inner join)

SELECT e.ename , d.deptno FROM emp e INNER JOIN dept d ON  e.deptno =d.deptno;


--join 사용시 on절을 정의하고 부가적인 조건이 있으면 where절 사용

          

SELECT e.ename, d.dname FROM emp e JOIN dept d ON e.deptno =d.deptno WHERE e.ename = 'ALLEN';


--만약 조인 조건에 사용된 컬럼의 이름이 같다면 다음과 같이 using절 사용하여 조인 조건을 정의할 수 있음.


/*주의 using에 사용된 컬럼은 테이블명 또는 테이블 알리아스를 붙이지 않음*/


SELECT e.ename, d.dname FROM emp e JOIN dept d USING(deptno) WHERE e.ename = 'ALLEN';


--salf JOIN


--사원이름과 해당 사원의 관리자 이름 구하기 (관리자 없는 사원은 제외)


SELECT e.ename, m.ename manager_name FROM emp e Join emp m ON e.mgr = m.empno;


-- 외부 조인 (Outer Join)  : 누락된 행의 방향 표시


SELECT distinct(e.deptno), d.deptno FROM emp e JOIN dept d ON e.deptno =d.deptno;


-- 사원이름과 해당 사원의 관리자이름 구하기 (관리자가 없는 사원도 표시)


SELECT e.ename name , m.ename manager_name FROM emp e LEFT OUTER JOIN emp m ON e.mgr = m.empno;


-- 10) 업무가 MANAGER 인 사원의 정보를 이름,업무,부서명,근무지 순으로 출력하시오.

-- 11) 커미션을 받고 급여가 1,600 이상인 사원이름 급여 부서명 근무지 출력

-- 12) 근무지(loc) 별로 근무하는 사원의 수가 5명 이하인 경우 인원이 적은 도시 순으로 정렬 (근무 인원 0명인 곳도 표시, 근무지 근무인원)


SELECT e.ename , e.job , d.dname , d.loc  FROM emp e JOIN dept d ON  e.deptno = d.deptno WHERE e.job='MANAGER' ;

SELECT e.ename  , e.sal, d.dname , d.loc FROM emp e JOIN dept d ON e.deptno = d.deptno WHERE e.comm IS NOT NULL and e.sal >=1600 ;

SELECT d.loc,COUNT(e.empno) emp_member FROM emp e RIGHT OUTER JOIN dept d ON e.deptno = d.deptno GROUP BY d.loc HAVING/*해빙절에서 as 사용불가*/ COUNT(e.empno)<=5 ORDER BY emp_member ASC;


-- 13) 10번부서에서 근무하는 사원들의 부서번호, 부서이름 , 사원이름 , 월급, 급여등급을 출력하시오.


SELECT e.deptno, d.dname ,e.ename, e.sal , s.grade FROM emp e INNER JOIN dept d ON e.deptno =d.deptno INNER JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal WHERE e.deptno=10;


--집합 연산자


-- union : 합집합, 중복값 제거 (유니온은 두 테이블의 결합을 나타내며, 결합시키는 두 테이블의 중복되지 않은 값들을 반환


SELECT deptno FROM emp UNION SELECT deptno FROM dept;


-- union all : union과 같으나 두 테이블의 중복되는 값까지 반환


SELECT deptno FROM emp UNION ALL SELECT deptno FROM dept;


--intersect : 두 행의 집합 중 공통된 행을 반환 (교집합) 


SELECT deptno FROM emp INTERSECT SELECT deptno FROM dept;


-- minus : 첫번째 select 문에 의해 반환되는 행 중에서 두번째 select문에 의해 반환되는 행에 존재하지 않는 행들을 보여줌 (차집합)


SELECT deptno FROM dept MINUS SELECT deptno FROM emp;

'프로그래밍 > sql,php' 카테고리의 다른 글

sql> PL/SQL 2일차  (0) 2018.11.22
sql>오라클 DB수업 6일차 + PL/SQL START  (0) 2018.11.21
sql> 오라클db 수업 3일차  (0) 2018.11.16
sql> 오라클 sql 수업 2일차  (0) 2018.11.15
sql> 오라클 sql 수업 1일차  (0) 2018.11.14



--TO_NUMBER : 문자 -> 숫자


SELECT TO_NUMBER('100','999') FROM dual;

SELECT TO_NUMBER('100') FROM dual; --포멧문자 생략 가능


--일반 함수


-- NVL(value1,value2) : v1이 null 이면 v2를 사용 , val1과 val2의 자료형을 일치해야함


SELECT ename,sal,NVL(comm,0) commission, NVL((comm*12)+(sal*12),0) "Annual Salary" FROM emp ORDER BY commission;

-- SELECT ename,NVL(comm,'NO commission') commission FROM emp; --자료형이 맞지 않아 사용이 불가능하다

SELECT ename, NVL(TO_CHAR(comm),'NO commission') commission FROM emp; --TO_CHAR로 자료형을 맞춰줘서 사용이 가능함.


-- NVL2(value1,value2,value3)valuel1 이 null 인지 평가 null 이면 value3 , null이 아니면 value2 자료형이 일치하지 않아도 됨.


SELECT ename, NVL2(comm,'commission','no commission') commission FROM emp; 


--NULLIF(value1,value2) : 두개의 값이 일치하면 null , 두개의 값이 일치하지 않으면 value1


SELECT  NULLIF(LENGTH(ename),LENGTH(job)) "NULLIF" FROM emp; --길이가 같으면 NULL


-- coalesce(value1,value2,value3) : null 값이 아닌 값을 사용 // 자료형을 일치시켜야함


SELECT comm,sal,COALESCE(comm,sal,0) FROM emp; --널을 제외하여 사용 


--안시 표준


--case 컬럼 when 비교값 then 결과값

--             when          then

--             when          then

--             (else 결과값)

-- end


SELECT ename, sal,job, CASE job WHEN 'SALESMAN' THEN sal*0.1 WHEN 'MANAGER' THEN sal*0.2 WHEN 'ANALYST' THEN sal*0.3 ELSE sal*0.4 END "Bonus" FROM emp; --셀러리맨 10프로 매니저 20프로 아날리스트 30프로 나머지 40프로 ="보너스"로 출력

SELECT ename,sal,job, CASE WHEN sal>=4000 AND sal <=5000 THEN 'A' WHEN sal>=3000 AND sal < 4000 THEN 'B' WHEN sal>=2000 AND sal <3000 THEN 'C' WHEN sal>=1000 AND sal <2000 THEN 'D' ELSE 'F' END "GRADE" FROM emp;


-- 오라클 전용


--decode : = 비교만 가능

--decomde(컬럼, 비교값, 반환값,

--                    비교값, 반환값,

--                    비교값, 반환값,

--                    반환값)


SELECT ename, sal ,job, DECODE(job,'SALESMAN',sal*0.1,'MANAGER',sal*0.2,'ANALYST',sal*0.3,sal*0.4) "Bonus" FROM emp;

SELECT ename, sal ,job, DECODE (TRUNC(sal/1000),5,'A',4,'B',3,'C',2,'D',1,'E','F') "GRADE" FROM emp;


-- [실습문제]

-- 9) 이름(소문자로 표시) ,업무, 근무연차(MONTH_BETWEEN)를 출력하시오.

-- 10) 사원이름,월급,월급과 커미션을 더한값을 컬럼명: 실급여라고 해서 출력 단,Null값은 나타나지 않게 .

-- 11) 월급과 커미션을 합친 금액이 2,000이상인 급여를 받는 사원의 이름 업무 월급 커미션 고용날짜를 출력하시오.  단,고용날짜는 1980-12-17 형식으로 출력하시오.



SELECT LOWER(ename), job ,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) 근무연차 FROM emp;

SELECT ename,sal,sal+NVL(comm,0) 실급여 FROM emp; 

SELECT ename,job,sal,NVL(comm,0) 커미션,TO_char(HIREDATE,'YYYY-MM-DD') 고용날짜 FROM emp where sal+ NVL(comm,0)>=2000 ;


-- 12) DEcode 함수를 사용하여 다음 데이터에 따라 job 열의 값을 기준으로 모든 사원의 등급을 표시하시오. 업무 PRESIDENT  등급 A , 업무 ANALYST  등급 B  업무 MANAGER  등급 C  업무 SALESMAN  등급 D  업무 CLERK  등급 E 기타 F or '0'


SELECT ename ,DECODE(job,'PRESIDENT','A','ANALYST','B','MANAGER','C','SALESMAN','D','CLERK','E','F') 등급 FROM emp;


-- 13) TO_CHAR 를 사용 각 사원에 대한 사원번호, 이름 , 급여 및 15% 인상된 급여를 정수(반올림)로 표시 인상된 급여 레이블 'New Salary' 로 표시



SELECT TO_CHAR(empno,9999) 사원번호,ename 이름,TO_CHAR(sal,9999) 급여,TO_CHAR(sal*1.15,9999) "New Salary" FROM emp;


-- 그룹 함수 : 행 집합 연산을 수행하여 그룹별로 하나의 결과를 산출


--AVG() : null을 제외한 모든 값들의 평균을 반환 / null값은 평균 계산에서 무시.


SELECT ROUND(AVG(sal)) FROM emp;

SELECT AVG(comm) FROM emp;

SELECT AVG(NVL(comm,0)) FROM emp;


-- COUNT() : null을 제외한 값을 가진 모든 레코드의 수를 반환, count(*)형식을 사용하면 널도 계산에 포함


SELECT COUNT(empno) FROM emp;

SELECT COUNT(comm) FROM emp;

SELECT COUNT(NVL(comm,0)) FROM emp;

SELECT COUNT(*) FROM emp;

SELECT COUNT(*) FROM emp WHERE deptno =10;


-- MAX() : 레코드 내에 있는 여러 값 중 가장 큰 값을 반환


SELECT MAX(sal) FROM emp;

SELECT MAX(ename) FROM emp;


-- MIN() : 레코드 내에 있는 여러 값 중 가장 작은 값을 반환


SELECT MIN(sal) FROM emp;

SELECT MIN(ename) FROM emp;


-- SUM() : 레코드들이 포함하고 있는 모든 값을 더하여 반환


SELECT SUM(sal) FROM emp;

SELECT ROUND(AVG(sal)),MAX(sal),MIN(sal),SUM(sal) FROM emp;

--SELECT deptno,ROUND(AVG(sal)),MAX(sal),MIN(sal),SUM(sal) FROM emp; // 사용불가 개별함수라서 


--GROUP BY : HAVING


SELECT deptno,ROUND(AVG(sal)),MAX(sal),MIN(sal),SUM(sal) FROM emp GROUP BY deptno;


--다중 열에서 GROUP BY 사용


SELECT deptno,job,sum(sal)  FROM emp GROUP BY deptno,job ORDER BY deptno; --부서별로 묶고 직업별로 묶고 


SELECT deptno,job,sum(sal) FROM emp WHERE deptno=10 GROUP BY deptno,job ORDER BY deptno; 


--//그룹 처리 결과를 제한하고자 할 때 having 절 이용 where 절에서는 집합함수를 사용할 수 없고 having 절을 이용

--조건을 체크하기 위해서 where절을 사용하는데 where 절에는 그룹함수를 사용할 수 없음.

--오류 발생

--SELECT deptno,ROUND(AVG(sal)) FROM emp WHERE ROUND(AVG(sal))>=2000 GROUP BY deptno;


SELECT deptno,ROUND(AVG(sal)) FROM emp  GROUP BY deptno HAVING ROUND(AVG(sal))>=2000;


-- HAVING절 이용 : HAVING 절에 알리아스 사용 x 


SELECT deptno,MAX(sal) "MaxSal" FROM emp GROUP BY deptno HAVING MAX(sal) >3000;


--그룹 함수 중첩


SELECT MAX(AVG(sal)) FROM emp GROUP BY deptno;


-- 그룹함수 이용하기 분기별로 입사한 사원의 수


-- EXTRACT() 함수를 이용하여 입사 일자로부터 월을 구함.

-- 3으로 나눈 값을 올림 처리하여 각 월의 분기를 계산


SELECT CEIL( EXTRACT(MONTH FROM HIREDATE)/3) As quarter, COUNT(empno) as count_member FROM emp GROUP BY CEIL( EXTRACT(MONTH FROM HIREDATE)/3); --1번방법

SELECT TO_CHAR(hiredate,'Q') As quarter, COUNT(empno) AS count_member FROM emp GROUP BY TO_CHAR(hiredate,'Q') ORDER BY quarter; --2번방법 Q는 분기를 나타냄


--[실습문제]

-- 1) 모든 사원의 급여 최고액,최저액,총액 및 평균액을 표시 MAXIMUM MINIMUM SUM 밑 average로 지정, 결과를 정수로 반올림하고 세자리 단위로 ,를 명시하시오.

--2) 업무가 동일한 사원 수를 표시하는 질의어를 작성하시오

 

 SELECT TO_CHAR(MAX(sal),'9,999') "MAXIMUM", TO_CHAR(MIN(sal),'9,999') "MINIMUM" ,TO_CHAR(SUM(sal),'99,999') "sum",TO_CHAR(ROUND(AVG(sal)),'9,999') "average" FROM emp ;

 SELECT job,count(job) FROM emp GROUP BY job;


-- 3) 30번 부서의 사원수를 구하기

-- 4) 업무별 최고 월급을 구하고 업무,최고 월급을 출력

-- 5) 20번부서의 급여 합계를 구하고 급여 합계 금액 출력

-- 6) 부서별로 지급되는 총월급에서 금액이 7,000이상인 부서번호,총월급을 출력


SELECT count(*) FROM emp WHERE deptno=30;

--SELECT deptno,count(deptno) FROM emp GROUP BY deptno HAVING deptno=30; // 부서명까지 표기

SELECT job,Max(sal) FROM emp GROUP BY job ;

SELECT deptno,sum(sal) FROM emp GROUP BY deptno HAVING deptno=20;

SELECT deptno,sum(sal) FROM emp GROUP BY deptno HAVING sum(sal) >= 7000; 


-- 7)업무별로 사원번호가 제일 늦은 사람을 구하고 그 결과 내에서 사원번호가 79로 시작하는 결과만 보여주시오.

SELECT job, MAX(EMPNO) FROM emp WHERE EMPNO like '79%'  GROUP BY job; --1번방법

SELECT job, MAX(EMPNO) FROM emp  GROUP BY job HAVING MAX(EMPNO) like '79%' ; --2번방법


-- 8)업무별 총월급을 출력하는데 업무가 MANAGER인 사원들은 제외하고 총월급이 5,000보다 큰 업무의 총월급만 출력

SELECT job,sum(sal) FROM emp GROUP BY job HAVING sum(sal) > 5000 and  job !='MANAGER';  --1번방법

SELECT job,sum(sal) FROM emp WHERE job NOT IN 'MANAGER' GROUP BY job HAVING sum(sal) > 5000 ; --2번방법

SELECT job,sum(sal) FROM emp WHERE job <> 'MANAGER' GROUP BY job HAVING sum(sal) > 5000 ; --3번방법


-- 9)업무별로 사원의 수가 4명이상인 업무와 인원수를 출력

SELECT job,count(empno) FROM emp GROUP BY job HAVING COUNT(empno)>=4;


-- 10)사원수가 5명이 넘는 부서의 부서번호와 사원수를 구하기

SELECT deptno,count(empno) FROM emp GROUP BY deptno HAVING COUNT(empno)>5;


-- 11)부서별 급여평균을 구할 때 소수점 3자리에서 반올림해서 2자리까지 구하고 부서번호, 부서평균을 출력하시오.

SELECT deptno,TO_CHAR(AVG(sal),'9999.99') FROM EMP GROUP BY deptno  ;

SELECT deptno,ROUND(AVG(sal),2) FROM EMP GROUP BY deptno  ;


-- 12)분기별로 입사한 사원수를 구하는데 2분기에 입사한 사원수만 구하시오. (TO_CHAR() 사용하기)

SELECT  TO_CHAR(hiredate,'Q') 분기 ,COUNT(empno) "입사한 사원수" FROM emp GROUP BY TO_CHAR(hiredate,'Q') HAVING TO_CHAR(hiredate,'Q')=2 ; --q는 분기별로 나타냄

SELECT  TO_CHAR(hiredate,'Q') 분기 ,COUNT(empno) "입사한 사원수" FROM emp WHERE TO_CHAR(hiredate,'Q')=2 GROUP BY TO_CHAR(hiredate,'Q') ; --q는 분기별로 나타냄



'프로그래밍 > sql,php' 카테고리의 다른 글

sql> PL/SQL 2일차  (0) 2018.11.22
sql>오라클 DB수업 6일차 + PL/SQL START  (0) 2018.11.21
sql> 오라클db 수업 4일차  (0) 2018.11.19
sql> 오라클 sql 수업 2일차  (0) 2018.11.15
sql> 오라클 sql 수업 1일차  (0) 2018.11.14


--ORDER BY * 정렬


SELECT * FROM emp ORDER BY sal; --기본 오름차순 정렬


SELECT * FROM emp ORDER BY sal asc; --asc 오름차순 정렬


SELECT * FROM emp ORDER BY sal desc; --desc 내림차순 정렬


SELECT * FROM emp ORDER BY sal asc , ename desc; --선 월급 후 이름 ?


--열 alias를 기준으로 정렬


SELECT empno,ename,sal*12 annsal FROM emp ORDER BY sal*12; 


--열의 숫자 위치를 사용하여 정렬


SELECT ename,job,deptno,hiredate FROM emp ORDER BY 3; --열의 순서값


--NULLS FIRST 또는 NULLS LAST 키워드를 사용하여 반환된 행 중 null값을 포함하는 행이 정렬 순서상 맨 처음에 나타나거나 마지막에 나타나도록 지정 가능.


SELECT * FROM emp ORDER BY comm NULLS FIRST;


SELECT * FROM emp ORDER BY comm NULLS LAST;


--특정 컬럼의 특정값으 먼저 오게 정렬하는 방법


--1) order by (case 컬럼명 when 비교값 then 결과값(순서)

--                           when 비교값 then 결과값

--                          else 결과값

--                    end)


-- order by decode (컬럼명,비교값,결과값,(순서),

--                         비교값,결과값,결과값, 

--                         end)


--사번으로 정렬하는데 7698인 경우는 가장 먼저 정렬


SELECT empno,ename,sal FROM emp ORDER BY (CASE empno when 7698 then 1 END), empno;


SELECT empno,ename,sal FROM emp ORDER BY DECODE(empno,7698,1), empno;


SELECT empno,ename,sal FROM emp ORDER BY DECODE(empno,7698,1,7521,2), empno; --2번으로 점프시키키


SELECT empno,ename,sal FROM emp ORDER BY DECODE(empno,7698,1,7521,2) DESC, empno; --맨뒤로 보내기

--[실습문제]

--1)사원번호,사원이름,입사일을 출력하는데 입사일이 빠른 사람순으로 정렬하시오.

--2)사원이름,급여,연봉을 구하고 연봉이 많은 순으로 정렬하시오.

--3)10번부서와 20번부서에서 근무하고 있는 사원의 이름과 부서번호를 출력하고 이름을 영문자순(a가 먼저오게 끔) 으로 표시

--4)커미션을 받는 모든 사원의 이름, 급여 , 커미션을 출력하는데 커미션을 기준으로 내림차순 정렬하시오. (커미션을 받는사람만)


SELECT empno,ename,hiredate FROM emp ORDER BY hiredate;

SELECT ename,sal,sal*12 ee FROM emp ORDER BY ee desc;

SELECT ename,deptno FROM emp where deptno IN(10, 20) ORDER BY ename;

SELECT ename,sal,comm FROM emp where comm is NOT NULL ORDER BY comm desc ;


--문자함수 


--대소문자 조작함수 : LOWER, UPPER , INITCAP


--LOWER : 소문자로 변경


SELECT LOWER('HELLO') FROM dual;


SELECT LOWER(ename) FROM emp;


-- UPPER : 대문자로 변경


SELECT UPPER('sky') FROM dual;


SELECT UPPER (LOWER(ename)) FROM emp; --소문자로 만든 함수를 대문자로 만드는 함수로 감싸서 사용 가능 -함수중첩가능


-- INITCAP : 첫글자를 대문자로 변경 나머지를 소문자 변경


SELECT INITCAP('hello woRLD') from dual;


SELECT INITCAP(ename) from emp;


SELECT INITCAP(ename), INITCAP(job) FROM emp;


-- 문자 조작 함수 : CONCAT, SUBSTR, INSTR, LENGTH, LPAD, TRIM, REPALCE


--CONCAT(문자열1, 문자열2) //연결하여 하나의 문자열로 반환


SELECT CONCAT('hello' , ' world') FROM dual;


SELECT CONCAT(ename, job) FROM emp;


--SUBSTR(대상문자열,인덱스) : 대상문자열에서 지정한 인덱스부터 문자열을 추출 [주의사항] 인덱스가 1부터 시작함.


SELECT SUBSTR('hello worold',3) FROM dual; --3번째부터


SELECT SUBSTR('HEllo World',3,3)FROM dual; --3번째부터 3개만


SELECT SUBSTR('hello worold',-3) FROM dual; --뒤3번째부터 끝까지


SELECT SUBSTR('hello worold',-3,2) FROM dual; --뒤3번째부터 2개만


-- LENGTH (대상문자열) : 문자의 갯수 


SELECT LENGTH('Hello Wolrd') FROM dual;


SELECT ename ,LENGTH(ename) FROM emp;


--INSTR(대상문자열,검색문자) : 검색문자의 위치값 검색


SELECT INSTR('hello world', 'e')FROM dual;


SELECT INSTR('hello world', 'o')FROM dual; --대상문자열,검색문자,검색인덱스:해당위치부터 검색


SELECT INSTR('hello world', 'o')FROM dual;


SELECT INSTR('hello world', 'o',1,2)FROM dual;


 -- LPAD ,RPAD ( '문자열','문자열+갯수','추가문자')

 

 SELECT LPAD('Hello',10,'*') FROM dual;

 SELECT RPAD('Hello',10,'*') FROM dual;


--TRIM (공백을 제거하거나 문자를 제거한 다음 값 반환)

--방향 leadin : 왼쪽 , trailing : 오른쪽 both : default


SELECT TRIM(both 'h' from 'habchh') FROM dual; --habchh 에서 h를 모두 제거


--REPLACE (대상문자열,old문자,new문자)


SELECT REPLACE('hello','he','He') FROM dual; --he 를 He 로


SELECT REPLACE('010.1234.5678','.','-')FROM dual; -- .을 -으로


--[실습문제]

--1)업무(job)를 첫글자는 대문자 나머지는 소문자로 출력

--2)사원이름 중 A가 포함된 사원이름을 구하고 그 이름중 앞에서 3자만 추출

--3)이름의 세번째 문자가 A인 모든 사원의 이름을 표시

--4)이름이 J,A 또는 M으로 시작하는 모든 사원의 이름을 첫글자는 대문자

--나머지는 소문자로 표시 및 이름의 길이도 표시


SELECT INITCAP(job) FROM emp;

SELECT SUBSTR(ename,1,3) FROM emp where ename like '%A%';

SELECT ename FROM emp where SUBSTR(ename,3,1) = 'A';

SELECT INITCAP(ename),LENGTH(ename) FROM emp where ename LIKE 'J%' OR ename LIKE 'A%' OR ename LIKE 'M%'; 

--SELECT INITCAP(ename),LENGTH(ename) FROM emp where SUBSTR(ename,1,1) in('A','J','M');


--5)이름의 글자수가 6자 이상인 사원의 이름을 소문자로 이름만 출력하시오.

--6)모든 사원의 이름과 급여를 표시하는 질의를 작성. 조건) 급여는 15자길이로 왼쪽에 $기호가 채워진 형식으로 표시하고 열 레이블을 SALARY로 지정


SELECT LOWER(ename) FROM emp where LENGTH(ename)>=6;

SELECT ename, LPAD(sal,15,'$') "SALARY"   FROM emp;


--숫자함수


--CEIL() : 올림 처리한 정수값을 반환


SELECT CEIL(1.4) FROM dual;


--ROUND(대상숫자,지정자릿수)  : 반올림


SELECT ROUND(45.926,2)FROM dual;


SELECT ROUND(45.926)FROM dual; --지정자릿수가 없으면 첫째자리에서 반올림


SELECT empno,ename,sal,ROUND(sal*1.15,0) "NEW Salary" FROM emp;


-- TRUNC(대상숫자,지정자릿수) : 숫자 절삭


SELECT TRUNC(45.926,2) FROM dual;


SELECT TRUNC(45.926) FROM dual;


--MOD(대상숫자,나눌숫자) : 나머지값 구할때


SELECT MOD(17,2) FROM dual;


--날짜 함수


--SYSDATE(연/월/일 만 나옴) 


SELECT SYSDATE FROM dual;


--날짜에 산술 연산자 이용


SELECT ename, ROUND (((SYSDATE-hiredate)/ 7)) WEEKS FROM emp WHERE deptno=10;


--MONTHS_BETWEEN : 두 날짜 간의 월 수


SELECT MONTHS_BETWEEN('2018-11-15','2018-07-15') FROM dual; --큰 날짜가 앞으로 


SELECT ename,ROUND(MONTHS_BETWEEN(SYSDATE,hiredate)) months_work FROM emp; --입사일부터 현날짜까지 몇달인지  


--ADD_MONTHS : 특정 날짜의 월에 정수를 더한 다음 해당 날짜를 반환하는 함수


SELECT ADD_MONTHS('2018-11-15',8)FROM dual;


--NEXT_DAT : 지정된 요일의 다음 날짜


SELECT NEXT_DAY('2018-11-15','월요일') FROM dual; --1(일요일) ~7(토요일)


SELECT NEXT_DAY('2018-11-15',1) FROM dual;


SELECT LAST_DAY('2018-11-15') FROM dual;


--ROUND() 를 이용해서 반올림되는 형식 //연도는 7월 1일 이상일 경우 올림 ,그 이전 날짜의 경우는 잘려나감


SELECT ROUND(SYSDATE,'year') FROM dual;


--월은 16일 이상일 경우 올리고 그 이전 날짜의 경우는 잘려나감


SELECT ROUND(SYSDATE,'month') FROM dual;


--시간은 12시를 넘어서면 1을 증가시킴


SELECT ROUND(SYSDATE,'dd') FROM dual;


--TRUNC() : 날짜 절삭


SELECT TRUNC(SYSDATE,'year') FROM dual;


SELECT TRUNC(SYSDATE,'month') FROM dual;


SELECT TRUNC(SYSDATE,'dd') FROM dual;


--extract() : 날짜정보에서 특정한 연도,월,일,시간,분,초 등을 추출


SELECT EXTRACT(YEAR FROM SYSDATE),EXTRACT(DAY FROM SYSDATE) FROM dual;


--[실습문제]

--7)오늘부터 이번달의 마지막 날짜까지의 남은 날 수를 구하기

--8)각 사원에 대해 사원번호, 이름 ,급여 및 15% 인상된 급여를 정수(반올림)로 표시하시오. 인상된 급여 New Salary 로 지정


SELECT LAST_DAY(SYSDATE)-SYSDATE FROM dual;

SELECT empno, ename,sal ,ROUND(sal+sal*0.15) "New Salary" FROM emp;


-- 변환 함수


-- to_char() : 숫자를 문자로 바꿔주거나 날짜를 문자로 바꿔줌

-- 날짜 -> 문자

SELECT to_char(SYSDATE,'YYYY-MM-DD') FROM dual; --뒤에 포맷문자 갯수 = 표기 자릿수 

--SELECT to_char(SYSDATE,'YYYY년-MM월-DD일') FROM dual;  날짜표기에 한글표기하면 오류


SELECT to_char(SYSDATE,'YYYY-MM-DD') FROM dual;


SELECT to_char(SYSDATE,'RR-MON-DD') FROM dual; --뒤에 포맷문자 갯수 = 표기 자릿수 


-- 숫자 -> 문자 

-- 실제 자리수와 일치

SELECT TO_CHAR(1234,9999) FROM dual; -- 9999-> 자리수를 나타내는 포멧 문자

SELECT TO_CHAR(1234,'9999') FROM dual; -- 1234으로 표기

SELECT TO_CHAR(1234,'0000') FROM dual; --1234로 표기

SELECT TO_CHAR(1234,0000) FROM dual; -- ##으로 표기 = 자릿수가 모자람

SELECT TO_CHAR(123,0000) FROM dual; -- ##으로 표기 = 자릿수가 모자람

SELECT TO_CHAR(1234,99999) FROM dual; -- 1234로 표기

SELECT TO_CHAR(1234,999) FROM dual; --####로 표기

SELECT TO_CHAR(123,'0000') FROM dual; --0123 표기

SELECT TO_CHAR(123,'9999') FROM dual; --123 표기


-- 소숫점 자리


SELECT TO_CHAR(1234,'9999.99') FROM dual; --1234.00

SELECT TO_CHAR(1234,'0000.00') FROM dual; --1234.00


-- 반올림해서 소수점 둘째자리까지 표시


SELECT TO_CHAR(25.897,'99.99')FROM dual;

SELECT TO_CHAR(sal*1.15,'9,999.0')FROM emp;


통화표시 


SELECT TO_CHAR(1234, '$0000') FROM dual;

SELECT TO_CHAR(1234, 'L0000') FROM dual;


-- to_date : 문자 ->날짜


SELECT TO_DATE('20181115','YYYY-MM-DD')FROM dual; -- (-)없이도 자릿수 인식가능

SELECT TO_DATE('2018-11-15','RR-MM-DD')FROM dual;


'프로그래밍 > sql,php' 카테고리의 다른 글

sql> PL/SQL 2일차  (0) 2018.11.22
sql>오라클 DB수업 6일차 + PL/SQL START  (0) 2018.11.21
sql> 오라클db 수업 4일차  (0) 2018.11.19
sql> 오라클db 수업 3일차  (0) 2018.11.16
sql> 오라클 sql 수업 1일차  (0) 2018.11.14

SELECT * FROM tab;


SELECT empno, ename , job , mgr, hiredate, sal, comm, deptno FROM emp;


SELECT * FROM emp;


SELECT ename, sal FROM emp;


SELECT *  FROM emp;


--  dual 함수및 계산 결과를 볼때 사용할 수 있는 공용 테이블(public)


SELECT 7 + 10 FROM dual;


SELECt sysdate FRom dual;


select ascii(0) from dual;


SELECT ename, sal, sal+300 FROM emp;


SELECT ename, sal, sal*12 FROM emp;


-- NULL : NULL은 사용할 수 없거나 할당되지 않았거나 알수 없거나 적용할수 없는값.


SELECT EMPNO , ENAME, COMM FROM EMP;


--산술식의 NULL값 : NULL값을 포함하는 산술식은 NULL로 계산


 SELECT ENAME, 12*SAL *COMM FROM EMP;

 

 -- 열 alias :열 이름 바꿈

 

 SELECT sal*12 Asal FROM emp;

 

 SELECT sal*12 as ASal FROM emp;

 

 SELECT sal*12 "Annual Salary" FROM emp;

 

 SELECT ename as name, comm commission from emp;

 

 -- 알리아스에 큰 따옴표를 사용하는 경우 : 대소문자 구별을 원할때 , 공백을 포함시킬때 ,_ # 등 특수문자 사용시 , 숫자로 사용될때

 

 SELECT ename as name, comm commission from emp;


--연결 연산자 (||) : 열이나 문자열을 다른 열에 연결 


Select ename || 'has$ '  || sal FROM emp;


--연결 연산자와 null값 : 문자열에 null값을 결합할 경우 결과는 문자열


SELECT ename || comm FROM emp;

 

 --distinct : 중복행 삭제

 

 SELECT DISTINCT deptno FROM EMP;


--테이블의 구조 표시 : describe 명령을 사용하여 테이블의 구조를 표시 축약형 ex) desc[ribe] tablename


describe emp;

--[실습]

--1)emp 테이블에서 사원번호 사원이름 월급을 출력하시오.

--2)emp 테이블에서 사원이름과 월급을 출력하는데 컬렴명은 "이 름" , "월 급" 으로 바꿔서 출력하시오.

--3)emp 테이블에서 사원번호,사원이름,월급, 연봉을 구하고 각각 컬럼명은 "사원번호","사원이름","월급","연봉"으로 출력하시오.

--4)emp 테이블의 업무(job)를 중복되지 않게 표기하시오 

--5)emp 테이블의 사원명과 업무를 쉼표(,)로 연결해서 표시하고 컬럼명은 Employee and Job으로 표시하시오.


SELECT empno,ename,sal FROM emp;


SELECT ename "이 름",sal "월 급" FROM emp;


SELECT empno "사원번호",ename "사원이름",sal "월급",sal*12 "연봉" FROM emp;


SELECT DISTINCT job FROM EMP;


SELECT ename || ',' || job "Employee and Job" From emp;


--where 절에서는 알리아스 사용불가 


SelecT * FROM emp WHERE deptno =10;


select ename,job,deptno from emp where ename = 'SMITH';


--날짜 표기

SELECT * FROM emp WHERE hiredate>'81/12/03';


--비교연산자 사용( 자바는 == , db는 =) 부정 (!=, <> , ^=, NOT )

SELECT * FROM emp where hiredate='81/09/28'; 


SELECT * FROM emp where hiredate!='81/09/28'; 


SELECT * FROM emp where hiredate<>'81/09/28'; 


SELECT * FROM emp where hiredate^='81/09/28'; 


Select * from emp where SAL >=200 and sal <=5000;


Select * from emp where sal Between 2000 and 5000;


Select * from emp where sal NOT Between 2000 and 5000;


Select * from emp where ename BETWEEN 'KING' and 'SMITH';


-- in 값 목록 중에 값과 일치 여부


Select *FROM emp WHERE sal IN (1300,2450,3000);


Select *FROM emp where sal NOT IN(1300,2450,3000);


Select *FROM emp where ename in('ALLEN','FORD');


--해당 문자열 찾기


Select *FROM emp where ename = 'ALLEN';


-- 포함된 문자 찾기


Select *FROM emp where ename like '%A%';


Select *FROM emp where ename NOT like '%A%'; --검색하고자 하는 문자열에 _가 포함되어있는경우 /_ %가 포함된경우 /%


--null 조건  =null 은 사용 불가 is null 사용가능 


SELECT * FROM emp where comm is NULL;


SELECT * FROM emp WHERE comm is NOT NULL;


--논리연산자 (and ,or , not)을 사용한 조건 정의


Select empno,ename,job,sal from emp where sal>=2000 and job like '%MAN%';


SELECT empno, ename ,job ,sal FROM emp WHERE sal>=2000 OR job LIKE '%MAN%';


--[실습문제] 

-- 1) emp 테이블에서 사원번호가 7698인 사원의 이름,업무,급여를 출력하시오.

-- 2) emp 테이블에서 사원이름이 SMITH인 사람의 이름과 월급, 부서번호를 구하시오.

-- 3) 월급이 2500이상 3500미만인 사원의 이름,입사일,월급을 구하시오.

-- 4) 급여가 2~3000 사이에 포함되지 않는 사원의 이름 ,업무,급여를 출력하시오.

-- 5) 81년05월01일과 81년12월03일사이에 입사한 사원의 이름,급여,입사일을 출력하시오,

-- 6) 사원번호가 7566,7782,7934인 사원을 제외한 사람들의 사원번호,이름,월급을 출력하시오.


Select  ename,JOB,sal from emp where empno= '7698';

SELECT ename,sal,deptno from emp where ename = 'SMITH';

SELECT ename,hiredate,sal from emp where 2500<=sal and sal<3500 ;

SELECT ename,job,sal from emp where NOT 2000<=sal and sal<3000 ;

SELECT ename,sal,hiredate from emp WHERE hiredate between '81/05/01' and '82/12/03';

SELECT empno,ename,sal from emp WHERE  empno NOT IN (7566,7782,7934);


--7) 부서번호 30에서 근무하며 월 2000 달러 이하를 받는 81년05월01일 이전에 입사한 사원의 이름,급여,부서번호,입사일을 출력

--8) 급여가 $2000와 $5000사이고 부서번호가 10또는 30인 사원의 이름과 급여, 부서번호 출력


SELECT ename,sal,empno,hiredate from emp WHERE Deptno = '20' and sal<='3000' and hiredate>'81/05/01' ;

SELECT ename,sal,deptno from emp WHERE sal between '2000' and '5000' and deptno in (10,30)   ;


--9) 업무가 SALESMAN 또는 MANAGER이면서 급여가 1600,2975,2850이 아닌 모든 사원의 이름,업무 및 급여를 출력

--10) 사원이름 중 S가 포함되지않은 사람들  중 부서번호가 20인 사원들의 이름과 부서번호 출력


SELECT ename,job,sal from emp WHERE job in('SALESMAN','MANAGER')and sal NOT in(1600,2975,2850);

--SELECT ename,job,sal from emp WHERE (job = 'SALESMAN' or job='MANAGER') and sal NOT in(1600,2975,2850);


SELECT ename,deptno from emp WHERE ename NOT like '%S%' and  deptno =20;



'프로그래밍 > sql,php' 카테고리의 다른 글

sql> PL/SQL 2일차  (0) 2018.11.22
sql>오라클 DB수업 6일차 + PL/SQL START  (0) 2018.11.21
sql> 오라클db 수업 4일차  (0) 2018.11.19
sql> 오라클db 수업 3일차  (0) 2018.11.16
sql> 오라클 sql 수업 2일차  (0) 2018.11.15


안드로이드 기본인 로그인과 회원가입 페이지를 제작해 보겠습니다.

우선 기초적인 디자인과 인텐트 부분만 다뤄봤습니다.



준비물입니다.


2개의 클래스를 추가해주세요.



2개의 백그라운드 사진이 필요합니다.



2개의 xml이 필요합니다 각각 클래스에 연결됩니다.




먼저 xml 부분을 살펴보겠습니다.


android:background="@drawable/back3" 해당레이아웃에 background를 줍니다.

  <EditText 아이디 비밀번호는 EditText로 하였습니다.

android:inputType="textPassword"비밀번호는 type을 주어 비밀번호가 별모양으로 표시됩니다.

<android.support.v7.widget.AppCompatCheckBox 또한 유저의 편의성을 위해 자동로그인 버튼을 만들 예정입니다.

    <TextView 그리고 회원가입페이지로 이동할 텍스트뷰를 하나 만들어 줍니다.



디자인 이미지입니다.




회원가입 xml입니다.


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/back1">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="40dp"
android:text="다람월드 회원가입"
android:textColor="#000000"
android:textSize="30dp"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30dp"
android:layout_marginTop="30dp"
android:layout_marginBottom="30dp"
android:text="회원가입 페이지입니다."
android:layout_gravity="center"
android:textStyle="bold"
android:textColor="#000000"/>
<EditText
android:id="@+id/idText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:ems="10"
android:hint="아이디"
android:textColorHint="#000000"
android:textColor="#000000"
android:inputType="textPersonName" />

<EditText
android:id="@+id/passwordText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:ems="10"
android:hint="비밀번호"
android:textColorHint="#000000"
android:textColor="#000000"
android:inputType="textPassword" />



<Button
android:id="@+id/registerButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="회원가입" />
</LinearLayout>

  <EditText>저희가 필요한건 아이디와 패스워드이니 두가지의 EditText를 받아옵니다.



디자인 이미지입니다.


사진은 drawable파일에 사진을 복사해서 붙여넣기 해주시면 됩니다.


이제 class 파일을 살펴 보겠습니다.



로그인 메인입니다.


public class LoginMain extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_activity);


TextView id = (TextView)findViewById(R.id.Login_id);
TextView ps = (TextView)findViewById(R.id.Login_password);
Button button = (Button)findViewById(R.id.Login_Button);
CheckBox box = (CheckBox)findViewById(R.id.Auto_Login);
TextView register = (TextView)findViewById(R.id.Go_registerActivity);

button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(LoginMain.this,MainActivity.class);
startActivity(intent);
}
});

register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(LoginMain.this,LoginRegister.class);
startActivity(intent);
}
});
}
}


메인에 보면 버튼과 텍스트뷰에 하나씩 클릭 리스너를 넣어주었습니다.


버튼쪽은 로그인후 메인뷰로 이동하고 레지스터텍스는 회원가입 페이지로 이동합니다.



회원가입 레지스터입니다.


public class LoginRegister extends Activity {
SharedPreferences shard;
String LoginID = "LoginID";
String LoginPassword = "LoginPassword";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_register);

final TextView id = (TextView)findViewById(R.id.idText);
final TextView ps = (TextView)findViewById(R.id.passwordText);
Button button = (Button)findViewById(R.id.registerButton);



button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

Intent intent =new Intent(LoginRegister.this,LoginMain.class);

startActivity(intent);
}
});
}
}

간단합니다. 

회원가입후 로그인메인으로 다시 돌아갑니다.


이후에 데이터를 저장하고 조건을 체크하는 부분을 포스팅하겠습니다.


안녕하세요 이번에는 액션바 이미지 설정에 대해 글을 올립니다.

방법은 간단합니다.



values의 styles에 들어가줍니다.



style 의 액션바설정을 할 수있습니다. 





짜잔 ~ 파란색에서 고급스런 푸른빛으로 변경했습니다.







안녕하세요. 이번 포스팅은 오토스크롤 뷰페이저 입니다.

주로 광고사진을 넣거나 사진을 효율적으로 올리기 위해 사용합니다.




우선 결과물입니다. 한번 만들어 두면 여러곳에서 잘 사용할 수 있을거 같죠 ?


제가 사용한 뷰는 엑티비티 아래에 있는 프래그먼트입니다.


보여질 클래스에 연결된 xml부분 입니다.

<cn.trinea.android.view.autoscrollviewpager.AutoScrollViewPager
android:id="@+id/autoViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp">

</cn.trinea.android.view.autoscrollviewpager.AutoScrollViewPager>
manifest에 추가할 퍼미션입니다.

<uses-permission android:name="android.permission.INTERNET"/>





AutoScrollViewpager 를 사용하기 위해서 gradle에 추가해 줍시다.
 api ('cn.trinea.android.view.autoscrollviewpager:android-auto-scroll-view-pager:1.1.2') {
exclude module: 'support-v4'
}}
repositories {
mavenCentral()
google()}
annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'




AutoScrollAdapter 입니다.

public class AutoScrollAdapter extends PagerAdapter {

Context context;
ArrayList<String> data;

public AutoScrollAdapter(Context context, ArrayList<String> data) {
this.context = context;
this.data = data;
}

@Override
public Object instantiateItem(ViewGroup container, int position) {

//뷰페이지 슬라이딩 할 레이아웃 인플레이션
LayoutInflater inflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.auto_viewpager,null);
ImageView image_container = (ImageView) v.findViewById(R.id.image_container);
Glide.with(context).load(data.get(position)).into(image_container);
container.addView(v);
return v;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {

container.removeView((View)object);

}

@Override
public int getCount() {
return data.size();
}

@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}















적용할 프래그먼트입니다.

다음과 같이 import 해주시고 

레이아웃을 연결해준뒤 ArrayList에 사용할 이미지를 연결해줍니다. 

해당레이아웃의 오토스크롤 뷰페이저를 연결해준후 어뎁터와 연결하여줍니다.

import cn.trinea.android.view.autoscrollviewpager.AutoScrollViewPager;

public class TabFragment3 extends Fragment {
AutoScrollViewPager autoScrollViewPager;
ArrayList<String>data =new ArrayList<>();

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v= inflater.inflate(R.layout.tab_fragment_3, container, false);
LinearLayout layout = (LinearLayout) v.findViewById(R.id.fragment_uri);

ArrayList<String> data = new ArrayList<>(); //이미지 url를 저장하는 arraylist
data.add("http://www.lotteria.com/Images/main/visual/page2/img_lpoint_event_181026.jpg");
data.add("http://www.burgerking.co.kr/Content/menu/image/main/181018_Product_PC_detail_5.png");
data.add("https://www.baskinrobbins.co.kr/upload/EditUpload/1541032533-99.png");
data.add("http://www.popeyes.co.kr/images/banner/burger_main_180607.png");


autoScrollViewPager = (AutoScrollViewPager)v.findViewById(R.id.autoViewPager);
AutoScrollAdapter scrollAdapter = new AutoScrollAdapter(getActivity(), data);
autoScrollViewPager.setAdapter(scrollAdapter); //Auto Viewpager에 Adapter 장착
autoScrollViewPager.setInterval(3000); // 페이지 넘어갈 시간 간격 설정
autoScrollViewPager.startAutoScroll(); //Auto Scroll 시작

return v;

}





}



안녕하세요.

저번엔 클릭이벤트로 클릭시,롱클릭시,프로필클릭시 등 클릭이벤트를 넣는법을 포스팅 했습니다.

이번에는 클릭후 실직적인 데이터의 이동과 화면전환에 대해서 포스팅하겠습니다.



해당 포지션의 이미지 클릭시 이벤트 처리를 하였습니다.



다음과같이 사진과 이름과 나이에 대한 데이터를 이동시키고 profile 엑티비티에 적용시킨 모습입니다.

하나의 profile을 만들어두면 어뎁터에서 클릭리스너가 사용되어 profile의 정보가 계속 바뀌고 하나의 액티비티로

프로필을 재사용할 수 있겠죠 ?



Adapter의 ViewHolder의 personPhoto 에 클릭 리스너를 달아 줬습니다.

여기서 중요한건 position 입니다.

 해당 뷰의 위치를 확인해서 데이터를 불러와야 profile Activity로 해당 데이터를 전달 시켜 주는 겁니다. 

다음과 같이 온클릭 리스너에 인텐트를 넣어주고 putExtra를 통해 객체의 데이터를 이동시켜줍니다.

그리고 마지막에 context.startActiviy(intent)를 통해 새로운 엑티비트를 열어줍니다.




객체 내용입니다.






초보자들이 자주 실수하는 부분이 있습니다. manifests 에 새로만든 엑티비티를 입력해줘야

profile 엑티비티를 실행시킬 수 있습니다.





어뎁터코드입니다.


public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder> {
public static ArrayList<Person> person ;
Context context ;
public RVAdapter( ArrayList<Person> person){
this.person = person;
}
@NonNull
@Override
public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup,int position) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycler_view, viewGroup, false);
PersonViewHolder pvh = new PersonViewHolder(v, position);
return pvh;
}
@Override
public void onBindViewHolder(final PersonViewHolder personViewHolder, final int position) {
personViewHolder.personName.setText(person.get(position).name);
personViewHolder.personAge.setText(person.get(position).age);
personViewHolder.personPhoto.setImageResource(person.get(position).img);
personViewHolder.personPhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view ) {
Log.d("test", "클릭됨");
context = view.getContext();
Intent intent = new Intent(context, UserProfile.class);
intent.putExtra("age",person.get(position).age);
intent.putExtra("name", person.get(position).name);
intent.putExtra("img", person.get(position).img);
Log.d("getPosition", String.valueOf(position));
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return person.size();
}


public static class PersonViewHolder extends RecyclerView.ViewHolder {
CardView cv;
TextView personName;
TextView personAge;
ImageView personPhoto;
PersonViewHolder(final View itemView ,final int position) {
super(itemView);
cv = (CardView)itemView.findViewById(R.id.cv);
personName = (TextView)itemView.findViewById(R.id.person_name);
personAge = (TextView)itemView.findViewById(R.id.person_age);
personPhoto=(ImageView)itemView.findViewById(R.id.person_photo);
personPhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d("test", "포토클릭됨");
}
});
itemView.setOnLongClickListener(new View.OnLongClickListener() {
public boolean onLongClick(View v) {
Log.d("test", "롱클릭됨");
return true;
}
});
}
}
}
class Person {
String name ;
String age ;
int img;
public Person(String name, String age, int img) {
this.name = name;
this.age = age;
this.img = img;
}


UserProfile 입니다.


public class UserProfile extends AppCompatActivity {
ArrayList<Person> person;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.user_profile);
TextView textViewName =(TextView)findViewById(R.id.person_name);
TextView textViewAge =(TextView)findViewById(R.id.person_age);
ImageView imageViewphoto =(ImageView)findViewById(R.id.person_photo) ;


Intent intent = getIntent();
textViewName.setText(intent.getStringExtra("name"));
textViewAge.setText(intent.getStringExtra("age"));
imageViewphoto.setImageResource(intent.getIntExtra("img",0));
}
}


user_Profile  xml 입니다.


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<ImageView
android:id="@+id/person_photo"
android:layout_width="318dp"
android:layout_height="289dp"
android:layout_alignParentTop="true"
android:layout_gravity="center"
android:gravity="center"
android:text="name"
android:layout_marginTop="100dp"
android:textSize="100dp" />
<TextView
android:id="@+id/person_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="50dp"
android:layout_gravity="left"
android:gravity="center"
android:text="name"
android:textSize="40dp" />
<TextView
android:id="@+id/person_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="50dp"
android:layout_gravity="left"
android:gravity="center"
android:text="age"
android:textSize="40dp" />
</LinearLayout>


+ Recent posts