데이터베이스란?
데이터베이스(Database)는 데이터를 효율적으로 저장, 관리, 검색, 수정할 수 있도록 체계적으로 구성된 데이터의 집합체입니다. 데이터를 중복 없이 저장하고, 필요한 데이터를 빠르게 검색할 수 있도록 하는 구조와 시스템을 의미합니다. 데이터를 관리하기 위한 시스템을 데이터베이스 관리 시스템(Database Management System, DBMS)이라고 부르며, 이 시스템을 통해 데이터베이스를 관리하고 사용할 수 있습니다.
데이터베이스가 중요한 이유는?
고성능 데이터베이스는 모든 조직에 매우 중요합니다. 데이터베이스는 회사의 내부 운영을 지원하고 고객 및 공급업체와의 상호 작용을 저장합니다. 또한 관리 정보와 엔지니어링 또는 경제 모델과 같은 보다 전문화된 데이터를 보유하고 있습니다. 디지털 도서관 시스템, 여행 예약 시스템 및 재고 시스템을 예로 들 수 있습니다. 다음은 데이터베이스가 필수적인 몇 가지 이유입니다.
효율적인 확장
데이터베이스 애플리케이션은 수백만, 수십억 개 등으로 확장하여 대량의 데이터를 관리할 수 있습니다. 데이터베이스 없이는 이렇게 많은 양의 디지털 데이터를 저장할 수 없습니다.
데이터 무결성
데이터베이스에는 데이터 일관성을 유지하기 위한 기본 제공 규칙 및 조건이 있는 경우가 많습니다.
데이터 보안
데이터베이스는 모든 데이터와 관련된 개인정보 보호 및 규정 준수 요구 사항을 지원합니다. 예를 들어 데이터베이스에 액세스하려면 사용자가 로그인해야 합니다. 사용자마다 액세스 수준이 다를 수 있습니다(예: 읽기 전용).
데이터 분석
최신 소프트웨어 시스템은 데이터베이스를 사용하여 데이터를 분석합니다. 이러한 시스템은 추세와 패턴을 식별하거나 예측을 수행할 수 있습니다. 데이터 분석은 조직이 확신할 수 있는 비즈니스 의사 결정을 내리는 데 도움이 됩니다.
데이터베이스의 유형에는 어떤 것들있을까?
데이터베이스를 사용 사례, 데이터 유형 및 데이터 저장 방법에 따라 분류할 수 있습니다. 다음은 데이터베이스를 분류하는 세 가지 방법입니다.
- 문서 텍스트, 통계 또는 멀티미디어 객체와 같은 콘텐츠 기준
- 회계, 영화 또는 제조와 같은 적용 분야 기준
- 데이터베이스 구조 또는 인터페이스 유형과 같은 기술적 측면 기준
데이터베이스 모델이란?
데이터베이스 모델은 데이터베이스의 논리적 구조를 보여줍니다. 데이터를 저장, 구성 및 조작할 수 있는 방법을 결정하는 관계와 규칙을 정의합니다. 각 데이터베이스 애플리케이션은 특정 데이터 모델을 기반으로 구축됩니다. 개별 데이터베이스 모델은 기본 애플리케이션이 채택하는 광범위한 데이터 모델의 규칙과 개념을 기반으로 설계되었습니다.

데이터베이스는 어떻게 발전했을까?
가장 초기의 데이터베이스는 데이터 레코드가 순차적으로 저장된 자기 테이프였습니다. 데이터베이스는 기술의 발전과 함께 계속 발전했습니다. 이제 전용 연구 분야를 갖춘 복잡하고 성능이 뛰어난 시스템이 되었습니다. 데이터 모델이 어떻게 발전했는지 살펴보겠습니다.
계층적 데이터베이스
계층적 데이터베이스는 1970년대에 인기를 얻었습니다. 데이터 레코드를 순차적으로 저장하는 대신 트리 구조에 보관하여 두 파일 간에 상위-하위 관계를 설정했습니다. 예를 들어 가구 소매점에 대한 데이터베이스 시스템을 만들려면 침대, 침대 옆 탁자, 옷장을 하위 레코드로 사용하여 침실을 상위 레코드로 정의할 수 있습니다. 침대 레코드는 싱글 침대, 더블 침대, 퀸 침대 등과 같이 더 많은 하위 레코드를 가질 수 있습니다. 안타깝게도 계층적 데이터 모델은 구현하기가 복잡했으며 중요한 데이터 중복 없이는 여러 상위-하위 관계를 처리할 수 없었습니다.
네트워크 데이터베이스
또 다른 초기 데이터베이스인 네트워크 데이터 모델은 하나의 하위 레코드가 여러 상위 레코드를 가질 수 있도록 허용했으며 그 반대의 경우도 마찬가지입니다. 따라서 가구점의 예에서 두 개의 상위 레코드, 즉 침실과 아이방이 있다면 둘 다 하위 레코드 옷장에 연결할 수 있습니다.
관계형 데이터베이스
1980년대에 관계형 데이터베이스는 생산성, 유연성 및 더 빠른 하드웨어와의 호환성으로 인해 널리 사용되는 엔터프라이즈 모델로 부상했습니다. 관계형 데이터베이스는 레코드를 연결된 목록 대신 여러 테이블로 구성했습니다.
관계형 데이터베이스 모델에서 각 범주에는 범주 속성이 열이고 데이터 레코드가 행인 테이블이 있습니다. 예를 들어 가구 소매점을 방 및 가구와 같은 테이블 세트로 모델링할 수 있습니다. 테이블은 방 번호 및 가구 이름 열로 연결됩니다. 이 두 열 모두 프라이머리 키라고도 합니다.
방 번호 | 방 이름 |
1 | 침실 |
2 | 아이방 |
가구 이름 | 색상 |
침대 | 브라운 |
옷장 | 화이트 |
침대 옆 탁자 | 검정색 |
방 번호 | 가구 이름 |
1 | 침대 |
1 | 옷장 |
2 | 옷장 |
객체 지향 데이터베이스
객체 지향 데이터베이스는 객체 지향 프로그래밍의 출현에 대응하여 1990년대에 발전했습니다. 프로그래머와 디자이너는 데이터베이스의 데이터를 객체로 취급하기 시작했습니다. 예를 들어 색상 및 크기와 같은 의자의 속성을 의자 데이터 객체에 매핑할 수 있습니다. 이 객체는 객체 지향 데이터베이스에서 실제 의자를 가상으로 표현한 것입니다.
NoSQL 데이터베이스
SQL은 관계형 데이터베이스에서 데이터를 검색, 액세스 및 편집하는 데 사용되는 쿼리 언어입니다. NoSQL은 그 반대인, 데이터 모델링에서 테이블 형식 관계를 사용하지 않는 데이터베이스 메커니즘을 나타냅니다. NoSQL 데이터베이스는 클러스터 컴퓨팅과 분산 데이터베이스 아키텍처가 등장한 21세기 초에 만들어졌습니다. 분산 아키텍처는 여러 기본 스토리지 디바이스에 하나의 대규모 데이터베이스를 저장합니다. 이러한 배열을 수평 확장이라고 합니다. NoSQL에서 사용되는 소프트웨어 메커니즘은 고속이며, 고정 테이블 스키마에 대한 요구 사항이 없고, 중복되거나 그룹화된 데이터를 저장하는 기능 및 수평적으로 확장할 수 있는 기능입니다.
현대적 데이터베이스란 무엇입니까?
오늘날 사용되는 데이터베이스는 수직 및 수평으로 확장되도록 발전했습니다. 클라우드에 방대한 데이터를 저장하고 기계 학습 및 기타 데이터 분석을 위한 고급 소프트웨어 인터페이스를 제공할 수 있습니다.
클라우드 데이터베이스
클라우드 데이터베이스는 일반적으로 클라우드 컴퓨팅 플랫폼에서 실행됩니다. 두 가지 표준 배포 모델이 있습니다. 사용자는 클라우드에서 데이터베이스를 독립적으로 실행하거나 클라우드 데이터베이스 공급자로부터 액세스 권한을 구매할 수 있습니다. 클라우드 데이터베이스는 SQL 및 NoSQL 데이터 모델을 모두 따를 수 있습니다.
그래프 데이터베이스
그래프 데이터베이스는 서로 다른 데이터 레코드 간의 관계에 우선 순위를 지정하므로 유용합니다. 그래프 데이터베이스는 관계를 저장하고 탐색하도록 특별히 구축되었습니다. 그래프 데이터베이스는 노드와 엣지로 구성됩니다. 노드는 데이터 객체를 저장하고, 엣지는 객체 간의 관계를 저장합니다. 엣지에는 항상 시작 노드, 종료 노드, 유형 및 방향이 있습니다. 상위-하위 관계, 작업 및 소유권을 설명할 수 있습니다. 하나의 노드가 가질 수 있는 관계의 수와 종류에는 제한이 없습니다.
인 메모리 데이터베이스
대부분의 데이터베이스는 외부 저장 장치에 저장되지만 인 메모리 데이터베이스는 컴퓨터의 내부 메모리에 상주합니다. 그러나 일반적으로 컴퓨터 데이터 스토리지로도 백업됩니다. 인 메모리 데이터베이스는 디스크 데이터베이스보다 빠릅니다. 통신 네트워크 장비와 같이 응답 시간이 중요한 곳에서 자주 사용됩니다.
데이터 스토어란 무엇입니까?
데이터 스토어는 모든 기업의 대규모 데이터 리포지토리를 가리키는 광범위한 용어입니다. 조직은 파일, 문서, 동영상, 고객 데이터, 애플리케이션 데이터 및 시스템 데이터를 비롯한 모든 유형의 데이터를 생성합니다. 데이터 스토어를 사용하여 모든 데이터를 처리하고 저장하며 분석, 애플리케이션 및 데이터 기반 의사 결정에 사용합니다.
데이터베이스는 어떤 용도로 사용됩니까?
모든 업계에서는 다양한 사용 사례에 데이터베이스를 사용합니다. 다음은 일부 예입니다.
사기 탐지
그래프 데이터베이스는 ID 관리 및 사기 탐지에 도움이 됩니다. 기계 학습 알고리즘은 패턴을 찾고 사기 행위를 선제적으로 자동 감지합니다.
문서 관리
NoSQL 데이터베이스는 기사 및 계약서와 같은 문서를 저장하고 관리합니다. 또한 조직에서 문서를 쿼리하고 색인화할 수 있습니다.
게임 및 엔터테인먼트
많은 게임 및 엔터테인먼트 회사는 데이터베이스를 광범위하게 사용하여 수백만 명의 사용자에게 동시 로그인 액세스와 같은 리치 미디어 환경을 제공합니다.
컴파일러 언어
컴파일러(compiler)는 고급 언어로 작성 된 소스 코드를 저급 언어로 번역하는 프로그램을 가리킨다. 여기서 고급 언어는 사람이 이해하기 쉽도록 작성된 프로그래밍 언어로 C, C++, JAVA 등이 이에 속한다. 저급 언어는 컴퓨터 내부에서 바로 처리 가능한 프로그래밍 언어로 기계어와 어셈블리어 등이 이에 속한다.
컴파일러 언어는 컴파일러를 통해 컴파일 타임에 전체 소스 코드를 한 번에 기계어로 변환 후 실행파일을 만든다. 컴파일러 언어는 컴파일 단계와 실행 단계가 각각 분리되어 있으며, 컴파일은 단 한번만 수행한다. 실행은 실행 파일을 실행시킴으로써 할 수 있으며, 실행시에는 컴파일 과정을 거치지 않고 실행만 하면 되므로 코드 실행 속도가 빠르다. 단, 프로젝트의 규모가 클 경우 컴파일 시간이 오래 걸릴 수 있다는 단점이 있다.
컴파일러 언어의 종류
C, C++, C#, JAVA 등이 있다.
인터프리터 언어
인터프리터(interpreter)는 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램을 말한다.
인터프리터 언어는 소스 코드를 한번에 기계어로 변환하는 컴파일러와 달리, 컴파일 하지 않고 소스 코드를 한 줄씩 읽어들여 실행한다. 컴파일 하는 과정이 없기 때문에 컴파일 하는 시간은 소요되지 않으나, 인터프리터 언어는 실행파일을 별도로 생성하지 않기 때문에 실행시마다 인터프리트 과정이 반복 수행되어 실행 속도가 느리다는 단점이 있다.
인터프리터 언어의 종류
Python, Javascript, Ruby 등이 있다.
컴파일러 언어 vs 인터프리터 언어
정리하자면, 컴파일러 언어와 인터프리터 언어는 다음과 같은 차이가 있다.
컴파일러 언어인터프리터 언어
코드 실행 전, 컴파일 타임에 소스 코드 전체를 한번에 기계어로 변환 후 실행 | 코드가 실행 단계인 런타임에 코드 한 줄씩 중간 코드인 바이트코드로 변환 후 실행 |
실행 파일 생성 | 실행 파일 생성 X |
컴파일 단계와 실행 단계가 분리 | 인터프리트 단계와 실행 단계 분리 X 인터프리터는 한 줄씩 바이트코드로 변환 후 즉시 실행 |
컴파일은 한번만 수행 | 코드 실행시마다 인터프리트 과정 반복 수행 |
컴파일과 실행단계가 분리되어 있어, 실행시에는 실행만 하면 되므로 코드 실행 속도 빠름 | 인터프리트 단계와 실행 단계가 분리되어 있지 않아 반복 수행하므로 실행 속도가 느림 |
DB용어
Query(쿼리)
:질문 db에 데이터를 요구하기 위한 문장을 의미
Transaction(트랜잭션)
:DB의 기본적인 작업의 단위 조작하고 통제하는 작업의 단위.
Commit, Rollback(커밋,롤백)
:트랜잭션들을 적용할지,이전의 단계로 돌아갈지 정하는 것
Primary Key(기본키)
:Table에서 데이터를 대표하는 속성.자세한 건 이후에
Foreign Key(외래키)
:다른 Table의 기본키. 자세한 건 이후에
Normalization(정규화)
:관계형 DB에서 중요한 데이터 절약 및 관계형 DB의 관계를 구성하는 틀. 자세한 건 이후에
스키마 (schema)
데이터베이스에서 자료의 구조, 자료의 표현 방법, 자료 간의 관계를 형식 언어로 정의한 구조
DBMS가 주어진 설정에 따라 데이터베이스 스키마를 생성하며, 데이터 베이스 사용자가 자료를 저장, 조회,
삭제, 변경할 때 DBMS는 자신이 생성한 데이터베이스 스키마를 참조하여 명령을 수행한다.
스키마의 3층 구조
외부 스키마 : 프로그래머나 사용자의 입장에서 데이터베이스의 모습으로 조직의 일부분을 정의하는 것
개념 스키마 : 모든 응용 시스템과 사용자들이 필요로하는 데이터를 통합한 조직 전체의 데이터베이스 구조를 논리적으로 정의한 것
내부 스키마 : 전체 데이터베이스의 물리적 저장 형태를 기술하는 것
Table (=relation)
행과 열로 구성된 것으로 정렬된 데이터 집합의 모임
관계형 데이터베이스의 사용자 데이터를 보유하는 기본 구조
SQL에서는 CREATE TABLE 문을 이용하여 테이블을 만든다.
- Column (=attrubute=열=속성)
관계형 데이터베이스 테이블에서 특정한 단순 자료형의 일련의 데이터값과 테이블에서의 각 열을 말한다.
필드(feild)와 필드 값은 한 열이나 칼럼 사이의 교차로 조재하는 단일 항목을 특정할 때, 언급하는 것으로
Column과 혼동하지 않도록 한다.
- Row (=record=tuple=행)
관계형 데이터베이스에서 레코드 또는 튜플로 불리기도 하며, 어떤 테이블에서 단일 구조 데이터 항목을 가리킨다.
- 디그리 (Degree)
테이블이 가지고 있는 Column의 수
- 카디널리티 (Cardinality)
테이블이 가지고 있는 Row의 수
DB의 구조
DBMS를 다루는 구조
DB > Table
여러가지 DB가 존재할 수 있으며 DB내부에 여러 Table들이 존재
여러 사용자가 특정 DB의 권한을 받아 여러 Table에 대하여 해당 권한만큼을 사용할 수 있음
Table과 Table은 관계를 형성하며, 이를 위해 정규화 과정을 거치고 나눠 용량을 절약할 수있다
Sever에 DB를 두고 원격으로 Client가 접속하여 여러명이 하나의 DB를 공유할 수 있음
SQL이란
Structured Query Language의 줄인말로 DB를 다루기 위한 언어
DB와 SQL은 땔래야 땔 수 없는 존재이지만 DB == SQL은 아니다.
때문에 DB를 다룰 줄 아는것과 SQL을 다룰줄 아는 것은 깊이에서 차이가 존재한다
SQL은 생각보다 직관적인 표현으로 난이도가 쉬운편이나 깊이는 더 깊은편
앞선 DBMS를 모두가 공통적으로 SQL문법이 같으나 작은 부분에서 다르기 때문에 주의
MariaDB란?
마리아DB(MariaDB)는 오픈 소스 관계형 데이터베이스 관리 시스템(RDBMS)으로, MySQL의 포크(Fork)이다. MySQL은 오픈 소스 RDBMS로서 가장 많이 사용되는 데이터베이스 시스템 중 하나였으며, 그 인기로 인해 여러 포크 버전들이 등장하게 되었다.
MariaDB는 MySQL과 완벽하게 호환되는 데이터베이스 시스템이며, MySQL에서 사용되는 클라이언트 라이브러리와 API를 그대로 사용할 수 있다. 즉, 기존에 MySQL을 사용하던 프로젝트들이 MariaDB로 쉽게 이전할 수 있다. 또한 MariaDB는 MySQL과 마찬가지로 오픈 소스로 개발되고 있으며, 커뮤니티 기여를 통해 지속적으로 발전하고 있다.
MariaDB의 장점
1. 호환성
마리아DB는 MySQL과 완벽하게 호환되며, 기존에 MySQL을 사용하던 프로젝트들이 쉽게 이전할 수 있다. MySQL과 동일한 클라이언트 라이브러리와 API를 사용하여 기존 코드를 거의 수정하지 않고도 마리아DB로 전환할 수 있다.
2. 성능
마리아DB는 몇몇 상황에서 MySQL보다 더 빠른 성능을 제공할 수 있다. 특히, 일부 쿼리와 작업에서 최적화가 잘 이루어져 있다.
3. 보안
마리아DB는 데이터 보안을 강화하기 위해 다양한 기능을 제공한다. 예를 들어, 데이터베이스 암호화와 SSL 지원 등을 통해 보안을 강화할 수 있다.
4. 활발한 커뮤니티
마리아DB는 활발한 오픈 소스 프로젝트로서, 수많은 사용자와 개발자들이 참여하고 있다. 이로 인해 빠른 버그 수정과 새로운 기능 개발 등이 이루어진다.
5. 추가 기능
마리아DB는 MySQL보다 먼저 새로운 기능을 도입하기도 한다. 새로운 기능들이 추가되면서 사용자들은 더 많은 선택지를 가지게 되고 개발 작업이 용이해진다.
6. 오픈 소스
마리아DB는 오픈 소스로서 무료로 사용할 수 있다. 따라서 비용 절감과 라이선스 문제에 대한 걱정이 없어진다.
7. 관리 툴
MySQL과 마찬가지로 마리아DB에는 다양한 관리 툴이 존재한다. 이러한 툴을 사용하여 데이터베이스 관리와 모니터링을 용이하게 할 수 있다.
MariaDB의 단점
1. 커뮤니티 크기
MySQL과 비교하면 마리아DB의 커뮤니티 규모가 더 작을 수 있다. MySQL은 오랫동안 사용되어 왔기 때문에 많은 사용자와 개발자들이 참여하고 있으며, 다양한 문제에 대한 빠른 해결과 다양한 지원이 가능하다. 반면 마리아DB는 상대적으로 더 적은 사용자와 개발자들이 참여하고 있을 수 있어서, 특정한 문제에 대한 지원이 더 느릴 수 있다.
2. 호환성 문제
마리아DB는 일반적으로 MySQL과 완벽하게 호환되지만, 때로는 MySQL과의 완벽한 호환성을 보장하지 못할 수도 있다. 특정한 상황에서는 MySQL과의 차이점으로 인해 일부 애플리케이션 또는 쿼리들이 작동하지 않을 수 있다. 이는 대부분의 경우에는 드물지만, 기존에 MySQL을 사용하고 있는 프로젝트에서 마리아DB로 전환할 때 고려해야 할 사항 중 하나이다.
3. 지원 서비스
MySQL은 Oracle Corporation이 후원하고 있으며, 상용 라이선스와 기술 지원을 제공한다. 하지만 마리아DB는 오픈 소스 프로젝트이기 때문에 공식적인 기술 지원이 상대적으로 제한적일 수 있다. 따라서 큰 규모의 비즈니스에서는 상용 데이터베이스 솔루션을 선호하는 경우가 있다.
4. 특정 기능 부재
MySQL과 비교했을 때, 마리아DB는 일부 특정 기능들이 부재할 수 있다. 이는 미세한 차이일 수 있으며, 대부분의 경우에는 사용에 큰 문제가 없다. 하지만 특정한 기능이 반드시 필요한 경우에는 MySQL의 기능 지원을 확인해야 할 수 있다.
5. 인기와 생태계
MySQL은 옛날부터 사용되어온 기술로서 많은 사용자와 프로젝트들이 이에 의존하고 있다. 반면 마리아DB는 상대적으로 최근에 출시된 포크 버전이기 때문에, MySQL보다는 사용자와 생태계가 덜 발달해 있을 수 있다. 이는 오픈 소스 커뮤니티가 더 활발해짐에 따라서 차차 보완될 수 있는 부분이지만, 현재까지는 고려해야 할 단점으로 언급된다.
Maria 설치
설치 전 패키지 업데이트
sudo apt update
sudo apt upgrade
서버, 클라이언트 설치
# MariaDB 서버 설치
sudo apt install mariadb-server
# MariaDB 클라이언트 설치
sudo apt install mariadb-client
클라이언트 설치 시 설정에 대해 묻는데,
만약 묻지 않는다면, 아래 명령어를 수행한다.
# MariaDB secure 설정
sudo mysql_secure_installation
root 비밀번호를 입력한다.
root 접속을 위한 비밀번호를 입력하세요.
Enter current password for root (enter for none):
위에서 비밀번호를 설정했기 때문에 y해서 바꾸거나 같은 비밀번호를 적어도,
n을 하여 설정을 안 해도 무방하다.
root 비밀번호를 변경하시겠습니까?
Change the root password? [Y/n]
아래 항목들은 취향 따라 설정하면 된다.
anonymous 계정을 지우시겠습니까?
Remove anonymous users? [Y/n]
test db를 지우시겠습니까?
Remove test database and access to it? [Y/n]
바로 적용하시겠습니까?
Reload privilege tables now?
설치 되었다면 아래와 같은 문구가 나온다.
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
기본적인 mariadb 명령어
# MariaDB 활성화
systemctl enable mariadb
# MariaDB 시작
systemctl start mariadb
# MariaDB 상태 확인
systemctl status mariadb
# MariaDB 중지
sudo systemctl stop mysql
# MariaDB 재시작
sudo systemctl restart mysql
#systemctl를 못 쓰는 상황이라면 service 명령어를 사용하면 된다
sudo service mariadb start
명령어를 친 후, 비밀번호를 치면 root 계정으로 접속 가능하다.
sudo mysql -u root -p
Enter password:
DB 생성, User 추가, 권한 설정 등 명령어
# mysql DB 접속
use mysql;
# DB 만들기
CREATE DATABASE 데이터베이스명;
# DB 확인하기
SHOW DATABASES;
# DB 삭제하기
DROP DATABASE 데이터베이스명;
#사용자 생성
## 로컬접속용
CREATE USER '사용자명'@'localhost' IDENTIFIED BY '비밀번호';
## 외부접속용
CREATE USER '사용자명'@'%' IDENTIFIED BY '비밀번호';
# 사용자 확인
SELECT HOST, USER, PASSWORD FROM USER;
#사용자 삭제
## 로컬접속용
DROP USER '사용자명'@'localhost';
## 외부접속용
DROP USER '사용자명'@'%';
# 권한 부여
## 로컬접속용
GRANT ALL PRIVILEGES ON 데이터베이스명.* TO '사용자명'@'localhost';
## 외부접속용
GRANT ALL PRIVILEGES ON 데이터베이스명.* TO '사용자명'@'%';
# 갱신
FLUSH PRIVILEGES;
< SQL 기본 문법의 가닥 >
SQL(Structured Query Language)은 데이터베이스와 상호작용하기 위한 표준 언어입니다.
1. SELECT 문
SELECT 문은 데이터베이스에서 데이터를 조회할 때 사용합니다.
SELECT column1, column2, ... FROM table_name;
예시:
SELECT first_name, last_name FROM employees;
2. WHERE 절
WHERE 절은 조건에 따라 데이터를 필터링합니다.
SELECT column1, column2, ... FROM table_name WHERE condition;
예시:
SELECT first_name, last_name FROM employees WHERE department = 'Sales';
이 예시는 department가 'Sales'인 직원들의 first_name과 last_name을 조회합니다.
3. AND, OR, NOT 연산자
여러 조건을 결합할 때 사용됩니다.
예시:
SELECT first_name, last_name FROM employees WHERE department = 'Sales' AND salary > 50000;
- AND 연산자는 두 조건이 모두 참일 때만 결과를 반환합니다.
SELECT first_name, last_name FROM employees WHERE department = 'Sales' OR department = 'Marketing';
- OR 연산자는 두 조건 중 하나라도 참이면 결과를 반환합니다.
SELECT first_name, last_name FROM employees WHERE NOT department = 'Sales';
- NOT 연산자는 조건이 거짓일 때 결과를 반환합니다.
4. ORDER BY 절
ORDER BY 절은 결과를 정렬합니다.
SELECT column1, column2, ... FROM table_name ORDER BY column1 [ASC|DESC];
예시:
SELECT first_name, last_name FROM employees ORDER BY last_name ASC;
이 예시는 last_name을 오름차순(ASC)으로 정렬하여 데이터를 반환합니다.
5. INSERT 문
INSERT 문은 테이블에 새로운 행을 삽입할 때 사용합니다.
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
예시:
INSERT INTO employees (first_name, last_name, department, salary) VALUES ('John', 'Doe', 'Sales', 60000);
이 예시는 employees 테이블에 새로운 직원을 추가합니다.
6. UPDATE 문
UPDATE 문은 테이블의 데이터를 수정할 때 사용합니다.
UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;
예시:
UPDATE employees SET salary = 65000 WHERE first_name = 'John' AND last_name = 'Doe';
이 예시는 John Doe의 salary를 65000으로 업데이트합니다.
7. DELETE 문
DELETE 문은 테이블에서 데이터를 삭제할 때 사용합니다.
DELETE FROM table_name WHERE condition;
예시:
DELETE FROM employees WHERE last_name = 'Doe';
이 예시는 last_name이 'Doe'인 행을 삭제합니다.
8. CREATE TABLE 문
CREATE TABLE 문은 새로운 테이블을 생성할 때 사용합니다.
CREATE TABLE table_name ( column1 datatype, column2 datatype, ... );
예시:
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
department VARCHAR(50),
salary DECIMAL(10, 2)
);
이 예시는 employees라는 테이블을 생성하며, 각 컬럼의 데이터 타입을 정의합니다.
9. ALTER TABLE 문
ALTER TABLE 문은 기존 테이블을 수정할 때 사용합니다.
ALTER TABLE table_name
ADD column_name datatype;
예시:
ALTER TABLE employees
ADD hire_date DATE;
이 예시는 employees 테이블에 hire_date 컬럼을 추가합니다.
10. DROP TABLE 문
DROP TABLE 문은 테이블을 삭제할 때 사용합니다.
DROP TABLE table_name;
예시:
DROP TABLE employees;
이 예시는 employees 테이블을 삭제합니다.
11. JOIN 문
JOIN 문은 두 개 이상의 테이블에서 관련 데이터를 결합할 때 사용합니다.
예시:
SELECT employees.first_name, departments.department_name
FROM employees
JOIN departments ON employees.department_id = departments.department_id;
이 예시는 employees 테이블과 departments 테이블을 결합하여 각 직원의 이름과 부서 이름을 조회합니다.
고정 소수점(Fixed Point)
표현법
고정 소수점(fixed point)은 정수를 표현하는 비트와 소수를 표현하는 비트수를 미리 **고정하고** 해당 비트만을 활용하여 실수를 표현합니다.
- 처음 1비트는 sign(부호)을 나타냅니다. 양수는 0, 음수는 1입니다.
- 다음 15비트는 integer part(정수부)를 나타냅니다.
- 다음 16비트는 fractional part(소수부)를 나타냅니다.
- 그리고 정수부와 소수부의 경계를 소수점의 위치라고 생각하고 2진수로 변환된 수를 그대로 넣으면 됩니다.
- 마지막으로 남는 자리는 모두 0으로 채우면 됩니다.
fixed point, 고정 소수점
예를 들어, 10진수 7.625를 32비트 고정 소수점으로 표현해보겠습니다. 먼저 10진수 7.625를 2진수로 표현하면:
7.625 (10) =2² × 1 + 2¹ ×1 +20 ×1 +2-1 ×1 +2-2 ×0 +2-3 ×1 = 111.101(2)
⬇
32비트 고정 소수점으로 표현 방식
장단점
- 장점
고정 소수점 방식은 밑에서 다룰 부동 소수점 방식에 비해서 실수를 표현하는 방법이 단순하고, 속도가 빠르다. - 단점
이 방식은 정수부와 소수부의 자릿수가 크지 않으므로, 표현할 수 있는 범위가 매우 적다는 단점이 있다. 또한 정밀도가 낮다는 특징도 있다. 따라서 높은 정밀도가 필요없는 소규모 시스템에서만 간혹 쓰인다.
2. 부동 소수점(Floating Point)
표현법
소수점이 옮겨다니는 방식의 실수 표현법이다.
부동 소수점 표현 방식은 고정 소수점 표현 방식과 비트를 사용하는 체계가 다릅니다. 그리고 부동 소수점은 이를 표현하는 다양한 체계가 있는데, 일반적으로 가장 널리 쓰이는 표준은 IEEE 754라고 합니다. IEEE 754에 따르면 실수를 다음과 같이 부동 소수점 방식으로 표현할 수 있다.
- 2진수를 정규화(normalize) 합니다.
- 처음 1비트는 sign(부호)를 나타냅니다 (0은 양수, 1은 음수).
- 다음 8비트는 exponent(지수부)를 나타냅니다. 정규화 과정에서 얻어낸 지수에 bias를 더한 값으로 채웁니다.
- 다음 23비트는 mantissa(가수부)를 나타냅니다. 소수 부분의 값으로 채웁니다.
floating point, 부동 소수점
⬇
7.625 (10)를 부동 소수점으로 표현
2진수 변환: 111.101(2)
정규화: 1.11101(2) x 2²
Exponent: 2(10) + 127(10)(bias) = 129(10) = 10000001(2)
Mantassia: 11101(2)
장단점
- 장점
부동 소수점은 고정 소수점에 비해서 더 큰 실수를 표현할 수 있다. 예를 들어 고정 소수점은 정수 부분에 15개의 비트를 사용하는데. 이는 총 215 개의 정수를 표현할 수 있는데 이에 반해 부동 소수점의 경우에는 exponent에 8 비트를 사용합니다. 8 비트를 채울 수 있는 가장 큰 숫자는 11111111(2) 이지만, 부동 소수점 표현에서 이는 무한대의 숫자를 나타내는 특별한 수이므로 실질적으로 가장 큰 숫자는 11111110(2) 입니다. 이를 10진수로 바꾸면 254입니다. 254에는 bias 127이 더해져 있죠. 따라서 정규화 결과로 가질 수 있는 가장 큰 지수는 127(254-127)입니다. 다시 말해 32비트 부동 소수점에서 가질 수 있는 가장 큰 수의 정규화 결과는 1.xxx × 2127 와 같은 형태이다. 정규화 이전의 값을 고려했을 때 고정 소수점에 비해서 정수 자리에 훨씬 더 많은 비트를 할당할 수 있음을 알 수 있다. - 단점
실수 연산이 부정확할 수 있다는 것이 부동 소수점 표현 방식의 가장 큰 단점이다. 이는 컴퓨터 하드웨어가 가지는 본질적인 한계점 때문에 완벽하게 극복할 수는 없다. 예를 들어 십진수 0.3을 2진수로 변환하면 0.0100110011...(2) 처럼 특성 수가 무한이 반복된다.
따라서 컴퓨터가 실수 부분을 표현할 수 있는 비트수를 다 써버리게 되어 근사치로 표현되는 것이다.
날짜 시간 타입
데이터베이스에서 날짜와 시간을 저장하기 위해 사용하는 데이터 타입은 여러 가지가 있습니다. 사용하는 데이터베이스 시스템에 따라 약간의 차이가 있지만, 공통적으로 사용되는 날짜와 시간 관련 데이터 타입을 소개하겠습니다.
1. DATE
- 설명: 날짜(연, 월, 일)만 저장합니다.
- 형식: YYYY-MM-DD
- 예시: 2024-08-19
2. TIME
- 설명: 시간(시, 분, 초)만 저장합니다.
- 형식: HH:MM:SS
- 예시: 14:30:00
3. DATETIME
- 설명: 날짜와 시간(연, 월, 일, 시, 분, 초)을 함께 저장합니다.
- 형식: YYYY-MM-DD HH:MM:SS
- 예시: 2024-08-19 14:30:00
- 주의: 일부 데이터베이스에서는 초 단위 이하의 정밀도(밀리초, 마이크로초 등)를 지원하기도 합니다.
4. TIMESTAMP
- 설명: 날짜와 시간(연, 월, 일, 시, 분, 초)을 함께 저장하며, 데이터베이스의 타임존을 기반으로 저장됩니다. 주로 자동으로 현재 시각을 기록하거나 수정된 시각을 기록하는 데 사용됩니다.
- 형식: YYYY-MM-DD HH:MM:SS
- 예시: 2024-08-19 14:30:00
- 특징: 타임존 변환에 민감하며, UTC 시간으로 저장된 후 조회 시 현지 시간으로 변환됩니다.
5. YEAR
- 설명: 연도만 저장합니다.
- 형식: YYYY
- 예시: 2024
- 사용 범위: 4자리 또는 2자리 연도를 저장할 수 있으며, 2자리의 경우 00부터 99까지 사용합니다.
6. INTERVAL
- 설명: 두 날짜나 시간 사이의 기간(차이)을 저장합니다. 예를 들어, 몇 일, 몇 개월, 몇 년 등의 차이를 표현할 수 있습니다.
- 예시: INTERVAL '2' DAY, INTERVAL '3' MONTH, INTERVAL '5' YEAR
7. TIME WITH TIME ZONE
- 설명: 시간과 함께 타임존을 저장합니다.
- 형식: HH:MM:SS±TZ
- 예시: 14:30:00+09:00
8. TIMESTAMP WITH TIME ZONE
- 설명: 날짜와 시간, 그리고 타임존을 함께 저장합니다. 이를 통해 전 세계 시간대를 고려한 시간 관리를 할 수 있습니다.
- 형식: YYYY-MM-DD HH:MM:SS±TZ
- 예시: 2024-08-19 14:30:00+09:00
데이터베이스 시스템별 특이사항
- MySQL: DATETIME, DATE, TIME, TIMESTAMP, YEAR 등의 타입을 사용합니다.
- PostgreSQL: DATE, TIME, TIMESTAMP, TIMESTAMP WITH TIME ZONE, INTERVAL 등을 지원하며, 시간대 관리가 우수합니다.
- Oracle: DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE, INTERVAL 등을 사용하며, 날짜와 시간 관련 기능이 매우 강력합니다.
- SQL Server: DATE, TIME, DATETIME, DATETIME2, SMALLDATETIME, DATETIMEOFFSET 등이 있습니다.
각 데이터 타입의 선택은 저장하고자 하는 데이터의 성격, 타임존의 필요성, 그리고 해당 데이터베이스 시스템의 특성에 따라 달라질 수 있습니다.
데이터를 CRUD하는 방법
데이터베이스에서 테이블 내부의 데이터를 CRUD하는 방법에 대해 설명하겠습니다. CRUD는 Create, Read, Update, Delete의 약자로, 데이터베이스 테이블에서 데이터를 생성, 조회, 수정, 삭제하는 작업을 의미합니다. SQL(Structured Query Language)을 사용하여 이러한 작업을 수행할 수 있습니다.
1. CREATE (데이터 생성)
INSERT INTO 명령어를 사용하여 테이블에 새로운 데이터를 추가합니다.
INSERT INTO 테이블명 (열1, 열2, 열3, ...)
VALUES (값1, 값2, 값3, ...);
INSERT INTO 테이블명 (열1, 열2, 열3, ...)
VALUES (값1, 값2, 값3, ...);
예시: users 테이블에 새로운 사용자를 추가
INSERT INTO users (username, email, age)
VALUES ('john_doe', 'john@example.com', 25);
2. READ (데이터 조회)
SELECT 명령어를 사용하여 테이블에서 데이터를 조회합니다.
SELECT 열1, 열2, ...
FROM 테이블명
WHERE 조건;
예시: users 테이블에서 모든 데이터를 조회
SELECT * FROM users;
예시: 특정 조건을 만족하는 데이터를 조회 (예: 나이가 25 이상인 사용자)
SELECT username, email FROM users WHERE age >= 25;
3. UPDATE (데이터 수정)
UPDATE 명령어를 사용하여 테이블에 이미 존재하는 데이터를 수정합니다.
UPDATE 테이블명
SET 열1 = 새값1, 열2 = 새값2, ...
WHERE 조건;
예시: users 테이블에서 특정 사용자의 이메일 주소를 업데이트
UPDATE users
SET email = 'new_email@example.com'
WHERE username = 'john_doe';
4. DELETE (데이터 삭제)
DELETE FROM 명령어를 사용하여 테이블에서 데이터를 삭제합니다.
DELETE FROM 테이블명
WHERE 조건;
예시: users 테이블에서 특정 사용자를 삭제
DELETE FROM users
WHERE username = 'john_doe';
주의: WHERE 조건 없이 DELETE 명령을 사용하면 테이블의 모든 데이터가 삭제됩니다.
DELETE FROM users; -- users 테이블의 모든 데이터 삭제
CRUD 예시 테이블 구조
먼저, users라는 테이블을 다음과 같이 만든다고 가정합니다:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
이제 이 테이블에 대해 CRUD 작업을 수행할 수 있습니다:
Create: 데이터를 삽입하여 새 사용자를 추가
Read: 특정 사용자의 데이터를 조회하거나 전체 데이터를 조회
Update: 사용자의 정보를 수정
Delete: 사용자를 삭제
이러한 CRUD 작업은 대부분의 데이터베이스 관리에 필수적이며, 데이터의 상태를 관리하는 기본적인 방법입니다. SQL의 다양한 기능을 활용하여 복잡한 조건을 추가하거나 트랜잭션을 관리할 수도 있습니다.
Table을 관리하는 SQL
Data 이상의 Table 자체를 만들고 제거하고 수정할 수 있다.
이를 위해 명령어가 존재한다. 동일한 명령어로 관리하게 만들지 않은 이유는
중요한 Data를 다루는 만큼 실수와 오류를 막기, 더불어 접근을 제한하기 위해 그렇다.
Table을 관리하는 SQL : CREATE
DB 생성
- CREATE DATABASE {DB명};
- CREATE DATABASE TEST;
Table 생성
- CREATE TABLE {Table명} (속성명 속성타입 [제약조건], …,
[CONSTRAINT {제약조건}])
- CREATE TABLE DEPT (DEPTNO DECIMAL(2), DNAME VARCHAR(14),
LOC VARCHAR(13), CONSTRAINT PK_DEPT PRIMARY KEY (DEPTNO));
제약조건
: 특정 속성에 추가적으로 부여하는 조건으로 이를 충족하
지 못하면 생성되지 못하도록 걸어두는 일종의 제약으로,
오류를 줄이고 잘못된 DATA가 입력되는 경우를 없애준다.
또한, 특정 제약을 통해서 성능에 도움을 줄 수 있다.
제약조건 작성 방법
: 속성을 작성할 때 바로 뒤에 붙여 제약조건을 붙이거나 모
든 속성을 작성한 다음 ‘CONSTRAINT’문을 이용하여 제약조
건 이름과 함께 제약조건을 부여
NOT NULL
: NULL 값을 허용하지 않는 제약조건. 속성 뒤에 바로 이어서 작성한다.
CREATE TABLE TEMP (ID INT NOT NULL, NAME VARCHAR(15));
DEFAULT
: 미입력 혹은 ‘DEFAULT’를 작성하면 기본값으로 들어가는 값을
지정한다. 속성 뒤에 바로 이어서 작성한다.
CREATE TABEL TEMP (ID INT NOT NULL, NAME VARCHAR(15)
DEFAULT ‘default’);
이 둘의 경우에는 CONSTRAINT문을 이용한 추가를 할 수 없다.
UNIQUE
: 중복을 허용치 않는다. 이미 존재하는 값을 입력시 적용되지 않
도록 합니다.
CREATE TABLE TEMP (ID INT NOT NULL UNIQUE, NAME
VARCHAR(15) DEFAULT ‘default’);
/or/
CREATE TABLE TEMP (ID INT NOT NULL, NAME VARCHAR(15)
DEFAULT ‘default’, CONSTRAINT UNI_TEMP UNIQUE (ID));
CHECK
: 사전에 조건을 주어 참인 경우에만 허용한다.
CREATE TABLE TEMP (ID INT NOT NULL UNIQUE CHECK (ID>0),
NAME VARCHAR(15) DEFAULT ‘default’);
/or/
CREATE TABLE TEMP (ID INT NOT NULL UNIQUE, NAME
VARCHAR(15) DEFAULT ‘default’, CONSTRAINT TEMP_CH CHECK
(ID>0));
PRIMARY KEY(기본키)
: Table의 행(Tuple)을 유일하게 가리킬 수 있게해주는 ‘Key’를 지
정하는 제약조건. 이 Tuple이 식별되도록 기준이 되는 속성이여야
하며, 유일성과 최소성을 만족해야 한다.
CREATE TABLE TEMP (ID INT PRIMARY KEY CHECK (ID>0), NAME
VARCHAR(15) DEFAULT ‘default’);
/or/
CREATE TABLE TEMP (ID INT CHECK (ID>0), NAME VARCHAR(15)
DEFAULT ‘default’, CONSTRAINT PK_TEMP PRIMARY KEY (ID));
NOT NULL과 UNIQUE는?
: 이미 PRIMARY KEY상에 이 두 기능이 기본으로 포함되어 있다.
FOREIGN KEY(외래키)
: 다른 Table의 기본키. 해당 Table의 유일성을 유지해주지는 않으
나 Table간의 관계를 형성할 때 조건으로 사용하여 무결성을 유지
시켜 준다.
CREATE TABLE TEMP_FK (ID INT PRIMARY KEY, PID INT, FOREIGN
KEY(PID) REFERENCES TEMP(ID));
/or/
CREATE TABLE TEMP_FK (ID INT PRIMARY KEY , PID INT,
CONSTRAINT FK_TEMP FOREIGN KEY(PID) REFERENCES TEMP(ID));
관계 테이블의 기본키가 가지지 않은 값은 외래키 값으로 넣을 수
없음.
외래키 추가 조건
: 앞선 것과 같이 관계 테이블의 기본키가 가지고 있지 않은 값이
라면 넣을 수 없는 조건을 가지고 있기 때문에 관계 테이블 상에
삭제, 수정 간에 문제가 발생할 수 있음.
사라진 기존의 값
: 삭제, 수정 과정에서 외래키의 관계에 해당하는 값이 사라져 더
이상 외래키로서 역할을 수행할 수 없는 경우 4가지 제약을 걸어
둘 수 있다.
- ON DELETE [RESTRICT | CASCADE | NO ACTION | SET NULL]
- ON UPDATE [RESTRICT | CASCADE | NO ACTION | SET NULL]
- RESTRICT : 외래키의 관계에 해당하는 개체가 사라질 수 있는 경
- 우 이를 사전에 경고, 막는다.
- CASCADE : 외래키의 관계에 해당하는 개체가 사라질 경우 이와
- 관련된 외래키를 가진 데이터를 같이 변경, 삭제된다.
- NO ACTION : 문제가 발생하더라도 무시한다.
- SET NULL : 외래키의 관계에 해당하는 개체가 사라질 경우 이와
관련된 외래키를 가진 데이터를 모두 NULL로 대체한다. 이 경우
NOT NULL과 같이 사용할 수 없다.
- CREATE TABLE TEMP_FK (ID INT PRIMARY KEY, PID INT,
- CONSTRAINT FK_TEMP FOREIGN KEY(PID) REFERENCES TEMP(ID)
ON DELETE CASCADE);
Table을 관리하는 SQL : DELETE
DB 제거
- DROP DATABASE {DB명};
- DROP DATABASE TEST;
- DB를 지우고 만드는 것은 매우 주의해야한다.
TABLE 제거
- DROP TABLE {Table명};
- DROP TABLE TEST;
Table을 관리하는 SQL : CREATE/UPDATE
Table에 속성 추가
- ALTER TABLE {Table명} ADD COLUMN {Column명} {Datatype} [DEFAULT {기
본값}] [제약조건] ;
- ALTER TABLE TEMP ADD COLUMN AGE INT DEFAULT 20 CHECK (AGE>0);
: 추가된 속성에 대해서 DEFAULT를 설정하지 않는다면 모두 NULL 값으로 들
어가게 된다.
- ALTER TABLE TEMP ADD COLUMN PHONE_NUMBER VARCHAR(17) UNIQUE;
- ALTER TABLE {Table명} ADD CONSTRAINT {제약조건명} {제약조건};
- ALTER TABLE TEMP ADD CONSTRAINT UNI_PN UNIQUE(PHONE_NUMBER);
Table의 속성 제거
- ALTER TABLE {Table명} DROP COLUMN {Column명};
- ALTER TABLE TEMP DROP COLUMN AGE;
- ALTER TABLE TEMP DROP CONSTRAINT UNI_PN;
Table의 속성 변경
- ALTER TABLE {Table명} MODIFY COLUMN {Column명} {바뀔 타입} {바뀔 제약
조건};
- ALTER TABLE TEMP MODIFY COLUMN AGE INT NOT NULL;
: NOT NULL의 경우 기본 설정이 NULL이 가능한 상태이므로 ADD가 아닌
MODIFY를 사용한다.
- ALTER TABLE TEMP MODIFY COLUMN AGE INT UNSIGNED;
함수
SQL은 자주 쓰는 기능을 함수로 만들어 이를 활용할 수 있도록 설계 되어있다.
함수는 미리 설계된 기능으로 기본적인 SQL들과 섞어 사용할 수있다.
기본 내장함수와 집계함수, 사용자지정 함수로 나눌 수 있다.
기본 함수(문자)
LOWER/UPPER(대상)
: 소문자로, 대문자로 치환시켜주는 함수
SELECT LOWER(‘ABCdef’); // SELECT UPPER(‘ABCdef’);
SUBSTR(대상, OFFSET, [LIMIT])
: 부분문자열을 출력하는 함수
SELECT SUBSTR(‘123456’, 2, 4);
LEGNTH(대상)
: 문자의 길이를 출력
SELECT LEGNTH(‘123456’);
INSTR(대상, 찾는 문자열)
: 대상이 되는 문자열을 찾아 시작되는 문자의 위치값을 반환
SELECT INSTR(‘REFERENCE’, ‘E’);
LPAD/RPAD(대상, 총자리수, [채울 문자열])
: 문자를 주어진 자리수만큼 늘리며 채울 문자열을 비는 자리에채운다.
총자리수가 대상보다 짧으면 아무 적용이 되지 않으며 채울 문자열의 기본값은 ‘ ’이다.
각각 공백을 채울때 왼쪽을 채우는가, 오른쪽을 채우는가 차이다.
SELECT LPAD(‘12345’, 7, ‘A’) // SELECT RPAD(‘12345’ 7, ‘B’);
CONCAT(대상1, 대상2)
: 문자를 서로 합쳐준다.
SELECT CONCAT(‘HELLO, ‘, ‘WORLD!’);
REPLACE(‘대상’, ‘바뀌는 단어‘, ‘적용할 단어’)
: 대상에서 특정 문자를 다른 문자로 바꾼다.
SELECT REPLACE(‘123456’, ‘123’, ‘ABC’);
기본 함수(숫자)
ROUND(대상, [자리수])
: 자리수가 없다면 정수부까지 반올림한다. 자리수가 있을 경우자리수 이전에 반올림을 한다.
SELECT ROUND(3.141592, 3);
TRUNCATE(대상, 자리수)
: 자리수 이전에 버림한다. ROUND함수와 다르게 자리수가 필수이다.
SELECT TRUNCATE(3.141592, 3);
CEIL/FLOOR(대상)
: 가장 가까운 큰/작은 정수를 반환
SELECT CEIL(3.141592) // SELECT FLOOR(3.141592)
MOD(대상, 나눌 대상)
: 나머지를 계산한다.
SELECT MOD(10, 3);
ABS(대상)
: 값의 절대값을 출력
SELECT ABS(123); // SELECT ABS(-123);
RAND()
: 0 ~ 1사이의 랜덤한 값을 반환.
SELECT RAND();
기본 함수(날짜)
SYSDATE()
: SYSTEM의 현재시간을 반환한다. 트랜잭션 안에서 각각 실행된
시간을 반환한다.
NOW()
:현재 시간을 반환한다. 트랜잭션 안에서 모두 하나의 시간을 반
환한다.
UNIX_TIMESTAMP([대상])
: 대상 시간의 UNIX시간을 반환한다. 기본값은 현재시간.
FROM_UNIXTIME(대상)
: 대상 UNIX시간을 현재 날짜로 변환한다.
DATE_FORMAT(대상, 포맷)
: 시간을 출력 포맷에 맞춰 출력되도록 한다.
SELECT DATE_FORMAT(NOW(), ‘%Y%M%D’);
- Y/y : 년도 표시 각각 4자리수, 2자리수로 표현된다.
- M/m : 월 표시 각각 영문명, 2자리수로 표현된다.
- D/d : 일 표시 각각 영문명, 2자리수로 표현된다.
- H/h : 시간 표시 각각 24시간제, 12시간제로 표현된다.
- i : 분표시
- S/s : 초 표시
- T : 시분초를 모두 표시(HH:MM:SS)
- W/w : 요일 표시 각각 영문명, 인덱스(0-일요일)로 표현된다.
별칭
다음 함수에 대해서 알아보기 이전에 별칭에 대해서 알아보자.
별칭이란 해당 Column을 부르는 방법을 바꾸는 방법이다.
예를 들어, ‘SELECT ROUND(3.141592, 3);’의 출력 후 Column명은 ‘ROUND(3.141592, 3)’으로 나오지만 별칭을 이용하면 다음과같이 줄이고 가독성을 높일 수 있다.
SELECT ROUND(3.141592, 3) AS FUNC_RU;
여러 Column에 대해서도 가능하다.
SELECT ENAME AS ‘이름’, JOB AS ‘직업’ FROM EMP;
집계 함수
- 기본 함수와 다르게 각 행에 적용되는 것이 아닌 모든 행을 집계하는 용도로 사용되는 함수
- GROUP BY를 이용하여 합쳐질 행을 그룹별로 나눌 수 있습니다.
- 집계함수의 경우 WHERE절이 아닌 HAVING절을 이용하여 조건을지정해야합니다.
COUNT(대상)
: 행의 개수를 세어주는 집계함수.
SELECT COUNT(*) FROM EMP;
SUM(대상)
: 합이 가능한 속성에 한해서 이를 더해주는 집계함수.
SELECT SUM(SAL) FROM EMP;
AVG(대상)
: 평균이 가능한 속성에 한해서 이를 평균내주는 집계함수.
SELECT AVG(SAL) FROM EMP;
MIN/MAX(대상)
: 계산할 수 있는 속성에 한해서 최소값/최대값을 알려주는 집계함수
SELECT MIN(SAL) FROM EMP; // SELET MAX(SAL) FROM EMP;
STDDEV(대상)
: 계산할 수 있는 속성에 한해서 표준편차를 알려주는 집계함수
SELECT STDDEV(SAL) FROM EMP;
VARIANCE(대상)
: 계산할 수 있는 속성에 한해서 분산을 알려주는 집계함수
SELECT VARINACE(대상) FROM EMP;
GROUP BY {Column명}, …
: 집계함수를 적용할 때 그룹을 지을 행을 선택한다. 중복이 없는
- Column에 대해서는 적용할 경우 아무 기능을 얻을 수 없다.
SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO;
- ORDER BY와 같이 다중으로도 가능
SELECT DEPTNO, COMM, AVG(SAL) FROM EMP GROUP BY DEPTNO,COMM;
# GROUP BY와 비슷하지만 특정 열의 중복을 제거해주는 것으로
DISTINCT가 존재한다.
SELECT DISTINCT * FROM EMP; (모든 속성의 중복을 제거. 겹치는
부분이 없다면 작동 안할 수 있음)
SELECT DISTINCT DEPTNO FROM EMP;
HAVING {조건식}
: 집계함수의 조건을 줄 때 사용하는 식. GROUP BY 문 뒤에 붙어
작동한다. 쉽게 생각해서 전체를 대상으로 할 때는 WHERE,
GROUP 단위 혹은 집계를 기준으로 할 때 사용한다.
SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO
HAVING COUNT(DEPTNO) > 4;
SELECT DEPTNO, AVG(SAL) AS AVSAL FROM EMP
GROUP BY DEPTNO HAVING AVSAL > 2000;
SELECT DEPTNO, AVG(SAL) FROM EMP WHERE SAL > 1000
GROUP BY DEPTNO HAVING COUNT(DEPTNO) > 4;
'개발 일지 > 데이터베이스' 카테고리의 다른 글
데이터 베이스란? 2 (0) | 2024.09.06 |
---|---|
데이터 베이스 설계 (0) | 2024.09.06 |