MySQL

현서·2025년 4월 29일

백엔드

목록 보기
9/18
post-thumbnail

1. 데이터(Data)

  • 숫자, 문자, 기호의 집합
  • 컴퓨터 또는 디지털 장치에서 처리하고 저장할 수 있는 형태

2. 데이터베이스(DataBase)

  • 체계적으로 구성된 데이터의 집합. 특정 목적을 위해 조직화되고 관리
  • 정보를 효율적으로 저장, 검색, 업데이트, 관리할 수 있는 기술적인 도구와 구조를 제공
  • 데이터베이스 관리 시스템(DataBase Management Sysyem, DBMS):
    데이터베이스를 관리할 수 있는 기술적인 소프트웨어

3. 관계형 데이터베이스 시스템(Relational DBMS)

  • SQL(Structured Query Language): 관계형 데이터베이스에서 데이터를 정의하고 조작하기 위한 언어
  • 데이터를 테이블(표) 형식으로 관리하고, 각 테이블 간의 관계를 설정하여 데이터를 효율적으로 저장하고 검색하는 데이터베이스 관리 시스템의 한 종류

4. SQL의 특징

  • 대소문자를 구별하지 않음
  • 문자열을 사용할 때 ''(작은 따옴표)만 사용
  • 주석문 -- 또는 /* */

DB-engines

MySQL

MySQL 설치
설치는 full -> next 계속 누르고 -> use legacy 선택했다.
비밀번호는 기억하기 쉬운 것으로 지정했다.

왼쪽 하단에 있는 Schemas 클릭

# 데이터베이스 확인하기
show databases;
# 데이터베이스 생성하기
create database nodejs;


왼쪽 Navigator 창에 nodejs라는 database가 생성된 것을 확인할 수 있다.

  • 테이블 : 데이터를 행(로우, 레코드)과 열(컬럼, 필드)로 스키마에 따라 저장할 수 있는 구조

  • 스키마 : 데이터베이스의 구조와 제약조건에 관한 명세를 기술한 집합

    create table 테이블명 (
		필드명1 데이터타입 제약조건, 
        필드명2 데이터타입 제약조건,
        ...
    )

참조 (wikidocs)

❇️ 데이터 타입

  1. 숫자형
    정수: TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
    실수: FLOAT, DOUBLE, DECIMAL
  2. 문자형
    CHAR, VARCHAR(최대 65535byte), BINARY, VARBINARY, TEXT
  3. 날짜형
    DATE, TIME, DATETIME, TIMESTAMP, YEAR

❇️ 제약 조건

데이터의 무결성을 지키기 위해 데이터를 입력받을 때 실행되는 검사

규칙
1. not null: null 값을 허용하지 않음
2. unique: 중복값을 허용하지 않음. null 값을 허용
3. default: null값을 삽입할 때 기본이 되는 값을 설정함
4. primary key:
- null 값을 허용하지 않음.
- 중복값을 허용하지 않음
- 테이블에 단 하나만 설정
- 참조키와 쌍으로 연결
- 인덱싱을 설정
5. foreign key: 기본키와 쌍으로 연결

# 데이터베이스 선택하기
use nodejs;
# 테이블 만들기
create table member (
	idx int auto_increment primary key,
    userid varchar(20) unique not null,
    userpw varchar(20) not null,
    name varchar(20) not null,
    hp varchar(20) not null,
    email varchar(50) not null,
    gender varchar(10) not null,
    ssn1 char(6) not null,
    ssn2 char(7) not null,
    zipcode char(5),
    address1 varchar(100),
    address2 varchar(100),
    address3 varchar(100),
    regdate datetime default now(),
    point int default 1000
);
# 테이블 확인하기
desc member;
# 테이블 삭제하기
drop table member;

✨ 필드(field)
데이터베이스 테이블에서 열(column)을 의미한다.
하나의 테이블은 여러 개의 필드로 구성되며, 각 필드는 특정한 데이터 유형과 이름을 가지고 있다.

ex) 학생 테이블

학번 (student_id)이름 (name)나이 (age)전공 (major)
1001홍길동21컴퓨터공학
1002김영희22경영학

여기서 학번, 이름, 나이, 전공이 각각의 필드(field)이다.

✨ 필드의 주요 특징

  • 이름(Name): 각 필드는 고유한 이름을 가짐
    (예: student_id, name)

  • 데이터 형(Data Type): 각 필드는 어떤 종류의 데이터를 저장할지 지정
    (예: INT, VARCHAR, DATE 등)

  • 제약 조건(Constraints): NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY 등을 통해 필드에 제약을 걸 수 있음

# 필드 삭제하기
alter table member drop point;
# 필드 추가하기
alter table member add point int default 1000;
# 필드 수정하기
alter table member modify column point int default 100;

CRUD(Create Read Update Delete)

❇️ 데이터 삽입(insert)
1. insert into 테이블명 values (값1, 값2, 값3 ...)
테이블의 컬럼수와 값입력 개수가 같아야 함
2. insert into 테이블명 (필드명1, 필드명2 ..) values (값1, 값2 ..)
입력 필드와 입력 값의 순서와 개수가 같아야 함

create table words (
	eng varchar(50) primary key,
    kor varchar(50) not null,
    lev int default 1,
    regdate datetime default now()
);

regdate : 등록일(등록된 날짜) 또는 생성일(created date)을 의미한다.
즉, 어떤 데이터(예: 사용자, 게시글, 주문 등)가 언제 등록되었는지를 저장하는 날짜/시간 정보이다.

desc words; # 테이블 확인
insert into words values ('apple', '사과', 1, now());
select * from words;
-- insert into words values ('apple', '사과', 1, now()); 중복 삽입 에러!
-- insert into words values ('banana', '바나나'); 테이블 전체 컬럼을 입력해야 함!
insert into words values ('banana', '바나나', null, null); -- null이 삽입 됨
select * from words;
insert into words (eng, kor, lev, regdate) values ('orange', '오렌지', 1, now());
select * from words;
insert into words (eng, kor) values ('cherry', '체리'); -- 기본값이 적용 됨
select * from words;
-- insert into words (eng) values ('avocado'); kor가 not null로 설정 됨

❇️ 데이터 삭제(delete)
1. delete from 테이블명
2. delete from 테이블명 where 조건식

select * from words;
delete from words where eng='banana';
delete from words;
-- safe 모드 해제
set sql_safe_updates = 0; -- 일시적

delete는 실수로 where 조건 없이 쓰게 되면 전체 데이터가 삭제되는 굉장히 위험한 녀석이다.
그래서 함부로 delete를 하지 못 하도록 안전장치(?)가 되어 있다고 하는데...

여기서 set sqp_safe_updates = 0을 하게 되면 delete를 할 수 있게 된다!!
하지만, 이것은 일시적이니... 껐다 켜면 적용 안 되어 있다! (다시 실행해야함.)

↑ 일시적이지 않도록 설정하는 방법
Workbench Preferences에서 Safe Updates (rejects UPDATEs and DELETEs with no restrictions) 체크를 해제하면 된다.

❇️ 데이터 수정(update)
1. update 테이블명 set 필드명1=값1, 필드명2=값2 ...
2. update 테이블명 set 필드명1=값1, 필드명2=값2 ... where 조건식

select * from words;
update words set lev=2;
update words set lev=1 where eng='apple';
insert into member (userid, userpw, name, hp, email, gender, ssn1, ssn2, zipcode, address1, address2, address3) values 
('apple', '1111', '김사과', '010-1111-1111', 'apple@apple.com', '여자', '001011' , '4068518' , '06774' , '서울 서초구 강남대로 27', 'AI센터', '(양재동)');
select * from member;
insert into member (userid, userpw, name, hp, email, gender, ssn1, ssn2, zipcode, address1, address2, address3) values
('apple', '1111', '김사과', '010-1111-1111', 'apple@apple.com', '여자', '001011', '4068518', '06774', '서울 서초구 강남대로 27', 'AT센터', '(양재동)');
select * from member;
insert into member (userid, userpw, name, hp, email, gender, ssn1, ssn2, zipcode, address1, address2, address3) values
('banana', '2222', '반하나', '010-2222-2222', 'banana@banana.com', '여자', '950101', '4068518', '12345', '서울 서초구 방배동 27', '111', '(방배동)');
insert into member (userid, userpw, name, hp, email, gender, ssn1, ssn2, zipcode, address1, address2, address3) values
('orange', '3333', '오렌지', '010-3333-3333', 'orange@orange.com', '남자', '910202', '4068518', '06774', '서울 강남구 역삼동 27', '2222', '(역삼동)');
insert into member (userid, userpw, name, hp, email, gender, ssn1, ssn2, zipcode, address1, address2, address3) values
('melon', '4444', '이메론', '010-4444-4444', 'melon@melon.com', '남자', '881111', '4068518', '06774', '서울 강남구 논현동 27', '3333', '(논현동)');
insert into member (userid, userpw, name, hp, email, gender, ssn1, ssn2, zipcode, address1, address2, address3) values
('cherry', '5555', '채리', '010-5555-5555', 'cherry@cherry.com', '여자', '990808', '4068518', '06774', '서울 동작구 사당동 27', '4444', '(사당동)');

-- 모든 유저중에서 성별이 여성인 유저만 point를 100을 추가
update member set point = point + 100 where gender='여자';

❇️ 데이터 검색(select)

select 100;
select 100+50;
select 100+50 as 덧셈;
select 100+50 as '덧셈 연산';
select '';
select null;
select 100 + '';
select 100 + null; # null과의 연산은 무조건 null

select * from words; # *는 모든 컬럼
select eng, kor, lev, regdate from words;
select eng from words;
select kor, lev, eng from words;

❇️ MySQL의 연산자

  1. 산술: +, -, *, /, mod, div
  2. 비교: =, <, >, >=, <=, <>
  3. 대입: =
  4. 논리: and, or, not, xor
  5. 기타
    is: 양쪽의 피연산자가 모두 같으면 true, 아니면 false
    between A and B: A보다는 크거나 같고, B보다는 작거나 같으면 true, 아니면 false
    예) between 1 and 10, 변수 >= 1 and 변수 <= 10
    in: 매개변수로 전달된 리스트에 값이 존재하면 true 아니면 false
    like: 패턴으로 문자열을 검색하여 값이 존재하면 true 아니면 false
# 아이디가 'apple'인 유저의 아이디, 이름, 성별을 출력
select userid, name, gender from member where userid='apple';
# 포인트가 200이상인 유저의 아이디, 이름, 포인트를 출력
select userid, name, point from member where point >= 200;
select userid, name, point from member where point between 200 and 1000;
select userid, name, point from member where point >= 200 and point <= 1000;

# 로그인
select userid from member where userid='apple' and userpw = '1111'; -- 로그인 성공
select userid from member where userid='apple' and userpw = '1112'; -- 로그인 실패

# 아이디가 apple, orange, melon 인 유저의 모든 컬럼을 출력
select * from member where userid='apple' or userid='orange' or userid='melon';
select * from member where userid in ('apple','orange','melon');

# 아이디가 a로 시작하는 유저의 모든 컬럼을 출력
select * from member where userid like 'a%';
# 아이디가 a로 끝나는 유저의 모든 컬럼을 출력
select * from member where userid like '%a';
# 아이디가 a를 포함하는 유저의 모든 컬럼을 출력
select * from member where userid like '%a%';

select * from words;
# words 테이블에서 lev이 null인 데이터를 출력
select * from words where lev is null;
select * from words where lev is not null;

# 유저 테이블에서 가입순으로 오름차순 정렬하여 모든 컬럼을 출력
select * from member order by regdate; # 오름차순 asc, 내림차순 desc, 오름차순은 생략이 가능
select * from member order by regdate desc;
# 유저 테이블에서 포인트로 내림차순 정렬하고 포인트가 같다면 가입순으로 오름차순
select * from member order by point desc, regdate asc;

# 일부 로우만 출력
# [limit 가져올 로우의 개수], [limit 시작로우(인덱스), 가져올 로우의 개수]
select * from member;
select * from member limit 3;
select * from member limit 2, 2;
# 유저 테이블에서 포인트순으로 내림차순하고 포인트가 같다면 가입순으로 오름차순 한 뒤, top3를 출력
select * from member order by point desc, regdate asc limit 3;

✨ 새롭게 알게 된 것.
limit : 가져올 로우의 개수,
limit 2, 2 이렇게 쓰는 경우는 시작로우가 2, 가져올 로우의 개수가 2 라는 뜻.

profile
The light shines in the darkness.

0개의 댓글