개발공부/SQL

[SQL] 명령문

jnnjnn 2024. 4. 17. 21:54

 

스키마(schema)

데이터베이스의 구조를 정의하는 개념

테이블을 포함한다

// 스키마 생성하기
CREATE DATABASE test1;

 

SHOW

데이터베이스 목록이나 테이블 목록을 보여준다

SHOW tables;

 

테이블(Tables)

데이터를 저장하는 데 사용하는 구조적 객체

열(Column)과 행(Row)으로 구성되어 있으며 각 열은 특정 데이터 유형을 가진다

# 행(records, data, row), 열(field, attribute, column)로 이루어져 있음
# 새 테이블 만들기
CREATE TABLE test1.test
(
    id   int,
    name varchar(20)
);

 

SELECT

데이터 베이스 조회하기

# 데이터베이스명.테이블명
# * 은 전체 column 가져오기
SELECT *
FROM test1.test;

# 특정 column만 조회
# SELECT column명, column명 FROM 테이블명
# 나열한 column 순서대로 데이터 출력
SELECT CustomerName, City
FROM Customers;

 

USE

사용중인 데이터베이스(스키마) 선택하기

# 현재 사용중인 데이터베이스 선택
USE test1;
SELECT *
FROM test;
# 현재 사용중인 데이터베이스명 생략가능

# 다른 데이터베이스의 테이블은 생략 못 함
SELECT *
FROM w3schools.Customers;

 

DESCRIBE (DESC)

해당 테이블의 컬럼 조회하기

# 테이블의 컬럼들 조회
DESCRIBE Customers;
DESC Customers;

 

 

DISTINCT

중복을 제거하고 조회

-- DISTINCT : 중복 제거
SELECT DISTINCT Country
FROM Customers;

 

 

SELECT COUNT

레코드 수 구하기

-- COUNT : 레코드 수 구하는 내장 함수
SELECT COUNT(City)
FROM Customers;

 

 

WHERE

가져올 레코드의 조건문 작성

# 비교연산자 : 같다, 작다 <, 작거나 같다 <=, 크다 >, 크거나 같다 >=
# 같지 않다 !=, <>
SELECT *
FROM Customers
WHERE CustomerID = 3;

SELECT *
FROM Customers
WHERE CustomerID < 3;

SELECT *
FROM Customers
WHERE CustomerID > 89;

SELECT *
FROM Customers
WHERE CustomerID <> 1;

# 문자열 형식(대소문자 구분 없음)
SELECT *
FROM Customers
WHERE CustomerName >= 'S'; # S~Z까지

SELECT *
FROM Customers
WHERE Country = 'germany';

SELECT *
FROM Employees
WHERE BirthDate = '1968-12-08';

// 1955-01-01 이후 값 출력
SELECT *
FROM Employees
WHERE BirthDate >= '1955-01-01';

 

 

AND OR

조건문에 추가 작성

AND : 여러 조건 만족

OR : 조건 하나만 만족

# WHERE 의 조건을 () 사용해서 우선순위 결정
SELECT *
FROM Products
WHERE SupplierID = 2
  AND (CategoryID = 2
    OR Price > 20);

 

 

LIKE

해당 문자열 일부가 포함되는 데이터를 출력한다

# LIKE : 와일드카드로 조회
# 와일드카드
# _ : 한글자 아무거나
# % : 0개 이상의 글자 아무거나

SELECT *
FROM Products
WHERE ProductName LIKE 'cha__';

SELECT *
FROM Orders
WHERE OrderDate LIKE '1996-07-1_';

SELECT *
FROM Orders
WHERE OrderDate LIKE '____-07-__';

SELECT *
FROM Products
WHERE ProductName LIKE 'cha%';

SELECT *
FROM Products
WHERE ProductName LIKE '%NG';

SELECT *
FROM Products
WHERE ProductName LIKE 'S%S';

 

BETWEEN

WHERE 컬럼명 최소값 BETWEEN 최대값

최소값과 최대값 사이의 데이터를 가져온다. 이때, 최소값과 최대값도 포함한다

# 가격이 10.00 ~ 20.00 사이인 Products 출력
SELECT *
FROM Products
WHERE Price BETWEEN 10.00 AND 20.00;

 

IN

IN 다음의  조건이 하나라도 같으면 출력

SELECT *
FROM Customers
WHERE Country IN ('germany', 'uk', 'sweden', 'france');

 

 

ORDER BY

ORDER BY 컬럼명

기본값은 오름차순으로 정렬된다

내림차순은 테이블명 뒤에 DESC를 붙여주면 된다

# order by : 조회 순서 결정
# order by 컬럼명
SELECT *
FROM Products
ORDER BY ProductID;

# ASC : 오름 차순
SELECT *
FROM Products
ORDER BY Price ASC;

# DESC : 내림 차순
SELECT *
FROM Products
ORDER BY Price DESC;

# 여러 컬럼 기준
SELECT *
FROM Products
ORDER BY CategoryID, Price;

SELECT *
FROM Products
ORDER BY CategoryID ASC, Price DESC;

# 컬럼명 대신 컬럼 index
SELECT *
FROM Products
ORDER BY 4, 6;
# 4번째 column, 6번째 column 기준으로 정렬

# SELECT 에 명시한 컬럼명의 순서를 따라야 함
SELECT ProductName, CategoryID, Price, Unit
FROM Products
ORDER BY 2, 3;
# CategoryID, Price 순으로 정렬

 

 

NOT

# not : 조건을 만족하지 않으면 TRUE

SELECT *
FROM Employees
WHERE NOT BirthDate >= '1960-01-01';
# 1960년대 이전 출생자 출력

SELECT *
FROM Customers
WHERE Country NOT IN ('France', 'UK', 'Spain')
ORDER BY Country;

SELECT *
FROM Products
WHERE Price NOT BETWEEN 100 AND 200
ORDER BY Price;

# 여러 조건 사용시 괄호 잘 사용하기
SELECT *
FROM Products
WHERE NOT (CategoryID = 1
    AND Price > 50)
ORDER BY CategoryID, Price;

 

 

LIMIT

조회 결과 수를 제한한다

게시판 페이지를 나눌 때 사용한다

# 5개 출력
SELECT *
FROM Customers
LIMIT 5;
# LIMIT OFFSET, 5
# OFFSET 부터 5개

SELECT *
FROM Products
WHERE CategoryID = 3
ORDER BY Price DESC
LIMIT 0, 2;

# 5개부터 10개
SELECT *
FROM Products
ORDER BY Price
LIMIT 5, 10;

 

 

ALIAS

컬럼 또는 테이블에 별칭을 준다. 해당 쿼리에서 별칭을 반복해서 사용할 수 있으며 데이터를 불러올 때도 지정한 별칭으로 불러온다

# AS : 컬럼 (또는 테이블)에 별칭을 줌
# AS 생략가능
SELECT ProductID   AS id,
       ProductName AS name,
       Price       AS 가격
FROM Products;

 

 

CREATE

테이블 혹은 데이터베이스를 생성한다

CREATE DATABASE mydb;

# CREATE TABLE 테이블명(
#컬럼명1 컬럼타입,
#컬렴명2 컬럼타입
# )

CREATE TABLE my_table1
(
    name VARCHAR(3),
    age  INT
);

 

DROP

데이터베이스 혹은 테이블을 삭제한다

 

DROP DATABASE mydb;
DROP TABLE table99;

 

 

ALTER

 

컬럼의 이름, 자료형, 제약사항 등을 추가 변경 삭제 할 수 있다

# ALTER TABLE : 테이블 구조 변경

CREATE TABLE my_table23
(
    name VARCHAR(3),
    age  INT
);

INSERT INTO my_table23
    (name, age)
VALUES ('son', 44),
       ('lee', 33);

# 컬럼 추가

ALTER TABLE my_table23
    ADD COLUMN address VARCHAR(10) NOT NULL;

ALTER TABLE my_table23
    ADD COLUMN city VARCHAR(10);


# 컬럼 변경
# 이름변경, 자로형/제약사항 변경
ALTER TABLE my_table23
    RENAME COLUMN address to town;


# 자료형 변경
ALTER TABLE my_table23
    MODIFY COLUMN age DEC(20, 2);

ALTER TABLE my_table23
    MODIFY COLUMN name VARCHAR(30);

# 타입 변경시 주의할 점 : 데이터를 잃어버리지 않도록 해야 함
# 저장된 데이터보다 범위가 작으면 오류 발생

#제약사항 변경
ALTER TABLE my_table23
    MODIFY COLUMN name VARCHAR(20) UNIQUE;

ALTER TABLE my_table23
    MODIFY COLUMN age INT UNIQUE;

# UNIQUE 제약사항 삭제하기 (DROP INDEX)

ALTER TABLE my_table23
    DROP INDEX age;

ALTER TABLE my_table23
    DROP INDEX name;


# NOT NULL 추가
ALTER TABLE my_table23
    MODIFY COLUMN name VARCHAR(20) NOT NULL;

# NOT NULL 삭제
ALTER TABLE my_table23
    MODIFY COLUMN name VARCHAR(20) NULL;



# DEFAULT 제약사항 추가/삭제
ALTER TABLE my_table23
    MODIFY COLUMN name VARCHAR(20) DEFAULT 'anonymous';

ALTER TABLE my_table23
    ALTER COLUMN name DROP DEFAULT;




# PRIMARY KEY 추가
ALTER TABLE my_table23
    ADD PRIMARY KEY (name);

ALTER TABLE my_table23
    DROP PRIMARY KEY;
ALTER TABLE my_table23
    MODIFY COLUMN name VARCHAR(20) NULL;