[MariaDB] 3. SELECT

JIWON·2025년 5월 7일

MariaDB

목록 보기
4/13
post-thumbnail

Select(데이터 조회)

1. SELECT 구문 기본 형식

SELECT [DISTINCT] {*,column [Alias],...}
FROM 테이블명 나열 - 변경된 테이블 이름 사용 가능
[WHERE condition(조건)]
GROUP BY 그룹화 할 조건
HAVING GROUP BY 이후의 condition
ORDER BY {컬럼 이름이나 연산식 [ASC | DESC]};

실행 순서

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

1) 모든 열 선택

SELECT 키워드에 *을 사용하여 테이블의 열 데이터 모두를 조회한다
오라클에서는 데이터를 입력한 순서대로 조회된다

예시) tCity 테이블의 전체 데이터를 조회
SELECT *
FROM tCity;

MySQL이나 MariaDB는 대소문자를 구분하지 않지만 오라클은 구분한다.

2) 특정 Column 선택

테이블의 특적 Column을 검색하고자 하는 경우 SELECT 절에 Column이름을 ,로 구분해서 나열하면 된다. 조회순서는 SELECT 뒤에 나열한 순서대로 조회한다.

예시) tCity 테이블의 name,popu 컬럼을 조회
SELECT name,popu
FROM tCity;

3) 별명

SELECT 명령이 출력하는 내용을 Result Set 또는 Row Set이라고 한다.
SELECT 구문의 결과는 하나의 테이블 처럼 사용한다.
출력하는 결고의 Field Caption은 테이블에서 정의한 컬럼 이름과 동일한데 별명을 이용해서 변경하는 것이 가능하다.

별명을 붙여서 출력

SELECT 컬럼이름 [AS] 별명
FROM 테이블명;

별명을 만들 때 공백이나 특수문자 등을 포함한 경우는 " "로 감싸야 한다.
AS 는 생략해도 상관없다.
별명은 SELECT 구문이 수행된 후 사용이 가능하다

-- tcity 테이블에서 name, area, popu를 조회하는데 각각 도시명,면적(km),인구(만명) 으로 출력

SELECT name "도시명", area "면적(km)", popu "인구(만명)"
FROM tcity;

실행순서에 따른 별명 사용

-- where 절에서 별명 사용하기
SELECT name "도시명", area "면적(km)", popu "인구(만명)"
FROM tcity
where 도시명 = 부산;

-> 에러 발생
From > where > select > order by 순으로 수행되기 때문에 where에서 별명을 쓰게되면 에러가 발생한다.
만약 order by에서 별명을 쓴다면 select 이후에 수행 되기 때문에 잘 동작한다.
따라서 select 절에서 붙인 별명은 order by절에서만 사용이 가능하다.

4) 계산 값의 출력

SELECT 절에서는 컬럼을 가지고 산술 연산이 가능하다. 이 경우 대부분 별명을 붙여서 출력한다.

예시) tcity 테이블에서 popu 컬럼에 10000을 곱해서 출력
SELECT name "도시명", area "면적(km)", popu * 10000 "인구(명)"
FROM tcity;

예시) tcity 테이블에서 면적과 인구수를 이용해서 인구 밀도 조회
-- 인구수 / 면적 = 인구밀도
SELECT name "도시명", popu * 10000 / area "인구밀도"
FROM tcity;

예시) 계산 자체를 출력
SELECT 60 * 60 * 24;

5) CONCAT - 컬럼 결합

CONCAT(컬럼 이름이나 연산식 나열)
예시) EMP 테이블에서 ENAME과 JOB을 묶어서 EMPLOYEES 로 조회
SELECT CONCAT(ENAME,' ', JOB) AS "EMPLOYEES"
FROM EMP;

6) DISTINCT

DISTINCT는 컬럼의 값의 중복을 제거해준다.
DISTINCT는 SELECT 절에 맨 앞에 한번만 나와야하고, 주의해야 할 점은 컬럼이 여러개이면 그 모든 컬럼의 값이 중복된 경우만 제거된다.

-- 중복 제거 x
select  region
from tcity;

-- 중복 제거 o
select  distinct region
from tcity;
중복 제거 X중복 제거 O

7) ORDER BY

ORDER BY : 데이터 정렬을 위한 절

ORDER BY절이 없으면 데이터의 출력 순서는 DBMS 의 디폴트 순서를 따르게 된다.
오라클은 레코드의 입력순서를 기억해두고 그대로 가져오고, SQL Server와 MariaDB는 Primary Key에 대해서 오름차순으로 정렬된다.

SELECT 구문을 이용해서 출력을 할 때는 출력 순서를 알 수 없으므로 되도록이면 ORDER BY 절을 이용해서 데이터를 정렬한 후 출력하는 것이 좋습니다.

ORDER BY 기본형식

ORDER BY 컬럼이름 [ASC|DESC]
  • 오름차순의 경우 ASC, 내림차순의 경우 DESC
  • 생략하면 ASC
  • 컬럼 이름 대신에 컬럼의 별명 사용 가능
  • 컬럼 이름 대신에 컬럼의 인덱스 사용 가능
  • 계산식 이용도 가능
  • 컬럼이름이나 연산식을 기재하면 앞의 컬럼의 값이 같을 때 뒤의 컬럼 값을 가지고 정렬

오름차순의 경우 정렬 순서

  • 숫자는 가장작은 값 먼저
  • 날짜는 빠른 값이 먼저
  • 문자는 알파벳 순서
  • NULL 값은 오름차순에서는 제일 나중에, 내림차순에서는 제일 먼저
예시) tcity 테이블에서 popu(인구 수)에 따른 정렬
SELECT *
FROM tcity
ORDER BY popu;

예시) tcity 테이블에서 지역 별로 오름차순 정렬하고 같은 지역에 속한 도시끼리는 이름의 내림차순으로 조회
SELECT *
FROM tcity
ORDER BY region, name DESC ;

ORDER BY에서 컬럼이름 대신 컬럼 순번 사용

select *
from tcity
--order by area; 
-- area 컬럼의 순번 = 2
order by 2; 

8) WHERE

WHERE : 조회하고자 하는 데이터의 조건을 지정

이 절이 생략되면 테이블의 모든 데이터를 조회한다. 이 절은 SELECT에만 사용되는 것이 아니고 DELETE와 UPDATE 구문에도 사용된다.

비교연산자

=
>
<
>=
<=
<> != ^= NOT 컬럼이름 =

비교를 할 때 숫자는 상수를 그냥 쓰지만 문자열과 날짜 상수는 ''로 감싸야 한다. RDBMS에 따라 생략해도 되는 경우가 있다. '' 대신 ""을 사용해도 에러가 아닌 경우도 있다.

MySQL과 MariaDB는 저장을 할 때는 대소문자를 구분하지만 비교를 할 때는 대소문자 구분을 하지 않는다

예시) tcity 테이블에서 popu가 10 미만인 데이터의 name을 조회
SELECT popu,name
FROM tcity
where popu < 10 

예시) tcity 테이블에서 region이 전라 인 데이터 조회
SELECT *
FROM tcity
where region = '전라' 

예시) tStaff 테이블에서 salary가 400 이상인 데이터의 name을 조회
SELECT name, salary
FROM tstaff
where salary >= 400; 

예시) tCity 테이블에서 metro가 y인 데이터 조회
-- 소문자로 검색
SELECT *
FROM tcity
where metro = 'y'; 

-- 대문자로도 검색가능
SELECT *
FROM tcity
where metro = 'Y';

NULL 비교

NULL은 아직 알려지지 않은 데이터라고 한다.
NULL은 = 으로 비교하지 않고 IS NULLIS NOT NULL 을 사용한다. = NULL 로 비교하게 되면 값이 NULL인 데이터를 조회한다.

-- Score의 값 자체가 NULL인 데이터를 조회
SELECT *
FROM tStaff
where score = NULL;

Score의 값 자체가 NULL인 데이터를 조회하므로 데이터를 조회할 수 없다.

-- ISNULL 사용
SELECT *
FROM tStaff
where score IS NULL;

IS NULL로 조회하게되면 값이 입력되어 있지 않은 상태인 NULL을 조회할 수 있다.

논리연산자

AND OR NOT

  • AND가 OR보다 우선순위가 높다.
  • AND는 앞의 조건이 FALSE이면 뒤의 조건을 확인하지 않음
  • OR은 앞의 조건이 TRUE이면 뒤의 조건을 확인하지 않음

로그인 시 주의사항

select *
FROM user
where id = ? and pw = ?

이때 MySQL이나 MariaDB에서는 ? 자리에 ''를 붙이지 않아도 인식되기 때문에 id만 안다면 pw에 1234 or 1=1 이런식으로 넣으면 로그인이 되어버리는 문제가 생긴다

예시) tCity 테이블에서 popu는 100이상이고 area는 700 이상인 데이터 조회
select *
FROM tCity
where popu >= 100 AND area >= 700

9) LIKE

LIKE : 패턴으로 부분 문자열을 검색
와일드 카드를 사용한다

와일드카드

문자설명
%0개 이상의 문자
_1개의 문자
[문자나열]문자 리스트 중 하나의 문자와 대응
[^문자나열]문자리스트에 포함되지 않은 하나의 문자와 대응

와일드 카드 문자를 검색 하고자 할 때는 ESCAPE를 이용한다

예시) 천 자가 들어가는 도시를 검색
SELECT * 
FROM tCity
WHERE name LIKE '%천%';

예시) 천 자가 들어가지 않는 도시를 검색
SELECT * 
FROM tCity
WHERE name NOT LIKE '%천%';

예시) %가 들어간 데이터를 검색
-- SALE 컬럼에 30%가 포함된 데이터를 조회
-- 이렇게 작성하면 어떤게 와일드카드 문자인지 파악을 제대로 하지 못해서 30이 포함된 데이터를 조회
WHERE SALE LIKE '%30%%';

-- ESCAPE 사용
WHERE SALE LIKE '%30#%' ESCAPE '#';
-- 이때 맨 앞 %는 와일드 카드, 맨 뒤 %는 백분율 기호로 해석됨

# 뒤에 나오는 문자는 와일드 카드 문자로 해석되지 않고 문자 그대로 해석

예시) 두번째 글자가 A인 데이터 검색
select ENAME
from EMP
where ENAME like '_A%';

예시) tStaff 테이블에서 name이 신으로 시작하는 데이터 검색
select *
from tStaff
where name like '신%';

10) BETWEEN

BETWEEN1 AND2

값1부터 값2까지의 데이터를 조회하고 값1과 값2를 포함한다.
반드시 값1 <= 값2 여야 한다.

일반적으로 >= AND <= 보다 BETWEEN 이 더 빠르다.

예시) 직원의 입사일이 2015년부터 2017년 사이인 데이터 전부 검색
SELECT *
FROM tStaff
where joindate BETWEEN '20150101' AND '20171231';

11) IN 연산자

IN 연산자 : 여러 개의 값 중 하나를 선택하고자 할 때 사용

예시) tCity 테이블에서 region의 값이 경상이나 전라인 데이터 조회
SELECT *
FROM tCity
where region = '경상' or region = '전라';

-- in연산자를 사용한 것이 더 간단하다.
SELECT *
FROM tCity
where region in ('경상','전라');

서브쿼리에서는 위처럼 or을 사용할 수 없고 in 을 사용해야한다.

where region not in ('경상','전라');

not in 도 가능하다

12) 행의 개수 제한: LIMIT

SELECT 구문의 맨 뒤에 기재해서 행의 개수를 제한

LIMIT [건너뛸 개수,] 조회할 개수
예시) 인구가 많은 5개의 도시 조회
select *
from tCity
order by POPU desc
limit 5;

예시) 그 다음 2개의 도시 조회
select *
from tCity
order by POPU desc
limit 5,2;

페이징 처리할 때 사용함.
유튜브를 내리면 동영상을 계속해서 안끊기고 가져오는 것처럼 느껴지는 이유는 처음에 10개를 가져오고 5개만 먼저 보여줌. 스크롤을 할 때 이미 가지고 있던 나머지 5개를 보여주면서 다음 5개를 가져옴 그래서 끊기지 않고 가져오는 것처럼 보임

OFFSET FETCH

ORDER BY 정렬할 컬럼 OFFSET 건너뛸행의 개수 ROWS FETCH NEXT 출력할 행의 개수 ROWS ONLY

이 구문을 사용하면 오라클에서도 사용이 가능하다

예시) 인구가 많은 5개의 도시 조회
select *
from tCity
order by POPU desc OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY;

연습문제

  1. EMP테이블에서 COMM이 NULL이 아닌 사원의 모든 정보를 조회하는 SELECT 문 작성
select *
from EMP
where comm IS NOT NULL
  1. EMP테이블에서 COMM 이 SAL보다 10% 이상 많은 사원에 대하여 ENAME, SAL ,COMM 를 조회
SELECT ENAME, SAL, COMM
FROM EMP
WHERE COMM >= SAL * 0.1;
  1. EMP테이블에서 JOB이 CLERK이거나 ANALYST이고 SAL이 1000,3000,5000이 아닌 사원의 모든 정보를 조회
select *
from EMP
WHERE 
  1. EMP테이블에서 ENAME에 A와 E가 포함되어 있는 ENAME과 SAL을 조회
select ENAME, SAL
from EMP
WHERE ENAME LIKE '%A%E%';
  1. EMP테이블에서 (ENAME에 L이 두자 이상 포함되어있고 DEPTNO가 30)이거나 MGR이 7782인 사원의 모든 정보를 조회
select ENAME, SAL
from EMP
WHERE (ENAME LIKE '%L%L%' AND DEPTNO = 30) OR (MGR = 7782);

0개의 댓글