자바/스프링 부트캠프 22일차( 시작,SELECT, WHERE )
1) DB설치 및 초기설정
1-1) 테이블 설정
1-2) 주석 관련 알아야할 것
1-3) 쿼리 실행
2)SELECT
2-1) DESC
3) Where
3-1)between
3-2) in , not in . or
3-3) like
3-4 null
3-5 order by
3-6) join 맛보기
4) 예제 풀이
DB버전은 pdf에 없는 버전이어도 괜찮다.
설치한 파일을 더블클릭해보자
↓ ↓ ↓ 관리자비번 설정화면임
Use UTF8 언체크 시 한글이 안됨
클릭
실행 후 신규버튼 누르면 다음과같은 창이나옴
DB를 하나 더 만들어보자
도구 -> 사용자관리자 클릭 후
1사용자이름 만들고
2호스트는 %( 모든곳에서접근)
3비밀번호를 외우기편한것으로 설정!
새로운 사용자로 접근하는 법
파일->세션관리자 들어가서
세션을 하나 만든 후 사용자와 암호를 입력!!
설정 후 화면
1-1 ) 테이블 생성
1 . 해당 DB(본인 : gdjdb) 를 클릭 해준다
2. 밑에와 같이 뜬다면 정상연결
3.
위 파일과 같이 미리 만들어둔
파일을 복사해서 붙여넣고 모두 실행하면
다음과 같이 테이블이 들어갈 것임.
1-2) 주석관련 알아야 할 것
-- 과 #을 주석으로 사용하는데
--은 한번 띄워쓰기를 하고 사용해야함
띄워쓰기 안하고 문장사용시 오류발생
#은 그럴필요가 없음!!
1-3) 쿼리 실행법
2)@@ SELECT @@
2-1) DESC 명령어
지정한 테이블의 구조를 조회
dept테이블 조회
deptno : int형 2자릿수 , null값을 허용X
dname : 14자리 가변 문자열, null허용
loc : 20자리 가변 문자열, null허용
SQL문을 좀 사용해보자
-- SQL : sturcted Query Language
-- 데이터 처리를 위한 언어
-- select : 데이터 조회를 위한 언어
-- 자동완성 : ctrl + space
-- emp 테이블의 모든 데이터조회
SELECT *
FROM emp;
-- emp테이블의 empno , ename , deptno 컬럼을
-- 번호 , 이름 , 번호2 로 조회
SELECT empno ,ename , deptno FROM emp;
-- 리터럴 컬럼 사용 : 상수값을 사용하기
-- 학생(student)의 이름 뒤에 학생 문자열 붙여서 조회
SELECT NAME,'학생'
FROM student;
/*
1. 교수(professor) 테이블의 구조 조회
*/
DESC professor;
/*
2. 교수(professor) 에서 교수번호 , 교수이름 '교수'문자열붙여서 조회
*/
/*
문자열형 상수 : 작은따옴표 , 큰따옴표 동일
오라클 DB에서는 작은 따옴표만 가능
*/
SELECT p.`no`, p.`name`, '교수' FROM professor p; -- p로 줄여서 쓸수있다!!
SELECT p.`no`, p.`name`, "교수" FROM professor p; -- p로 줄여서 쓸수있다!!
-- 컬럼에 연산자 (+,-,*,/ ) 사용
-- emp테이블에서 사원이름(ename),급여(salary) 10%인상 예상급여 조회
SELECT ename , salary*1.1
FROM emp;
-- distinct : 중복제거하고 하나만 조회
-- 교수 테이블에서 교수가 속한 부서코드(deptno) 조회
SELECT DISTINCT FROM professor;
-- 교수(professor) 테이블에서 교수가 속한 직급(position 조회)
SELECT DISTINCT position FROM professor;
-- 교수(professot)테이블에서 부서별 교수가 속한 직급(position) 조회
SELECT DISTINCT deptno , POSITION FROM professor;
-- Disinct 는 앞에 한번만 써주자! 두번사용불가능
3) Where
select 컬럼명(컬럼,리터널컬럼 , 연산된컬럼,*(모든컬럼),별명,distinct)
from 테이블명
where 레코드 선택 기준
조건문이 없는 경우 : 모든레코드 조회
조건문이 있는경우 : 조건문결과가 참인 레코드만 조회
#학생테이블(Student)에서 1학년 학생의 모든컬럼 조회
SELECT *
FROM student
WHERE grade = 1;
#DB에서는 = 가 등가연산자임.
# 학생테이블(student)에서 3학년 학생 중 전공1코드(major1)가 101인 학생의
# 학번(studno), 이름(name) , 학년(grade),전공1학과(major1)컬럼 조회
SELECT studno ,name ,grade ,major1
FROM student
where grade=3 AND major1 = 101;
-- 학생테이블(student)에서 3학년이거나 전공1코드가 101인 학생의
# 학번(studno) 이름(name) 학년(grade) 전공1(major1) 조회
SELECT studno , `name` , grade , major1
FROM student
WHERE grade = 3 OR major1 = 101; #둘중 하나라도 일치하면 true
간단한 Where 예제
#where문제----------------------------------------------------------------
#1.emp테이블에서 부서코드가 10인 사원의 이름(ename),
#급여(salary), 부서코드(deptno) 를 결과와 같이 출력하기
SELECT e.ename , e.salary , e.deptno
FROM emp e
WHERE e.deptno = 10;
#2.emp테이블에서 급여가 800보다 큰사람의 이름과 급여를 결과와 같이 출력하기
SELECT e.ename , e.salary
FROM emp e
WHERE e.salary > 800;
#3.professor 테이블에서 직급이 정교수인
# 교수의 이름과 부서코드, 직급을 결과와 같이 출력하기
SELECT p.`name` , p.deptno , p.`position`
FROM professor p
WHERE p.`position`='정교수';
-- Where문 조건문에서 연산처리하기
-- emp 테이블에서 모든사원급여 10% 인상 할 때 , 인상예정급여가 1000이상인
# 사원의 이름 , 현재급여 , 인상예정급여 , 부서코드 조회
SELECT e.ename , e.salary , e.salary*1.1 '인상예정급여' , e.deptno
FROM emp e
WHERE e.salary*1.1 >=1000;
3-1 ) between
-- between : 범위지정 연산자
-- where 컬럼명 between A and B ==> 컬럼의값이 A이상B이하
SELECT * FROM student
WHERE grade BETWEEN 1 AND 2 #grade>=1 AND grade<=2;
ORDER BY grade ASC; #학년기준 오름차순정렬
# 문제
-- 1학년 학생 중 몸무게가 70이상 80 이하 학생의
-- 이름 학년 몸무게 전공1학과 조회
SELECT name , grade ,weight , major1
FROM student s
WHERE weight BETWEEN 70 AND 80;
SELECT s.`name` , s.grade , s.weight , s.major1
FROM student s
WHERE 70<=weight AND weight<=80;
-- 제 1 전공이 101번 학생 중 몸무게가 50이상 80이하인
# 학생의 이름 몸무게 1전공학과코드 출력
SELECT name'이름' , weight '몸무게', major1
FROM student
WHERE major1=101 AND (weight BETWEEN 50 AND 80);
3-2) in , not in ,or
where 컬럼 in ( a , b)
a 이거나 b
in ,or 조건문 으로 표현이 가능
# 전공1학과가 101 , 201 학과에 속한 학생의 모든정보 조회
SELECT * FROM student
WHERE major1 = 101 OR major1 =201;
SELECT * FROM student
WHERE major1 IN(101,102); #In은 기능은 좋지만 성능이나쁨.
#교수중 학과코드가 101 201 학과에 속한 교수의 교수번호
#교수이름 , 학과코드 , 입사일 조회
SELECT p.no , p.`name` , p.deptno , p.hiredate
FROM professor p
WHERE p.deptno IN(101,201);
# 101 , 201 전공학과1(major1) 학생중 키170이상 학생의
# studno , name , weight , height , major1 조회studentstudent
SELECT studno , NAME , weight , height , major1
FROM student
WHERE major1 IN(101,201) AND height>=170;
-- not in
# 101 , 201 전공학과1(major1)를 제외하고 ,키170이상 학생의
# studno , name , weight , height , major1 조회studentstudent
SELECT studno , NAME , weight , height , major1
FROM student
WHERE major1 not IN(101,201) AND height>=170;
3-3 ) Like 연산자 :
like : 일부분 일치
not like : like의 반대
% : 0개이상 임의의 문자
_ : 1개의 임의의 문자
ex) name like'김%' : 성이김씨인
name like '%현%' : 이름에 현이 들어간
-- 대소문자 구분 위해서는 binary 예약어사용해야만 함
-- 학생의 성 김씨인 학생의 학번 이름 학과코드1 조회
SELECT studno , NAME , major1
FROM student
WHERE NAME LIKE'김%';
-- 이름에'진' 을 가진 학생의 학번,이름,학과코드1 조회
SELECT studno , NAME , major1
FROM student
WHERE NAME like'%진%';
-- 학생 중 이름이 2자인 학생의 학번, 이름 , 학과코드1 조회
SELECT studno , NAME , major1
FROM student
WHERE NAME LIKE '__';
/*
문제
1.학생 중 이름의 끝자가 '훈'인 학생의 학번이름전공코드1 출력
2.학생 중 전화번호(tel)이 서울(02)인 학생의 이름 학번 전화번호
*/
SELECT s.studno , s.`name` , s.major1
FROM student s
WHERE NAME LIKE'%훈';
SELECT NAME , studno , tel
FROM student
WHERE tel LIKE '02%';
-- 교수테이블에 id 내용에 k문자를 가지고있는 교수이름 , id ,직급조회
SELECT NAME , id , POSITION
FROM professor
WHERE id LIKE '%k%'; #'%K%'
# MariaDb는 대소문자 구별을 안함
-- 대소문자 구분 위해서는 binary 예약어사용해야만 함
SELECT NAME , id , POSITION
FROM professor
WHERE id LIKE BINARY'%k%'; #'%K%'대문자 입력시 아무것도 select하지않음
-- not like 연산자 : like 반대
-- 학생 중 성이 이씨가 아닌 학생의 학번 이름 전공코드1 조회
SELECT studno , NAME , major1
FROM student
WHERE NAME NOT LIKE'이%';
/*
1.학생 성이 김씨가 아닌 학생의 이름 , 학년 , 전공 1학과조회
2. 교수테이블에서 101 , 201 학과에 속한 교수가 아닌 교수 중 성이 김씨가 아닌 교수의
이름 학과코드 , 직급을 조회
*/
SELECT NAME , grade , major1
from student
WHERE NAME NOT LIKE'김%';
SELECT name , deptno , position
FROM professor p
WHERE deptno NOT IN(101,201) AND name NOT LIKE'김%';
3-4) null
null의미 : 값이 없다 . 비교대상이 안됨
( = > < 비교 불가)
is null : 컬럼의 값이 null
is not null : 컬럼의값이 null이 아닌 경우
null은 연산이 불가능
-- 교수 중 보너스 없는 교수의 이름 급여 보너스 조회
SELECT p.`name` , p.salary , p.bonus
FROM professor p
WHERE p.bonus IS NULL;
-- 교수 중 보너스 있는 교수의 이름 급여 보너스 조회
SELECT p.`name` , p.salary , p.bonus
FROM professor p
WHERE p.bonus IS NOT NULL
ORDER BY p.bonus DESC; #내림차순
-- 학생 중 지도교수(profno) 없는 학생의 학번,이름
SELECT s.profno , s.name , s.major1
FROM student s
WHERE s.profno IS NULL;
--교수의이름(name) 교수번호(no) 현재급여(salary)상여금(bonus)
-- 통상급여(salary+bonus)조회
SELECT NO 교수번호 , NAME 교수이름 , salary 현재급여
, bonus 보너스 , salary+bonus 통상급여
FROM professor;
/*
null은 비교 연산의 대상X
null값과의 연산의결과는 null
*/
--교수 중 보너스가있는 교수의 이름 급여 보너스 연봉 조회
SELECT NAME ,salary , bonus , (salary * 12 +bonus) 연봉
FROM professor
WHERE bonus IS NOT NULL
ORDER BY salary DESC , bonus DESC;
# 급여 , 보너스 내림차순정렬 ( 급여 내림차순이 우선임)
3-5 ) Order by
-- 1학년 학생의 이름 , 키를 조회하기 , 키가 큰 순으로 출력
SELECT NAME , height
FROM student
WHERE grade=1
ORDER BY height DESC;
# 조회된 컬럼순서로 정렬 , height가 2번째 조회된 컬럼이므로 2
SELECT NAME , height
FROM student
WHERE grade=1
ORDER BY 2 DESC;
# 별명으로 정렬하기
SELECT NAME 이름 , height 키 FROM student
WHERE grade = 1
ORDER BY 키 DESC;
#order by는 가장나중에 실행되기때문에 별명으로도 정렬 가능
# 학생의 이름 학년 키 조회하기 . 학년순 , 키가큰순 으로 출력
SELECT NAME , grade , height
FROM student
ORDER BY grade ,height DESC;
#정렬의 기본은 오름차순(ASC) 생략가능
SELECT NAME , grade , height
FROM student
ORDER BY 2 ,3 DESC;
-- 컬럼의 순서 , 별명으로 정렬 시 반드시 해당컬럼이 조회되어야함
-- 컬럼명으로 정렬 시 조회된 컬럼이 아니어도 가능
-- 1학년 학생의 이름조회( 키가 큰순으로 출력)
SELECT NAME FROM student
WHERE grade=1
ORDER BY height DESC;
-- 문제:
-- 1. 교수테이블(professor(에서
-- 교수번호 이름 학과코드 , 급여 , 예상급여(10%인상)출력
-- 단 학과코드 순으로 예상급여의 역순조회
-- 2.학생테이블에서 지도교수(profno)가 배정되지 않은 학생의
-- 학번, 이름, 지도교수번호, 전공1코드 출력하기 단 학과코드 순으로 정렬하기
--
-- 3.1학년 학생의 이름, 키, 몸무게 출력하기 단 키는 작은순으로 몸무게는 큰순으로 출력하기
-- 1
SELECT NO, p.deptno , p.`name` , p.salary , (p.salary*1.1) 예상급여
FROM professor p
ORDER BY p.deptno,예상급여 DESC;
-- 2
SELECT * FROM student;
SELECT s.studno,s.`name`,s.profno,s.major1
FROM student s
WHERE profno IS NOT NULL
ORDER BY s.studno ;
-- 3
SELECT NAME ,height,weight FROM student
GROUP BY height , weight DESC;
3-6) join 맛보기
SELECT * FROM professor;
SELECT * FROM student ;
SELECT p.`name`'지도교수' ,s.profno ,s.`name` '학생이름'
FROM professor p JOIN student s ON(p.no = s.profno)
professor p
student s
professor 의 no 과 student의 profno는 같은거라고 보면 됨 ( 원래는 외래키로 설정해야함)
p join s on(p.no = s.profno)
둘을 조인해서 교수이름 , 지도교수번호, 학생이름 출력해보자
-- 18. 1학년들의 이름과 국,수,영 점수 출력해보자
# join 이용해야함
SELECT * FROM score;
SELECT * FROM student;
SELECT s.grade , s.name , c.kor , c.math , c.eng
FROM student s JOIN score c USING(studno)
WHERE s.grade = 1;
예제문제 원본
4 ) 오늘의 예제문제 풀이
-- 1. emp 테이블에서 empno는 사원번호로, ename 사원명, job는 직급으로 별칭을 설정하여 조회하기
SELECT e.empno 사원번호 ,e.ename '사원명',e.job '직급'
FROM emp e;
-- 2. dept 테이블에서 deptno 부서#, dname 부서명, loc 부서위치로 별칭을 설정하여 조회하기
SELECT deptno '부서' , dname '부서명' , loc '부서위치'
FROM dept;
-- 3. 학생들을 지도하는 지도교수번호(profno) 조회하기
SELECT profno
FROM student
WHERE profno IS NOT NULL;
--
-- 4. 학생테이블에서 name, birthday,height,weight 컬럼을 조회하기
-- 단 name은 이름, birthday는 생년월일 ,height 키(cm),weight 몸무게(kg) 으로 변경하여 조회하기
SELECT NAME '이름' , birthday '생년월일' , height '키' , weight '몸무게'
FROM student;
--
-- 5. emp 테이블에서 급여가 800보다 큰사람의 이름, 급여(salary), 부서코드(deptno) 조회하기
SELECT ename , salary , deptno
FROM emp
WHERE 800<=salary;
--
-- 6. professor 테이블에서 직급(position)이 정교수인 교수의 이름(name),부서코드(deptno),직급(position) 조회하기
SELECT NAME , deptno , position
FROM professor
WHERE `position` ='정교수';
--
-- 7. 전공1이 101번,201 학과의 학생 중 몸무게가 50이상 80이하인 학생의 이름(name), 몸무게(weight), 학과코드(major1)를 조회하기
SELECT NAME , weight , major1
FROM student
WHERE major1 IN(101,201) AND (weight BETWEEN 50 AND 80);
--
-- 8. 사원의 급여가 700이상인 사원들만 급여를 5% 인상하기로 한다. 인상되는 사원의 이름, 현재급여, 예상인상급여, 부서코드 출력하기
SELECT ename , salary , (salary*1.05) '예상급여' , deptno
FROM emp
WHERE 700<=salary;
--
-- 9. 학생테이블에서 생일이 1998년 6월 30일 이후에 출생한 학생 중
-- 1학년 학생인, 이름(name), 전공코드(major1), 생일(birthday), 학년(grade) 컬럼 조회하기
-- 날짜는 '2024-06-30' 로 표시 한다.
SELECT * FROM student ;
SELECT s.`name` , s.major1 , s.birthday , s.grade
FROM student s
WHERE s.birthday > '1998-06-30' AND grade=1;
--
-- 10. 학생테이블에서 생일이 1998년 6월 30일 이후에 출생한 학생 이거나, 1학년 학생인 학생의
-- 이름(name), 전공코드(major1), 생일(birthday), 학년(grade) 컬럼 조회하기
-- 날짜 표시는 '1998-06-30' 한다.
SELECT NAME , major1 , birthday , grade
FROM student
WHERE grade=1 OR birthday > '1998-06-30';
-- 11. 전공학과 101이거나 201인학과 학생 중 키가 170이상인 학생의 학번, 이름, 몸무게, 키, 학과코드 조회하기
SELECT s.studno , s.name , s.weight , s.height , s.major1
FROM student s
WHERE s.major1 IN(101,201) AND s.height>=170;
-- WHERE s.major1 = 101 OR major = 201;과 같음
--
-- 12. 학생 테이블에 1학년 학생의 이름과 주민번호,생일, 키와 몸무게를 출력하기.
-- 단 생일이 빠른 순서대로 정렬
SELECT grade '학년',NAME ,s.jumin , birthday , height , weight
FROM student s
WHERE grade=1
ORDER BY birthday ;
-- 13. 학생 중 전화번호가 서울지역이 아닌 학생의 학번, 이름, 학년, 전화번호를 출력하기
-- 단 학년 순으로 정렬하기
SELECT * FROM student;
SELECT studno , NAME , grade , tel
FROM student
WHERE tel NOT LIKE('02%') #02로시작안하면 서울이 아님
ORDER BY grade;
--
-- 14. 학생 테이블에서 id에 kim 이 있는 학생의 학번, 이름, 학년, id 를 출력하기.
-- 단 kim은 대소문자를 구분한다.
SELECT studno, NAME , grade , id
FROM student
WHERE id LIKE BINARY('%kim%');
--
-- 15. 학생 중 이름의 끝자가 '훈'인 학생의 학번, 이름, 전공1코드 조회하기. 학년 순으로 정렬하기
INSERT INTO student values
(240994,'박 훈','hoon2',1,'0502233234567',str_to_date('1998-02-20','%Y-%m-%d'),'055)333-1234',183,71,101,null,NULL);
#박훈이라는 학생을 추가해봤음
SELECT studno , NAME , major1
FROM student
WHERE name LIKE('%훈')
ORDER BY grade;
--
-- 16. 교수 중 교수의 성이 ㅈ이 포함된 교수의 이름을 출력하기
SELECT NAME FROM professor ;
SELECT name
FROM professor
WHERE '자%'<= NAME AND NAME < '차%' ;