[초보] 데이터 분석을 위한 SQL 기초 모음
1.[초보] SQL 기초 모음 - SELECT(1)
2.[초보] SQL 기초 모음 - INSERT(1)
3. [초보] SQL 기초 모음 - UPDATE(1)
4. [초보] SQL 기초 모음 - DELETE(1)
출처: [AgileBus - IT 기술자를 위한 최신 기술 Trends:티스토리]
[초보] SQL 기초 모음 - SELECT (1)
SQL 쿼리를 배우기 위해 가장 먼저 배운 것이 SELECT 문입니다.
데이터베이스의 테이블에 저장된 데이터를 읽어서 처리하는 가장 기본적인 문장으로 데이터의 특정 데이터와 조회 되는 순서나 같은 값을 기준으로 갯수를 카운트 하거나 특정 데이터 끼리 그룹이나 다양한 수학적 연산이 가능합니다.
간단한 예제를 통해서 SELECT 문의 가장 기본적인 테이블의 조회 방법을 알아 보고자 합니다.
1. SQL SELECT Statement Syntax :
■ SQL 구문 중요 사항
1.SQL 문은 대소문자를 구분하지 않으므로 SQL에서 SELECT와 select가 모두 동일합니다.
* 한편 MySQL의 경우 테이블 이름을 case-sensitive 로 구분하게 할 수 있습니다.
2. 일반적으로 SQL 키워드는 대문자로 작성됩니다. 소문자를 사용하여도 무방하나 문장을 쉽게 구분할 수 있습니다.
3. SQL 구문은 데이터 끼리의 수학적 대수관계, 데이터쌍(튜플) 으로 이루어 집니다.
4. 각 SQL 문은 세미콜론(;)으로 끝납니다. 세미콜론은 일반적으로 두 개 이상의 문이 사용되는 경우 두 개의 SQL 문을 서로 구분하는 데 사용됩니다.
■ SELECT 기본 조회 문장
SELECT expressions
FROM tables
[WHERE conditions]
[ORDER BY expression [ ASC | DESC ]];
■ 특정 컬럼을 기준으로 데이터 그룹핑
그룹은 주로GROUP BY 문과 COUNT(), SUM(), MIN(), MAX(), AVG() 등과 같은 수학,통계 함수와 사용됩니다.
SELECT <column1>, SUM(<column2>)
FROM <table>
GROUP BY <grouping_column>;
■ 그룹 조건 결과에 특정 조건을 추가하는 HAVING 문장
- HAVING 조건은 그룹이 실행된 결과가 출력될때 작동 되는 것으로 FROM절의 조건과 차이가 있습니다.
그룹 문장의 결과 중에 특정 조건을 만족하는 결과중에서 조건을 만족하는 결과를 찾습니다.
주의 사항으로 테이블의 전체를 처리해야 나오는 것으로 전체데이터를 대상으로 하는 SQL에 사용됩니다.
SELECT <column1>, SUM(<column2>)
FROM <table>
GROUP BY <grouping_column>
HAVING <condition>;
■ SELECT문을 이용해서 새로운 테이블 만드는 방법
SELECT <column> INTO <new_table>
FROM <table>
WHERE <condition>;
* SQL결과를 테이블로 만드는 방법으로 처리 결과를 임시 저장 할 수 있습니다. 그러나 이러한 방법이 비효율적이만 DB에 반복 작업을 불일 수도 있고, 처리하는 동안 불 필요한 컴퓨터 자원과 공간을 낭비 할 수도 있습니다.
2. 테이블조회 기초 - 전체 필드 조회
■ 전체 필드 조회
SELECT문은 테이블에 저장된 데이터를 검색하는 명령어 입니다.
(팁) 문자 "*" 를 이용해서 전체 테이블의 필드를 조회 할 수 있습니다.
SELECT * FROM 테이블명;
SELECT * FROM Customers;
<결과>
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
5 | Berglunds snabbköp | Christina Berglund | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
6 | Blauer See Delikatessen | Hanna Moos | Forsterstr. 57 | Mannheim | 68306 | Germany |
3. 테이블조회 기초 - 특정 필드 조회
■ 특정 필드 조회
SELECT문을 통해 필요한 필드들을 조회 하는 방법입니다.
(팁) 테이블의 필드명을 나열하여 테이블의 필요한 필드를 조회 할 수 있습니다.
SELECT 필드명1, 필드명2, ..., 필드명N FROM 테이블명;
SELECT CustomerID, CustomerName, Country FROM Customers;
<결과>
CustomerID | CustomerName | Country |
1 | Alfreds Futterkiste | Germany |
2 | Ana Trujillo Emparedados y helados | Mexico |
3 | Antonio Moreno Taquería | Mexico |
4 | Around the Horn | UK |
5 | Berglunds snabbköp | Sweden |
6 | Blauer See Delikatessen | Germany |
7 | Blondel père et fils | France |
8 | Bólido Comidas preparadas | Spain |
4. 테이블조회 기초 - 특정 필드로 조회 소팅
■ 특정 필드로 조회 소팅 (오름차순, 내림차순)
SELECT문을 통해 필요한 필드의 값을 소팅하여 순서대로 조회 하는 방법입니다.
(팁) SQL 문장의 마지막에 ORDER BY "필드명" ASC|DESC 를 통해 순서대로 소팅이 가능합니다.
- ASC : 작은 값부터 출력되는 Ascending(오름차순)의 약자이고
- DESC : 큰 값부터 출력되는 Descending (내림차순)의 약자 입니다.
■ Descending (내림차순)으로 정렬
SELECT 필드명1, 필드명2, ..., 필드명N FROM 테이블명 ORDER BY 필드명1 DESC ;
SELECT CustomerID, CustomerName, Country FROM Customers ORDER BY Country DESC ;
<결과> :
CustomerID | CustomerName | Country |
33 | GROSELLA-Restaurante | Venezuela |
35 | HILARIÓN-Abastos | Venezuela |
46 | LILA-Supermercado | Venezuela |
47 | LINO-Delicateses | Venezuela |
32 | Great Lakes Food Market | USA |
36 | Hungry Coyote Import Store | USA |
43 | Lazy K Kountry Store | USA |
45 | Let's Stop N Shop | USA |
48 | Lonesome Pine Restaurant | USA |
■ Ascending (오름차순)으로 정렬
<결과>
SELECT CustomerID, CustomerName, Country FROM Customers ORDER BY Country ASC ;
CustomerID | CustomerName | Country |
12 | Cactus Comidas para llevar | Argentina |
54 | Océano Atlántico Ltda. | Argentina |
64 | Rancho grande | Argentina |
20 | Ernst Handel | Austria |
59 | Piccolo und mehr | Austria |
50 | Maison Dewey | Belgium |
76 | Suprêmes délices | Belgium |
5. 테이블조회 기초 - 특정 필드의 값으로 필터링 조건
■ 특정 필드의 값으로 필터링 조건
SELECT CustomerID, CustomerName, Country FROM Customers WHERE country = 'Austria'
<결과>
CustomerID | CustomerName | Country |
20 | Ernst Handel | Austria |
59 | Piccolo und mehr | Austria |
6. 테이블 조회를 위한 SQL 예시들
■ CREATE (생성)
CREATE DATABASE | CREATE DATABASE database_name |
CREATE TABLE | CREATE TABLE table_name ( column_name1 data_type, column_name2 data_type, column_name3 data_type, ... ) |
CREATE INDEX | CREATE INDEX index_name ON table_name (column_name)or CREATE UNIQUE INDEX index_name ON table_name (column_name) |
CREATE VIEW | CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition |
CREATE TABLE table_name(
column1 datatype,
column2 datatype,
column3 datatype,
.....
columnN datatype,
PRIMARY KEY( one or more columns )
);
CREATE UNIQUE INDEX index_name
ON table_name ( column1, column2,...columnN);
CREATE DATABASE database_name;
■ ALTER (변경)
ALTER TABLE | ALTER TABLE table_name ADD column_name datatype or ALTER TABLE table_name DROP COLUMN column_name |
ALTER TABLE table_name
ALTER TABLE table_name {ADD|DROP|MODIFY} column_name {data_ype};
ALTER TABLE table_name RENAME TO new_table_name;
■ DROP (삭제)
DROP DATABASE | DROP DATABASE database_name |
DROP TABLE | DROP TABLE table_name |
DROP INDEX | DROP INDEX table_name.index_name (SQL Server) DROP INDEX index_name ON table_name (MS Access) DROP INDEX index_name (DB2/Oracle) DROP INDEX index_name (MySQL) |
DROP TABLE table_name;
DROP INDEX index_name;
DROP DATABASE database_name;
■ Insert (입력)
INSERT INTO | INSERT INTO table_name VALUES (value1, value2, value3,....)or INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,....) |
INSERT INTO table_name( column1, column2....columnN)
VALUES ( value1, value2....valueN);
■ UPDATE (수정)
UPDATE table_name
SET column1 = value1, column2 = value2....columnN=valueN
[ WHERE CONDITION ];
■ DELETE, TRUNCATE (삭제)
DELETE | DELETE FROM table_name WHERE some_column=some_valueor DELETE FROM table_name (Note: Deletes the entire table!!) DELETE * FROM table_name (Note: Deletes the entire table!!) |
TRUNCATE TABLE | TRUNCATE TABLE table_name |
TRUNCATE TABLE table_name;
DELETE FROM table_name WHERE {CONDITION};
■ Select (조회)
SELECT * | SELECT * FROM table_name |
SELECT DISTINCT | SELECT DISTINCT column_name(s) FROM table_name |
SELECT INTO | SELECT * INTO new_table_name [IN externaldatabase] FROM old_table_nameor SELECT column_name(s) INTO new_table_name [IN externaldatabase] FROM old_table_name |
SELECT TOP | SELECT TOP number|percent column_name(s) FROM table_name |
SELECT column1, column2....columnN
FROM table_name;
SELECT DISTINCT column1, column2....columnN
FROM table_name;
■ Condition (조회 조건)
WHERE | SELECT column_name(s) FROM table_name WHERE column_name operator value |
SELECT column1, column2....columnN
FROM table_name
WHERE CONDITION;
일반적인 조회 조건은 인덱스와 함께 고민해야 합니다.
같은것>큰것, 작은것 > 있는것, 아닌것,다른것 > 없는것 등의 순서로 인덱스 활용의 논리적. 물리적 효율성을 이해 해야 하며, 인덱스 구조와 순서에 맞는 조건절의 순서와 구조도 매우 중요 합니다.
SQL튜닝에서 인덱스와 조건의 튜닝은 책한권 만큼 할 말이 많은 분야로 많은 경험과 노하우가 요구됩니다.
AND / OR | SELECT column_name(s) FROM table_name WHERE condition AND|OR condition |
AS (alias) | SELECT column_name AS column_alias FROM table_nameor SELECT column_name FROM table_name AS table_alias |
BETWEEN | SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2 |
IN | SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,..) |
LIKE | SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern |
SELECT column1, column2....columnN
FROM table_name
WHERE CONDITION-1 {AND|OR} CONDITION-2;
SELECT column1, column2....columnN
FROM table_name
WHERE column_name IN (val-1, val-2,...val-N);
SELECT column1, column2....columnN
FROM table_name
WHERE column_name BETWEEN val-1 AND val-2;
SELECT column1, column2....columnN
FROM table_name
WHERE column_name LIKE { PATTERN };
■ UNION (조회 병합)
UNION | SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2 |
UNION ALL | SELECT column_name(s) FROM table_name1 UNION ALL SELECT column_name(s) FROM table_name2 |
■ Order (조회순서)
ORDER BY | SELECT column_name(s) FROM table_name ORDER BY column_name [ASC|DESC] |
SELECT column1, column2....columnN
FROM table_name
WHERE CONDITION
ORDER BY column_name {ASC|DESC};
■ Group (그룹)
GROUP BY | SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name |
HAVING | SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name HAVING aggregate_function(column_name) operator value |
SELECT SUM(column_name)
FROM table_name
WHERE CONDITION
GROUP BY column_name;
SELECT COUNT(column_name)
FROM table_name
WHERE CONDITION;
SELECT SUM(column_name)
FROM table_name
WHERE CONDITION
GROUP BY column_name
HAVING (arithmetic function condition);
■ JOIN (테이블 조인)
INNER JOIN | SELECT column_name(s) FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name |
LEFT JOIN | SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name |
RIGHT JOIN | SELECT column_name(s) FROM table_name1 RIGHT JOIN table_name2 ON table_name1.column_name=table_name2.column_name |
FULL JOIN | SELECT column_name(s) FROM table_name1 FULL JOIN table_name2 ON table_name1.column_name=table_name2.column_name |
[초보] SQL 기초 모음
1.[초보] SQL 기초 모음 - SELECT(1)
2.[초보] SQL 기초 모음 - INSERT(1)
3. [초보] SQL 기초 모음 - UPDATE(1)
4. [초보] SQL 기초 모음 - DELETE(1)
[참고자료]
'BigData' 카테고리의 다른 글
[SQLite] Sqlite transaction ACID 개념 (0) | 2022.08.10 |
---|---|
[SQLite] Sqlite transaction 처리문 - BEGIN TRANSACTION (0) | 2022.08.10 |
[초보] SQL 기초 모음 - INSERT(1) (0) | 2022.08.10 |
[SQLite] SQLite Commands (0) | 2022.08.04 |
[SQLite] sqlite 소개 - Serverless Database (0) | 2022.08.04 |
[SQLite] sqlite create table example (0) | 2022.08.04 |
(표준)개인식별정보 와 비식별 ISO/IEC 20889 privacy framework (0) | 2022.06.24 |