본문 바로가기

SQLD · DB

[ SQLD ] SQL_Basic DML 240810

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 테이블은 하나의 행과 하나의 열로 이루어져 있다.

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 · DB' 카테고리의 다른 글

[ SQLD ] SQL - DDL 240815  (0) 2024.08.16
[ SQLD ] SQL_Basic DML 240814  (0) 2024.08.15
[ SQLD ] 데이터 모델과 성능 240806  (0) 2024.08.06
[ SQLD ] 실습 240802  (0) 2024.08.02
[ MYSQL ] SELECT절과 WHERE절 실습  (0) 2024.08.01