SQL - 기본 문법(SELECT)
SELECT문
SELECT문은 생성된 테이블에서 데이터를 출력하는 기능을 하며, 데이터를 변경시키지 않는다.
SELECT 앞에 작성하는 내용은 읽어올 컬럼(열)을 지정하며, 복수 지정이 가능하다.(*)를 사용하면 모든 컬럼을 지정한다.
SELECT문 작성 순서
SELECT 컬럼 FROM 테이블 WHERE /GROUP BY /HAVING /ORDER BY /LIMIT
열(컬럼) 명의 별칭
열(컬럼)의 이름에 별칭(alias)을 지정할 수 있다. 별칭을 지정하면 Result Grid에 별칭이 대신 표시된다. 별칭에 특수문자, 공백이 존재한다면 작은따옴표로 묶어 작성한다.
SELECT mem1 AS '멤버1', mem2 AS '멤버2' FROM table;
SELECT mem1 '멤버1', mem2 '멤버2' FROM table;
DISTINCT중복된 결과를 제거
출력 결과에서 중복된 데이터를 1개만 남기고 제거한다.
SELECT DISTINCT addr FROM table;
SELECT의 속성
속성 | 생략여부 | 설명 |
FROM | 가능 | 읽어올 테이블을 설정한다. |
WHERE | 불가능 | 선택한 행에 조건을 설정한다. |
GROUP BY | 불가능 | 동일한 값을 가진 행을 그룹으로 묶는다. |
HAVING | 불가능 | GROUP BY로 그룹화된 결과에 대한 조건을 설정한다.(집계 함수) |
ORDER BY | 불가능 | 결과를 정렬한다.(ASC / DESC) |
LIMIT | 불가능 | 출력할 결과의 개수를 제한한다. |
들어가기 앞서
테이블의 이름은 table 열(컬럼)은 mem_id(PK), mem_name, mem_number, height, addr이 포함되어 있다.
FROM
SELECT문에서 읽어올 테이블을 지정하는 명령어로 생략이 불가능하다.
*WHERE, GROUP BY를 사용하지 않으면 모든 행이 출력된다.
SELECT * FROM table;
USE로 사용할 DB를 지정하지 않으면 'DB명.테이블명'으로 테이블을 지정해줘야 한다.
SELECT * FROM DB02.table;
WHERE절
특정한 조건을 추가하여 원하는 데이터가 포함된 행을 출력할 때 사용된다.(필터링)
SELECT 열 FROM 테이블 WHERE 조건식;
*PRIMARY KEY로 지정된 열(컬럼)을 선택하여 1개의 행만 출력 가능하다.
mem_id(PK)
SELECT *
FROM table
WHERE mem_id=1; ==> mem_id가 1인 행을 출력한다.
숫자
연산자 사용
숫자로 저장된 데이터는 비교 연산자, 논리 연산자를 사용하여 조건에 맞는 행을 출력할 수 있다.
비교 연산자(<, >, <=, >=, =)
SELECT mem_id, mem_name
FROM table
WHERE height < 165;
- height가 165 미만인 행의 mem_id와 mem_name을 출력한다.
논리 연산자(AND, OR)
SELECT mem_id, mem_name
FROM table
WHERE height < 165 AND mem_number > 6;
- height가 165 미만이면서 동시에 mem_number가 6보다 큰 행의 mem_id와 mem_name을 출력한다.
BETWEEN ~AND(범위 지정)
일반적인 논리 연산자 사용
SELECT mem_name, height
FROM table
WHERE height >= 163 AND height <= 165;
BETWEEN ~AND 사용
SELECT mem_name, height
FROM table
WHERE height BETWEEN 163 AND 165;
위 코드와 같이 height가 163 ~ 165인 행을 출력하고 싶을 때 BETWEEN ~AND를 사용하면 불필요한 코드 작성을 줄이고 편리하게 숫자의 범위를 지정할 수 있다.
문자
IN() (포함)
문자는 숫자와 다르게 비교 연산자나 BETWEEN ~AND로 범위를 지정할 수 없으며, 특정 문자가 포함된 행을 찾으려면 OR연산자로 하나하나 지정해줘야 한다. 이는 매우 번거롭고 가독성이 떨어진다.
이때 IN()을 사용하면 쉽고 간결하게 특정 문자가 포함된 행을 찾을 수 있다.
SELECT mem_name, addr
FROM table
WHERE addr IN('경기', '경남', '전남');
- '경기', '경남', '전남'중 하나가 포함된 addr을 찾아 그 행의 mem_name과 addr을 출력한다.
*LIKE*
특정 문자가 포함된 문자열을 찾을 때 사용한다.
글자수에 제한을 두지 않을 때는 '%'를 사용하고, 한 글자와 매칭하기 위해서는 언더바(_)를 사용한다.
예시)
'%다' : '다'로 끝나는 모든 문자열
'가%' : '가'로 시작하는 모든 문자열
'_나_' : '나'가 두 번째 위치에 있으며 그 앞뒤로 각각 하나의 문자가 있는 문자열
SELECT *
FROM table
WHERE mem_name LIKE '_나%마';
- mem_name에서 '나'가 두 번째 위치에 있고, '마'로 끝나는 행을 선택하여 출력한다.
*서브쿼리*
SELECT 안에는 또 다른 SELECT가 들어갈 수 있는데 이를 서브쿼리라고 한다.
SELECT *
FROM table
WHERE height > (SELECT height FROM table WHERE mem_id=10);
- mem_id가 10인 행의 height를 기준으로 그보다 큰 height를 가진 행을 출력한다.
ORDER BY절(정렬)
데이터의 값이나 개수에 대해서는 변화가 없지만 결과가 출력되는 순서를 조절한다.
기본값은 ASC이며, 이는 오름차순을 의미한다. 또 다른 값으로 DESC가 있는데 이는 내림차순을 뜻한다.
*Result Grid에 출력되는 데이터는 위에서 아래로 출력된다. ASC는 값이 커지고 DESC는 값이 작아진다.
SELECT *
FROM table
ORDER BY height ASC; => ASC는 생략가능
- height값이 작은 순서대로 정렬한다. DESC를 붙이면 height값이 큰 순서대로 정렬된다.
중복된 값이 있는 경우
정렬 기준은 여러 개의 열로 지정할 수 있다. 첫 번째 열로 정렬한 후에 중복된 값이 있는 경우 다음 지정 열로 정렬할 수 있다.
SELECT *
FROM table
ORDER BY height DESC, mem_number ASC;
- height값이 큰 순서대로 정렬하고 중복된 값이 있는 경우, mem_number가 작은 순서대로 정렬한다.
LIMIT절(제한)
출력하는 개수를 제한한다.
LIMIT의 형식은 'LIMIT 시작, 개수'로 단일 값을 입력하면 개수로 인식한다.
*시작 위치는 0부터 시작한다. 0은 첫 번째 행을 의미함
단일값
SELECT *
FROM table
LIMIT 3;
- 출력 결과를 3개로 제한한다.
*시작 위치와 개수 사용
SELECT *
FROM table
ORDER BY height DESC;
LIMIT 5, 8;
- height값이 큰 순서대로 정렬하고, 5번째 인덱스부터 8개의 행만 출력된다.(6번째 행부터 13번째 행까지)
GROUP BY절
동일한 값을 가진 행을 하나의 그룹으로 묶어주는 역할을 한다. 주로 집계 함수와 함께 사용하며, 집계 함수 없이 GROUP BY를 사용할 경우, 그룹의 첫 번째 행의 값이 출력된다.
집계 함수
집계 함수를 사용하면 Result Grid에 출력되는 컬럼이 집계 함수로 표시되므로 별칭을 달아주는게 좋다.
*집계 함수 안에서 연산할 수 있다. ex) SUM(a+b)
함수 | 설명 |
SUM() | 합계를 구한다. |
AVG() | 평균을 구한다. |
MIN() | 최소값을 구한다. |
MAX() | 최대값을 구한다. |
COUNT() | 행의 개수를 센다. |
COUNT(DISTINCT) | 행의 개수를 센다.(중복된 행은 1개로 셈) |
*COUNT()를 사용할 때 테이블의 전체 행의 개수를 파악하려면 PK를 지정해야 한다. PK는 NULL값이 없기 때문이다.
SELECT mem_number, AVG(height) AS height_AVG
FROM table
GROUP BY mem_number;
- 동일한 mem_number값을 가진 행을 그룹으로 묶고, 각 그룹의 height의 평균값을 출력한다.
HAVING절
GROUP BY절을 사용한 이후에는 WHERE절을 사용하지 못하기 때문에 대신 사용하는 것이 바로 HAVING절이다.
*집계 함수에 대한 조건을 작성하는 것이라 이해하면 편하다.
SELECT mem_number, AVG(height) AS height_AVG
FROM table
GROUP BY mem_number;
HAVING AVG(height) > 160;
- AVG(height)의 값이 160보다 큰 열(컬럼)의 행을 출력한다.