Notice
Recent Posts
Recent Comments
05-21 07:17
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Byeol Lo

Database Management - MySQL 기본지식 본문

BackEnd/Database Management

Database Management - MySQL 기본지식

알 수 없는 사용자 2023. 4. 1. 16:07

 SQL을 배우기 위해 우선 SQL의 기본적으로 알고 넘어가야 할 지식을 알아야 한다.

SQL을 사용하는 많은 DBMS가 있는데 대표적으로 MySQL과 Oracle DB가 있다. MySQL과 Oracle DB는 모두 데이터베이스 관리 시스템(DBMS)으로, 각각의 장단점이 있다.

MySQL의 장점:

  • 무료로 사용 가능하다.
  • 구축과 운영이 쉽고 간단하다.
  • 속도가 빠르다.
  • 오픈 소스로 개발자들의 지원이 많다.

MySQL의 단점:

  • 기능이 부족한 부분이 있으며, 기능이 추가되면서 복잡해질 수 있다.
  • 대규모 트랜잭션 처리에 취약할 수 있다.

Oracle DB의 장점:

  • 안정적이고 확장성이 뛰어나다.
  • 데이터베이스의 유연성과 기능이 많다.
  • 대규모 트랜잭션 처리에 강하다.
  • 기업에서 사용할 만큼 안정적인 데이터베이스 관리 시스템이다.

Oracle DB의 단점:

  • 라이선스 비용이 매우 비싸다.
  • 구축과 운영이 복잡하다.
  • 속도가 상대적으로 느리다.

MySQL을 기준으로 살펴보자.

 

MySQL 기본지식

테이블 이름

 윈도우에 설치된 MySQL은 대소문자를 구분하지 않지만, 유닉스 계열(Ubuntu, CentOS, ...) 등은 대소문자를 구분하게 된다. 이런 설정을 바꾸려면 lower_case_table_names을 설정하면 된다. 0은 대/소문자 구분, 1은 소문자로만 저장한다. 다음 링크를 참조하자. https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_lower_case_table_names

lower_case_table_names 환경변수 바꾸기

1. MySQL 서버에 로그인
2. my.cnf 파일을 열기 (일반적으로 이 파일은 /etc/my.cnf 또는 /etc/mysql/my.cnf에 위치함)
3. 파일의 [mysqld] 섹션에서 lower_case_table_names 값을 설정합니다.
4. my.cnf 파일을 저장 후 종료
5. MySQL 서버를 다시 시작
6. 변경된 값이 적용되었는지 확인하기 위해 MySQL 셸에서 SHOW VARIABLES LIKE 'lower_case_table_names'; 명령을 실행
 If set to 0, table names are stored as specified and comparisons are case-sensitive. If set to 1, table names are stored in lowercase on disk and comparisons are not case-sensitive. If set to 2, table names are stored as given but compared in lowercase. This option also applies to database names and table aliases. For additional details, see 
Section 9.2.3, “Identifier Case Sensitivity”

 

리터럴 (Literal = Constants)

리터럴 표기는 홑따옴표(')로 한다.

SELECT *
FROM Products
WHERE PID='computer';
-- 'computer'는 리터럴 형태이다

 

예약어 (Reserved Words)

 MySQL의 예약어는 다음과 같다.(https://dev.mysql.com/doc/refman/8.0/en/keywords.html#keywords-in-current-series)

 

MySQL :: MySQL 8.0 Reference Manual :: 9.3 Keywords and Reserved Words

9.3 Keywords and Reserved Words Keywords are words that have significance in SQL. Certain keywords, such as SELECT, DELETE, or BIGINT, are reserved and require special treatment for use as identifiers such as table and column names. This may also be true

dev.mysql.com

 열이름, 테이블 이름을 예약어로 쓰지 않는 것이 정석이다.

 

비교 (Comparison)

 문자열과 숫자 비교시에는 항상 숫자를 우선으로 하여 문자열들을 숫자로 변환하여 사용한다. 날짜 타입도 마찬가지이다. 리터럴에 날짜가 들어간다면 날짜로 변환하여 사용된다.

SELECT *
FROM example
WHERE number_column='10'; -- 문제 없음 ('10'을 숫자 10으로 변환하여 처리)

SELECT *
FROM tab_test
WHERE string_column=10; -- 문제 있음

-- 오히려 모든 레코드의 문자열 컬럼의 값(string_column)을 숫자로 변환해서
-- 쿼리를 수행하기 때문에 매 레코드마다 변환 처리해야한다.
-- 또한 string_column 데이터가 숫자 형태가 아닌게 들어있으면 에러마저 난다.
SELECT *
FROM dept_emp
WHERE from_date='2021-08-15';
-- 문자열을 날짜로 변경하기 때문에 인덱스 사용에 문제 없음

SELECT *
FROM dept_emp
WHERE from_date=STR_TO_DATE('2021-08-15', '%Y-%m-%d');
-- 위의 쿼리와 똑같음

 

BOOLEAN 은 TINYINT(1)과 같다.

-- MySQL
CREATE TABLE sample (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  is_active TINYINT(1)
);

INSERT INTO sample (id, name, is_active)
VALUES (1, 'John', 1),
       (2, 'Mary', 0),
       (3, 'Bob', 1);

SELECT * FROM sample;
CREATE TABLE sample (
  id NUMBER(10) PRIMARY KEY,
  name VARCHAR2(50),
  is_active NUMBER(1)
);

INSERT INTO sample VALUES (1, 'John', 1)
INSERT INTO sample VALUES (2, 'Mary', 0)
INSERT INTO sample VALUES (3, 'Bob', 1);

SELECT * FROM sample;

 

Comments