
본 글은 w3big.com을 참고하여 작성하였습니다.
참조
- yumin25 님의 블로그
- coco3o 님의 블로그
- stricky 님의 블로그
- genesis8 님의 블로그
- W3schools
1. SELECT
SELECT column_name, column_name
FROM table_name ;
SELECT * FROM table_name;
데이터베이스(table_name)에서부터 데이터 (column_name)를 추출.
반환한 데이터는 result-set에 테이블 형태로 저장됨.
*을 사용하여 모든 데이터를 불러올 수 있음.
2. SELECT DISTINCT
SELECT DISTINCT coulmn1, column2
FROM table_name;
중복을 제외한 값들을 반환.
3. WHERE
SELECT column_name , column_name
FROM table_name
WHERE column_name operator value ;
--example
SELECT * FROM Websites WHERE country = 'CN';
SELECT column_name FROM table_name WHERE column_name IN (value_1, value_2, ...);
SELECT column_name FROM table_name WHERE column_name NOT IN (value_1, value_2, ...);
특정 조건에 부합하는 레코드만을 필터링.
4. AND & OR & NOT
여러 조건을 동시에 만족하는 데이터를 찾을 때 사용. (C언어의 &&, || 와 같은 쓰임)
NOT은 조건이 참이 아닌 레코드를 표시 (C언어의 !와 같은 쓰임)
5. ORDER BY
SELECT column1, column2
FROM table_name
ORDER BY column1, column2 ASC|DESC;
--country로 정렬하고, 그 중에서는 alexa로 정렬
SELECT * FROM Websites
ORDER BY country, alexa;
결과 세트를 정렬하는 기능. 기본적으로는 오름차순(ASC). 내림차순은 DESC.
6. INSERT INTO
--열과 값의 이름을 보두 지정하는 방법
INSERT INTO table_name (column1 , column2)
VALUES (value1, value2);
--값만 지정하는 방법 (순서는 테이블과 같은 순서)
INSERT INTO table_name
VALUES (value1, value2);
테이블에 새로운 레코드를 삽입.
마지막에 삽입됨.
6. UPDATE
UPDATE table_name
SET column1 = value1 , column2 = value2 ,...
WHERE some_column = some_value ;
--example
UPDATE Websites
SET alexa = '5000', country = 'USA'
WHERE name = 'tutorial';
테이블에 있는 레코드를 수정.
example의 결과는 아래와 같음.

WHERE를 사용하지 않으면 모든 데이터가 변하니 주의할 것.
7. DELETE
DELETE FROM table_name WHERE condition;
DELETE * FROM table_name;
테이블에 있는 레코드 삭제.
8. SELECT TOP
--SQL Server, MS Access
SELECT TOP number | percent column_name(s)
FROM table_name ;
--MySQL
SELECT column_name(s)
FROM table_name
LIMIT number ;
--Oracle
SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number ;
데이터베이스를 제안하여 출력.
규모가 큰 테이블에 유용.
9. LIKE
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern ;
--example
SELECT * FROM Websites
WHERE name LIKE 'G%';
특정 문자열 검색 (패턴 검색). WHERE와 함께 사용
- % : 0문자 이상의 임의의 문자열
- _ : 임의의 문자
| LIKE 연산자 | 설명 |
| WHERE ~ LIKE 'a%' | a로 시작 |
| WHERE ~ LIKE '%a' | a로 끝 |
| WHERE ~ LIKE '%a%' | a가 어디든 존재 |
| WHERE ~ LIKE '_a%' | a가 두번째 위치에 존재 |
| WHERE ~ LIKE 'a_%_%' | a로 시작하고 최소 3글자 |
| WHERE ~ LIKE 'a%b' | a로 시작하여 b로 끝남 |
| WHERE ~ LIKE '_o_gle' | google과 같이 _o_gle 꼴에 맞는 것 |
10. REQEXP & NOT REGEXP
SELECT * FROM table_name
WHERE column_name REGEXP '[문자열]'
정규표현식을 사용. (RLIKE나 NOT RLIKE을 사용하기도 함)
사용법은 아래 예시 참조



11. Wildcards
문자열에서 하나 이상의 문자를 대체하는데 사용.
WHERE 절에서 LIKE와 함께 사용됨.
| MS Access | 설명 | 예시 | 결과 |
| * | 0개 이상의 문자 | bl* | bl, blah, black, ... |
| ? | 하나의 문자 | h?t | hat, hot, hit, ... |
| [] | 괄호 안의 문자 | h[oa]t | hat, hot |
| ! | 괄호 안을 제외한 문자 | h[!oa]t | hit, het, hut, ... |
| - | 문자 범위 | h[a-b]t | hat, hbt |
| # | 하나의 숫자 | 1#3 | 113, 123, 133, ... |
| SQL | 설명 | 예시 | 결과 |
| % | 0개 이상의 문자 | bl% | bl, blah, black, ... |
| _ | 하나의 문자 | h_t | hat, hot, hit, ... |
| [] | 괄호 안의 문자 | h[oa]t | hot, hat |
| ^ | 괄호 안을 제외한 문자 | h[^oa]t | hit, het, hut, .... |
| - | 문자 범위 | h[a-b]t | hat, hbt |
12. IN & NOT IN
SELECT column_name FROM table_name WHERE column_name IN (value_1, value_2, ...);
SELECT column_name FROM table_name WHERE column_name IN (SELECT STATEMENT)
SELECT column_name FROM table_name WHERE column_name NOT IN (value_1, value_2, ...);
SELECT column_name FROM table_name WHERE column_name NOT IN (SELECT STATEMENT);
WHERE 절에서 값을 지정. (OR 조건)
| 연산자 | 설명 |
| = | 같다 |
| <> | 같지 않다 (=!를 사용하는 버전도 있음) |
| > | 크다 |
| < | 작다 |
| >= | 크거나 같다 |
| <= | 작거나 같다 |
| BETWEEN | 특정 범위 내의 값 |
| LIKE | 패턴 검색 (부분일치) |
| IN | IN 괄호 안에 있는 값을 가진 ROW만 출력 |

13. BETWEEN
SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
value1와 value2 사이의 값 검색.
값은 숫자, 문자, 날짜일 수 있음.

14. ALIAS
--column
SELECT column_name AS alias_name
FROM table_name;
--table
SELECT column_name(s)
FROM table_name AS alias_name;
열이나 테이블에 별칭을 지정.
별칭은 쿼리 기간 동안에만 유효.




15. JOIN
--INNER JOIN - 1
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name ;
--INNER JOIN - 2
SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name = table2.column_name ;
--LEFT JOIN - 1
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name ;
--LEFT JOIN - 2
SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name = table2.column_name ;
--RIGHT JOIN - 1
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name ;
--RIGHT JOIN - 2
SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name = table2.column_name ;
--FULL JOIN
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name ;
여러 테이블을 결합하는 방식.
대응 되는 값이 없는 경우에는 NULL로 표시




16. UNION
--UNION
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2 ;
--UNION ALL
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2 ;
여러 SELECT 문의 결과 집합을 결합.
UNION 중복되는 값들은 제외.
UNION ALL은 중복 허용

17. SELECT INTO
SELECT *
INTO newtable [IN externaldb ]
FROM table1;
SELECT column_name(s)
INTO newtable [IN externaldb ]
FROM table1;
--example
SELECT *
INTO WebsitesBackup2016
FROM Websites;
SELECT *
INTO WebsitesBackup2016 IN 'Backup.mdb'
FROM Websites;
SELECT name, url
INTO WebsitesBackup2016
FROM Websites;
SELECT Websites.name, access_log.count, access_log.date
INTO WebsitesBackup2016
FROM Websites
LEFT JOIN access_log
ON Websites.id=access_log.site_id;
다른 테이블을 테이블에 추가.
IN을 사용하면 외부 db로부터 불러올 수 있음.
18. INSERT INTO SELECT
INSERT INTO table2
SELECT * FROM table1;
INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;
데이터베이스에 새로운 데이터를 삽입.
19. CREATE DB
CREATE DATABASE dbname ;
데이터베이스 생성
20. CREATE TABLE
CREATE TABLE table_name
(
column_name1 data_type ( size ),
column_name2 data_type ( size ),
column_name3 data_type ( size ),
....
);
--example
CREATE TABLE Persons
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
행과 열로 이루어져있는 테이블 생성.
테이블 이름이 있어야 함.
위 example의 경우, varchar의 길이는 최대 255.
21. constraint
CREATE TABLE table_name
(
column_name1 data_type ( size ) constraint_name ,
column_name2 data_type ( size ) constraint_name ,
column_name3 data_type ( size ) constraint_name ,
....
);
데이터 무결성을 위하여 입력받는 데이터를 검사하는 규칙
CREATE 문으로 테이블을 생성하거나 ALTER 문으로 열을 추가할때 설정할 수 있음
| 제약조건(constraint) | 설명 |
| NOT NULL | NULL 값을 지정할 수 없음 |
| UNIQUE | 서로 다른 값만을 가져야 함 |
| PRIMARY KEY | NOT NULL && UNIQUE |
| FOREIGN KEY | 다른 테이블과 연결해줌 (참조하는 필드는 UNIQUE해야함) |
| CHECK | 특정 조건에 부합하는지 체크 |
| DEFAULT | 기본값 설정 |
FORIEGN KEY의 경우 참조되는 테이블이 수정 혹은 삭제될 경우를 가정할 수 있음
- ON DELETE : 값이 삭제될 경우
- ON UPDATE : 값이 수정될 경우
| 동작 | 설명 |
| CASCADE | 삭제/수정되면 같이 삭제/수정 |
| SET NULL | 삭제/수정되면 NULL로 변경 |
| NO ACTION | 삭제/수정돼도 데이터 변경하지 않음 |
| SET DEFAULT | 삭제/수정되면 필드의 기본값으로 설정 |
| RESTRICT | 참조하는 테이블에 데이터가 남아있으면 원 테이블 삭제/수정 불가 |
22. NOT NULL
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
21 참조
23. UNIQUE
--mySQL
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (P_Id)
)
--SQL Server, Oracle, MS Access
CREATE TABLE Persons
(
P_Id int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
--MySQL, SQL Server, Oracle, MS Access
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
)
21 참조.
24. PRIMARY KEY
--MySQL
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)
--SQL Server, Oracle, MS Access
CREATE TABLE Persons
(
P_Id int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
--MySQL, SQL Server, Oracle, MS Access
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
)
21 참조
25. FOREIGN KEY
--MySQL
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
)
--SQL Server, Oracle, MS Access
CREATE TABLE Orders
(
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
P_Id int FOREIGN KEY REFERENCES Persons(P_Id)
)
--MySQL, SQL Server, Oracle, MS Access
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
)
21 참조
26. CHECK
--MySQL
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (P_Id>0)
)
--SQL Server, Oracle, MS Access
CREATE TABLE Persons
(
P_Id int NOT NULL CHECK (P_Id>0),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
--MySQL, SQL Server, Oracle, MS Access:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
)
21 참조
27. DEFAULT
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
OrderDate date DEFAULT GETDATE()
)
함수 사용 가능.
21 참조.
28. CREATE INDEX
CREATE INDEX index_name
ON table_name (column_name)
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
인덱스 키를 만든다
29. DROP
--MS Access
DROP INDEX index_name ON table_name
--MS SQL Server
DROP INDEX table_name.index_name
--DB2, Oracle
DROP INDEX index_name
--MySQL
ALTER TABLE table_name DROP INDEX index_name
테이블 삭제
30. ALTER
--열 더하기
ALTER TABLE table_name
ADD column_name datatype
--열 삭제하기
ALTER TABLE table_name
DROP COLUMN column_name
-- 데이터 형 바꾸기 (SQL Server, MS Access)
ALTER TABLE table_name
ALTER COLUMN column_name datatype
-- 데이터형 바꾸기 (My SQL, Oracle)
ALTER TABLE table_name
MODIFY COLUMN column_name datatype
테이블 수정.
31. Auto Increment
--MySQL
CREATE TABLE Persons
(
ID int NOT NULL AUTO_INCREMENT,
...
)
--초기값 설정(MySQL)
ALTER TABLE Persons AUTO_INCREMENT=100
--자동으로 unique value 넣기 (MySQL)
INSERT INTO Persons (FirstName,LastName)
VALUES ('Lars','Monsen')
자동으로 값 설정
32. view
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
--update
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
--revocation
DROP VIEW view_name
뷰는 가상 테이블.
보안과 사용자 편의성을 옾이기 위해 사용한다고 함.
SQL을 간소화 시킬 수 있고, 복잡한 SQL을 편리하게 재생성할 수 있음.
33. date
| MySQL | DATE | YYYY-MM-DD |
| DATETIME | YYYY-MM-DD HH: MM: SS | |
| TIMESTRAP | YYYY-MM-DD HH: MM: SS | |
| YEAR | YYYY or YY | |
| SQL Server | DATE | YYYY-MM-DD |
| DATETIME | YYYY-MM-DD HH: MM: SS | |
| SMALLDATETIME | YYYY-MM-DD HH: MM: SS | |
| TIMESTRAP | The only digital |
34. IS NULL & IS NOT NULL
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL
35. data types
| TYPE | 바이트 | 속성 | |
| CHAR | CHAR(n) | 정확히 n (<=255 = 2^8 - 1) | 무조건 n 바이트 |
| VARCHAR(n) | 최대 n (<=65535 = 2^16 - 1) | 사용량에 따라 다름 | |
| BINARY | BINARY(n) / BYTE(n) | 정확히 n (<=255 = 2^8 - 1) | CHAR 이지만 바이너리 |
| VARBINARY(n) | 최대 n (<=65535 = 2^16 - 1) | VARCHAR이지만 바이너리 | |
| TEXT | TINYTEXT(n) | 최대 n (<=255 = 2^8 - 1) | 문자열 |
| TEXT(n) | 최대 n (<=65535 = 2^16 - 1) | ||
| MEDIUMTEXT(n) | 최대 n (<=16777215 = 2^24 - 1) | ||
| LONGTEXT(n) | 최대 n (<=4294967295 = 2^32 - 1) | ||
| BLOB | TINYBLOB(n) | 최대 n (<=255 = 2^8 - 1) | 바이너리 |
| BLOB(n) | 최대 n (<=65535 = 2^16 - 1) | ||
| MEDIUMBLOB(n) | 최대 n (<=16777215 = 2^24 - 1) | ||
| LONGBLOB(n) | 최대 n (<=4294967295 = 2^32 - 1) | ||
| TYPE | 크기 | 최솟값(signed) | 최솟값(unsigned) | 최댓값(signed) | 최댓값(unsigned) |
| TINYINT | 1 | -128 | 0 | 127 | 255 |
| SMALLINT | 2 | -32768 | 0 | 32767 | 65535 |
| MEDIUMINT | 3 | -8388608 | 0 | 8388607 | 16777215 |
| INT / INTEGER | 4 | -2147483648 | 0 | 2147483647 | 4294967295 |
| BIGINT | 8 | -9223372036854775808 | 0 | 9223372036854775807 | 18446744073709551615 |
| FLOAT | 4 | -3.40E + 45 | x | 3.40E + 45 | x |
| DOUBLE / REAL | 8 | -1.7976E + 320 | x | 1.7976E + 320 | x |
MySQL 기준.
MULTISET, XML, ARRAY 등 다양함.
http://www.w3big.com/sql/sql-datatypes-general.html