본문 바로가기
데이터베이스

MySQL 데이터 검색

by 승환파크 2023. 5. 11.

SELECT문

select 문은 데이터 조회를 위해서 사용하는 구문이다.

 

문법 사용 방식

select (열 이름) from (테이블 이름) where(조건식) group by(열 이름) having(조건식) order by(열 이름) limit 숫자;

 

위의 문법에서 wherem group by, having, order by, limit 는 생략이 가능하다.

SELECT * FROM member;

select

테이블에서 데이터를 가져올 때 사용하는 예약어이다.

*(asterisk) : 일반적으로 "모든 것"을 의미하며 위 예시에서는 열 이름이 들어갈 자리에 사용되어 "모든 열"을 의미한다.

 

from

데이터를 가져올 테이블을 지정할 때 사용하는 예약어 이다.

 

member

조회할 테이블의 이름이다.

 

위 문장의 뜻은 member 테이블에서 모든 열의 내용을 가져와라 라는 뜻이다.

문장을 실행하면 이런 결과값이 출력된다.

 

원칙적으로는 데이터베이스.테이블의 형태로 작성해야 한다.

하지만 계속 작성하기에는 오타같은 실수를 할 수 있어서 사용할 데이터베이스를 지정해줄 수 있다.

use market_db;

저 문장으로 데이터베이스를 지정한다.

 

 

필요한 열만 가져오기

member 에서 mem_name 가져오기

select mem_name from member;

컬럼 명으로 필요한 열의 정보만 가져올 수 있다.

 

만약 여러 열을 가져오고 싶으면 콤마로 연결해서 가져올 수 있다.

기존 테이블의 열 순서는 상관없이 보고싶은 순서대로 열을 나열한다.

select addr, debut_date, mem_name from member;

기존 열 순서와 다르지만 본인이 지정한 순서대로 컬럼들이 보이게 된다.

 

 

열 이름에 별칭 지어주기

열 이름 다음에 지정하고 싶은 별칭을 지정한다. 만약 지정하고 싶은 별칭에 공백이 있으면 따옴표로 묶어서 표시한다.

select addr 주소, debut_date "데뷔 일자", mem_name from member;

본인이 지정하고 싶은 별칭으로 컬럼명이 변경된것을 확인할 수 있다.

 

 

특정 조건에 맞는 데이터만 조회하기

실무에서는 많은 데이터를 다루기 때문에 조건을 설정을 안하고 모두 가져오면 컴퓨터에 부하가 걸릴 수 있다.

따라서 그 부하 문제를 해결하기 위해서 조건을 설정하고 그 조건에 맞는 데이터만 가져온다.

 

문법 사용 방식

select (열 이름) from (테이블 이름) where 조건식;

select * from member where mem_name = "블랙핑크";

조건에 맞는 1개의 열만 나오는 것을 확인할 수 있다.

 

관계 연산자, 논리 연산자

where 로 조건식을 작성할 때 연산자를 사용해서 조건을 줄 수 있다.

연산자를 사용해서 조건식을 작성할 때 숫자로 표현된 데이터에만 사용할 수 있다.

select mem_id, mem_name, height from member where height <= 162;

height의 값이 162 보다 작거나 같은 열들만 나오게 된다.

 

논리 연산자를 사용해서 여러 조건을 만족하도록 할 수 있다.

select mem_name, height, mem_number from member where height >= 165 and mem_number > 6;

위에서 설정한 height의 값이 165 보다 크거나 같고 mem_number 가 6보다 큰 열들만 출력된다.

 

select mem_name, height, mem_number from member where height >= 165 or mem_number > 6;

위에서 설정한 height값이 165 보다 크거나 같은 열과 mem_number 가 6보다 큰 열들을 모두 출력하게 된다.

 

 

between

select mem_name, height from member where 163 <= height and height <= 165;

방금 사용한 논리 연산자로도 표현이 가능하지면 저 문장의 가독성이 떨어지므로 between 예약어를 사용하는 것이 좋다.

 

문법 사용 방법

between a and b

select mem_name, height from member where height between 163 and 165;

같은 역할을 수행하지만 가독성이 더좋은 between 을 주로 사용한다.

 

 

in

select mem_name, addr from member where addr = "경기" or addr="전남" or addr = "경남";

방금 사용한 논리 연산자로도 표현이 가능하지면 저 문장의 가독성이 떨어지고 유지보수도 하기 힘들기 때문에 in 예약어를 사용하는 것이 좋다.

문법 사용 방식

where (컬럼 명) in (값1, 값2, 값3, ...)

select mem_name, addr from member where addr in ("경기", "전남", "경남");

 

 

 like

1. 문자열 일부 검색

select * from member where mem_name like "%이%";

%는 앞이나 뒤에 사용이 가능하다.

% 는 어떤 값이 들어올지 모를 때 사용한다.

 

2. 글자 수 매치

select * from member where mem_name like"__핑크";

언더바(_) 하나당 하나의 문자열이 들어가는 형식이다.

% 와는 다르게 언더바 하나당 하나의 문자열이 들어가기 때문에 찾으려는 글자 수가 언더바보다 많거나 적다면 그 값은 출력되지 않는다.

 

 

order by

데이터 베이스에서 select 문에 사용하는 문법으로 정렬을 하기 위해서 사용한다.

정렬 옵션

  • ASC : 오름차순 정렬
  • DESC : 내림차순 정렬

만약 order by를사용하고 정렬 옵션을 따로 작성하지 않는다면 오름차순으로 정렬 된다.

select mem_id, mem_name, debut_date from member order by debut_date;

데뷔 일자로 정렬을 시킨 것이다.

 

member 에서 키가 164 이하인 회원들 키의 내림차순으로 정렬하기

select * from member where height >= 164 order by height DESC;

키의 순서대로 정렬이 되어서 나오게 된다.

 

 

limit

출력하려는 갯수의 숫자가 너무 많은 경우 출력 갯수를 제한하기 위해서 사용한다.

select * from member limit 3;

select * from 으로 전체조회를 했지만 limit 3으로 조건을 주었기 때문에 총 3개의 결과값만 출력되게 된다.

 

 

중복 제거하기

데이터에는 수많은 중복값이 있을 수 있다. 따라서 중복값이 많이 출력이 되지만 이러한 중복값은 출력이 안되게 할 수 있다.

이때 distinct 를 작성하고 보고싶은 열을 작성하면 겹치는 값들은 출력이 되지 않는다.

select distinct addr from member order by addr asc;

분명 addr 은 총 10개의 값이 있었지만 중복되는 값들을 보이지 않게 했기 때문에 겹치지않는 값들만 출력해서 총 5개의 값이 나오게 된다.

 

 

새로운 테이블 생성

CREATE TABLE buy
(  num 		INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
   mem_id  	CHAR(8) NOT NULL,
   prod_name 	CHAR(6) NOT NULL,
   group_name 	CHAR(4)  ,
   price     	INT  NOT NULL,
   amount    	SMALLINT  NOT NULL,
   FOREIGN KEY (mem_id) REFERENCES member(mem_id)
);
INSERT INTO buy VALUES(NULL, 'BLK', '지갑', NULL, 30, 2);
INSERT INTO buy VALUES(NULL, 'BLK', '맥북프로', '디지털', 1000, 1);
INSERT INTO buy VALUES(NULL, 'APN', '아이폰', '디지털', 200, 1);
INSERT INTO buy VALUES(NULL, 'MMU', '아이폰', '디지털', 200, 5);
INSERT INTO buy VALUES(NULL, 'BLK', '청바지', '패션', 50, 3);
INSERT INTO buy VALUES(NULL, 'MMU', '에어팟', '디지털', 80, 10);
INSERT INTO buy VALUES(NULL, 'GRL', 'SQL기초', '서적', 15, 5);
INSERT INTO buy VALUES(NULL, 'APN', 'SQL기초', '서적', 15, 2);
INSERT INTO buy VALUES(NULL, 'APN', '청바지', '패션', 50, 1);
INSERT INTO buy VALUES(NULL, 'MMU', '지갑', NULL, 30, 1);
INSERT INTO buy VALUES(NULL, 'APN', 'SQL기초', '서적', 15, 1);
INSERT INTO buy VALUES(NULL, 'MMU', '지갑', NULL, 30, 4);

 

group by

그룹화를 시킬 때 사용한다.

방금 위에서 만든 buy 테이블에서 각 멤버가 구매한 물품의 총 갯수를 알고싶을 때

select mem_id, sum(amount) from buy group by mem_id;

방금 실행한 코드 처럼 같은 값으로 저장된 열들을 그룹화해서 나타날 때 사용한다.

 

sum()

sum 함수는 같은 열들을 그룹화 할때 합쳐진 열들의 value값을  더할 때 사용한다.

select mem_id "회원 아이디", sum(price * amount) "총합" from buy group by mem_id;

price 와 amount 값을 곱한 이후 나온 값들을 모두 더한 값이 나오게 된다.

 

avg()

avg 함수는 같은 열들을 그룹화 할때 합쳐진 열들의 value 값을 더한 이후 합쳐진 열들의 갯수로 나누어 평균을 구할 때 사용한다.

select mem_id "회원 아이디", avg(amount) "평균 구매 개수" from buy group by mem_id;

amount 로 총 갯수를 구한 다음 값이 합쳐진 열들의 갯수만큼 나누어 평균을 구한값이 나오게 된다.

 

count()

count 함수는 같은 열들을 그룹화 할 때 합쳐진 열들의 갯수를 구할 때 사용한다.

select count(*) from member;

총 열의 갯수를 반환 해준다.

 

 

having

group by 를 사용한 이후 조건을 추가하고 싶을 때 사용한다.

select mem_id "회원 아이디", sum(price * amount) "총 구매 금액" from buy group by mem_id;

위 데이터에서 총 구매액이 1000 이상인 회원에게만 사은품을 증정하려 한다면

조건을 추가하기 위해서 having을 사용해야 한다.

그 이유는 group by 에서는 집계함수를 사용할 수 없기 때문이다.

select mem_id "회원 아이디", sum(price * amount) "총 구매 금액" from buy group by mem_id having sum(price * amount) >= 1000;

group by 에서 having으로 조건을 주어서 총 구매 금액이 1000 이상인 고객의 데이터만 찾을 수 있다.

'데이터베이스' 카테고리의 다른 글

MySQL 데이터 수정  (0) 2023.05.15
MySQL 데이터 추가  (1) 2023.05.15
MySQL 데이터베이스, Table 생성하기  (0) 2023.05.11
데이터베이스  (0) 2023.05.11
MariaDB 테이블  (0) 2022.10.09