Lsiron
SQL이란? 그리고 MySQL 기초 본문
SQL(Structured Query Language)은 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 정의하고 조작하기 위해 사용되는 표준 언어이다.
SQL은 데이터베이스에서 데이터를 검색, 삽입, 업데이트 및 삭제하는 데 사용된다.
SQL의 주요 용도
1. 데이터베이스 생성 및 수정: 데이터베이스와 그 안에 포함된 테이블, 인덱스, 뷰 등의 객체를 생성하고 수정한다.
2. 데이터 삽입, 업데이트, 삭제: 테이블에 데이터를 삽입하거나, 기존 데이터를 업데이트하거나, 필요 없는 데이터를 삭제한다.
3. 데이터 검색: 특정 조건에 맞는 데이터를 검색한다. SELECT 문을 사용하여 다양한 조건과 필터를 적용해 데이터를 조회할 수 있다.
4. 데이터 제어: 데이터베이스의 접근 권한을 설정하고, 트랜잭션을 관리한다.
SQL의 사용 시기
SQL과 NoSQL 데이터베이스는 각각의 특성과 장점에 따라 사용되는 용도가 다르다.
SQL 데이터베이스가 언제 사용되는지 NoSQL 데이터베이스와 비교하며 알아보자.
먼저 SQL의 사용시기 이다.
1. 데이터의 구조가 정형화되어 있고 관계형 데이터 모델이 필요한 경우.
관계형 데이터베이스는 테이블 간의 관계를 정의하고 유지하는 데 적합하다.
예: 금융 시스템, ERP 시스템, CRM 시스템 등
2. ACID(Atomicity, Consistency, Isolation, Durability) 트랜잭션이 중요한 경우.
데이터 일관성과 무결성이 중요한 경우 SQL 데이터베이스가 적합하다.
예: 은행 거래 시스템, 온라인 쇼핑몰의 결제 시스템
3. 복잡한 쿼리와 조인 작업이 필요한 경우.
SQL은 복잡한 쿼리와 여러 테이블 간의 조인 작업을 효율적으로 처리할 수 있다.
예: 복잡한 보고서 생성, 다차원 분석
4. 데이터 무결성 제약 조건이 중요한 경우.
SQL 데이터베이스는 외래 키, 고유 제약 조건, 체크 제약 조건 등 데이터 무결성을 보장하는 다양한 제약 조건을 제공한다.
예: 사용자 정보 관리 시스템, 재고 관리 시스템
다음으로 NoSQL 은 언제 사용하는지 알아보자.
1. 데이터의 구조가 유연하고 비정형 데이터가 많은 경우.
NoSQL 데이터베이스는 유연한 스키마를 제공하여 비정형 데이터나 반정형 데이터를 효율적으로 저장할 수 있다.
예: 소셜 미디어 게시물, 로그 데이터, IoT 데이터
2. 대규모의 데이터를 처리하고 확장성이 중요한 경우.
NoSQL 데이터베이스는 분산 아키텍처를 사용하여 수평 확장이 용이하다.
예: 빅데이터 분석, 실시간 데이터 스트리밍
3. 고가용성과 분산 저장이 중요한 경우.
NoSQL 데이터베이스는 여러 노드에 데이터를 분산 저장하여 고가용성을 보장한다.
예: 글로벌 사용자 기반을 가진 애플리케이션, 콘텐츠 전송 네트워크(CDN)
4. 데이터 모델이 특정한 경우. (문서형, 키-값, 열-패밀리, 그래프 등)
특정한 데이터 모델이 필요한 경우 NoSQL 데이터베이스가 적합하다.
1) 문서형 데이터베이스: JSON, BSON 형식의 문서를 저장. 예: MongoDB
2) 키-값 저장소: 키와 값의 쌍으로 데이터를 저장. 예: Redis, DynamoDB
3) 열-패밀리 저장소: 컬럼 패밀리로 데이터를 저장. 예: Cassandra, HBase
4) 그래프 데이터베이스: 노드와 엣지로 데이터를 저장. 예: Neo4j
SQL 테이블 구조
SQL 작성 규칙 (MySQL 기준)
1. 대소문자 구분 없음: SQL 키워드는 대소문자를 구분하지 않는다.
그러나 일반적으로 키워드는 대문자로, 테이블 이름과 속성은 소문자로 쓰는 것이 관례이다.
SELECT * FROM employees;
select * from employees;
2. 문장의 끝은 세미콜론(;)으로 마감: SQL 문은 세미콜론으로 끝난다.
MySQL에서는 여러 문을 한 번에 실행할 수 있기 때문에 각 문을 세미콜론으로 구분한다.
SELECT * FROM employees;
UPDATE employees SET salary = 5000 WHERE id = 1;
3. 이름: 이름에 여러 단어를 혼합하는 경우 "_" 를 이용해 구분하고 이름은 항상 의미가 잘 드러나도록 작성한다.
id INT AUTO_INCREMENT PRIMARY KEY,
4. 주석 처리: 주석은 SQL 코드 내에서 설명을 추가할 때 사용된다.
- 한 줄 주석: -- 또는 #
- 여러 줄 주석: /* */
-- This is a single-line comment
SELECT * FROM employees; # This is another single-line comment
/*
This is a
multi-line comment
*/
SELECT * FROM employees;
5. 데이터 출력 ( ★ )
1) SHOW : 데이터베이스, 테이블, 컬럼, 인덱스, 프로시저 등 다양한 메타데이터 정보를 조회하는 데 사용한다.
( 주로 데이터베이스 조회에 사용한다. )
a. 데이터베이스 목록 조회
SHOW DATABASES;
b. 특정 데이터베이스의 테이블 목록 조회
SHOW TABLES FROM database_name;
c. 테이블의 컬럼 정보 조회
SHOW COLUMNS FROM table_name;
d. 테이블의 인덱스 정보 조회
SHOW INDEX FROM table_name;
2) DESC : 특정 테이블의 구조를 설명하는 데 사용된다. 테이블의 속성, 데이터 타입, 널 허용 여부, 키 정보 등을 출력한다.
DESC table_name;
6. 데이터 정의 언어(DDL - Data Definition Language)
1) CREATE : 데이터베이스, 테이블, 인덱스 등을 생성한다.
CREATE DATABASE mydatabase;
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
name VARCHAR(100) NOT NULL,
salary DECIMAL(10, 2) NULL
);
NOT NULL 은 NULL값을 넣으면 안된다는 의미이고, NULL은 NULL값을 허용한다는 의미이다.
(NULL 은 비어있는 값을 의미한다. ) 반드시 들어가야 하는 데이터는 NOT NULL을 설정해 주어야한다.
테이블을 정의할 때 속성을 명시해야하는 데이터타입은 다음과 같이 있다.
a. VARCHAR : nBytes 크기의 가변 길이 문자열을 저장한다.
VARCHAR (M)
b. INT 또는 INTEGER : 정수형 숫자데이터(4Bytes)를 저장한다. ( 4Bytes 보다 작은건 TINYINT 큰건 BIGINT를 씀 )
INT [(M)] [UNSIGNED] [ZEROFILL]
c. FLOAT : 소수점 이하의 숫자를 저장하는 4Bytes 크기의 부동 소수점 타입이다. 정확도는 DECIMAL 이 좋지만, 많은 데이터를 다를땐 FLOAT이 좋다. 더 큰 크기의 부동 소수점 타입을 적용 시키고 싶을땐 DOUBLE 을 사용하면 된다.
FLOAT [(M,D)] [UNSIGNED] [ZEROFILL]
d. DATETIME : 날짜와 시간을 저장한다. 형식은 YYYY-MM-DD HH:MM:SS이다.
DATETIME
예제.
CREATE TABLE example (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
salary FLOAT(10, 2),
hire_date DATETIME,
);
AUTO_INCREMENT PRIMARY KEY: 이 구문은 테이블의 기본 키로 사용되며, 새로운 행이 추가될 때마다 자동으로 고유한 값을 할당한다.
2) ALTER : 테이블의 구조를 변경한다. 수정할 땐 컬럼명 데이터타입 제약조건을 모두 넣어주어야 정상작동한다.
-- 컬럼 추가: ALTER TABLE 테이블명 ADD COLUMN 속성 데이터타입 제약조건
ALTER TABLE customer ADD COLUMN birthday DATE NULL;
-- 컬럼 수정: ALTER TABLE 테이블명 MODIFY COLUMN 속성 데이터타입 제약조건
ALTER TABLE customer MODIFY COLUMN id varchar(15) NULL;
-- 컬럼 이름 변경: ALTER TABLE 테이블명 CHANGE COLUMN 기존속성 새로운속성 데이터타입 제약조건
ALTER TABLE customer CHANGE COLUMN name korean_name varchar(10) NOT NULL;
-- 컬럼 삭제: ALTER TABLE 테이블명 DROP COLUMN 속성
ALTER TABLE customer DROP COLUMN address;
-- 테이블 이름 변경: ALTER TABLE 테이블명 RENAME 새로운테이블명
ALTER TABLE customer RENAME member;
컬럼삭제는 반드시 'ALTER TABLE' 을 사용해야 한다. 테이블 삭제와 혼동 주의!
3) DROP : 데이터베이스나 테이블을 삭제한다.
DROP TABLE employees;
7. 데이터 조작 언어(DML - Data Manipulation Language)
1) SELECT : 테이블에서 데이터를 조회한다. 'SELECT 속성1, 속성2, ... FROM 테이블명;' 구조이다.
-- SELECT 속성 FROM 테이블;
SELECT name FROM customer;
-- 출력하고 싶은 속성을 여러개 넣는것도 가능하다.
SELECT address, name FROM customer;
-- "*" 을 이용해 모든 속성 출력이 가능하다.
SELECT * FROM customer;
-- SELECT 속성 FROM 테이블 WHERE 조건(보통 속성과 조건이 들어간다.)
SELECT * FROM employees WHERE salary > 3000;
현업에서 '*' 은 거의 쓰지 않는다. 또한 데이터베이스를 들어가서 '*' 을 찍는것과 같은 기능인 전체 조회도 해서는 안된다.
( 데이터 전체를 불러오는 것 이기 때문에 과금 폭탄을 맞을 수 있음. )
SELECT 문에서 기억해야 할 것은 'SELECT' , 'FROM' , 'WHERE' 이다.
일반적으로 ' SELECT 검색 할 대상 FROM 테이블 WHERE 속성과 조건 ' 으로 사용한다.
WHERE 을 사용하면 내가 원하는 데이터만 검색하기 위해 검색하고자 하는 데이터의 조건을 설정 할 수 있다.
보통 WHERE 때문에 까다로워진다; 보통 몇 이상 몇 이하 이런 조건이 자주 있는데, 이럴 때 사용하는게 비교연산자 이다.
비교연산자는 간단하게 표로 정리하면 아래와 같다.
연산자 | 연산의 예 | 의미 |
>, < | N < 10 N > 10 |
N이 10 미만 N이 10 초과 |
>= , <= | N <= 10 N >= 10 |
N이 10 이하 N이 10 이상 |
= | N = 10 | N이 10인 값 |
!= | N != 10 | N이 10이 아닌 값 |
이에 더해서 그리고, 또는, 아니다와 같이 복합조건 연산자가 있다.
복합조건 연산자는 간단하게 표로 정리하면 아래와 같다.
연산자 | 연산의 예 | 의미 |
AND, && | A AND B A && B |
A 그리고 B 를 모두 만족하는 값 |
OR, || | A OR B A || B |
A 또는 B인 값 |
NOT, ! | NOT A !A |
A 가 아닌 값 |
쿼리를 만들 때 AND, OR, NOT 처럼 문자를 사용할 것이라면 전부 문자, &&, || 처럼 기호를 사용할 것이라면 전부 기호를 사용하자. 섞어서 쓰면 보기 좋지않다.
또한 != 기호와 ! 기호를 잘 구분하자 '!=' 기호는 '~가 ~이 아닌 값' 이고 '!' 기호는 '~가 아닌 값' 이다.
마지막으로 기타 연산자가 있는데 간단하게 표로 정리하면 아래와 같다.
연산자 | 연산의 예 | 의미 |
BETWEEN | A BETWEEN 10 AND 20 | A 가 10과 20 사이에 포함된 값 |
IN | A IN B | B에 A가 포함된 값 |
NOT IN | A NOT IN B | B에 A가 포함되지 않은 값 |
A BETWEEN 10 AND 20 은 10이상 20이하를 의미한다. 잘 기억해두자. 10초과 20미만이 아니다.
BETWEEN 은 나이대와 날짜에 주로 사용한다.
A IN B 와, A NOT IN B 에서 A가 속성이다 헷갈리지 말자.
( B는 A IN (tuple1, tuple2, tuple3) 등으로 괄호를 씌워서 여러개를 쓸 수 있다. )
a. LIKE : 특정 문자가 포함된 문자열을 찾고 싶을 때 사용하는 명령어 이다.
( 특정조건과 일치하는 값을 찾을 때 주로 사용한다. ex) 1997-12-09에 태어난 사람을 조회 해보시오. )
-- SELECT 검색할 속성 FROM 테이블 WHERE 조건속성 LIKE '검색할 단어';
-- customers 테이블에서 address 가 '서울특별시' 인 주소 검색
SELECT * FROM customers WHERE address LIKE '서울특별시';
-- SELECT 검색할 속성 FROM 테이블 WHERE 조건속성 LIKE '%검색할 단어';
-- customers 테이블에서 address 가 '특별시'로 끝나는 주소 검색
SELECT * FROM customers WHERE address LIKE '%특별시';
-- SELECT 검색할 속성 FROM 테이블 WHERE 조건속성 LIKE '검색할 단어%';
-- customers 테이블에서 address 가 '서울'로 시작하는 주소 검색
SELECT * FROM customers WHERE address LIKE '서울%';
-- SELECT 검색할 속성 FROM 테이블 WHERE 조건속성 LIKE '%검색할 단어%';
-- customers 테이블에서 address 가 '특별'을 포함하는 주소 검색
SELECT * FROM customers WHERE address LIKE '%특별%';
% 는 보통 '와일드 카드' 라고 말한다.
b. ORDER BY : 데이터를 검색할 때 정렬하여 결과를 출력하는 명령어 이다.
( 문자와 숫자 둘 다 정렬가능하다. )
-- SELECT 검색할 속성 FROM 테이블 ORDER BY 조건컬럼 DESC;
-- score 테이블에서 math컬럼의 값이 높은 데이터부터 정렬하여 검색(내림차순)
SELECT * FROM score ORDER BY math DESC;
-- SELECT 검색할 속성 FROM 테이블 ORDER BY 조건컬럼 ASC;
-- score 테이블에서 math컬럼의 값이 낮은 데이터부터 정렬하여 검색(오름차순)
SELECT * FROM score ORDER BY math ASC;
내림차순으로 사용한 DESC는 테이블을 조회 할 때 사용한 DESC 명령어와 기능이 다르다.
c. DISTINCT : 뒤에 나오는 컬럼의 중복을 제거하고 보여준다.
-- 만약 music 테이블에 가수 목록을 담은 singer와 노래 목록을 담은 song column이 있을 때
-- A라는 노래를 B라는 가수와 C라는 가수가 불렀다고 가정 해보자.
+-------+--------+
| music |
+-------+--------+
| song | singer |
+-------+--------+
| A | B |
| A | C |
+-------+--------+
SELECT DISTINCT song FROM music;
-- 결과는 A 를 출력한다 (중복X)
+-------+
| song |
+-------+
| A |
+-------+
-- DISTINCT 뒤에 2개 이상의 속성을 적으면,
-- 한 쪽 column에 중복이 있어도 다른 쪽 속성의 값이 다르면 다르게 취급한다.
SELECT DISTINCT song, singer FROM music;
-- 결과는 A-B , A-C 를 출력한다.
+-------+--------+
| song | singer |
+-------+--------+
| A | B |
| A | C |
+-------+--------+
2) INSERT : 테이블에 데이터를 삽입한다.
'INSERT INTO 테이블명 (속성1, 속성2, ...) VALUES(속성값1, 속성값2, ...);` 구조이다.
속성값을 넣지 않는 경우, default 값인 NULL이 삽입된다.
( 단, 한 테이블 속성의 속성값들 데이터 타입이 일치하지 않을 경우, 에러가 날 수 있기 때문에 문자열을 넣기로 했으면 문자열만 숫자만 넣기로 했으면 숫자만 넣는것이 좋다. )
-- INSERT INTO 테이블 (속성1, 속성2, 속성3..)
-- VALUES (속성값1, 속성값2, 속성값3..);
INSERT INTO employees (name, salary)
VALUES ('John Doe', 4000);
-- 속성의 순서는 중요하지 않다.
INSERT INTO employees (salary, name)
VALUES (4000, 'John Doe');
-- 모든 속성을 순서대로 입력하는 경우 속성 목록은 생략 가능하다.
INSERT INTO employees
VALUES ('John Doe', 4000);
3) UPDATE: 테이블에서 이미 저장된 값을 수정하는 명령어 이다 .
-- UPDATE 테이블 SET 변경할 값(변경할 속성 = 변경할 속성값) WHERE 조건(속성 = 속성값);
-- employees 테이블에서 이름이 'John Doe' 인 노동자의 임금을 4500으로 변경한다.
UPDATE employees SET salary = 4500 WHERE name = 'John Doe';
4) DELETE: 테이블에서 이미 저장된 값을 삭제하는 명령어 이다.
-- DELETE FROM 테이블 WHERE 조건 (속성 = 속성값);
-- employees 테이블에서 이름이 John Doe 인 노동자의 데이터를 삭제한다.
DELETE FROM employees WHERE name = 'John Doe';
8. 데이터 제어 언어(DCL - Data Control Language)
1) GRANT : 사용자에게 권한을 부여한다.
GRANT SELECT, INSERT ON mydatabase.employees TO 'user'@'localhost';
2) REVOKE : 사용자에게 부여된 권한을 회수한다.
REVOKE INSERT ON mydatabase.employees FROM 'user'@'localhost';
9. 트랜잭션 제어 언어(TCL - Transaction Control Language)
1) COMMIT : 트랜잭션의 변경 사항을 저장한다.
COMMIT;
2) ROLLBACK : 트랜잭션의 변경 사항을 취소한다.
ROLLBACK;
'데이터베이스 > MySQL' 카테고리의 다른 글
집계함수와 제어키워드 (0) | 2024.07.10 |
---|---|
구글 클라우드를 통한 MySQL 배포하기 (0) | 2024.07.09 |
정규화와 역정규화 그리고 이상현상, 함수의 종속성 (2) | 2024.07.09 |
데이터 모델링이란? (0) | 2024.07.09 |
제약 조건과 키 (0) | 2024.07.09 |