KDT 과정을 수강하며 그날 배운 내용의 확인과 복습을 위해 꾸준히 글을 써보려고 한다.
사전적인 지식보단 알기 쉽게 풀어놓은 내용으로 구성하고자 한다.
DAY 10 2023.03.16
오늘은 이어서 MySQL 의 문법과 사용을 적어 보겠다.
●SQL 연산자
1. 산술연산자
+,-,*,/, mod(나머지 연산자) , div(몫)
2. 비교 연산자
=(같다) , <,>,>=,<=,<>(다르다)
3. 대입 연산자
=
※대입 연산자와 비교 연산자의 구별은??
고민할 필요가 없다. 비교연산자 '=' 은 비교문에서만 나온다.
대입연산자 '=' 은 컬럼명과 함께 사용된다.
4. 논리 연산자
and, or ,not ,xor
xor : 둘의 값이 다르면 참
5.기타 연산자
is : 양쪽이 모두 true 또는 false
between A and B : 값이 A보다는 크거나 같고, B보다는 작거나 같으면 true 아니면 false
in : 매개변수로 전달된 리스트에 값이 존재하면 true 아니면 false
like: 패턴으로 문자열을 검색하여 값이 존재하면 true 아니면 false
MySQL 의 연산자 들이다. 밑에 데이터 검색과 함께 사용하며 사용법을 더 알아보자
●데이터 검색
문법
select 필드명1,필드명2.... from 테이블명;
예시)
select 100;
select 100 + 50; : 이렇게 할수 있지만 필드명이 없엇기에 계산값 자체가 필드값이 된다.
이런식으로 필드명이 잡히면 연동이 힘들기 때문에 별명 설정 필요
use kdt;
select userid,username,gender from member;
select username,userid,gender from member; : 이러 순서 바꿔서 가져옴 테이블에 순서가 확정되어있지 않다.
#별명
selcet 필드명 as 별명 from 테이블명;
select 100 + 50 as '덧셈'; -- ''를 사용하는 이유는 띄어쓰기가 있을 수 있어서 사용
select 100 + 50 as '덧셈 연산';
select userid as 아이디, username as 이름, hp as 휴대폰번호 from member; # as 뒤에 ''없으면 띄어쓰기 X
#모든 컬럼 가져오기 (추천하지 않음)
select * from member; #연산이 너무 많아서 실서버에서 이러면 안됌
null 과 ''
데이터가 있고 없는 것은 굉장히 큰 차이 이므로 숙지하자.
select null; #데이터가 없음, insert가 되지 않은것
select ''; #해당 셀에 '' 데이터가 삽입된 것
select 100 + null; # 결과 :null ,연산할 수 없음
select 100 + '' ; # 결과 :100 ,연산 가능
●조건절 : 조건에 맞는 데이터를 뽑아올 수 있다.
문법
select 필드명1,필드명2,... from 테이블명 where 조건절
select userid,username,hp,email from member where userid ='apple';
select userid,username from member where gender ='남자';
select userid,username,point from member where point >=300; #비교 연산자
로그인 ( 논리연산자)
select userid,username,hp,email from member where userid = 'apple' and userpw = 'le'; #이방식이 로그인 쿼리
is (주소 없는사람 찾기) :양쪽이 모두 True 거나 False 이면 True
select userid,username,hp from member where address1 = 'null'; -- 틀린방법
select userid,username,hp from member where address1 = null; -- 틀린방법2
select userid,username,hp from member where address1 is null; -- is의 양옆이 모두 null이냐
select userid,username,hp from member where address1 is not null; -- is의 양옆이 모두 not null,즉 주소가 있는사람
update member set point=300 where userid ='grape';
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 연산자 : 패턴으로 문자열을 검색하여 값이 존재하면 true 아니면 false
밑의 예시를 보자
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; #아이디로 오름차순
#point 내림차순으로 할건데 같을시 id로 내림차순 하고 싶다.
select userid,username,point from member order by point desc, userid desc; #뒤에 ,쓰고 적용하면 된다.
#조건절 + 정렬 : 조건절 먼저 그 뒤에 정렬
#select 필드명1,필드명2,.... from 테이블명 where 조건절 order by 정렬할 필드명 (asc,desc) # 조건절 무조건 먼저
#성별이 여성인 회원을 point가 많은순으로 정렬 (단,포인트가 같을 경우 먼저 가입한 순으로 정렬)
select userid,username,gender,regdate,point
from member where gender = '여자' order by point desc, regdate asc;
●limit : 행의 갯수를 제한해서 가져올 수 있다.
문법
#select 필드명1,필드명2,...from 테이블명 limit 가져올 행의 갯수
#select 필드명1,필드명2,...from 테이블명 limit 시작행,가져올 행의 갯수
select *from member;
select userid,username,gender from member limit 3;
select userid,username,gender from member limit 3, 2; #인덱스 3행부터 2개의 행을 가져옴
#정렬 + limit : 정렬한 후 마지막에 limit
#select 필드명1,필드명2.... from 테이블명 order by 정렬할 필드명[asc,desc] limit 가져올 행의 갯수
select userid,username,point from member order by point desc limit 3;
●집계함수 : 여러 행으로부터 하나의 결괏값을 반환하는 함수
count / min /max/avg/sum/group by / having 등이 있다.
다른 함수는 직관적이지만
group by, having 은 따로 설명하겠다.
#count : 행의 갯수를 세는 함수
#전체인원을 알고싶다! : primary key 읽어주기 /primary key가 적용되어 null이 포함될 수 없음
select count(userid) as 전체인원 from member; #5
#주소를 입력한 인원을 알고싶다!:null이 있으면 주소를 입력하지 않앗음
select count(zipcode) as 우편번호 from member; #1 , null을 제외하고 갯수를 셈
#sum:행의 값을 더함
select sum(point) as 포인트합 from member;
select userid,sum(point) as 포인트함 from member; #집계함수와 다른필드는 같이 못들어감 #Error Code: 1140. In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'kdt.member.userid'; this is incompatible with sql_mode=only_full_group_by 0.000 sec
#avg :행 값의 평균을 구함
select avg(point) as 평균 from member;
#min : 행의 최소값을 구함
select min(point) as 최솟값 from member;
#max: 행의 최댓값을 구함
select max(point) as 최댓값 from member;
#그룹 (group by) : 테이블의 일부행을 대상으로 집계함수를 사용한다.
문법
select 그룹을 맺은 컬럼 또는 집계함수 from 테이블명 group by 그룹을 맺을 필드명
select gender from member group by gender;
select gender,sum(point) from member group by gender;
#집계 함수도 가능! 일반함수는 그룹을 맺을 필드명만 포함할 수 있다.
이 말은 그룹을 맺을 필드명은 gender 인데 여기서 selcet 또한 일반 필드는 gender만 포함 할 수 있다.
select gender,avg(point) from member group by gender;
select gender,count(point) from member group by gender;
설명을 붙이면 gender 로 group by 하면 gender라는 필드안에 있는 로웃값 즉, 남자와 여자로 그룹이 나뉘고 그 값에 대해 count(point) 라는 집계함수가 작용한다. 또한 select 뒤에 있는 gender로 필드값을 눈에 보이게 뽑아준다.
이해를 돕기위해 gender을 제외한
select count(point) from member group by gender; 의 값을 알아보자
보는것처럼 그룹도 나뉘고 count도 됬지만 select에서 gender를 제외하자 필드값이 보이지 않아 가시성이 떨어진다.
#그룹 + 조건 : 여기서 Having 이 등장한다. 그룹을 맺을 필드명에 조건을 걸어주는 문법으로써
조건절의 where 과 비슷하다. 차이는 where에는 집계함수를 사용할 수 없지만 having 절은 가능하다.
문법
select 그룹을 맺은 컬럼 또는 집계함수 from 테이블명 groub by 그릅을 맺을 필드명 having 조건절;
select gender from member group by gender having gender ='여자'; #그룹을 맺을 필드명에 조건을 걸어준다.
gender 가 '여자' 인 그룹으로 묶고 gender 필드를 불러왔다.
# 조건절 + 그룹 + 그룹조건 + 정렬
문법
select 그룹을 맺은 컬럼 또는 집계함수 from 테이블명
where 조건절 group by 그룹을 맺을 필드명 having 조건절 order by 정렬할 필드명 [asc, desc]
# 포인트가 0이 아닌 회원들 중에서 남,여로 그룹을 나눠 포인트의 평균을 구하고 평균 포인트가 100 이상인 성별을 검색하여 포인트로 내림차순 정렬
select gender,avg(point) as avg from member where point>0 group by gender having avg >=100 order by avg desc;
하나하나 뜯어서 살펴보자
selct gender, avg(point) -> 보여줄 필드값을 말한다.
where point >0 -> 전체적인 조건 , 즉 포인트가 0이 아닌 회원들을 지칭한다.group by gender -> gender라는 필드로 그룹을 나뉘어준다. 남자와 여자가 서로 하나의 그룹으로 묶인다.having avg>=100 -> 그룹 gender 문의 조건을 걸어준다. 평균포인트가 100점이상인 성별order by avg desc -> 정렬을 할건데 포인트로 정렬한다 그것도 평균 포인트 , 내림차순이니 desc를 사용한다.
뜯어보면 이해가 쉽지만 한번에 보면 어려움이 있을수 있다.문법을 사용하는 순서를 알아두고 그 순서에 따라 살펴보면 쉽게 다가갈 수 있다.
'코딩공부 > DBMS' 카테고리의 다른 글
DBMS(MySQL)_문자열함수 (3) | 2023.03.23 |
---|---|
DBMS(MySQL)_서브 쿼리 (sub Query) (0) | 2023.03.23 |
DBMS(MySQL)_데이터 정규화 (0) | 2023.03.23 |
DBMS(MySQL) _ 조인(join) (0) | 2023.03.23 |
DBMS(MySQL) _기본 개념,문법 (1) | 2023.03.23 |