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
SELECT 키워드에 *을 사용하여 테이블의 열 데이터 모두를 조회한다
오라클에서는 데이터를 입력한 순서대로 조회된다
SELECT *
FROM tCity;

MySQL이나 MariaDB는 대소문자를 구분하지 않지만 오라클은 구분한다.
테이블의 특적 Column을 검색하고자 하는 경우 SELECT 절에 Column이름을 ,로 구분해서 나열하면 된다. 조회순서는 SELECT 뒤에 나열한 순서대로 조회한다.
SELECT name,popu
FROM tCity;

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절에서만 사용이 가능하다.
SELECT 절에서는 컬럼을 가지고 산술 연산이 가능하다. 이 경우 대부분 별명을 붙여서 출력한다.
SELECT name "도시명", area "면적(km)", popu * 10000 "인구(명)"
FROM tcity;

-- 인구수 / 면적 = 인구밀도
SELECT name "도시명", popu * 10000 / area "인구밀도"
FROM tcity;

SELECT 60 * 60 * 24;

CONCAT(컬럼 이름이나 연산식 나열)
SELECT CONCAT(ENAME,' ', JOB) AS "EMPLOYEES"
FROM EMP;

DISTINCT는 컬럼의 값의 중복을 제거해준다.
DISTINCT는 SELECT 절에 맨 앞에 한번만 나와야하고, 주의해야 할 점은 컬럼이 여러개이면 그 모든 컬럼의 값이 중복된 경우만 제거된다.
-- 중복 제거 x
select region
from tcity;
-- 중복 제거 o
select distinct region
from tcity;
| 중복 제거 X | 중복 제거 O |
|---|---|
![]() | ![]() |
ORDER BY : 데이터 정렬을 위한 절
ORDER BY절이 없으면 데이터의 출력 순서는 DBMS 의 디폴트 순서를 따르게 된다.
오라클은 레코드의 입력순서를 기억해두고 그대로 가져오고, SQL Server와 MariaDB는 Primary Key에 대해서 오름차순으로 정렬된다.
SELECT 구문을 이용해서 출력을 할 때는 출력 순서를 알 수 없으므로 되도록이면 ORDER BY 절을 이용해서 데이터를 정렬한 후 출력하는 것이 좋습니다.
ORDER BY 컬럼이름 [ASC|DESC]
SELECT *
FROM tcity
ORDER BY popu;

SELECT *
FROM tcity
ORDER BY region, name DESC ;

select *
from tcity
--order by area;
-- area 컬럼의 순번 = 2
order by 2;
WHERE : 조회하고자 하는 데이터의 조건을 지정
이 절이 생략되면 테이블의 모든 데이터를 조회한다. 이 절은 SELECT에만 사용되는 것이 아니고 DELETE와 UPDATE 구문에도 사용된다.
=
>
<
>=
<=
<> != ^= NOT 컬럼이름 =
비교를 할 때 숫자는 상수를 그냥 쓰지만 문자열과 날짜 상수는 ''로 감싸야 한다. RDBMS에 따라 생략해도 되는 경우가 있다. '' 대신 ""을 사용해도 에러가 아닌 경우도 있다.
MySQL과 MariaDB는 저장을 할 때는 대소문자를 구분하지만 비교를 할 때는 대소문자 구분을 하지 않는다
SELECT popu,name
FROM tcity
where popu < 10

SELECT *
FROM tcity
where region = '전라'

SELECT name, salary
FROM tstaff
where salary >= 400;

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

NULL은 아직 알려지지 않은 데이터라고 한다.
NULL은 = 으로 비교하지 않고 IS NULL 과 IS 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
select *
FROM user
where id = ? and pw = ?
이때 MySQL이나 MariaDB에서는 ? 자리에 ''를 붙이지 않아도 인식되기 때문에 id만 안다면 pw에 1234 or 1=1 이런식으로 넣으면 로그인이 되어버리는 문제가 생긴다
select *
FROM tCity
where popu >= 100 AND area >= 700

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 '#';
-- 이때 맨 앞 %는 와일드 카드, 맨 뒤 %는 백분율 기호로 해석됨
# 뒤에 나오는 문자는 와일드 카드 문자로 해석되지 않고 문자 그대로 해석
select ENAME
from EMP
where ENAME like '_A%';

select *
from tStaff
where name like '신%';

BETWEEN 값1 AND 값2
값1부터 값2까지의 데이터를 조회하고 값1과 값2를 포함한다.
반드시 값1 <= 값2 여야 한다.
일반적으로 >= AND <= 보다 BETWEEN 이 더 빠르다.
SELECT *
FROM tStaff
where joindate BETWEEN '20150101' AND '20171231';

IN 연산자 : 여러 개의 값 중 하나를 선택하고자 할 때 사용
SELECT *
FROM tCity
where region = '경상' or region = '전라';
-- in연산자를 사용한 것이 더 간단하다.
SELECT *
FROM tCity
where region in ('경상','전라');
서브쿼리에서는 위처럼 or을 사용할 수 없고 in 을 사용해야한다.

where region not in ('경상','전라');
not in 도 가능하다
SELECT 구문의 맨 뒤에 기재해서 행의 개수를 제한
LIMIT [건너뛸 개수,] 조회할 개수
select *
from tCity
order by POPU desc
limit 5;

select *
from tCity
order by POPU desc
limit 5,2;

페이징 처리할 때 사용함.
유튜브를 내리면 동영상을 계속해서 안끊기고 가져오는 것처럼 느껴지는 이유는 처음에 10개를 가져오고 5개만 먼저 보여줌. 스크롤을 할 때 이미 가지고 있던 나머지 5개를 보여주면서 다음 5개를 가져옴 그래서 끊기지 않고 가져오는 것처럼 보임
ORDER BY 정렬할 컬럼 OFFSET 건너뛸행의 개수 ROWS FETCH NEXT 출력할 행의 개수 ROWS ONLY
이 구문을 사용하면 오라클에서도 사용이 가능하다
select *
from tCity
order by POPU desc OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY;
select *
from EMP
where comm IS NOT NULL
SELECT ENAME, SAL, COMM
FROM EMP
WHERE COMM >= SAL * 0.1;
select *
from EMP
WHERE
select ENAME, SAL
from EMP
WHERE ENAME LIKE '%A%E%';
select ENAME, SAL
from EMP
WHERE (ENAME LIKE '%L%L%' AND DEPTNO = 30) OR (MGR = 7782);