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문을 정상적으로 이용할 수 있을 것입니다.

컬럼의 타입 바꾸기 순서

  1. 테이블 수정
  2. 컬럼 수정
  3. 타입 수정
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;