KoreanFoodie's Study

SQL 기초 - 4. 데이터 읽기(SELECT, 조건문, 정렬) 본문

Database

SQL 기초 - 4. 데이터 읽기(SELECT, 조건문, 정렬)

GoldGiver 2021. 10. 12. 09:21

이 글은 '김상형의 SQL 정복'의 예제 코드를 설명하는 방식으로 SQL 쿼리 예제를 소개하고 있습니다.

 

SQL 기초 - 4. 데이터 읽기(SELECT, 조건문, 정렬)

-- 원하는 열만 선택해서 가져올 수 있다.
SELECT name, area, popu, metro, region FROM tCity;
SELECT * FROM tCity;

-- AS를 사용하여 새로운 별명을 만들어 줄 수 있다.
SELECT name AS 도시명, area AS "면적(제곱Km)", popu AS "인구(만명)" FROM tCity;

-- AS대신 '='을 활용하여 별명을 붙여 줄 수도 있다.
SELECT 도시명 = name, area '면적(제곱Km)', popu [인구(만명)] FROM tCity;

-- 열을 출력할 때 연산을 할 수 있다.
SELECT name, popu * 10000 AS "인구(명)" FROM tCity;

SELECT name, area, popu, popu * 10000 / area AS "인구밀도" FROM tCity;

SELECT 60 * 60 * 24 AS "하루" FROM dual;

-- 그냥 연산.
SELECT 60 * 60 * 24;

-- WHERE을 이용해 조건문을 생성한다.
SELECT * FROM tCity WHERE area > 1000;

SELECT name, area FROM tCity WHERE area > 1000;

-- 문자열은 '' 로 감싸주어야 한다.
SELECT * FROM tCity WHERE name = '서울'			-- 맞음
SELECT * FROM tCity WHERE name = 서울				-- 틀림
SELECT * FROM tCity WHERE name = "서울"			-- 틀림. 단, 마리아는 인정한다.

-- 변수=NULL로는 NULL을 찾을 수 없다.
SELECT * FROM tStaff WHERE score = NULL;

-- IS NULL, NOT NULL 을 이용해야 NULL값 체크가 가능하다.
SELECT * FROM tStaff WHERE score IS NULL;

SELECT * FROM tStaff WHERE score IS NOT NULL;

-- AND/OR/!/NOT 등의 논리 연산자를 잘 활용해보자.
SELECT * FROM tCity WHERE popu >= 100 AND area >= 700;

SELECT * FROM tCity WHERE region = '경기' AND popu >= 50 OR area >= 500;
SELECT * FROM tCity WHERE region = '경기' AND (popu >= 50 OR area >= 500);

SELECT * FROM tCity WHERE region != '경기';
SELECT * FROM tCity WHERE NOT(region = '경기');

SELECT * FROM tCity WHERE region = '전라' OR metro = 'y';

SELECT * FROM tCity WHERE region != '전라' AND metro != 'y';

SELECT * FROM tCity WHERE NOT(region = '전라' OR metro = 'y');

-- %를 이용해 REGEX의 *+같은 효과를 만들 수 있다 (와일드 카드).
-- '_'는 한 글자만을 대체한다.
SELECT * FROM tCity WHERE name LIKE '%천%';

SELECT * FROM tCity WHERE name NOT LIKE '%천%';

SELECT * FROM tCity WHERE name LIKE '천%';
SELECT * FROM tCity WHERE name LIKE '%천';

SELECT * FROM tCity WHERE TRIM(name) LIKE '%천';

-- 오라클에서는 BETWEEN이라는 직관적인 문법을 사용할 수 있다.
-- 이는 날짜나 문자열 데이터에도 적용 가능하다.
SELECT * FROM tCity WHERE popu BETWEEN 50 AND 100;

SELECT * FROM tCity WHERE popu >= 50 AND popu <= 100;

SELECT * FROM tStaff WHERE name BETWEEN '가' AND '사';
SELECT * FROM tStaff WHERE joindate BETWEEN '20150101' AND '20180101';

-- 특정 범위가 아닌 요소들의 집합은 IN으로 표현한다.
SELECT * FROM tCity WHERE region IN ('경상', '전라');

SELECT * FROM tCity WHERE region = '경상' OR region = '전라';

SELECT * FROM tCity WHERE region NOT IN ('경상', '전라');

-- LIKE IN 문법은 허용되지 않는다. 대신 LIKE ... OR LIKE ... 로 표현한다.
SELECT * FROM tStaff WHERE name LIKE IN ('이%', '안%');

SELECT * FROM tStaff WHERE name LIKE '이%' OR name LIKE '안%';

-- ORDER BY를 통해 정렬이 가능하고, DESC를 통해 내림차순도 가능하다.
SELECT * FROM tCity ORDER BY popu;
SELECT * FROM tCity ORDER BY popu DESC;

-- 다중 정렬도 가능하다. 먼저 정렬된 요소가 우선순위를 갖는다.
SELECT region, name, area, popu FROM tCity ORDER BY region, name DESC;

SELECT * FROM tCity ORDER BY area;
SELECT * FROM tCity ORDER BY 2;

SELECT name FROM tCity ORDER BY popu;

SELECT name, popu * 10000 / area FROM tCity ORDER BY popu * 10000 / area;

SELECT * FROM tCity WHERE region = '경기' ORDER BY area;

SELECT * FROM tCity ORDER BY area WHERE region = '경기';

SELECT region FROM tCity;
SELECT DISTINCT region FROM tCity;
SELECT DISTINCT region FROM tCity ORDER BY region;

-- ALL은 기본적으로 내재되어 있다. 중복을 허용해 출력한다.
-- DISTINCT는 출력 시 중복된 요소를 제거한다.
SELECT ALL depart FROM tStaff;
SELECT DISTINCT depart FROM tStaff;

-- rowid는 자동생성되는 고유 식별문자열이고, rownum은 행 번호이다(자동).
SELECT name, rowid, rownum FROM tCity;

SELECT * FROM tCity WHERE rownum <= 4;

SELECT * FROM tCity ORDER BY area DESC WHERE rownum <= 4;

SELECT * FROM tCity WHERE rownum <= 4 ORDER BY area DESC;

-- 서브쿼리문을 통해 제일 area가 큰 4개를 고른다. 하지만 이 쿼리는 비효율적이다.
SELECT * FROM (SELECT * FROM tCity ORDER BY area DESC) WHERE rownum <= 4;

-- TOP, PERCENT는 MARIADB에서 사용 가능한 문법이다.
SELECT TOP 4 * FROM tCity ORDER BY area DESC;
SELECT TOP 20 PERCENT * FROM tCity ORDER BY popu DESC;

SELECT * FROM tExam ORDER BY Score DESC;

SELECT TOP 100 * FROM tExam ORDER BY Score DESC;

SELECT TOP 1 PERCENT WITH TIES * FROM tExam ORDER BY Score DESC;

SELECT * FROM tCity ORDER BY area DESC LIMIT 4;

SELECT * FROM tCity ORDER BY area DESC LIMIT 2, 3;

-- SQL 표준에서는 OFFSET 시작지점-1 ROWS FETCH NEXT 갯수 ROWS ONLY 를 이용하여
-- 원하는 행의 갯수를 추출할 수 있다.
SELECT * FROM tCity ORDER BY area DESC OFFSET 0 ROWS FETCH NEXT 4 ROWS ONLY;

SELECT * FROM tCity ORDER BY area DESC OFFSET 2 ROWS FETCH NEXT 3 ROWS ONLY;

SELECT * FROM tCity WHERE metro = 'n' ORDER BY area DESC OFFSET 2 ROWS FETCH NEXT 3 ROWS ONLY;

 

 

Comments