[프로그래밍] DataBase

[DataBase] SQL 구문

JHVan 2024. 5. 15. 21:54

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] SQL  (0) 2024.05.15
[DataBase] Table 제약조건  (0) 2024.05.12
[DataBase] 무결성  (0) 2024.05.12
[DataBase] Key  (0) 2024.05.11
[DataBase] DataBase Table  (0) 2024.05.10