Day11 연산자와 데이터 검색, 정렬

2023. 3. 17. 17:00SQL

SQL연산자
1. 산술 연산자
+,-,*,/,mod(나머지),div(몫)

2. 비교 연산자
=(같다/ where절에만 가능),<,>,>=,<=,<>(다르다)

3. 대입 연산자
= (컬럼명에만 사용)

4. 논리 연산자
and, or, not, xor

5. 기타 연산자

is: 양쪽이 모두 같으면 : true | 아니면 : false
between A and B (A,B는 피연산자) : 값이 A보다 크거나 같고, B보다는 작거나 같으면 True
in: 매개변수로 전달된 리스트에 값이 존재하면 True, 아니면 Fasle    
like: 패턴으로 해당 문자열을 검색하여 값이 존재하면 True | Fasle

 

 

 

SQL은 str이라고 굳이 싱글쿼트를 쓸 필요가 없다.

 


#✔실습
use kdt;
select userid,username,gender from member;
#DB는 순서는 상관없다. 따라서 필드를 불러올때도 순서는 상관 X

select userid as 아이디, username as 이름, hp as 번호 from member;
# 원본에는 영향 x

select * from member;

모든 컬럼을 가져오는 것은 지양한다.

현장에서는 필드수, row수가 상당해서, 전체 리스트를 뽑아오면 상당한 시간이 소요된다.

따라서 연습용, 시험용으로 사용하자.


 

 

# null,''
select null; # 데이터가 없다, insert가 되지 않은 것
select ''; # 데이터가 있다. ''라는 데이터 insert

select 100 + null; # 결과 null | 연산 x
select 100 + ''; # 결과: 100 | 연산 O

SQL에서 null은 데이터가 없다는 뜻

하지만 ' ' 빈공간은 데이터가 있는 것이다 !

 

 

SQL은 = 1개로 대입 연산자와 비교 연산자 사용 

 


 

# ✔로그인
select userid,username,hp,email from member where userid ='apple'and userpw = '1111';
select userid,username,hp,email from member where userid ='apple'and userpw = '2222';

# ✔is (address1이 비어있는 사람 찾기)
select userid,username,hp from member where address1 = 'null'; 	# 잘못됌
select userid,username,hp from member where address1 = null;	# 잘못됌

select userid,username,hp from member where address1 is null;	
select userid,username,hp from member where address1 is not null;

#✔between A and B
update member set point = 300 where userid='grapes';

select userid,username point from member where point between 300 and 600;
select userid,username point from member where point >= 300 and point <= 600;


#✔like 연산자
select userid,username from member where userid like 'a%' ; -- a로 시작하는 문자열
select userid,username from member where userid like '%a' ; -- a로 끝나는 문자열
select userid,username from member where userid like '%a%' ; -- a가 들어가는 문자열
select userid,username from member where userid like '%app%' ; -- app이 들어가는 문자열
select userid,username from member where userid like '%app__%' ; -- app으로 시작하는 5글자

 


# ✔✔정렬 
# select 필드명1,필드명2.. from 테이블명 order by 정렬할 필드명 [asc,desc]
# 알파벳 오름차순 정렬
select userid,username,point from member order by userid asc; 	#오름차순
select userid,username,point from member order by userid desc; 	#내림차순
select userid,username,point from member order by userid; 		#오름차순(기본값)

# 포인트를 기준으로 내림차순, 만약 같은 포인트인 경우 아이디로 내림차순 정렬
select userid,username,point from member order by point desc, userid desc; # 1차정렬, 2차정렬

select * from member;

#✔where + 정렬
#select 필드명1,필드명2.. from 테이블명 where 조건절 order by 정렬할 필드명, [asc,desc];

#문제 _ 성별이 여성인 회원을 포인트가 많은 순으로 정렬하기 (단 포인트가 같을경우 먼저 가입한 순으로 정렬)
select userid,username,gender,regdate,point from member where gender = 'f'
order by point desc, regdate asc;
#✔limit 
#select 필드명1,필드명2.. from 테이블명 limit 가져올 행의 개수
#select 필드명1,필드명2.. from 테이블명 limit 시작행 ,가져올 행의 개수
#주로 정렬 후 사용함

select userid, username,gender from member limit 3; #처음부터 3개 가져옴
select userid, username,gender from member limit 3,2; #인덱스 3부터 2개를 가져옴

#✔정렬 + limit
#select 필드명1,필드명2.. from 테이블명 order by 정렬할 필드명 [asc,desc] limit 가져올 행의 개수
select userid, username, gender, point from member order by point desc limit 3;

#✔✔집계함수

#✔count : 행의 개수를 세는 함수
# cf)전체 인원을 알고 싶으면 : primary key가 적용된 필드를 선택 
select count(userid) as 전체인원 from member;
# 주소를 입력한 인원 : null이 있기 때문에 그것을 제외하고 갯수를 셈
select count(zipcode) as 우편번호 from member;

#✔sum : 행의 값을 더함
select sum(point) as 포인트합계 from member;
select userid,sum(point) as 포인트합계 from member;
# 만약 userid에 무엇을 넣고 싶다면 그룹을 넣어야함.

#✔avg: 행값의 평균을 구함 
select avg(point) as 평균 from member;

#✔min: 행의 최소값
select min(point) as 최소값 from member;

#✔max: 행의 최대값
select max(point) as 최대값 from member;

# ✔✔그룹
# select 그룹을 맺은 컬럼 or 집계함수 from 테이블명 group by 그룹을 맺을 필드명
select gender from member group by gender;
select gender,sum(point) from member group by gender;
select gender,avg(point) from member group by gender;
select gender,count(userid) from member group by gender;

# ✔✔그룹 + 그룹조건(where절이 아님)
# select 그룹을 맺은 컬럼 or 집계함수 from 테이블명 group by 그룹을 맺을 필드명 having 조건절;
select gender from member group by gender having gender = 'f'; #그룹에 대한 조건

insert into member (userid,userpw,username,hp,email,gender,ssn1,ssn2) 
					values ('berry','6666','베리','010-6666-6666','berry@berry.com','m','666666','6666666');
                    
# 조건절 + 그룹 + 그룹조건 + 정렬 
#select 그룹을 맺은 컬럼 or 집계함수 from 테이블명 where 조건절 group by 그룹을 맺을 필드명 having 그룹조건절 order by 정렬할 필드명,[asc,desc];

# 문제_ point가 0이 아닌 회원들 중에서, 남,여로 그룹을 나눠서 포인트의 평균을 구하고, 
# 평균 포인트가 100이상인 성별을 검색하여 포인트로 내림차순 정렬

select gender, avg(point) as avg from member where point > 0 group by gender having avg > 100 order by avg desc;
728x90