[Database] RDBMS - MySQL

SHINYEJI·2023년 9월 12일
0

Database

목록 보기
2/12

📌 MySQL

  • 관계형 데이터 베이스 관리 프로그램

📌 MySQL 특징

기본적으로 SQL 표준을 가지지만 MySQL만의 특징이 있다.

데이터의 대소문자를 구분하지 않음

  • SQL 표준과 달리 MySQL은 데이터의 대소문자도 구분하지 않는다.

데이터의 대소문자 구분하기

  1. MySQL의 default 설정 변경
    • MySQL의 default 설정이 데이터의 대소문자를 구분하지 않는 것임으로, 설정을 변경하면 데이터의 대소문자 구분이 가능해진다.

❗ 여기서 잠깐! 대소문자를 구분하기 위해서는 String이 아닌 binary 형태로 저장되어야 한다.

  1. 데이터를 varbinary type으로 저장
    • 데이터가 binary type으로 저장되면 대소문자 구분이 가능함으로 데이터를 저장할 때 데이터 타입을 varbinary type으로 저장한다.
      단, JDBC에서 Database의 varbinary type의 데이터를 검색할 때 해당 데이터가 binary 타입임으로 추가적으로 String으로 만드는 작업이 필요한 귀찮음이 존재한다.
  2. 데이터를 varcharbinary type으로 저장
    • varcharbinary type으로 데이터를 저장하면 String type의 binary 형태로 저장되어 대소문자 구분이 가능해진다.
  3. binary() 함수 사용
    • 데이터 타입이 varchar (문자열)로 저장되어 있는 경우 binary() 함수를 사용해서 varchar 타입을 바이너리로 읽어 대소문자를 구분하여 검색이 가능하다.
      select *
       from employees
       where binary(first_name) = "steven" 

DDL

데이터 베이스 사용

USE dbname;

데이터 베이스 생성

  • Create
    CREATE DATABASE 데이터베이스이름;
    • create option

      • CHARACTER SET
        • 각 문자가 컴퓨터에 저장될 때 어떠한 '코드'로 저장될지에 대한 규칙의 집합을
          의미
      • COLLATE
        • 특정 문제 셋에 의해 데이터베이스에 저장된 값들을 비교 검색하거나 정렬 등의 작업을 위해 문자들을 서로 '비교' 할 때 사용하는 규칙들의 집합을 의미
      -- <다국어 처리>
      
      CREATE DATABASE dbname
       DEFAULT CHARACTER SET utf8mb3 
       COLLATE utf8mb3_general_ci;
       
      -- <이모지 문자까지 처리>
      
      CREATE DATABASE dbname
       DEFAULT CHARACTER SET utf8mb4 
       COLLATE utf8mb4_general_ci;
      

optional attribute

제약조건설명
UnSIGNED양수로 제한
Auto INCREMENT새 레코드가 추가 될 때마다 필드 값을 자동으로 1증가

데이터 베이스 변경

  • Alter
-- dbtest의 character set, collate 변경
ALTR DATABASE dbtest
default character set utf8mb4 collate utf8mb4_general_ci;

utf8mb3 - 한글 지원
utf8mb4 - 이모지까지 지원

데이터 베이스 삭제

  • Drop
DROP DATABASE 데이터베이스이름

DML

select

select 절설명
*FROM 절에 나열된 테이블에서 모든 열 선택
ALL선택된 모든 행을 반환, DISTINCT와 다르게 default며 생략 가능
DISTINCT선택된 모든 행 중 중복된 행을 제거
alias별칭 (as로 사용)

CASE문

-- 모든 사원의 사번, 이름, 급여, 급여에 따른 등급표시 검색.
-- 급여에 따른 등급
--   15000 이상은 “고액연봉“으로 분류      
--   8000 이상은 “평균연봉”으로 분류      
--   8000 미만은 “저액연봉"으로 분류
SELECT employee_id, first_name, salary,
       CASE
		  WHEN salary >= 15000 THEN "고액연봉"
          WHEN salary >= 8000 THEN "평균연봉"
          ELSE "저액연봉"
		END "급여 등급"
FROM employees;

WHERE

where문 키워드설명
AND& 연산
OR|| 연산
NOT! 연산 (!도 사용가능)
속성 IN (값1,값2,...)()에 있는 값과 속성 값이 같으면 해당 데이터 반환 (or연산을 한번에 가능)
속성 NOT IN (값1,값2,...)()에 있는 값과 속성 값이 같은게 하나도 없으면 데이터 반환
속성 BETWEEN 값1 AND 값2값1<=속성<=값2
속성 IS NULLnull인 값 반환 (속성 = null로 검색 불가)
속성 IS NOT NULLnull인 값 반환
속성 LIKE "wild card"wild card (% : 1개 이상, _ : 반드시 1개)

🤔 논리연산 중 NULL 연산 시 주의점

✔ NULL : "모르다"라는 의미

NULL and NULL : NULL
TRUE and NULL : NULL
NULL and FALSE : FALSE

NULL or NULL : NULL
TRUE or NULL : TRUE
NULL or FALSE : NULL

ORDER BY

|order by option|설명|
|ASC|오름차순 정렬|
|DESC|내림차순 정렬|

select 속성이름
from 테이블 이름
order by 속성1 [ASC|DESC], 속성2 [ASC|DESC],...

SET 집합연산자

  • MySQK은 합집합만 지원한다.
  • 교집합과 차집합은 다른 방법으로 구현해야 한다.

합집합

  • UNION : 합집합 연산 후 중복 행 제거
  • UNION ALL : 합집합 연산 후 중복 행 제거하지 않음

교집합

  • INNER JOIN으로 교집합을 구현하기
-- table1과 table2를 각 테이블의 id가 같은 것을 기준으로 join연산
select *
from table1 INNER JOIN table2
ON table1.id = table2.id;

차집합

  1. not in으로 차집합을 구현하기
--- table1중 table2에 존재하지 않으면 반환
select * 
from table1
where not in (
	select *
    from table2
);
  1. not exists로 차집합을 구현하기
select * 
from table1 t1
where not exists (
	select *
    from table2 t2
    where t1.id = t2=id
);
  1. left outer join으로 차집합 구현하기
select *
from table1 t1 LEFT JOIN table2 t2
on t1.id = t2.id;

MySQL 내장 함수

  • 단일행 함수
    • 숫자 관련 함수
  • 다중행 함수

0개의 댓글