개발공부/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;