SQL 문법 - SELECT

Mysql 설치시 제공되는 Sakila, World DB를 활용한 SELECT 예제를 진행한다.

Select : 데이터 조회하기

기본 형식

SELECT [컬럼1, 컬럼2, ...] FROM [테이블]

하나의 열을 조회

SELECT column1 FROM tablename;

하나의 열을 조회

SELECT column1 FROM tablename;

두 개 이상의 열을 조회

SELECT column1, column2 FROM tablename;

전체 열을 조회

SELECT * FROM tablename;

WHERE문

테이블에 저장된 전체 데이터를 조회하게되면 시간이 오래 걸려 출력이 늦어지게 되고, 과부하를 줄이기 위해 내가 원하는 조건의 데이터만 WHERE문을 이용하여 조회한다.

기본 형식

SELECT [컬럼1, 컬럼2, ...] FROM [테이블] WHERE [컬럼] [비교연산자] [값]

비교연산자 종류

  • 컬럼 = 조건값 : 조건값과 동일한 값을 조회

  • 컬럼 !=(<>) 조건값 : 조건값과 같지 않은 값을 조회

  • 컬럼 < 조건값 : 조건값 보다 작은 값을 조회

  • 컬럼 <= 조건값 : 조건값보다 작거나 같은 값을 조회

  • 컬럼 > 조건값 : 조건값보다 큰 값을 조회

  • 컬럼 >= 조건값 : 조건값보다 크거나 같은 값을 조회

※ 익숙한 비교 연산자 외 <>, !<, !> 만 숙지하면 된다.
※ 크기를 비교하는 연산자는 숫자에만 사용하는 것을 권장한다.

where문에서 비교 연산자 사용

= 연산자

actor 테이블에서 first_name 컬럼의 값이 michael인 데이터 조회

mysql> select * from actor where first_name = 'michael';
+----------+------------+-----------+---------------------+
| actor_id | first_name | last_name | last_update         |
+----------+------------+-----------+---------------------+
|      174 | MICHAEL    | BENING    | 2006-02-15 04:34:33 |
|      185 | MICHAEL    | BOLGER    | 2006-02-15 04:34:33 |
+----------+------------+-----------+---------------------+
2 rows in set (0.00 sec)

<>, != 연산자

language 테이블에서 name 컬럼의 값이 English가 아닌 데이터 조회

mysql> select * from language where name <> 'English';
+-------------+----------+---------------------+
| language_id | name     | last_update         |
+-------------+----------+---------------------+
|           2 | Italian  | 2006-02-15 05:02:19 |
|           3 | Japanese | 2006-02-15 05:02:19 |
|           4 | Mandarin | 2006-02-15 05:02:19 |
|           5 | French   | 2006-02-15 05:02:19 |
|           6 | German   | 2006-02-15 05:02:19 |
+-------------+----------+---------------------+
5 rows in set (0.00 sec)

> 연산자

address 테이블에서 city_id 컬럼의 값이 598보다 큰 데이터 조회

mysql> select address, district, city_id from address where city_id > 598;
+---------------------+------------+---------+
| address             | district   | city_id |
+---------------------+------------+---------+
| 346 Cam Ranh Avenue | Zhejiang   |     599 |
| 1889 Valparai Way   | Ziguinchor |     600 |
+---------------------+------------+---------+
2 rows in set (0.00 sec)

< 연산자

payment 테이블에서 payment_date 컬럼의 값이 2005-05-25 이전인 데이터 조회

mysql> select payment_id, amount, payment_date from payment where payment_date < '2005-05-25';
+------------+--------+---------------------+
| payment_id | amount | payment_date        |
+------------+--------+---------------------+
|       3504 |   2.99 | 2005-05-24 22:53:30 |
|       6003 |   6.99 | 2005-05-24 23:05:21 |
|       6440 |   4.99 | 2005-05-24 23:31:46 |
|       7274 |   1.99 | 2005-05-24 23:11:53 |
|       8987 |   4.99 | 2005-05-24 23:04:41 |
|      11032 |   3.99 | 2005-05-24 23:03:39 |
|      12377 |   2.99 | 2005-05-24 22:54:33 |
|      14728 |   0.99 | 2005-05-24 23:08:07 |
+------------+--------+---------------------+
8 rows in set (0.01 sec)

<= 연산자

payment 테이블에서 payment_id 컬럼이 5보다 작거나 같은 데이터 조회

mysql> select payment_id, amount, payment_date from payment where payment_id <= 5;
+------------+--------+---------------------+
| payment_id | amount | payment_date        |
+------------+--------+---------------------+
|          1 |   2.99 | 2005-05-25 11:30:37 |
|          2 |   0.99 | 2005-05-28 10:35:23 |
|          3 |   5.99 | 2005-06-15 00:54:12 |
|          4 |   0.99 | 2005-06-15 18:02:53 |
|          5 |   9.99 | 2005-06-15 21:08:46 |
+------------+--------+---------------------+
5 rows in set (0.00 sec)

>= 연산자

payment_id가 5보다 크거나 같은 데이터 조회


mysql> select payment_id, amount, payment_date from payment where payment_id >= 5;
+------------+--------+---------------------+
| payment_id | amount | payment_date        |
+------------+--------+---------------------+
|       5    |   9.99 | 2005-06-15 21:08:46 |
|       6    |   3.99 | 2005-06-15 23:04:20 |
|       7    |   2.99 | 2005-06-16 10:32:10 |
|       8    |   4.99 | 2005-06-16 11:01:45 |
|       9    |   1.99 | 2005-06-16 12:40:00 |
+------------+--------+---------------------+
5 rows in set (0.01 sec)

논리 연산자 종류 및 예시

AND

두 개 이상의 조건이 모두 참일 때 데이터를 조회

레벨이 1이고 성별이 남자인 회원

SELECT * FROM member WHERE mb_level = 1 AND mb_sex = 'M';

OR

두 개 이상의 조건 중 하나라도 참이면 결과가 참

레벨이 1이거나 성별이 남자인 회원

SELECT * FROM member WHERE mb_level = 1 OR mb_sex = 'M';

NOT

조건의 반대 값이 참일 때 결과를 반환

레벨이 100이 아닌 회원

SELECT * FROM member WHERE NOT mb_level = 100;

LIKE

문자열 패턴과 일치하는 데이터를 찾음

이름이 김씨인 회원 (이름에 김을 포함)

SELECT * FROM member WHERE mb_name LIKE '김%';

BETWEEN

지정된 범위 내의 데이터를 조회

회원 포인트가 3000이상 5000이하인 회원

SELECT * FROM member WHERE mb_point BETWEEN 3000 and 5000;

가입일이 11월1일 ~ 11월 30일인 회원

SELECT * FROM member WHERE regDate BETWEEN '2024-11-01' and '2024-11-30';

IN

피연산자가 값 목록에 하나라도 포함되어 있다면 데이터 조회

레벨이 1, 2, 3인 회원을 조회

SELECT * FROM member WHERE mb_level IN (1, 2, 3);

EXISTS

하위쿼리에 행이 포함되면(결과가 존재하는지) 데이터를 조회

ALL

서브쿼리에서 반환된 모든 값과 비교하여 조건을 만족하는 데이터 조회

ANY

서브쿼리에서 반환된 하나 이상의 값과 비교하여 조건을 만족하는 데이터

SOME

서브쿼리에서 반환된 하나 이상의 값과 비교하여 조건을 만족하는

※ AND, OR, IN, NOT, BETWEEN, LIKE 정도가 쿼리문 작성시 자주 사용된다.

NULL

NULL값인 컬럼 조회

SELECT * FROM member WHERE mb_addr IS NULL;

NULL 값이 아닌 컬럼 조회

SELECT * FROM member WHERE mb_addr IS NOT NULL;

※ NULL은 특정 값이 아니기때문에 WHERE mb_addr = NULL와 같이 = 연산자를 사용하지 않는다.

반응형

데이터베이스 및 테이블 생성 예제

데이터베이스명은 std이고 테이블명 student으로 생성하기로 정하고
create, insert, select, update, delete를 진행해본다.

1. 학생 디비 생성

mysql> create database stu;
Query OK, 1 row affected (0.01 sec)

2. 학생 테이블 생성

테이블명 : student

필드

컬럼명 타입 용도
std_id int primary key 학번 인덱스
std_name char(10) 학생 이름
std_dpt varchar(20) 학과
std_tel varchar(20) 연락처
std_addr varchar(20) 주소
mysql> create table student (std_id int primary key, std_name char(10), std_dpt varchar(20), std_tel varchar(20), std_addr varchar(50));
Query OK, 0 rows affected (0.02 sec)

3. 학생 데이터 입력

mysql> insert into student(std_id, std_name, std_dpt, std_tel, std_addr) values (1, "박명수", "영어영문학과", "010-5555-7878", "제주특별자치도시");
Query OK, 1 row affected (0.00 sec)

mysql> insert into student(std_id, std_name, std_tel) value (3, "한길동", "010-3333-3333");
Query OK, 1 row affected (0.00 sec)

4. 학생 데이터 여러 개 입력

INSERT INTO 테이브블명 (컬럼1, 컬럼2, ...)
VALUES (값1, 값2, ...), (값1, 값2, ...);
mysql> insert into student(std_id, std_name, std_dpt, std_tel, std_addr) values (4, "정형돈", "컴퓨터공학과", "010-1313-1414", "광주광역시"), (5, "노홍철", " 신문방송학과", "010-2222-7114", "경기도");
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

4. 학생 데이터 조회

mysql> select * from student;
+--------+----------+--------------+---------------+------------------+
| std_id | std_name | std_dpt      | std_tel       | std_addr         |
+--------+----------+--------------+---------------+------------------+
|      1 | 박명수   | 영어영문학과  | 010-5555-7878  | 제주특별자치도시  |
|      3 | 한길동   | NULL         | 010-3333-3333  | NULL             |
|      4 | 정형돈   | 컴퓨터공학과  | 010-1313-1414  | 광주광역시        |
|      5 | 노홍철   | 신문방송학과  | 010-2222-7114  | 경기도            |
+--------+----------+--------------+---------------+------------------+
4 rows in set (0.00 sec)
2 rows in set (0.00 sec)

5. 학생 테이터 수정


UPDATE 테이블명
SET 컬럼1 = 값1, 컬럼2 = 값2, ...
WHERE 조건;

mysql> update student set std_dpt = "AI학과" where std_id = 3;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from student;
+--------+----------+--------------+---------------+------------------+
| std_id | std_name | std_dpt      | std_tel       | std_addr         |
+--------+----------+--------------+---------------+------------------+
|      1 | 박명수   | 영어영문학과   | 010-5555-7878 | 제주특별자치도시 |
|      3 | 한길동   | AI학과        | 010-3333-3333 | NULL             |
|      4 | 정형돈   | 컴퓨터공학과   | 010-1313-1414 | 광주광역시       |
|      5 | 노홍철   | 신문방송학과   | 010-2222-7114 | 경기도           |
+--------+----------+--------------+---------------+------------------+
4 rows in set (0.00 sec)

6. 학생 데이터 삭제

DELETE FROM 테이블명 WHERE 조건;

mysql> delete from student where std_id = 5;
Query OK, 1 row affected (0.00 sec)

mysql> select * from student;
+--------+----------+--------------+---------------+------------------+
| std_id | std_name | std_dpt      | std_tel       | std_addr         |
+--------+----------+--------------+---------------+------------------+
|      1 | 박명수   | 영어영문학과 | 010-5555-7878 | 제주특별자치도시 |
|      3 | 한길동   | AI학과       | 010-3333-3333 | NULL             |
|      4 | 정형돈   | 컴퓨터공학과 | 010-1313-1414 | 광주광역시       |
+--------+----------+--------------+---------------+------------------+
3 rows in set (0.00 sec)

7. 학생 데이터 모두 삭제

DELETE FROM 테이블명

※ 쿼리문 작성 시 where은 필수로 넣고 최소 테이블이나 디비 백업을 해두고 작업하는 편이 좋다.

mysql> delete from student;
Query OK, 3 rows affected (0.00 sec)

mysql> select * from student;
Empty set (0.00 sec)
반응형

'MYSQL' 카테고리의 다른 글

[MYSQL][06] 외래키(Foreign Key, FK)의 참조 무결성  (0) 2024.11.25
[MYSQL][05] KEY  (0) 2024.11.24
[MYSQL][04] SELECT  (0) 2024.11.22
[MYSQL][03] CREATE : 회원 테이블 생성  (0) 2024.11.21
[MYSQL][01] 데이터베이스(DataBase, DB)-1  (1) 2024.11.19

[MYSQL][01] 데이터베이스(DataBase, DB)-1

목차

1. 데이터베이스란?

2. 데이터베이스의 역할

3. 데이터베이스의 장단점

4. 데이터베이스 관리 시스템

5. 데이터베이스의 종류

6. SQL(Structured Query Language, SQL)이란?

7. SQL문법 종류

8. 데이터베이스 생성 및 삭제

9. 테이블 생성 및 삭제

10. 데이터 삽입, 조회, 수정, 삭제

1. 데이터베이스란?

공유(Share)할 목적으로 통합(Integrate) 관리를 위해 일정한 형태로 저장(Stored)한 데이터를 데이터베이스라고 한다.

데이터베이스의 정의 : ISOS

Integrated Data(통합된 데이터) : 중복을 최소화 한 데이터
Stored Data(저장된 데이터) : 컴퓨터가 접근가능한 위치에 저장된 데이터
Operational Data(운영 데이터) : 업무수행을 위해 반드시 필요한 데이터
Shared Data(공용 데이터) : 여러 응용시스템이 공동 소유 및 유지하는 데이터

데이터베이스 시스템의 특징 : R1C3

Real Time Accessibility(실시간 접근성) : 질의에 실시간 응답 처리
Continuous Evolution(지속적인 변화) : 최신 데이터를 동적으로 유지(삽입, 삭제, 수정)
Concurrent Sharing(동시 공유) : 목적이 다른 사용자가 동시에 원하는 데이터 공유
Content Reference(내용에 의한 참조) : 주소에 의한 참조가 아닌 사용자가 요구하는(질의에 따른) 데이터 내용을 참조

2. 데이터베이스의 역할

중복데이터의 배제가 아닌 최소화하여 목적에 맞게 관리

3. 데이터베이스의 장단점

장점

  • 데이터 중복 방지
    • 데이터를 중앙에서 관리하여 중복을 최소화, 일관성 있는 데이터를 유지
  • 효율적인 저장공간 사용
    • 중복을 제거하고, 데이터를 정규화하여 저장 공간을 절약
  • 빠른 데이터 접근
    • 인덱싱, 쿼리 최적화 등을 통해 빠르고 효율적인 데이터 검색이 가능
  • 데이터 공유 용이
    • 여러 사용자나 애플리케이션이 동일한 데이터를 접근하고 수정할 수 있어 협업 및 데이터 공유가 용이
  • 데이터 무결성 보장
    • 데이터베이스 관리 시스템(DBMS)은 무결성 제약조건을 통해 데이터의 정확성, 일관성을 보장
  • 보안 강화
    • DBMS는 사용자 권한, 인증, 암호화 등의 보안 기능을 제공하여 데이터 접근을 제어하고 보호
  • 백업 및 복구 기능
    • 데이터 손실을 방지하기 위한 백업 및 복구 기능이 제공되어 안전하게 데이터를 보호

단점

  • 시스템 복잡성
    • 설계, 구축 및 관리가 복잡하여 운영을 위해서 기술의 전문성이 필요
  • 전문 인력 필요
    • 관리 및 최적화, 문제 해결 등을 위해 전문가가 필요
  • 운영 비용 증가
    • 관리 및 유지보수, 라이센스 비용 등이 발생하여 운영 비용이 증가
  • 백업 및 복구 시간
    • 대규모 데이터베이스의 백업 및 복구는 시간이 많이 걸리고, 대량의 데이터 처리로 시스템에 부담
  • 성능 문제
    • 데이터베이스가 매우 크거나 복잡해질 경우, 쿼리 성능이 저하되거나 시스템 과부하 야기
  • 보안 위험성
    • 보안이 제대로 구성되지 않으면 해킹, 데이터 유출 등의 관리 위험성

4. 데이터베이스 관리 시스템 (DataBase Management System, DBMS)

데이터의 입력, 수정, 삭제, 조회 등을 제공하는 소프트웨어

5. 데이터베이스의 종류

5-1. 계층형 데이터베이스

부모 자식관계인 트리구조

5-2. 네트워크형 데이터베이스

  • 데이터를 노드로 표현한 모델

5-3. Key-Value(키-값) 데이터베이스

  • NoSQL의 한 종류
  • 키 값을 일대일 대응
  • 데이터 중복이 발생하며 비정형데이터 저장에 유리

5-4. 관계형 데이터베이스

실무에서 가장 많이 사용하는 데이터베이스 종류

관계형 데이터베이스의 구조

  • 테이블(Table) = 릴레이션(Relation) : 행과 열의 값들의 모음, 도메인 특성에 따라 데이터를 논리적으로 그룹화
    • 행(Row), 튜플(Tuple), 레코드(Record) : 관계된 데이터의 묶음, 각 행은 기본키(Primary Key, PK)로 구분 및 식별
    • 열(Column), 필드(Field), 어트리뷰트(Attribute, 속성) : 고유한 이름과 타입이 있다.

※ 도메인(Domain) : 특정 속성(필드, 컬럼)의 허용 값의 타입과 범위

※ 도메인의 주요 특성

  • 유형제한 : 특정 데이터 타입으로 제한(숫자, 문자열, 날짜 등)
  • 범위제한 : 값의 범위를 정의
  • 형식제한 : 값의 형식을 정의(이메일, 주소, 전화번호 등)
  • 일관성보장

※ 도메인의 예시

  • 성별 필드의 도메인 : 남, 여
  • 학년 필드의 도메인 : 1,2,3,4

ERD(Entity Relationship Diagram)

테이블 간의 관계를 표현한 다이어그램

  • 논리모델 : 요구사항을 수집 및 분석해 데이터베이스의 모양을 구성
  • 물리모델 : 논리모델을 기반으로 실제 데이터를 저장할 수 있는 모델을 표현

대표적 DBMS

  • SQL Server
  • Oracle Database
  • DB2
  • PostregSQL
  • MySQL
  • SQLite

6. SQL(Structured Query Language, SQL)이란?

관계형 데이터베이스 관리시스템의 데이터를 관리하는 프로그래밍 언어

※ 구조(Structured) -> 정형화 되어 있다. -> 정형화된 데이터를 질의해서 다룬다.
※ NoSQL은 비정형 데이터를 다룬다.
※ 관계형 데이터베이스(Relational DataBase Management System, RDBMS)

7. SQL 문법의 종류

데이터 정의 언어(DDL), 데이터 조작 언어(DML), 데이터 제어 언어(DCL)

7-1. 데이터 정의 언어(Data Define Language, DDL)

데이터베이스를 정의하는 언어

  • Create : 테이블 생성
  • Alter : 테이블 수정
  • Drop : 디비 또는 테이블 삭제
  • Truncate : 테이블 초기화

7-2. 데이터 조작 언어(Data Manipulation Language, DML)

  • Select : 데이터 조회
  • Insert : 데이터 입력
  • Update : 데이터 수정
  • Delete : 데이터 삭제

7-3. 데이터 제어 언어(Data Control Language, DCL)

  • Grant : 특정 디비 사용자에게 특정 권한 부여
  • Revote : 권한 삭제
  • Commit : 트랜잭션 작업을 완료
  • Rollback : 트랜잭션 작업을 취소 및 이전상태로 복구

8. 데이터베이스 생성 및 삭제

8-1. mysql 접속

mysql -u root -p
Enter password : ******
mysql>

8-2. DDL - create : 데이터베이스 생성

mysql> create database myDatabase;
Query OK, 1 row affected(0.01 SEC)

8-3. 데이터베이스 목록 확인

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| mydatabase         |
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+
7 rows in set (0.00 sec)

8-4. 데이터베이스 사용(선택)

mysql> use myDatabase;
Database changed

8-5. 테이블 조회

mysql> show tables;
Empty set (0.00 sec)

8-6. DDL - drop : 데이터베이스 삭제

mysql> drop database myDatabase;
Query OK, 0 rows affected (0.02 sec)

9. 테이블 생성 및 삭제

9-1. 테이블 생성

mysql> create table member (col1 int, col2 VARCHAR(50), col3 DATETIME);
Query OK, 0 rows affected (0.04 sec)

9-2. 테이블 생성 확인

mysql> show tables;
+----------------------+
| Tables_in_mydatabase |
+----------------------+
| member               |
+----------------------+
1 row in set (0.00 sec)

9-3. 테이블 구조 확인

mysql> desc member;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| col1  | int         | YES  |     | NULL    |       |
| col2  | varchar(50) | YES  |     | NULL    |       |
| col3  | datetime    | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

9-4. 테이블 삭제

mysql> drop table member;
Query OK, 0 rows affected (0.01 sec)

9-5. 테이블 삭제 확인

mysql> show tables;
Empty set (0.00 sec)

10. 데이터 삽입, 조회, 수정, 삭제

10-1. 데이터 삽입

DML - insert(삽입) 기본형식

INSERT INTO 테이블이름 (열1, 열2, ...) VALUES (값1, 값2, ...);
mysql> INSERT INTO member(col1, col2, col3) VALUES (1,"col2 text", "2024-01-01");
Query OK, 1 row affected (0.01 sec)

10-2. 데이터 조회

DML - select(조회) 기본형식

mysql> select [열1, 열2, ... | * ] from 테이블명
※ 열을 콤마로 구분하여 직접 선택하거나 *를 사용하여 전체를 선택
mysql> select * from member;
+------+-----------+---------------------+
| col1 | col2      | col3                |
+------+-----------+---------------------+
|    1 | col2 text | 2024-01-01 00:00:00 |
+------+-----------+---------------------+
1 row in set (0.00 sec)

10-3. 데이터 삭제

DML - delete(삭졔) 기본 형식

DELETE FROM 테이블명 WHERE 조건;
mysql> delete from member where col1 = 1;
Query OK, 1 row affected (0.00 sec)

10-4. 데이터 조회

mysql> select * from member;
Empty set (0.00 sec)
 
반응형

+ Recent posts