SQL ( Structured Query Language, SEQUEL )
SQL은 관계형 데이터베이스에서 데이터 정의, 조작, 제어를 위해 정의하는 언어고,
데이터를 정의하는 DDL, 데이터를 조작하는 DML, 데이터를 제어하는 DCL, 트랜잭션을 제어하는 TCL 로 구성되어 있다.
SQL 기본 작성 규칙
- 문장 마지막은 세미콜론(;) 으로 끝남 → 세미콜론 단위로 한 문장이 끝남
- 명령어, 객체명, 변수명은 대/소문자 구분이 없지만 데이터 값은 대/소문자를 구분한다.
- 날짜와 문자열에는 작은 따옴표(')를 사용한다. ( ex. name = 'KIM' )
- 단어와 단어 사이에는 공백 또는 줄바꿈으로 구분한다.
- 주석문은 -- 또는 /**/ 사용하여 작성한다.
한 줄, 두 줄인 경우 -(대시) 두 개를 연이어 사용한 후 작성한다. ex. -- 이것은 주석입니다.
여러 줄인 경우 /**/ 사이에 작성한다. ex. /* 여기부터
여기까지 주석입니다 */
유형 | 설명 |
데이터 정의어 ( DDL: Data Definition Language ) |
- 데이터의 구조 ( 스키마 ) 를 정의하기 위한 명령어 - 명령어의 구체적인 예로는 테이블을 생성할 때 CREATE, 테이블의 구조를 변경할 때 ALTER, 테이블을 삭제할 때 DROP, 테이블의 이름을 다시 작명할 때 RENAME, 테이블의 모든 내용을 모두 지울 때 TRUNCATE |
데이터 조작어 ( DML: Data Manipulation Language) |
- 테이블에 있는 [ 존재하는 ] 데이터를 검색 ( SELECT ) 또는 변형 [ 삽입 · 삭제 · 변경 ] ( 데이터를 삽입하는 INSERT · 데이터를 삭제하는 DELETE · 데이터를 업데이트하는 UPDATE ) 하기위한 명령어로 이루어져 있으며, SELECT는 조회쿼리, INSERT, UPDATE, DELETE는 갱신쿼리다. 조회 쿼리는 데이터에 변형이 생기지 않고, 갱신 쿼리는 데이터가 삽입, 갱신, 삭제를 통해 데이터의 변형이 발생한다. |
데이터 제어어 ( DCL: Data Control Language ) |
- 사용자에게 객체에 대한 권한을 부여 / 취소하기 위한 명령어다. 테이블을 생성 또는 테이블에 삽입 등을 할 수 있는 권한을 부여 ( GRANT ) 또는 취소 ( REVOKE ) 하는 것이다. |
트랜잭션 제어어 ( TCL: Transaction Control Language ) |
- 변경 내용을 확정 ( COMMIT ) / 취소 ( ROLLBACK ) 하는 명령어 |
두 개 이상의 SQL문을 모아놓은 것을 스크립트라고 하고,
스크립트는 처음부터 ( 첫 SQL문 ) 끝까지 ( 마지막 SQL문) 묶여서 하나의 미션을 수행한다.
테이블간에도 만들어지는 순서가 중요하다.
→ A테이블의 PK를 FK로 사용하는 B테이블은 A테이블이 먼저 만들어져야 A테이블의 PK를 FK로 사용할 수 있다.
SQL문
- 테이블의 구조 ( 스키마 ) 를 확인할 때: DESCRIBE 테이블명; DESC 테이블명;
예를 들어 선수 ( PLAYER ) 테이블의 구조를 확인하려면 DESCRIBE PLAYER;
명령어 ( DESCRIBE ) 및 테이블명 ( PLAYER ) 은 대문자든 소문자든 상관없지만
관례상 대문자로 작성하는 것이 좋다. DESCRIBE 는 DESC 라고 작성해도 된다.
SELECT
- 테이블에 존재하는 레코드 ( 행 · ROW ) 의 값을 조회하는 명령어다.
SELECT [ ALL / DISTINCT ] PLAYER_ID, PLAYER_NAME, TEAM_ID, POSITION
FROM PLAYER;
→ SELECT와 FROM은 항상 함께 쓰인다.
→ SELECT 뒤에 ALL 또는 DISTINCT 라는 옵션을 줄 수 있는데, 기본 값은 ALL,
DISTINCT를 작성하면 중복 값을 제거하는 역할이고, DISTINCT 키워드는 첫 칼럼의 앞에 위치해야 한다.
NULL 값도 하나의 값으로 간주한다. 컬럼의 조합에 대해서도 중복이 체크된다.
예를 들어 SELECT TEAM_ID, POSITION FROM PLAYER; 의 경우 TEAM_ID 에 해당하면서
POSITION 인 경우가 하나의 데이터가 되고, 이에 중복된다면 제거하고 출력하라는 것이다 .
TEAM_ID와 POSITION 컬럼에 해당하는 데이터의 조합을 기준으로 중복을 제거한다.
→ 테이블 PLAYER 에서 PLAYER_ID, PLAYER_NAME, TEAM_ID, POSITION 만 ( 행으로 ) 출력하라
DUAL 테이블은 생성하지 않아도 시스템에서 기본적으로 제공해주는 테이블이고,
DUAL 테이블은 하나의 행과 하나의 열로 이루어져 있다.
테이블 안의 모든 컬럼 값을 조회할 때 별표(*) 기호를 사용한다.
SELECT * FROM 테이블명;
컬럼명이 길거나 보안상의 이슈가 있을 때 별칭을 주는데
별칭을 ALIAS 라고 하고, 컬럼명과 별칭 사이에 AS 라는
키워드를 사용 ( AS 라는 키워드는 생략가능 ) 하여 조회되는 칼럼의 레이블을 변경할 수 있다.
별칭이 공백, 특수문자 등을 포함하는 경우에는 큰 따옴표를 사용해야 한다.
SELECT 5+4 AS RESULT FROM DUAL;
ORDER BY
- 출력시 정렬 기준 ( 컬럼 ) 을 설정할 때 ORDER BY 문을 사용하고,
SQL 문장의 맨 마지막에 위치한다. 정렬을 할 때는 오름차순 ( ASC ) 또는 내림차순 ( DESC ) 으로 할 수 있고,
ASC 는 기본 값이다. 참고로 ORACLE 에서는 NULL이 가장 큰 값으로 취급된다.
SQL Server에서는 NULL이 가장 작은 값으로 취급된다.
- 예를 들어 선수명과 키를 키 오름차순으로 출력할 때
SELECT PLAYER_NAME, HEIGHT
FROM PLAYER
ORDER BY HEIGHT ASC;
위와 같이 작성할 수도 있지만 아래와 같이 작성할 수도 있다.
SELECT PLAYER_NAME, HEIGHT
FROM PLAYER
ORDER BY 2;
→ SELECT문에 작성한 컬럼 순서대로 PLAYER_NAME 이 1번,
HEIGHT가 2번이 되어 ORDER BY 2 에서 2는 HEIGHT 를 의미하고,
HEIGHT 를 기준으로 기본 값인 오름차순 ( ASC ) 으로 정렬될 것이다.
SELECT PLAYER_NAME, HEIGHT
FROM PLAYER
ORDER BY HEIGHT DESC, PLAYER_NAME ASC;
PLAYER 테이블에서 선수명 컬럼인 PLAYER_NAME 과 선수의 키 컬럼인 HEIGHT 를 조회하는데
HEIGHT 컬럼을 기준으로 내림차순으로 정렬한 다음 PLAYER_NAME 컬럼을 기준으로 오름차순으로 정렬하기
→ HEIGHT 컬럼에 해당하는 데이터를 내림차순으로 정렬된 다음 동일한 데이터를 기준으로
PLAYER_NAME 에 해당하는 데이터를 오름차순으로 다시 정렬한다.
ORDER BY 절에는 SELECT 문에 작성하지 않은 필드도 작성할 수 있다.
WHERE절
컬럼을 일부만 조회하기 위한 SELECT절
레코드 중에서 일부만 골라내기 위한 WHERE절
- 특정 조건을 만족하는 데이터를 한정하기 위해 사용한다.
- SELECT ~ FROM ~ WHERE ~ 형태로 사용한다.
SELECT PLAYER_ID, POSITION
FROM PLAYER
WHERE POSITION = 'GK';
→ PLAYER 테이블에서
POSITION이 GK에 해당하는 모든 레코드를 기준으로
PLAYER_ID, POSITION 컬럼을 조회하라
WHERE절에 사용되는 연산자 관련 정리
산술연산자는 +, -, *, / 종류가 있으며 NUMBER ( 숫자형 ) 와 DATE ( 날짜형 ) 자료형에 대해 적용된다.
연산자는 SELECT문에서도 사용이 가능하다. NULL ( 없는 값 ) 에 더하거나 빼거나 곱하거나 나누기를 하면 결과는 NULL이다.
비교연산자는 = ( 같다 ), <> ( 같지 않다 ), >= ( 크거나 같다 ), > ( 크다 ), <= ( 작거나 같다 ), < ( 작다 ) 종류가 있으며
모든 자료형에 대해 적용된다. 문자열의 크기 비교는 사전 순 ( 알파벳 순, 가나다 순 ) 으로 수행되며,
NULL에는 비교 연산자 사용이 불가하다. 만약 NATION 이 NULL 인 레코드만 조회하고 싶을 경우 WHERE절을 작성할 때
WHERE NATION = NULL 이 아니라 WHERE NATION IS NULL 이렇게 작성해야 한다.
IS NULL 과 IS NOT NULL 은 SQL 연산자다.
논리 연산자도 모든 자료형에 대해 사용이 가능하며
NOT, AND, OR 종류가 있고, 우선순위는 NOT > AND > OR 순이다.
SELECT PLAYER_NAME, POSITION, HEIGHTFROM PLAYER
WHERE NOT(POSITION = 'GK' AND HEIGHT > 180 );
→ POSITION 이 GK 이면서 HEIGHT 가 180 초과인 것의 반대
→ NOT(POSITION = 'GK' ) OR NOT(HEIGHT > 180 ) → POSITION이 GK가 아니거나 HEIGHT가 180 이하인 것
ex. 골키퍼가 아니면서 키가 180 초과인
1) WHERE POSITION <> 'GK' AND HEIGHT > 180
2) WHERE NOT( POSITION = 'GK' ) AND HEIGHT > 180
논리연산자의 진리표 ( truth table )
AND 연산자는 둘 다 참일 경우 결과가 참이 나온다.
참 AND NULL 인 경우 NULL이 된다. 하나가 거짓이면 다른 하나가 NULL이더라도 거짓 이라는 결과가 나온다.
하나가 참인데 다른 하나가 NULL 이라면 NULL 이라는 결과가 나온다.
NULL AND NULL 인 경우 NULL 이라는 결과가 나온다.
OR 연산자는 하나가 참이면 참이라는 결과를 가져온다.
참 OR NULL 의 경우 하나가 참이라 다른 것은 고려할 필요가 없이 참이라는 결과가 나온다.
거짓 OR NULL 인 경우 NULL 이라는 결과가 나온다.
NULL OR NULL 인 경우 NULL 이라는 결과가 나온다.
[ SQLD ] SQL_Basic DML 240813
SQL 연산자
1. 합성 ( 연결 ) 연산자는 문자열과 문자열을 연결하는데 2가지 방법이 있다. 첫 번째는 CONCAT() 함수 이용하기 두 번째는 문자열을 연결하는 연결기호 ( || ) 이용하기다. CONCAT함수는 매개변수로 연결할 문자열을 2개 전달받는다. 2개가 초과하면 에러가 난다. 문자열을 연결하는 연결기호 || 또한 이항 연산자이지만 여러 개의 문자열을 나열해도 에러가 나지 않는다. 여러 개의 문자열을 나열한다고 해도 나열한 문자열을 순서대로 이항의 구조를 만들어 연산해 나가기 때문이다.
2. BETWEEN 과 NOT BETWEEN 연산자
BETWEEN / NOT BETWEEN 연산자는 AND 키워드와 함께 사용되며,
BETWEEN 연산자는 AND 좌우에 작성되는 시작범위 값과 끝범위 값을 포함하고,
( 예를 들어 WHERE HEIGHT BETWEEN 155 AND 180 이렇게 작성했다면
키의 값이 작성되어 있는 컬럼 HEIGHT 에 대응하는 값 중
155 이상 180 이하에 해당하는 레코드 ( 행 ) 여야 한다는 것이다.
→ BETWEEN 연산자를 사용하지 않을 경우 아래와 같이 작성할 수 있다.
WHERE HEIGHT >= 155 AND HEIGHT <= 180
키가 155인 사람과 키가 180 인 사람도 포함하는 것이다. )
NOT BETWEEN 연산자는 AND 좌우에 작성되는 시작범위 값과 끝범위 값을 포함하지 않는다.
3. IN 연산자
OR 로 연결되는 범위조건을 IN 연산자를 사용하면 간단하게 나타낼 수 있다.
예를 들어 TEAM_ID 의 값이 K04 또는 K06 또는 K10 해당하는 레코드를 조회할 때
( SELECT 절을 사용했다 가정하고 )
해당 조건식을 다음과 같이 작성할 수 있다.
1) WHERE TEAM_ID = 'K04' OR TEAM_ID = 'K06 ' OR TEAM_ID = 'K10'
또는 2) WHERE TEAM_ID IN ( 'K04', 'K06 ', 'K10' )
NOT IN 의 경우
WHERE TEAM_ID NOT IN ( 'K04','K06 ','K10' )
→ 팀 아이디 ( TEAM_ID ) 가 K04, K06, K10 이 아닌 다른 TEAM_ID 조회할 때의 조건절
OR 연산자를 사용하여 풀어서 작성한다면
WHERE TEAM_ID <> 'K04' AND TEAM_ID <> 'K06' AND TEAM_ID <> 'K10'
문제
TEAM_ID와 POSITION 컬럼에 조건을 걸건데, 팀 아이디가 K04 포지션이 GK 또는
팀 아이디가 K06, POSITION 이 MF 인 레코드를 출력할 건데,
PLAYER_NAME, TEAM_ID, POSITION 컬럼을 PLAYER 테이블에서 출력하기
1) IN 연산자 사용버전
SELECT PLAYER_NAME AS 선수이름, TEAM_ID, POSITION
FROM PLAYER
WHERE ( TEAM_ID, POSITION ) IN ( ( 'K04', 'GK' ), ( 'K06', 'MF' ) ) ;
2) IN 연산자 미사용버전
반대 버전
3) NOT IN 연산자 사용버전
SELECT PLAYER_NAME AS 선수이름, TEAM_ID, POSITION
FROM PLAYER
WHERE ( TEAM_ID, POSITION ) NOT IN ( ('K04', 'GK'), ('K06', 'MF' ) );
→ TEAM_ID 가 K04 이고 POSITION 이 GK 또는 TEAM_ID 가 K06 이고 POSITION 이 MF 인 레코드가 아닌 것
3) NOT IN 연산자 미사용버전
SELECT PLAYER_NAME AS 선수이름, TEAM_ID, POSITION
FROM PLAYER
WHERE NOT( TEAM_ID = 'K04' AND POSITION = 'GK' ) AND NOT( TEAM_ID = 'K06' AND POSITION = 'MF' );
4. LIKE 연산자
문자열 비교 연산인 LIKE 연산자, 와일드카드( %, _ ) 를 사용하지 않고 LIKE 만 사용한다면
작성한 문자열과 완전히 일치하는지를 비교하고, 와일드카드를 사용한다면 작성한 문자열을 기반으로
유연한 비교가 가능하다. 예를 들어 조건절에 와일드카드는 사용하지 않고, LIKE 연산자만 다음과 같이 사용했다면,
WHERE PLAYER_NAME LIKE '김석' → PLAYER_NAME 컬럼에 대응하는 데이터가 김석과 완전히 일치하는 경우의
조건절이다. 그래서 WHERE PLAYER_NAME = '김석' 이렇게도 작성이 가능하다.
만약 선수 이름이 '김' 으로 시작하는 모든 선수이름의 레코드를 조회하고 싶다면
% 기호를 사용하여 아래와 같이 작성할 수 있다.
SELECT PLAYER_NAME
FROM PLAYER
WHERE PLAYER_NAME LIKE '김%' ;
→ 선수 이름이 김으로만 시작한다면 '김' 뒤에 어떠한 임의의 문자가 작성되어 있을지라도 모두 조회한다.
만약 김_ 이렇게 작성했다면 _(언더바) 기호는 자리수를 나타내는 것이고,
'김' 뒤에 문자가 하나(_) 오는데 그 문자가 어떤 문자일지라도 상관하지 않고, 조회하라는 의미다.
'공부기록용' 카테고리의 다른 글
[ SQLD ] SQL - DDL 240815 (0) | 2024.08.16 |
---|---|
[ SQLD ] SQL_Basic DML 240814 (0) | 2024.08.15 |
[ SQLD ] 데이터 모델과 성능 240806 (0) | 2024.08.06 |
[ Spring Boot ] 스프링 JPA (0) | 2024.08.02 |
[ SQLD ] 실습 240802 (0) | 2024.08.02 |