IT 공부/MySQL

select, 함수

toraa 2022. 7. 13. 16:41

select 컬럼명, 컬럼명, 컬럼명,... from 테이블
select * from 테이블 [where 조건]
   

select [distint] 컬럼, 컬럼, 컬럼...
    from 테이블1 [inner join] [outer join]
            테이블2 [inner join] [outer join]
             
        [on 조인 조건식]
        [where 조건식 [중첩질의]]
        [group by 컬럼, 컬럼, .. [having 조건식]]
        [order by 컬럼, 컬럼, .. [asc|desc]] 
        
. select절 : 검색결과에 포함된 컬럼명들
. from절 : 검색해올 테이블. 만약 두개 이상의 테이블에서 조인할 경우, ON절에 정의된 조건식에 의해 조인
                테이블의 별명(Alias) 처리 - as 별명 --> A.이름, B.이름
. on절 : 조인연산식
    . where절 : 레코드단위의 조건식
    . group by : 특정 컬럼을 기준으로 동일한 값끼리 묶는것
    . having절 : group by로 묶인 그룹 내에서의 조건검색
    . order by : 오름차순, 내림차순
   
. 단순질의문
   select ~~~~ from 테이블 [where]

 

# 수강신청의 모든 내역을 검색하여 출력하시오
# 학생 테이블에서 학생이름, 주소, 학생번호를 출력하시오
# 수강신청 테이블에서 학생번호, 신청시각, 강의번호 순으로 출력하시오
select * from 수강신청;
select 학생이름, 주소, 학생번호 from 학생;
select 학생번호, 신청시각, 강의번호 from 수강신청;

# 실습
select 강의번호, 강의이름, 선수과목 from 강의;
select 교수번호, 소속학과, 입사일 from 교수;
select 소속학과, 교수이름, 전화번호 from 교수;

# 학생테이블에서 학년 컬럼값을 기준으로 오름차순으로 정렬하여 학생이름, 학생번호, 주소를 검색
select 학생이름, 학생번호, 주소 from 학생 order by 학년 asc; 

# 교수테이블에서 입사일자를 기준으로 오름차순으로 정렬하여 교수이름, 전화번호, 입사일를 출력하시오
select 교수이름, 전화번호, 입사일 from 교수 order by 입사일 asc;
# 강의테이블에서 강의번호 내림차순으로 정렬하여 강의번호, 강의이름, 강의시간 출력
select 강의번호, 강의이름, 강의시간 from 강의 order by 강의번호 desc;
# 수강신청 테이블에서 신청시각을 오름차순으로 정렬하여 학생번호, 강의번호 순으로 출력
select 학생번호, 강의번호 from 수강신청 order by 신청시각 asc;

# 학생 테이블에서 학년을 기준으로 내림차순으로 정렬한 뒤, 다시 학생번호를 기준으로 오름차순으로 정렬하여 모든 칼럼을 출력하시오
select * from 학생 order by 학년 desc, 학생번호 asc;

# 학생 테이블에서 소속학과를 내림차순으로 정렬할 뒤, 학년을 오름차순으로 정렬하여 학생번호, 소속학과, 학년을 검색
select 학생번호, 소속학과, 학년 from 학생 order by 소속학과 desc, 학년 asc;

# 학생 테이블에서 이름을 오름차순으로 정렬한 뒤 성별을 내림차순으로 정렬하여 전체를 검색
select * from 학생 order by 학생이름 asc, 성별 desc;

# 수강신청 테이블에서 수강신청된 과목의 강의번호의 종류를 검색
-- 중복 제외시 distinct 사용 
select * from 수강신청;
select distinct 강의번호 from 수강신청;

# 학생테이블에 있는 소속학과의 종류를 검색하시오
select distinct 소속학과 from 학생;
# 교수테이블에 있는 직위의 종류를 검색하시오
select distinct 직위 from 교수;
# 강의테이블에 있는 이수구분의 종류를 검색하시오 
select distinct 이수구분 from 강의;

# 학생 테이블에서 학생의 나이가 적은/많은 세명의 학생의 학생번호, 학생이름, 나이, 소속, 학과를 검색하시오
select * from 학생;
select 학생번호, 학생이름, 나이, 소속학과 from 학생 order by 나이 asc limit 3;
select 학생번호, 학생이름, 나이, 소속학과 from 학생 order by 나이 desc limit 3;
# 수강신청 테이블에서 가장 먼저 수강신청한 3명의 학생번호, 신청시각을 검색하시오
select 학생번호, 신청시각 from 수강신청 order by 신청시각 desc limit 3;
# 교수 테이블에서 가장 늦게 입사한 교수 2명의 소속학과, 교수이름, 입사일을 검색하시오
select 소속학과, 교수이름, 입사일 from 교수 order by 입사일 desc limit 3;

# select ~~~~~~ from 테이블 where 조건질의문(비교/논리/특수)
# 		- 비교: =, <, <=, >, >=, != (<>)
#		- 논리 : and(&&), or(||), not(!), is not null
#		- 특수 : 컬럼 between 값 and 값
#				컬럼 like 'v%' 		- v로 시작하는 문자열
#						 '%v%'		- v가 들어있는 문자열
#						 '%v'		- v로 끝나는 문자열
#				컬럼 in(v1,v2,v3)	- v1~v3 중 하나와 일치하는 검사
#				컬럼 is [not] null	- null 여부검사

# 강의 테이블에서 강의명이 데이터베이스인 강의의 강의이름, 강의시간, 인원제한을 검색하시오
select 강의이름, 강의시간, 인원제한 from 강의 where 강의이름 ='데이터베이스';
# 학생 테이블에서 3학년 이상의 이름, 학년, 전화번호를 검색하시오
select 학생이름, 학년, 전화번호 from 학생 where 학년>= 3;
# 학생 테이블에서 2학년 이외의 학생들의 정보를 모두 검색하시오
select * from 학생 where 학년 != 2;
# 수강신청 테이블에서 2014년 3월2일 오후 6시 이전에 신청한 학생번호와 신청시각을 검색하시오
select 학생번호, 신청시각 from 수강신청 where 신청시각 < '2014-03-02 18:00:00';

# 학생 테이블에서 남학생이고 나이가 25살인 학생의 학생번호, 소속학과, 이름, 학년을 오름차순으로 정렬하여 검색하시오
select 학생번호, 소속학과, 학생이름, 학년 from 학생 where 나이=25 ;
# 교수 테이블에서 2000년과 2010년 사이에 입사한 교수의 정보를 모두 출력하시오
select * from 교수 where 입사일 >= '2000-01-01' && 입사일 <= '2010-01-01' ;
# 교수 테이블에서 소속이 컴퓨터과학과 이면서 퇴직한 교수의 이름, 전화번호를 모두 출력하시오
select 교수이름,전화번호 from 교수 where 소속학과='컴퓨터과학과' and 퇴사일 is not null;
-- is not null 사용

select * from 교수;
# 학생 테이블에서 국어국문학과 법학과 이외의 모든 학과의 학생정보를 검색하시오
select * from 학생 where 소속학과 != '국어국문학과' or '법학과';
# 교수 테이블에서 직위가 부교수이면서 입사일이 2004년도인 교수의 교수명, 직위, 입사일을 검색
select 교수이름, 직위, 입사일 from 교수 where 직위='부교수' and 입사일>='2004-01-01'and 입사일 <='2004-12-31';  

# 강의번호 C021, K014가 아닌 수강신청의 강의번호, 학생번호, 신청시각을 검색하시오
select  강의번호, 학생번호, 신청시각 from 수강신청 where 강의번호 != 'C021' or 'K014';
# 나이가 25살 이상이면서 남자인 학생의 학번, 이름, 전화번호를 검색하시오
select 학생번호, 학생이름, 전화번호 from 학생 where 나이>=25;
# 전공필수과목만 중복없이 검색하시오
select distinct * from 강의 where 이수구분 = '전공필수'; 

# 재중인 교수들의 교수명과 연락처, 담당과목을 검색하시오
select 교수이름, 전화번호, 강의이름 from 교수, 강의 where 퇴사일 is null; 

# 입사일이 1995년도 이후에 입사하였고, 현재 조교수인 교수들의 교수번호, 소속학과, 입사일을 검색하시오
select 교수번호, 소속학과, 입사일 from 교수 where 입사일>='1995-01-01' and 직위='조교수';

# 조교수들이 연구실 위치를 구로대학교로 변경하시오
update 교수 set 연구실위치='구로대학교' where 직위='조교수';
select * from 교수;

# 전공필수이거나 전공선택과목들의 강의명, 강의실, 강의시간, 인원제한, 이수구분내역을 조회하시오
select 강의이름, 강의실, 강의시간, 인원제한, 이수구분 from 강의 where 이수구분='전공필수' or'전공선택';

# 입사일이 가장 빠른 교수 2명에 대한 모든 정보를 검색하시오
select * from 교수 order by 입사일 asc limit 2;
# 가장 늦게 입사한 교수에 대한 모든 정보를 검색하시오
select * from 교수 order by 입사일 desc limit 1;
# 수강신청서에 등록된 강의번호의 종류만 출력하시오
select distinct 강의번호 from 수강신청;
# 박원장?학생의 정보를 3학년 여자 30살로 수정하시오
select * from 학생;
update 학생 set 학년='3', 성별='여', 나이='30' where 학생이름='장희령';
# 컴퓨터과학과의 성별을 오름차순으로 정렬하고 성별별로 나이가 많은 순으로 정렬하여 학생들의 정보를 출력하시오
select * from 학생 order by 성별 asc, 나이 desc;
# 교수번호 K041의 퇴사처리를 2022-6-30일자로 등록하시오
update 교수 set 퇴사일='2022-06-30' where 교수번호='K041';
select * from 교수;
# 교수 테이블에 급여(정수 10자리) 컬럼을 추가한 후, 2000년도 입사자는 500만원, 1900년도 입사자는 700만원으로 급여등록을 하시오
alter table 교수
	add column 급여 int(10) after 퇴사일;
update 교수 set 급여='5000000' where 입사일>='2000-01-01';
update 교수 set 급여='7000000' where 입사일<'2000-01-01';
# 교수 테이블에 급여컬럼을 '급여검색'인덱스로 설정하여 인덱스 생성여부를 검색하시오
create index 급여검색 on 교수(급여);
show index from 교수;
# 교수 테이블의 '급여검색' 인덱스를 삭제하시오
drop index 급여검색 on 교수;

# 학생의 나이가 25살에서 35살 사이인 학생들의 정보를 검색하시오. -- 특수연산자 활용
select * from 학생 where 나이>=25 && 나이 <=35;
# 교수의 주소가 서울이 교수들의 정보를 검색하시오
select * from 교수 where 주소 like '서울시%' ;
# 강의 테이블에서 교양필수와 전공선택의 강의정보를 출력하시오
select * from 강의 where 이수구분='교양필수'or 이수구분='전공선택';
# 2000년부터 2011년도 사이에 입사한 교수들은?
select * from 교수 where 입사일 >= '2000-01-01' and 입사일<='2011-12-31';
# 서울에 살고 있는 학생들의 명단을 검색하시오
select * from 학생 where 주소 like '서울%';
# 강의실이 신관으로 배정되어 있는 과목과 시간을 검색하시오
select 강의이름, 강의시간 from 강의 where 강의실 like '%신관%';

함수
- 문자함수 : 문자열 추출 및 변경
             . char_length(문자열)
            . concat(str1, str2) 결합
            . insert(str1 n1,num,str2) : str1문자열에 n1번째 문자부터 num갯수만큼 str2로 대체 
            . insert(x,y) x의 문자열에서 y의 문자열을 찾아 위치를 리턴
            . lower()
            . upper() 
            . left(str,n) : str 문자열의 왼쪽에서 n개
            . right(str,n)
            . substring(str,n,num) : str문자열의 n번째 문자부터 num개의 문자열을 반환
            . reverse(str)
            . replace(str,s1,s2) : 문자열 str에서 일치되는 s1을 s2로 대체
            . trim(str) : str문자열의 양쪽공백제거

 

 - 숫자함수 : 삼각함수, 절대값, 올림/버림 등 계산
            . abs(숫자)
            . celling(), floor() : 소수점 자릿수 안됨
            . truncate(숫자,n) : 숫자의 n번째 소수점이하를 버림
            . round(숫자,n)   : n번째 소수점에서 반올림
            . mod(num1,num2) : num1/num2 나머지
            . powr(x,y)  : x ** y
            . rand()
            
- 날짜함수 : 날짜와 시간함수 

 

* alias (as) : 결과를 쉽게 알아볼 수 있도록 별칭부여

 

select 교수이름, substring(주소,1,2) as 도시이름 from 교수;
select 강의번호, 강의이름, 인원제한, concat(강의실,강의시간) as 강의장소 from 강의;
select 학생이름, 학생번호, 주소 from 학생 where char_length(주소) >= 8;
select 학생번호, 소속학과, 학생이름, concat(학년,'학년') 학년 from 학생;

select abs(-153) as 절대값, rand(rand(),3) 랜덤값;
select 강의이름, 강의시간, concat(truncate(인원제한*0.15,-1),'명') as '인원제한 15%'
	from 강의 where 이수구분 = '전공필수';

# 교수테이블에서 교수이름, 교수번호, 주거 도시이름을 출력하시오
select 교수이름, 교수번호, substring(주소,1,2) as 도시이름 from 교수;
# 강의테이블에서 전공필수, 강의번호, 인원제한, 강의실과 강의시간을 결합하여 강의실과시간으로 출력하시오
select 강의번호, 인원제한, concat(강의실, 강의시간) as 강의실과시간 from 강의 where 이수구분='전공필수';
# 학생번호, 소속학과, 이름, 학년에 졸업예정자를 붙여서 4학년들만 출력하시오
select concat(학생번호, '졸업예정자')as 학생번호,concat(소속학과, '졸업예정자')as소속학과, concat(학생이름, '졸업예정자')as학생이름, concat(학년, '졸업예정자')as학년 from 학생 where 학년='4';

 

날짜함수
. adddate(x, interval y y단위) : x에 y단위시간을 더한 날짜를 반환
- interval 10 second :10초후
- interval 5 minute : 5분후
                - interval 10 hour  : 10시간후
                - interval 5 day : 5일후
                - interval 10 month : 10개월 뒤
                - interval 3 year : 3년 뒤alter
                
                - interval '5:30' minute_second : 5분 30초 뒤
                - interval '10 5:30:20' day_second: 10일 5시간 30분 20초 뒤
                - interval '5 10' year_month: 5년 10개월 뒤
                
. addtime(x,y) : x에 y시간을 더한 시간을 반환
        . current_date(): 현재 날짜를 반환
        . current_time(): 현재 시간을 반환
        . now() : 현재 날자와 시간을 반환 - 년월일시분초
        . datediff(x,y) : x,y의 날짜 차(일자 단위)를 반환    

 

select now() as 현재날짜;
select current_date() 현재년월일, current_time() 현재시간;
select current_date() 현재날짜, adddate(current_date(),interval '1 2:10' day_minute);
# 현재 날짜에서 2시간 10분뒤의 시간
select current_date() 현재날짜, adddate(current_time(), interval '2:10' hour_minute);
# 수강신청 시각이 2014년 2월 26일보다 1일후에 신청된 수강신청자의 명단을 검색하시오
select * from 수강신청;
select 강의번호, 학생번호, 신청시각, day(신청시각 - '2014-02-26') from 수강신청;	
# day(x) x의 일자값을 반환, month(x), year(x)
select 강의번호, 학생번호, 신청시각, datediff(신청시각, '2014-02-26')from 수강신청;

# 재직시간을 시간단위로 계산 후에 일자로 환산하고 소수점이 없도록 반올림하여 '일'을 붙여서 출력하시오
select 교수이름, 소속학과, 직위, concat(round((current_date()-date(입사일))/24,0),'일') as 재직기간 from 교수 where 퇴사일 is null;

 

'IT 공부 > MySQL' 카테고리의 다른 글

view  (0) 2022.07.14
join 2  (0) 2022.07.14
형변환, group, union, join  (0) 2022.07.13
테이블 수정, 인덱스  (0) 2022.07.12
테이블 생성  (0) 2022.07.11