SQL
데이터 정의어, 조작어 (DDL, DML)
데이터 정의어
create, alter, drop
데이터 조작어
select
데이터 조작어 실습하기
select 'hello world';
select 3+5;
select deptno, deptname from department;
select title from employee;
- 관계대수 연산자 projection의 결과에는 중복값이 포함되지 않습니다.
- 그러나 sql의 select에서는 중복값을 포함합니다.
- 중복값을 제거하려면, distinct를 활용합니다.
select distinct title from employee;
distinct는 모든 컬럼 값을 따졌을 때 중복을 제거합니다.
select문 활용
- where : 조건 검색, 특정 조건을 만족하는 투플들을 검색할 때 활용 (필터링, 실렉션과 같습니다.) =, >, >= 등의 비교연산자 적용
- like : 문자열의 포함관계 검색 (%와 _ 를 주로 이용합니다.)
- in, not in : 집합의 포함관계
- between a and b : a와 b 사이에 해당하는 값 (<=, >=를 이용해서도 구현할 수 있습니다.)
like 예제 :
사원 이름이 ‘이’로 시작하는 사원들의 모든 정보 검색
select * from employee where empname like '이%';
사원 이름이 권으로 끝나는 사원들의 모든 정보 검색
employee의 empname 컬럼을 보면, char(10)형식이므로 이름 뒤에 공백이 있습니다. 따라서 아무런 연산 없이 ‘%권’을 하게 되면, 결과가 제대로 나오지 않을 것입니다.
컬럼의 타입을 varchar(10)로 바꾸게 되면 유동적인 길이를 가지므로, like문을 정상적으로 이용할 수 있을 것입니다.
컬럼의 타입 바꾸기 순서
- 테이블 수정
- 컬럼 수정
- 타입 수정
alter table employee alter column empname type varchar(10);
varchar(x) 최대 x의 길이를 갖는 유동 크기 문자열 char(x) x의 고정 길이를 갖는 문자열
이렇게 타입을 바꾸고 난 후, like 문을 이용해 권으로 끝나는 사원의 정보를 검색할 수 있습니다.
select * from employee where empname like '%권';
사원 이름에 수가 들어가는 사원들의 모든 정보 검색
select * from employee where empname like '%수%';
%는 모든 문자열을 기준으로 조건을 검색할 수 있지만, _ 는 문자 하나로 생각합니다.
성이 ‘이’로 시작하는 세 글자 이름 사원의 모든 정보 검색
select * from employee where empname like '이__';
성이 ‘김’ , 끝이 ‘수’로 끝나는 세 글자 이름 사원의 모든 정보 검색
select * from employee where empname like '김_수';
앞에서 alter문을 이용해 컬럼의 타입을 varchar(10)로 바꿨습니다. 그러나 이 작업은 데이터베이스의 값을 직접 수정하는 것이므로 다른 연산에 문제를 야기할 수 있습니다. 만약에 컬럼의 타입을 수정하지 않고 공백을 제거한 상태로 연산하고 싶다면, trim 메소드를 이용합니다.
trim 메소드를 이용 예제 : ‘사원____ ‘ -> trim(‘사원__ ‘)=> ‘사원’
직접적으로 데이터를 변경하는 것은 아닙니다.
‘원’으로 끝나는 직급에 해당하는 사원들의 모든 정보를 검색하시오.
select * from employee where trim(title) like '%원';
다른 where 연산 예제
사원 중 1번 부서가 아닌 사원들의 모든 정보 (조건에 맞는데도 널값이 나오지 않는것을 볼수있습니다. 널값은 IS를 통해서만 연산이 가능합니다.)
select * from employee where dno != 1;
select * from employee where dno <> 1;
김정현 사원 추가 (dno는 외래키이므로 NULL이 가능)
insert into employee values(5000, '김정현', '사원',2106,1500000,NULL);
연산 결과에 널값을 포함하기
select * from employee where dno != 1 or dno is null;
1, 2번 부서 중 어디든 속한 사람의 모든 정보
select * from employee where dno in (1,2);
select의 산술 연산
사원들의 이름과 월급, 월급의 10%인상액을 계산해 검색
select empname, salary, salary*1.1 as new_sel from employee
as키워드를 통해 별칭을 붙이기
select empname, salary, salary*1.1 as new_sel, new_sel-salary from employee
이때 (new_sel)-(salary)와 같은 연산은 불가능합니다. new_sel이 원래부터 있는 칼럼이 아니기 때문입니다.
월급순으로 사원정보를 정렬
select *
from employee
order by salary asc
-- 원래는 asc가 없어도 됩니다.
-- order by는 정렬. 기본은 오름차순
select *
from employee
order by salary desc
-- 내림차순은 이런 방법으로
limit와 offset
- limit : 상위 n개만
- offset : 상위 n개 제외
월급이 높은 상위 3명의 사원의 모든 정보 검색
select *
from employee
order by salary desc
limit 3;
월급이 높은 상위 3명을 제외한 나머지 사원의 모든 정보 검색
select *
from employee
order by salary desc
offset 3;