DB/SQL - Oracle

[SQL] DML(데이터 조작어) - select *연산자, where조건문 활용 예제*

생각많은 프로그래머 2024. 2. 2. 15:07
SQL 종류
1. 데이터를 정의하는 쿼리 - DDL(데이터 정의어) : create, drop, alter, truncate 
2. 데이터를 조작하는 쿼리 - DML(데이터 조작어) : insert, select, update, delete
3. 데이터를 제어하는 쿼리 - DCL(데이터 제어어) : grant, revoke
4. 트랜잭션 제어하는 쿼리 - TCL(트랜잭션 제어어) : commit, rollback, checkpoint 

 

 

select문에 대해서 기본적인 부분은 아래 글을 참고해주세요!

https://bio-logisch.tistory.com/19

 

[SQL] SQL의 종류(4) - DML(데이터 조작어) - select

1. 데이터(테이블, 시퀀스, 뷰)를 정의하는 쿼리 - DDL(데이터 정의어) : create, drop, alter 2. 데이터(튜플)을 조작하는 쿼리 - DML(데이터 조작어) : insert, select, update, delete 3. 데이터를 제어하는 쿼리 - DC

bio-logisch.tistory.com

 

 

 

이번에는 조금 더 복잡한 경우에서의 select문에 대해 예제를 통해 공부해보고자 한다!

select문의 세계는 끝도 없다...

 

select 시 여러 조건을 걸어서 특정한 튜플만 조회하고자 할 경우에는

아래 형식을 활용해서 여러 절을 추가해서  select문을 작성하게 된다.

오늘은  where절과 order by를 사용하는 select문을 다뤄본다.

select 명령어 형식

 

 

아래는 select문에서 조건절에 자주 사용되므로 미리 숙지하면 좋다!

조건 설명
A and​ B  A와 B 모두 성립하는 조건일 경우 조회
* 즉 하나라도 성립하지 않으면 조회되지 않는다.
A or B A 혹은 B 중 하나이상 성립하는 조건일 경우 조회
between​ A and B  A와 B사이에 해당하는 값의 범위 지정
in   /  not in   in은 특정 값을 지정하고 not in은 특정 값이 아닌 값을 지정
 like % 패턴을 지정. %와 함께 사용하며,
%자리에는 문자든 숫자든 어떤 값이 와도 된다.

 

**** WHERE user_gender ​= 'male' OR user_amount ​>= 5500 ;

위의 식처럼 or이나 and로 연결하는 두 조건의 형식이 전혀 달라도 된다!

 

*** like '3%'이면 3으로 시작하는 값에 해당한다. 예를 들면 31, 300, 3121 등에 해당한다.

       %자리에는 어떤 수가 와도 된다.

 

 

예제를 통해 다양한  select 문을 다뤄보고자 한다.

create table member (
no number(2) primary key,
name varchar2(10),
age number(2),
addr varchar2(20),
point number(4)
);

*컬럼 설명 :
no : 회원번호 / name : 회원명 / age : 나이 / addr : 주소 / point : 포인트

 

 

아래와 같이 테이블에 튜플을 insert 해보겠다.

insert into member values (1,'김일수',23,'경기도 수원시',300) ;
insert into member values (2,'홍길수',34,'수원시',250) ;
insert into member values (3,'이지수',48,'용인시',100) ;
insert into member values (4,'삼국지',49,'서울시',400) ;
insert into member values (5,'사거리',37,'용인시​',250) ;
insert into member values (6,'오징어',23,'서울시​',180) ;​
insert into member values (7,'칠성수',10,'서울시​',300) ;

 

문제1) 포인트가 200이상인 사람의 이름과 주소와 포인트를 출력하시오. ​​
select name,addr,point from member where point>=200 ;
문제2) 포인트가 300미만인 사람의 모든 정보를 출력하되 포인트를 내림차순으로 출력하시오.​
select * from member where point>300 order by point desc;
문제3) 포인트가 200이상 250미만인 사람의 모든 정보를 출력하시오. 
select * from member where point between 200 and 250 ;
문제4) 거주지가 서울인 사람의 모든 정보를 출력하시오.​​
select * from member where addr='서울시' ;
문제5) 거주지가 서울이거나 용인인 사람의 정보의 이름과 주소를 출력하시오.​​
select name,addr from member where addr='서울시' or addr='용인시' ;
문제6) 거주지가 수원인 사람의 모든 정보를 출력하시오. ​​
select * from member where addr='경기도 수원시' or addr='수원시' ;
문제7) 문제 5번에서 조건식에서 in 연산자를 사용하여 풀어보세요.​
select name,addr from member where addr in ('서울시','용인시') ;

*** addr in ('서울시','용인시') 와 동일한 표현으로는

addr='서울시' and addr='용인시';

반대 표현으로는 addr not in ('서울시','용인시');

혹은 addr!='서울시' and addr!='용인시';​

문제8) 모든 사람의 이름과 나이가 출력되게 하세요.
출력 시에는 name 대신 이름, age 대신 나이라고 컬럼명을 변경하여 출력하시오.​
select name as 이름, age as 나이 from member ;
문제9) 문제 8번 쿼리문을 실행한 후 실제 테이블의 컬럼명도 바뀌었는지 확인하세요.
select * from member ;

 

*** 실제 테이블의 컬럼명은 바뀌지 않는다.

**** as - 별칭지정, select 절과 from 절에서 많이 사용한다.
where절에 별칭컬럼을 쓰면 작동되지 않는다.
where 절에는 테이블에 실제로 있는 컬럼명을 입력해야 한다.

 

문제10) 30대인 사람의 정보를 모두 출력하시오. 
select * from member where age between 30 and 39 ;
select * from member where age>=30 and age<40 ;
 
select * from member where age like '3%' ; 
*** age컬럼의 속성이 여기서는 number(2) 이므로
위 select문을 실행하면 30~39에 해당하는 튜플이 조회된다.
 like '3%' 만 보면 3으로 시작하는 모든 수가 가능하다.

31, 300, 33111, 등

 

select * from member where age like '3_' ;
*** 3으로 시작하는 두자리 숫자만 나오므로 30대만 나올 수 있다.
_는 %와 달리 딱 한 자리 내에서 0~9까지의 수가 올 수 있다.

 

 

연산식을 사용해서 나이가 30대의 튜플만 출력되도록 할 수도 있다.

select * from member where floor(age/10)=3 ;
select * from member where age/10>=3 ​and age/10<4 ;

​​

 

문제11) 포인트에 10%만 사용가능(가용포인트)하다고 할 때,
20포인트가 넘는 사람의 이름, 나이, 실제포인트, 가용포인트를 출력하시오.
 
select name,age,point,point*0.1 as rest_point from member where point*0.1 > 20 ;
select name as 이름,age as 나이,point as 실제포인트,point*0.1 as 가용포인트 from member where point*0.1 > 20 ;
​​
문제12) 포인트가 높은 순서대로 정렬하시오. 포인트가 같은 경우는 나이가 많은 순서로 출력한다.
 
select * from member order by point, age;

 

 

 

+

오름차순 정렬
age 오름차순 정렬 >> 나이가 어린 경우의 튜플부터 점차 나이가 많은 순으로 출력된다.
select * from member order by age asc ;
*** 오름차순이 default이기 때문에 asc를 생략해도 된다.

 

내림차순 정렬
age 내림차순 정렬 >> 나이가 많은 경우의 튜플부터 출력된다.
select * from member order by age desc ;
 
다중정렬
age 기준으로 내림차순으로 하고 age에서 값이 같다면 id 기준으로 내림차순으로 정렬된다.
select * from member order by age desc, id desc;