본문 바로가기

Languages/SQL

SQL 기초

728x90

본 글은 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을 사용하기도 함)

사용법은 아래 예시 참조

name이 G, F, s로 시작하는 데이터
A와 H 사이의 무자로 시작하는 데이터
A-와 H 사이의 글자로 시작하지 않는 데이터

 

 

 

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은 중복 허용

UNION ALL과 WHERE 함께 사용

 

 

 

 

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

 

 

 

36. DB type

http://www.w3big.com/sql/sql-datatypes.html

반응형