책 '그림으로 배우는 SQL 입문'을 읽은 후 정리한 글입니다.
데이터베이스에는 몇 가지 종류가 있는데, 그 중 가장 많이 이용되는 것은 Relational Database(관계 데이터베이스: RDB 형식)
RDB는 행(record)과 열(column)으로 구성된 표(table)로 데이터를 다룸
테이블 안의 1개의 요소를 ‘필드’라고 부름
RDB를 관리하기 위한 DBMS를 관계 데이터베이스 관리 시스템, RDBMS라고 부름
SQL: 데이터베이스 조작이나 정의를 시행하기 위한 언어
1. SELECT, FROM
데이터베이스에서 데이터를 가져오기 위해서는 SQL에서 SELECT라는 구문을 사용
(SELECT 구문을 사용한 SQL을 SELECT 문이라고 함)
예시) product_id와 product_name을 product 테이블에서 가져온다
SELECT
product_id,
product_name
FROM
product;
SELECT 다음에 ‘무엇’을 가져올지에 해당하는 column명을 작성 (여러개인 경우 콤마로 구분)
FROM 다음에 ‘어디’에서 가져오는지에 해당하는 table명을 작성
1개의 SQL문 마지막에는 반드시 ‘;’을 붙임
*을 사용해서, 테이블의 모든 데이터를 가져올 수 있음
예시) *을 사용해서, product 테이블의 모든 데이터를 가져온다
SELECT
*
FROM
product;
SELECT 구에서 같은 컬럼을 여러 개 지정하거나 *와 column명을 같이 사용할 수 있음
예시) product_id를 2회, product_name을 product 테이블에서 가져옴
SELECT
product_id, product_name, product_id
FROM
product;
예시) 모든 column과 product_id를 product 테이블에서 가져옴
SELECT
*, product_id
FROM
product;
SQL을 적을 때, 각각의 단어 사이는 1개 이상의 공백으로 구분
콤마나 세미콜론, 연산자의 앞 뒤는 공백을 넣지 않아도 상관 없음
SELECT 구에서 데이터를 가져올 때 AS 구를 활용하여 별명을 지정할 수 있음
(별명을 에일리어스, alias라고 부름)
예시) product_id와 product_name을 별명으로 가져온다
SELECT
product_id AS 상품ID,
product_name AS 상품명
FROM
product;
2. WHERE
WHERE 뒤에 조건을 줌으로써 특정 조건에 해당하는 행(record)만 가져올 수 있음
예시) membertype_id가 2인 레코드의 customer_name 컬럼을 customer 테이블에서 가져온다
SELECT
customer_name
FROM
customer
WHERE
membertype_id = 2;
3. 비교 연산자, 데이터형, NULL, IS와 IS NOT
비교 연산자 목록
연산자 = : a와 b는 같다
연산자 <=> : a와 b는 같다(NULL 대응)
연산자 != : a와 b는 다르다
연산자 <> : a와 b는 다르다
연산자 < : a는 b보다 작다
연산자 > : a는 b보다 크다
연산자 <= : a는 b 이하
연산자 >= : a는 b 이상
반환 결과는 1(TRUE), 0(FALSE), NULL
참고: 어떤 테이블에서도 데이터를 가져오지 않을 때는 FROM 구를 적지 않는다.
데이터형
문자열 : CHAR(’A’), VARCHAR(”abc123”), TEXT(’가나다라’)
정수: INT, TINYINT
실수(소수): DOUBLE, FLOAT, DECIMAL
날짜시각: DATE, DATETIME (’2020-01-01’, ‘2020/01/01’, ‘2020-01-01 01:23:34’
부울형: BOOLEAN( 1(TRUE), 0(FALSE) )
위도경도: GEOMETRY(’POINT(139.721251 35.689607)
문자열, 날짜 시각은 ‘이나 “를 감싸서 적는데, ‘이 일반적
NULL
NULL이란 어떤 데이터도 가지지 않는 상태
(길이가 0인 문자열 ≠ NULL)
NULL인 경우를 조건으로 하려면 IS NULL을 사용
예시) customer_name이 NULL인 customer_id를 customer 테이블에서 가져온다
SELECT
customer_id
FROM
customer
WHERE
customer_name IS NULL;
NULL이 아니다를 조건으로 하는 경우 IS NOT NULL을 사용
<=> 이외의 연산자로 NULL을 비교 대상으로 하면 NULL 자신을 포함하는 어떤 값과 비교해도 결과는 모두 NULL
1 <=> NULL → 0
1 = NULL → NULL
1 != NULL → NULL
1 <> NULL → NULL
IS와 IS NOT
데이터 값이 BOOLEAN 형의 TRUE 또는 FALSE인지를 판정할 때에는 IS와 IS NOT을 사용
4. 문자열 검색
문자열에서 비교 연산자를 사용하면 대소문자를 구별하지 않고, 끝의 공백은 무시됨
예시) val이 ‘A’인 레코드를 search 테이블에서 가져온다
SELECT
*
FROM
search
WHERE
val = 'A';
위 예문은 val = ‘a’인 레코드도 가져옴
BINARY를 사용하면 대소문자 문제와 끝의 공백이 무시되는 문제 해결 가능
예시) val이 ‘A’인 레코드를 search 테이블에서 가져온다
SELECT
*
FROM
search
WHERE
val = BINARY 'A';
문자열이 일치하는지 여부를 판정하는데에 LIKE와 NOT LIKE 사용 가능
SELECT
*
FROM
search
WHERE
val LIKE 'A';
대소문자도 구분하고 싶으면 WHERE에 val LIKE BINARY ‘A’; 라고 쓰자
LIKE는 문자열의 일부만 일치하는지 판정할 수 있음
%: 임의의 0개 이상의 문자
_: 임의의 1문자
예시) product_name의 맨 앞에 ‘약용’이 들어가 있는 레코드르 product 테이블에서 가져온다
SELECT
*
FROM
product
WHERE
product_name LIKE '약용%';
특수 문자 앞에 \를 붙이자 (이스케이프 처리)
예시) product_name에 ‘100%’가 들어가 있는 레코드를 product 테이블에서 가져온다
SELECT
*
FROM
product
WHERE
product_name LIKE '%100\\%%';
문자열이나 날짜의 대소 비교 가능
예시) birthday가 ‘1900-01-01’보다 이전인 레코드를 customer 테이블에서 가져온다
SELECT
*
FROM
customer
WHERE
birthday < '1990-01-01';
예시) val이 ‘A’보다 큰 레코드를 search 테이블에서 가져온다
SELECT
*
FROM
search
WHERE
val > 'A';
참고: ‘4’ <’ 10’은 false이다.