
SQL 문
데이터베이스에서 수행해야 하는 대부분의 작업이 SQL을 통해 수행
SELECT * FROM Human;
- SQL 키워드는 대소문자를 구분하지 않음 (select과 SELECT는 같음)
- 명령문의 끝을 ; 로 알림
기본 SQL 명령
- SELECT- 데이터베이스에서 데이터를 추출
- UPDATE- 데이터베이스의 데이터를 업데이트
- DELETE- 데이터베이스에서 데이터를 삭제
- INSERT INTO- 데이터베이스에 새로운 데이터를 삽입
- CREATE DATABASE- 새로운 데이터베이스를 생성
- ALTER DATABASE- 데이터베이스를 수정
- CREATE TABLE- 새 테이블을 생성
- ALTER TABLE- 테이블을 수정
- DROP TABLE- 테이블을 삭제
- CREATE INDEX- 인덱스(검색 키)를 생성
- DROP INDEX- 인덱스를 삭제
SELECT DISTINCT
고유값만 반환(중복된 데이터는 제외)
SELECT DISTINCT Country FROM Clients;
WHERE
데이터 필터링에 사용
SELECT * FROM Customers
WHERE Country='Korea';
연산자와 함께 사용 가능
SELECT * FROM Customers
WHERE CustomerID > 80;
ORDER BY
데이터를 정렬할 때 사용
SELECT * FROM Products
ORDER BY Price;
DESC
레코드를 내림차순으로 정렬 (ORDER BY 는 기본 오름차순 정렬)
SELECT * FROM Products
ORDER BY Price DESC;
여러 컬럼 기준 정렬
SELECT * FROM Customers
ORDER BY Country, CustomerName;
- "Country" 및 "CustomerName" 순서의 기준으로 정렬된 "Customers" 테이블에서 모든 고객을 선택
- Country 순으로 정렬하고 국가가 동일한 행은 CustomerName 순으로 정렬
기준별 ASC와 DESC 사용
SELECT * FROM Customers
ORDER BY Country ASC, CustomerName DESC;
- Country 기준 오름차순 정렬 후, 같은 County 들은 CustomerName기준 내림차순 정렬
NOT
SELECT * FROM Customers
WHERE NOT Country = 'Korea';
조건과 함께 사용하려면
SELECT * FROM Customers
WHERE CustomerName NOT LIKE 'Kim%';
Kim으로 시작하지 않는 고객
SELECT * FROM Customers
WHERE AGE NOT BETWEEN 1 AND 18;
18세 미만을 제외한 고객
SELECT * FROM Customers
WHERE NOT CustomerID > 50;
SELECT * FROM Customers
WHERE NOT CustomerId < 50;
INSERT INTO
삽입할 값만 데이터 입력 - 모든 열에 대한 값을 추가해야함
INSERT INTO Customers
VALUES ('SQL Kim', 'DataBase', 'Seoul', '1111', 'Korea');
삽입할 열 이름과 값을 모두 지정
INSERT INTO Customers (Name, Department, City, Code, Country)
VALUES ('SQL Kim', 'DataBase', 'Seoul', '1111', 'Korea');
특정 열과 값만 입력
INSERT INTO Customers (Name, Code, Country)
VALUES ('SQL Kim', '1111', 'Korea');
여러 행 동시 삽입
INSERT INTO Customers (Name, Department, City, Code, Country)
VALUES
('SQL Kim', 'DataBase', 'Seoul', 1111, 'Korea'),
('SQL Lee', 'DataBase', 'Suwon', 1112, 'Korea'),
('SQL Park', 'DataBase', 'Pangyo', 1113, 'Korea');
NULL
SELECT CustomerName, ContactName, Address
FROM Customers
WHERE Address IS NULL;
같은 방법으로 NOT NULL 사용가능
SELECT CustomerName, ContactName, Address
FROM Customers
WHERE Address IS NOT NULL;
UPDATE
특정 데이터를 바꿀 때
UPDATE Customers
SET ContactName = 'Alfred Schmidt', City= 'Frankfurt'
WHERE CustomerID = 1;
공통점을 가진 데이터 전체를 바꿀 때
UPDATE Customers
SET CountryCode='+82'
WHERE Country='Korea';
DELETE
특정 데이터 지우기
DELETE FROM Customers WHERE CustomerID=1;
테이블 전체 비우기
DELETE FROM Customers;
테이블 자체를 지우기
DROP TABLE Customers;
SELECT TOP
대규모 테이블에서 반환할 레코드 수를 지정하는 데 사용
SELECT TOP 3 * FROM Customers;
모든 데이터베이스 시스템이 이 SELECT TOP절을 지원하는 것은 아님.
MySQL은 LIMIT제한된 수의 레코드를 선택하는 절을 지원하지만
Oracle은 FETCH FIRST n ROWS ONLY 와 ROWNUM을 사용
LIMIT (MYSQL)
SELECT * FROM Customers
LIMIT 3;
첫 3 레코드를 선택
FETCH FIRST (ORACLE)
SELECT * FROM Customers
FETCH FIRST 3 ROWS ONLY;
첫 3 레코드를 선택
TOP PERCENT (SQL Server/MS Access)
SELECT TOP 50 PERCENT * FROM Customers;
WHERE 절 추가(MYSQL)
SELECT * FROM Customers
WHERE Country='Korea'
LIMIT 3;
WHERE 절 추가(ORACLE)
SELECT * FROM Customers
WHERE Country='Germany'
FETCH FIRST 3 ROWS ONLY;
ORDER BY 절 추가 (MYSQL)
SELECT * FROM Customers
ORDER BY CustomerName DESC
LIMIT 3;
ORDER BY 절 추가 (ORACLE)
SELECT * FROM Customers
ORDER BY CustomerName DESC
FETCH FIRST 3 ROWS ONLY;
Aggregate Functions
선택된 값들에 계산을 수행하고 단일 값을 반환하는 함수
SELECT 문의 GROUP BY 절과 함께 사용되는 경우가 많음
GROUP BY 절은 결과 집합을 값 그룹으로 분할하고 집계 함수를 사용하여 각 그룹에 대해 단일 값을 반환
많이 사용되는 functions
- MIN()- 선택한 열 내에서 가장 작은 값을 반환
- MAX()- 선택한 열 내에서 가장 큰 값을 반환
- COUNT()- 세트의 행 수를 반환
- SUM()- 숫자 열의 총합을 반환
- AVG()- 숫자 열의 평균값을 반환
집계 함수는 null 값을 무시( ' COUNT() '는 제외 )
MIN() , MAX()
SELECT MIN(Price)
FROM Products
WHERE Country='Korea';
SELECT MAX(Price)
FROM Products
WHERE Country='Korea';
Column 명 생성
SELECT MIN(Price) AS SmallestPrice
FROM Products;
GROUP BY 와 함께 사용
SELECT MIN(Price) AS SmallestPrice, CategoryID
FROM Products
GROUP BY CategoryID;
COUNT()
지정된 기준과 일치하는 row 수 반환
Products table 의 모든 row 반환
SELECT COUNT(*)
FROM Products;
ProductName이 null이 아닌 제품 수
SELECT COUNT(ProductName)
FROM Products;
WHERE 절 추가
SELECT COUNT(ProductID)
FROM Products
WHERE Price > 20;
중복 제외
DISTINCT 키워드를 사용하여 중복을 무시
지정하면 지정된 열에 대해 동일한 값을 갖는 행이 1개로 계산
SELECT COUNT(DISTINCT Price)
FROM Products;
Products 에서 몇 종류의 Price 들이 있는지
명명
AS 사용하여 이름 부여
SELECT COUNT(*) AS [Number of records]
FROM Products;
COUNT() 함수와 GROUP BY 절을 사용하여 Products 테이블의 각 범주에 대한 record 수를 반환
SELECT COUNT(*) AS [Number of records], CategoryID
FROM Products
GROUP BY CategoryID;
SUM()
SELECT SUM(Quantity)
FROM OrderDetails;
표현식이 포함된 SUM()
SUM() 함수 내부의 매개변수는 표현식도 가능
SELECT SUM(Quantity * 10)
FROM OrderDetails;
AVG()
SELECT AVG(Price)
FROM Products;
WHERE 과 함께 사용
SELECT AVG(Price)
FROM Products
WHERE CategoryID = 1;
명명과 함께 사용
SELECT AVG(Price) AS [average price]
FROM Products;
이름을 average price 로 명명
> , <
SELECT * FROM Products
WHERE price > (SELECT AVG(price) FROM Products);
GROUP BY 와 함께 사용
AVG() 함수와 GROUP BY 절을 사용하여 Products 테이블의 각 범주에 대한 평균 가격을 반환
SELECT AVG(Price) AS AveragePrice, CategoryID
FROM Products
GROUP BY CategoryID;
LIKE
- WHERE 절에서 사용되어 열에서 지정된 패턴을 검색
- LIKE 연산자와 함께 자주 사용되는 두 가지 와일드카드가 있음
- %는 0개, 1개 또는 여러 개의 문자를 나타냄
- _는 하나의 단일 문자를 나타냄
SELECT * FROM Customers
WHERE CustomerName LIKE 'a%';
한 글자 wildcard ( _ )
SELECT * FROM Customers
WHERE city LIKE 'L_nd__';
여러 글자 (공백 포함) 와일드 카드 ( % )
SELECT * FROM Customers
WHERE CustomerName LIKE 'Kim%';
[ ]
내부 문자 중 하나라도 일치하는 경우 결과를 반환
SELECT * FROM Customers
WHERE CustomerName LIKE '[bsp]%';
b,s,p 중 하나
-
[] 와일드카드 안에 문자 범위를 지정
SELECT * FROM Customers
WHERE CustomerName LIKE '[a-f]%';
와일드카드 혼압
SELECT * FROM Customers
WHERE CustomerName LIKE 'KIM%orLEE%';
SELECT * FROM Customers
WHERE CustomerName LIKE 'a__%';
a로 시작하는 3글자 이상
IN
WHERE 절에 여러 값을 지정
IN 연산자는 여러 OR 조건을 줄여서 표현한 것
SELECT * FROM Customers
WHERE Country IN ('Korea', 'Japan', 'America');
SELECT * FROM Customers
WHERE CustomerID IN (SELECT CustomerID FROM Orders);
SELECT * FROM Customers
WHERE CustomerID NOT IN (SELECT CustomerID FROM Orders);
BETWEEN
SELECT * FROM Products
WHERE Price BETWEEN 10 AND 20;
BETWEEN + IN
SELECT * FROM Products
WHERE Price BETWEEN 10 AND 20
AND CategoryID IN (1,2,3);
SELECT * FROM Products
WHERE ProductName BETWEEN 'Carnarvon Tigers' AND 'Mozzarella di Giovanni'
ORDER BY ProductName;
BETWEEN + NOT
SELECT * FROM Products
WHERE ProductName NOT BETWEEN 'Carnarvon Tigers' AND 'Mozzarella di Giovanni'
ORDER BY ProductName;
BETWEEN + DATE
SELECT * FROM Orders
WHERE OrderDate BETWEEN #07/01/1996# AND #07/31/1996#;
SELECT * FROM Orders
WHERE OrderDate BETWEEN '1996-07-01' AND '1996-07-31';
명명
AS
SELECT CustomerID AS ID
FROM Customers;
AS 생략 가능
SELECT CustomerID ID
FROM Customers;
Coloum 에 명명
SELECT CustomerID AS ID, CustomerName AS Customer
FROM Customers;
CustomerID Coloum 과 CustomerName Coloum 에 각각 한번씩 명명
두 단어 이상으로 명명
SELECT ProductName AS [Seclected Products]
FROM Products;
SELECT ProductName AS "Selected Products"
FROM Products;
Column 연결
SELECT CustomerName, Address + ', ' + PostalCode + ' ' + City + ', ' + Country AS Address
FROM Customers;
결과예시

MySQL 에선
SELECT CustomerName, CONCAT(Address,', ',PostalCode,', ',City,', ',Country) AS Address
FROM Customers;
Oracle 에선
SELECT CustomerName, (Address || ', ' || PostalCode || ' ' || City || ', ' || Country) AS Address
FROM Customers;
Table 재명명
SELECT * FROM Customers AS c;
여러 Table 재명명 후 사용
SELECT o.OrderID, o.OrderDate, c.CustomerName
FROM Customers AS c, Orders AS o
WHERE c.CustomerName='Kim Cus Tomer' AND c.CustomerID=o.CustomerID;
주로 사용하는 상황
- 쿼리에 둘 이상의 테이블이 포함될때
- 쿼리에 함수가 사용될때
- Column 이름이 길때
- 두 개 이상의 Column 을 결합해야 할 때
'[프로그래밍] DataBase' 카테고리의 다른 글
[DATABASE] ORACLE 연산자 (0) | 2024.11.11 |
---|---|
[DATABASE] ORACLE SQL (3) | 2024.11.11 |
[DataBase] SQL (0) | 2024.05.15 |
[DataBase] Table 제약조건 (0) | 2024.05.12 |
[DataBase] 무결성 (0) | 2024.05.12 |