본문 바로가기
Database/MySQL

[MySQL] SQL 기본 문법 : SELECT

by hyeeein 2023. 12. 8.

[실습용 데이터베이스 구축 코드]

-- 데이터베이스 만들기
DROP DATABASE IF EXISTS market_db;
CREATE DATABASE market_db;

-- 회원 테이블(member) 만들기
USE market_db;
CREATE TABLE member
(     mem_id	  CHAR(8) NOT NULL PRIMARY KEY,  -- 회원 아이디 (PK)
      mem_name	  VARCHAR(10) NOT NULL,          -- 이름
      mem_number  INT NOT NULL,			-- 인원수
      addr		  CHAR(2) NOT NULL,     -- 주소(경기, 서울, 경남 식으로 2글자만 입력)
      phone1	  CHAR(3),			-- 연락처의 국번(02, 031, 055 등)
      phone2	  CHAR(8),			-- 연락처의 나머지 전화번호 (하이픈 제외)
      height	  SMALLINT,			-- 평균 키
      debut_date  DATE				-- 데뷔 일자
);

-- 구매 테이블(buy) 만들기
CREATE TABLE buy
(     num         INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -- 순번 (PK)
      mem_id	  CHAR(8) NOT NULL,                        -- 아이디 (FK)
      prod_name   CHAR(6) NOT NULL,                        -- 제품 이름
      group_name  CHAR(4),                                 -- 분류
      price       INT NOT NULL,                            -- 단가
      amount	  SAMLLINT NOT NULL,                       -- 수량
      FOREIGN KEY (mem_id) REFERENCES member(mem_id)
);

-- 데이터 입력하기 (1-2개만 예시로)
INSERT INTO member VALUES ('TWC', '트와이스', 9. '서울', '02', '11111111', 167, '2015.10.19');
INSERT INTO buy VALUES (NULL, 'BLK', '지갑', NULL, 30, 2);

-- 데이터 조회하기
SELECT * FROM MEMBER;
SELECT * FROM BUY;

 

 

1. USE 문

SELECT 문을 실행하기 전 사용할 데이터베이스를 지정하는 것

 

- MySQL 워크벤치를 재시작하거나 쿼리 창을 새로 열면 다시 USE를 실행해야 함

- 테이블을 지정할 수는 없음

USE market_db;

 

 

2. SELECT 문

 

1) SELECT + 검색하고 싶은 속성의 이름 나열

- ALL : 결과 테이블의 튜플의 중복 허용 (생략 가능)

- DISTINCT : 결과 테이블의 튜플의 중복을 허용하지 않도록 지정

 

- 별칭 (alias) : 열 이름 다음에 지정하고 싶은 별칭을 입력. 별칭에 공백이 있으면 큰따옴표(")로 묶어줌

SELECT addr 주소, debut_date "데뷔 일자", mem_name
FROM member;

 

2) FROM + 검색하고 싶은 속성이 있는 테이블 이름 나열

 

3) WHERE + 조건을 만족하는 데이터만 검색

- 관계 연산자 : >, <, >=, <=

SELECT mem_id, mem_name
FROM member
WHERE height <= 162;

 

- 논리 연산자 : AND, OR, NOT

SELECT mem_name, height, mem_number
FROM member
WHERE height >= 165 AND mem_number > 6;

SELECT mem_name, height, mem_number
FROM member
WHERE height >= 165 OR mem_number > 6;

 

- 범위에 있는 값 : BETWEEN ~ AND

SELECT mem_name, height
FROM member
WHERE height BETWEEN 163 AND 165;

 

- 집합 연샨자 : IN, NOT IN

IN은 조건식에서 여러 문자 중 하나에 포함되는지 비교할 때 간결하게 사용할 수 있음

SELECT mem_name, addr
FROM member
WHERE addr IN ('경기', '전남', '경남');

 

- 문자열의 일부 글자를 검색하려면 LIKE 사용 ★

SELECT *
FROM member
WHERE mem_name LIKE '우%';

SELECT *
FROM member
WHERE mem_name LIKE '__핑크';

 

- NULL을 이용한 검색

IS NULL : 특정 속성의 값이 널 값인지 비교 / IS NOT NULL : 특정 속성의 값이 널 값이 아닌지 비교

이때, 검색 조건에서 널 값은 다른 값과 크기를 비교하면 결과가 모두 거짓이 됨 !!

 

※ 서브쿼리 : SELECT 안에 또 다른 SELECT 문을 사용할 수 있음

 

4) GROUP BY 절

그룹으로 묶어주는 역할을 함. 주로 집계함수와 함께 사용

 

집계 함수(aggregate function)는 열 함수(column function)라고도 부르며, 특정 속성 값을 통계적으로 계산한 결과를 검색하기 위해 집계 함수를 이용함. 이때, 속성의 값이 실제로 변경되는 것은 아니고, 결과 테이블에서만 계산 결과가 출력됨.

 

+) COUNT(DISTINCT) : 행의 개수를 세는데 중복은 1개만 인정

 

단, 널인 속성 값은 제외하고 계산 ★

WHERE 절에서는 사용할 수 없고, SELECT 절이나 HAVING 절에서만 사용 가능 

SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
FROM buy
GROUP BY mem_id;

 

열 이름의 별칭은 AS 키워드를 이용해 결과 테이블에서 속성의 이름을 바꾸어 출력 가능함 (생략 가능한 옵션). 필드 제목이 길거나 계산식에 의해 복잡할 때 사용하면 좋고, 별칭에 공백이 있으면 작은따옴표(’’)로 묶음.  대부분 공백 있든 없든 묶어 쓰길 권장.

 

5) HAVING 절

HAVING은 집계 함수에 관련된 조건을 제한하고, 무조건 GROUP BY 다음에 나옴.

(WHERE 절에서는 집계 함수를 사용할 수 없음)

SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
FROM buy
GROUP BY mem_id
HAVING SUM(price*amount) > 1000
ORDER BY SUM(price*amount) DESC;

 

6) ORDER BY 절

결과의 값이나 개수에 대해서는 영향을 미치지 않지만, 결과가 출력되는 순서를 조절함

ASC는 오름차순(기본값), DESC는 내림차순 정렬

SELECT mem_id, mem_name, debut_date
FROM member
ORDER BY debut_date;

SELECT mem_id, mem_name, debut_date
FROM member
ORDER BY debut_date DESC;

 

정렬 기준은 1개 열이 아니라 여러 개 열로 지정할 수 있음 (쓴 순서대로 정렬되는 기준에 있어 우선순위!)

SELECT mem_id, mem_name, debut_date
FROM member
ORDER BY height DESC, debut_date ASC;

- LIMIT : 출력하는 개수를 제한 → LIMIT 시작, 개수 형태로 사용

- DISTINCT : 조회된 결과에서 중복된 데이터를 1개만 남김

 

 

※ 여러 가지 요소가 중첩된 SQL 문의 실행 순서 예시

SELECT custid, COUNT(*) AS 도서수량        (5)
FROM Orders                                (1)
WHERE saleprice >= 8000                    (2)
GROUP BY custid                            (3)
HAVING count(*) > 1                        (4)
ORDER BY custid;                           (6)