KDT/DB

231123 DB - JOIN 2, 단일행함수 1

001cloudid 2023. 11. 23. 12:51
728x90

join

컬럼 별칭(alias)

SQL1> select 컬럼1, 컬럼2,... from 테이블 A join 테이블 B on 테이블 A.컬럼= 테이블B.컬럼

SQL2> 컬럼명 앞에 테이블명을 접두어로 붙여서 컬럼의 소속을 밝힘 → 성능 향상

select 테이블A.컬럼1, 테이블A.컬럼2,..., 테이블B.컬럼1, 테이블B.컬럼2,...

from  테이블A join 테이블 B

on 테이블A.컬럼명 = 테이블B.컬럼명

order by 테이블A.컬럼명;

SQL3> 테이블 alias 활용. 컬럼명 앞에 테이블 alias 접두어를 붙힘 → 성능 향상

select * from 첫번째 테이블 이름 별칭1 두번째 테이블 이름 별칭2 where 조건

 

join 추가 문법(오라클)

inner join(내부조인) : 조인조건을 만족하는 행만 반환하는 조인 유형. on절 조인(기본조인 유형)

 

outer join(외부조인) :  조인조건을 만족하는 행과 조인조건을 만족하지 않는 행까지 반환하는 조인 유형.

left outer join, right outer join

 

-- left outer join예제
-- employees 테이블과 departments 테이블을 사용해서 직원 정보(employee_id, last_name, salary)와 
-- 직원이 소속된 부서 정보(department_id, department_name)를 함께 출력하되 
-- 부서가 없는 직원도 출력
select e.employee_id, e.last_name, e.salary, d.department_id, d.department_name
from employees e left outer join departements d
on e.department_id = d.department_id
order by e.employee_id;

left outer join 예시 결과
그림 1. left outer join 예시 결과

 

-- right outer join
-- employees 테이블과 departments 테이블을 사용해서  
-- 직원 정보(employee_id, last_name, salary)와 
-- 직원이 소속된 부서 정보(department_id, department_name)를 함께 출력하되 
-- 소속된 직원이 없는 빈 부서 출력

select e.employee_id, e.last_name, e.salary, d.department_id, d.department_name
from employees e right outer join departements d
on e.department_id = d.department_id
order by d.department_id;

right outer join 예시 결과
그림 2. right outer join 예시 결과

 

-- left outer join 예제
-- employees 테이블을 사용해서 직원 정보(employee_id, last_name, manager_id)와 
-- 직원의 매니저 이름(last_name)을 함께 출력하되 매니저가 없는 사장도 출력 포함

select e1.employee_id, e1.last_name, e1.manager_id, e2.last_name
from employees e1 left outer join employees e2
on e1.manager_id = e2.employees_id
order by e1.employee_id;

ex1 결과
그림 3. ex1 결과


-- 연습문제1)  
-- members, orders 테이블 사용.
-- 주문정보(orde_num, member_id, order_date)와 
-- 주문자의 정보(member_name, phone, address)를 함께 출력

use shopdb;
desc members;
select * from members;

desc products;
select * from products;

desc orders;
select * from orders;
-- ※order_num X orde_num O 테이블 만들다가 오타남

select  o.orde_num, o.member_id, o.order_date, m.member_name, m.phone, m.address
from orders o join members m
on o.member_id = m.member_id;

연습문제 1 결과
그림 4. 연습문제 1 결과

 

-- 연습문제2)
-- products, orders 테이블 사용
-- 주문 정보(orde_num, member_id, prod_id, order_date)와 제품 정보(prod_name, price)를 함께 출력

select o.orde_num, o.member_id, o.prod_id, p.prod_name, p.price o.order_date
from orders o join products p
on o.prod_id = p.prod_id;

order by orde_num;

연습문제 2 결과
그림 5. 연습문제 2 결과

 

-- 연습문제3) 
-- members, products, orders 테이블 사용
-- 주문 정보(orde_num, order_date)와 주문자의 정보(member_name, phone, address)와
-- 주문한 제품의 정보(prod_name, price, company)을 함께 출력

select o.orde_num o.order_date, m.member_name, m.phone, m.address, p.prod_name, p.price, p.company
from orders o join members m on o.member_id = m.member_id
join products p on o.prod_id = p.prod_id
order by orde_num;

연습문제 3 결과
그림 6. 연습문제 3 결과


단일행함수 - 문자함수

함수란? 인수를 받아서 정해진 조작을 한 후 반드시 하나의 결과값을 반환함.

SQL 함수 유형 : 단일행함수, 다중행함수(그룹함수)

단일행함수란? 행당 조작해서 하나의 결과값을 반환하는 함수 유형

ascii(문자) : 해당 문자의 아스키코드값을 반환

char(숫자) : 아스키코드값에 해당하는 문자를 반환

※SQL에서 출력은 select from으로 함. 접근해야할 테이블이 없는 경우에는 from dual을 사용함.

단, mySQL에서는 from dual이 생략이 가능함.

 

select ascii('A'), ascii('a')
from dual;

ascii 함수
그림 7. ascii함수

 

select char(65), char(97) from dual;
-- Workbench의 버그 그림8처럼 나타남. 우클릭 후 Open Value in Viewer - Text들어가면된다(그림 9).

char 함수
그림 8. char 함수
버그 1버그 2
그림 9. workbench 버그일 때 우클릭-Open Value in Viewer- Text

 

length(문자열) : 문자열의 bytes 수를 반환

bit_length(문자열) : 문자열의 bit 수를 반환

char_length(문자열) : 문자열의 문자의 개수를 반환

 

select length('java'), bit_length('java'), char_length('java') from dual;

length, bit_length, char_length 함수 영문
그림 10. length, bit_length, char_length 함수 영문

 

select length('자바'), bit_length('자바'), char_length('자바') from dual;

length, bit_length, char_length 함수 한글
그림 11. length, bit_length, char_length 함수 한글

※한자의 경우 한자마다 다 다름. 동일하지 않음

 

select last_name, length(last_name) from employees;

length 함수 예시
그림 12. length함수 예시

 

concat(인수1, 인수2, ...., 인수n) : 인수를 연결해서 하나의 문자열로 반환함.

select employee_id, concat(first_name, last_name) as "이름" from employees;

concat 함수 1
그림 13. concat 함수 1

 

select employee_id, concat(first_name,' ', last_name) as "이름" from employees;

concat 함수 2
그림 14. concat 함수2

select concat('A','/','B','/','C','/','D','/','E') as value;

concat 함수 3
그림 15. concat 함수 3

 

concat_ws(구분자,인수1, 인수2, ..., 인수n) : 구분자와 함께 인수를 연결

select concat_ws('/','A','B','C','D','E') as value;

concat_ws 함수
그림 16. concat_ws 함수

 

select concat_ws('--',last_name,job_id,salary) as value from employees;

concat_ws 함수 예시
그림 16. concat_ws 함수 예시

 

instr(문자열, 특정문자) : 문자열부터 특정 문자의 첫번째 위치를 반환함.

select instr('daceaes','a'), instr('하나둘셋','둘');

instr 함수 예시
그림 17. instr 함수 예시 1

 

select last_name, instr(last_name,'a') as "a의 첫번째 위치?" from employees;

instr 함수 예시 2
그림 18. instr 함수 예시 2

 

upper/ lower

upper(문자열) : 문자열를 대문자로 반환함.
lower(문자열) :  문자열을 소문자로 변환함.

select employee_id, upper(last_name) as "L-name", lower(job_id) as "Job", lower(email) as "E-mail" from employees;

upper, lower 함수 예시
그림 19. upper, lower 함수 예시 1

 

select concat('The job id for ' , upper(last_name), ' is', lower(job_id)) as value from employees;

upper, lower 함수 예시 2
그림 20. upper, lower 함수 예시 2

 

left, right

left(문자열, 길이) : 문자열 왼쪽부터 해당 길이만큼 반환함

right(문자열, 길이) : 문자열 오른쪽부터 해당 길이만큼 반환함

select left('abcdefg',3) as "왼쪽부터글자반환", right('abcdefg',3) as "오른쪽부터글자반환";
select left('0001011234567',6) as "생년월일";

select concat(left('010-1234-5678',3), '-****-', right('010-1234-5678',4)) as "전화번호";

select last_name, left(last_name,2), right(last_name,2) from employees;

 

lpad, rpad

lpad(문자열, 전체자리수, 채울문자) : 전체자리수만큼 잡아서 문자열을 출력하되 남는 공간이 있다면 왼쪽부터 채울문자로 채워주는 함수. 오른쪽 정렬.

rpad(문자열, 전체자리수, 채울문자) : 전체자리수만큼 잡아서 문자열을 출력하되 남는 공간이 있다면 오른쪽부터 채울문자로 채워주는 함수. 왼쪽 정렬.

select lpad('가나다',10,'★'), rpad('가나다',10,'★');

lpad, rpad 함수 예시 1
그림 21. lpad, rpad 함수 예시 1

 

select lpad(last_name,20,' ') as "L-name", rpad(first_name, 20, ' ') as "F-name" from employees;

lpad, rpad 함수 예시 2
그림 22. lpad, rpad 함수 예시 2

 

ltrim/ rtrim / trim
ltrim(문자열) : 문자열의 왼쪽 공백을 제거해주는 함수 
rtrim(문자열) : 문자열의 오른쪽 공백을 제거해주는 함수
trim(문자열) : 문자열의 공백을 제거해주는 함수

trim(방향 제거문자 from 문자열) : 문자열로부터 해당 방향에 있는 제거 문자를 삭제함.

                                                       방향 leading(앞), trailing(뒤), both(양쪽)

select ltrim('                        SQL  '), rtrim('                        SQL  '), trim('                        SQL  ');

그림 23. ltrim, rtrim, trim 함수 예시

select trim(both '_' from '______SQL________________');

trim 함수 예시 1
그림 24. trim 함수 예시 1

 

select trim(leading '0' from '01');

trim 함수 예시 2
그림 25. trim 함수 예시 2

 

replace(문자열, 기준문자, 바꿀문자) : 문자열에서 기존 문자를 바꿀 문자로 바꿔서 반환함.

select employee_id, last_name, replace(phone_number,'.','-') from employees;

replace 함수 예시
그림 26. replace 함수 예시

 

space(길이) : 해당 길이만큼의 공백을 반환함.

select concat('A','                            ', 'B') as "결과"; = select concat('A',space(30), 'B') as "결과";

그림 27. space 함수 예시

728x90