부트캠프(DB)

자바/스프링 부트캠프 22일차( 시작,SELECT, WHERE )

동곤일상 2025. 3. 4. 17:01
반응형

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) 예제 풀이


1장_MariaDB_설치하기.pdf
1.09MB

 

 

DB버전은  pdf에 없는 버전이어도 괜찮다. 

 

 

설치한 파일을 더블클릭해보자

 

  관리자비번 설정화면임 

Use UTF8  언체크 시 한글이 안됨


클릭


실행 후 신규버튼 누르면 다음과같은 창이나옴

저장 후 열어!!!!

 

 

DB를 하나 더 만들어보자

 

 

도구 -> 사용자관리자  클릭 후

1사용자이름 만들고

2호스트는 %( 모든곳에서접근)

3비밀번호를 외우기편한것으로 설정!

 

 

새로운 사용자로 접근하는 법

파일->세션관리자 들어가서

세션을 하나 만든 후 사용자와 암호를 입력!!

 

설정 후 화면


1-1 ) 테이블 생성

 

1 . 해당 DB(본인 : gdjdb)  를 클릭 해준다

2. 밑에와 같이 뜬다면 정상연결

3.

mariadb-init.sql
0.01MB

 

위 파일과  같이 미리 만들어둔

파일을 복사해서 붙여넣고 모두 실행하면

다음과 같이 테이블이 들어갈 것임.

 


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;


예제문제 원본

test20250304.txt
0.00MB

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 < '차%' ;