SQL (Structured Query Language)
구조적 질의 언어,
데이터베이스(DataBase)에서 데이터의 효율적인 관리를 하기 위해 만든 언어이다.
각종 서버는 거의 대부분 SQL 기반 DB를 사용한다.
- 데이터를 직접 다루는 언어이다 보니 보안에 매우 신중하고, 가장 보수적인 문법 규칙을 고수한다.
- 신중한 입력을 요구받다 보니 자연어에 가까운 명령어를 채택하였다.
- 언어 특성상 탐욕적 알고리즘을 채택하여 명령어 입력에 매우 신중해야 한다. (특히 DROP)
해킹 공격을 막기 위해 발전을 거듭하여 Secure Coding 기법이 발달하게 되었다.
SQL은 Oracle, MS, 등등 여러 기업에서 변조 문법을 추가한 버전(?)이 많아서
가장 먼저 SQL 표준인 ANSI 표준 문법을 배워야 한다.
SQL DB data 구조
추상적으로 구조를 간단하게 이해하면 이렇게 된다.
행(行) == row == 가로줄
열(列) == column == 세로줄 (세로로 뻗은 기둥(column)을 생각하면 쉽다)
대문자? 소문자?
대부분의 SQL 에서 Windows 에서는 문법적으로 대소문자 구분을 하지 않는다.
하지만 실제 사용할 때 대소문자 구분을 해야 하는 이유는 바로 Linux나 Un*x 계열에서는
table 과 database 명이 directory와 file 명이기 때문이다.
Windows 에서는 디렉토리와 파일에 접근할 때 대소문자 구분을 하지 않으나
Linux/Unix 는 구분하므로
select 나 insert 명령 시에 테이블의 대소문자를 구분하게 된다.
그래서 이름(name)은 소문자로,
질의(QUERY), 연산(OPERATE), 타입(TYPE) 등은 대문자로 표기한다.
데이터 타입 (data Type)
테이블 만들기 1
CREATE TABLE <name> (id INTEGER PRIMARY KEY, age INTEGER);
<name>
id | age |
. . . |
. . . |
id 에는 INTEGER 타입만 올 수 있다.
id 는 primary key 로서 각 행/레코드를 고유하게 식별하는 테이블의 필드가 된다.
쉽게 기준 값이 된다는 것이다.
순서 뿐만 아니라 아이디,주민번호 등 고유한 레코드에 활용 가능하다.
primary key 인 열은 NULL 값을 가질 수 없다.
age 에는 INTERGER 타입만 올 수 있다. primary key 가 아니므로 값들은 서로 내용이 겹쳐도 된다.
테이블 만들기 2
CREATE TABLE customers (id INTEGER PRIMARY KEY, name TEXT, age INTEGER, weight REAL);
customers
id | name | age | weight |
. . . |
. . . |
. . . |
. . . |
데이터 삽입
INSERT INTO customers VALUES (71, "Sans", 31);
customers
id | name | age |
1~72 | ... | ... |
71 | Sans | 31 |
id 에 primary Key 가 있다면 자동으로 ++ 연산을 해주기 때문에 밑에 처럼 입력할 땐 넣지 않아도 된다.
INSERT INTO customers (name, age) VALUES ("Brian", 33);
id | name | age |
1~72 | ... | ... |
71 | Sans | 31 |
데이터 쿼리
SELECT * FROM customers;
id | name | age |
1 | test1 | 34 |
2 | test2 | 51 |
3 | test3 | 18 |
4 | test4 | 21 |
5 | test5 | 52 |
6 | test6 | 12 |
7 | test7 | 11 |
SELECT * FROM customers WHERE age > 21;
id | name | age |
1 | test1 | 34 |
2 | test2 | 51 |
5 | test5 | 52 |
SELECT * FROM customers WHERE age < 21 AND state = "NY";
다중 조건은 AND , OR 연산자 활용
customers
id | name | state | age |
1 | test1 | NY | 34 |
2 | test2 | NY | 51 |
5 | test5 | NY | 52 |
SELECT * FROM customers WHERE plan IN ("free", "basic");
IN 연산자로 특정 인자 필터링
NOT IN 를 통해 여집합 SELECT 가능
customers
id | name | plan |
1 | test1 | free |
2 | test2 | basic |
5 | test5 | none |
query 후(IN)
id | name | plan |
1 | test1 | free |
2 | test2 | basic |
SELECT * FROM customers WHERE plan NOT IN ("free", "basic");
query 후(NOT IN)
id | name | plan |
5 | test5 | none |
SELECT name, age FROM customers;
특정 열을 SELECT 할 수 있다.
customers
name |
test1 |
test2 |
test5 |
SELECT * FROM customers WHERE age > 21 ORDER BY age DESC;
ORDER BY 로 결과 정렬 하는 방법
ASC 오름차순 (보통 생략)
DESC 내림차순
SELECT name, CASE WHEN age > 18 THEN "adult" ELSE "minor" END "type" FROM customers;
CASE 변환
데이터 집계
SELECT MAX(age) FROM customers;
SELECT gender, COUNT(*) FROM students GROUP BY gender;
데이터 업데이트 및 삭제
UPDATE customers SET age = 33 WHERE id = 73;
DELETE FROM customers WHERE id = 73;
'개발 > DB' 카테고리의 다른 글
SQL 종류와 활용 (0) | 2022.02.20 |
---|---|
SQL 데이터 타입 총정리 - SQL Data Type (4) | 2022.02.04 |