본문 바로가기
Programming/MySQL

MySQL 1일차 수정

by yoon9i 2024. 3. 29.

MySQL 강좌정리

0. 참조할 문서

  오라클: https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/index.html#Oracle%C2%AE-Database

  mysql:  https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/

1. 환경설정
 
  1) MySQL8 다운 및 설치
    - 커뮤니티 버전 ( 무료 )
    - https://dev.mysql.com/downloads/installer/
   
    - Windows (x86, 32-bit), MSI Installer 8.0.36 285.3M


   
  2) 접속툴
    - 자체적으로 설치: workbench ( GUI )
                   command line client ( CMD )

    - 다운로드 설치: DBeaver.zip
                 ==> http://dbeaver.io/download
                  Toad
  ...

   3) 프로그램 언어(자바)
      - JDBC( Java DataBase Connectivity) 기술이용
      - JDBC 특징: DB 종류와 무관하게 연동 가능.
                  Java SE 및 Java EE(웹) 무관하게 사용 가능.
     단점: SQLException이 발생됨.( 무조건 try~cacth 필요)


    4) 실습에서 사용할 Database 생성 및 테이블 생성
       Database 명: testdb
       테이블: 
               - 수업때 사용할 테이블: scott_mysql.sql 이용
                          dept 테이블
  emp 테이블
  salgrade 테이블

       - 워크샵 진행시 사용할 테이블 :  MySQL용_SQL워크샵스크립트.txt
                             tb_class
     tb_class_professor
     tb_department
     tb_grade
     tb_professor
     tb_student

2. 데이터베이스 vs 데이터베이스 관리 시스템

 1) 데이터베이스(DataBase : DB)
   - 개인,회사,관공서등에서 업무적으로 필요한 데이터 의미.
 
 2) 데이터베이스 관리 시스템 ( DataBase Management System : DBMS )
   - DataBase(데이터)를 전문적으로 관리해주는 S/W 의미.
   - 관리 방법? 보안
              CRUD ( Create: 데이터 생성
             Read  : 데이터 조회
     Update: 데이터 수정
     Delete: 데이터 삭제 )
     사용자 생성
     Role 부여
     ...

    - 데이터 저장 방법? 계층형 데이터베이스
                    망형   데이터베이스
    객체지향 데이터베이스
    관계형 데이터베이스 (*): 행(레코드)과 열(컬럼)로 구성된 2차원 테이블형식으로 관리
    ..
      
3) 관계형 데이터베이스 (Relational DataBase : RDB) 
          <=====> NoSQL ( Not only SQL ):{key:value}, 비정형 예> MongoDB, Casandra,....
       
  가. 개념
    행(레코드)과 열(컬럼)로 구성된 2차원 테이블형식으로 관리
   
  나. 종류
    - Oracle
    - MySQL ( MariaDB 는 MySQL 문법이 거의 99% 비슷)
    - MSSQL
    - DB2
    ...

3. SQL (Structured Query Language )

 1) 개요
  - RDB 에서 사용하는 프로그램 언어이다.
  - 대소문 구별 안함. ( 식별자 의미 ) ==> mysql에서는 리터럴(값)도 대소문자 구별안함. oracle은 대소문자 구별함.
  - 연산자
  - 조건문
  - 함수 ( 자바의 메서드 역할 )

 2) 종류 1

    가. ANSI SQL
      - 표준화된 SQL 의미.
      - DBMS에 독립적 ==> 모든 DBMS에서 사용 가능(Oracle, MySQL, ... )


    나. 비 ANSI SQL
      - 표준화되지 않은 SQL 의미.
      - DBMS에 의존적 ==> MySQL에서만 사용가능한 문법이 있다는 의미.

 3) 종류 2 ( 역할 )

   가. 조회 ==> query 라고 부름.
     - select 문 이용

   나. 레코드-생성/수정/삭제 ==> DML(Data Manipulation Language: 데이터 조작어) 라고 부른다.
     - 레코드 생성: insert 문
     - 레코드 수정: update 문
     - 레코드 삭제: delete 문

   다. 테이블(객체:인덱스,뷰,프로시저,사용자)-생성/수정/삭제 ==> DDL ( Data Definition Language: 데이터 정의어 ) 라고 부른다.
     - 테이블 생성: create 문
     - 테이블 수정: alter  문
     - 테이블 삭제: drop 문

   라. 트랜잭션 명령어   ==> TCL( Transaction Control Language ) 라고 부른다.
      - DML과 매우 밀접한 관련있음.
      - commit 문
      - rollback 문

   마. etc
      - 사용자생성/권한부여/권한취소 ...


4. select 문

  1) 기능 3가지
   
   - selection: 행 선택
   - projection: 열 선택
   - join(연결): 2 개 이상의 테이블 연결해서 selection 및 projection 처리.

  2) 문법
    
    select 절
    from 절; ( mysql 생략 가능, Oracle 생략  불가 )
    ========> 항상 테이블의 모든 레코드 대상이다.
              따라서 emp는 항상 14개가 반환된다.

    - select 절: * (모든컬럼,all)
                컬럼명,컬럼명2,...
컬럼명+10  ==> 연산가능
컬럼명 as 별칭 ==> 가독성, "별칭"
리터럴(값)
함수명(컬럼명)  ==> 함수가능
distinct 컬럼명 ==> 중복 제거
    
    - from 절;  테이블 명

  
  3) sql문에서 "" 와 '' 사용  ( ANSI )
    - "" 는 별칭에서만 사용하자.
    - '' 는 문자(열)값, 날짜값 ==> 리터럴(literal)
     예>  'hello', 'a'
          '2024-03-28'
       
      
  4) null 값
   
    가. 정의?
       - 테이블의 컬럼에 값이 없는 것.( 값 없음을 의미 )
         select 하면 비워져서 보여짐.
   
    나. 특징
       - 기본적으로 테이블의 모든 컬럼은 null 값을 가질 수 있다.
         강제적으로 null이 아닌 값을 가지도록 할 수 있다. ( not null 제약조건  이용 )

       - null 값 조회는  is null 연산자를 사용해야 된다. ( 부정: is not null )
       - null 값의 연산결과는 null 값이 반환된다. (******)

         예> 사원의 연봉 ?
    sal*12 ==> (sal*12) + comm 가 null 값이 나오는 사원도 있다.

         컬럼값이 null 인경우에는 연산 가능하도록 null값을 임의의 값으로 변경하는 함수가 필요.
   
- ifnull(컬럼명, 기본값) ( Oracle 에서는 NVL(컬럼명, 기본값) )
   ==> (sal*12) + ifnull(comm, 0)

        - null 값은 가장 작은 값으로 처리한다. ( Oracle에서는 가장 큰 값으로 처리 )

- 기본인 null 허용 ---------------> not null 제약조건으로 허용 불가 ( 변경작업 )

 
5. select 문 + 조건지정

  1) 문법:
   
     select 절
     from 절
     where 절;

 예> select *|컬럼명,컬럼명|컬럼명 as "별칭"|컬럼명+10|함수(컬럼명)|distinct 컬럼명|리터럴값  , projection기능
    from 테이블명 
    where 조건식;  // 조건식에 일치하는 레코드만 출력됨. selection 기능

  2) 조건식에 사용되는 연산자

   가. 비교연산자 1
     
      =   : 같냐? ( 자바에서는 == 사용됨 )
      !=  : 같지 않냐?
      >   : 크냐?
      >=  : 크거나 같냐?
      <   : 작냐?
      <=  : 작거나 같냐?

     ==> 수치, 날짜, 문자도 사용 가능
     ==> 날짜는 내부적으로 수치형으로 관리

         기준시간: 1970-01-01  ------------------------> 현재

   나. 비교 연산자 2
      범위로 조회

     - Between A and B: A 부터 B 까지 포함된 레코드 반환.
                       A와 B 포함됨.
     - 수치, 날짜, 문자도 사용 가능
                      

   다. 비교연산자 3
      한꺼번에 여러개 지정

      - IN (값, 값2, 값3)  : 값 또는 값2 또는 값3
      - 수치, 날짜, 문자도 사용 가능

   
   라. like 연산자
      - 패턴으로 조회 가능

     * 2개의 와일드카드 문자와 같이 사용 ==> 특정문자(들)와 치환이 된다.

      % : 없거나 여러개 치환 가능
        예> where ename LIKE '%A';   // A로 끝나는
           where ename LIKE 'A%';   // A로 시작는
           where ename LIKE '%A%';   // A가 포함되는
     
      _ : 반드시 하나의 문자와 치환
        예> where ename LIKE '__A';  // 3글자면서 A로 끝나는

      %와 _ 혼합 사용 가능:
        예> where ename LIKE '_A%';  // 두번째 글자가 A로 시작하는

     * 산술연산자에서 % 가능하지만 MOD() 권장함.

      - % 나 _ 를 포함하는 이름을 찾을  수 있다.

      예> ename
         ------
 AAA_BBB
 AAA%BBB
 _XXXYYY

==> ename LIKE '%\_%';   // \뒤에 오는 와일드카드 문자를 그냥 일반문자로 처리함. ( oracle 불가 )

        ==> ename LIKE '%$_%' ESCAPE '$'; // 임의의 문자 뒤에 오는 와일드카드 문자를 그냥 일반문자로 처리함.
                                     ( oracle 가능 )
 

   마. null 조회
    
     - IS NULL 사용



   바. 정렬
     => 기본적으로 테이블내에 저장되는 데이터는 정렬이 안된 상태이다.
      
     - 정렬방법
       오름차순(기본) :  asc|ASC
       내림차순      :  desc|DESC

     - 문법

        select 컬럼명 as A, 컬럼명2 as B
from 테이블명
where 조건식(연산자)
order by 표현식(컬럼명|별칭|select절지정된위치1부터)  ASC|DESC   ;
    
     - 다중정렬

        order by 표현식1,  표현식2;

      예> order by sal desc, empono; ==> sal로 정렬하고 같은 sal들만 뽑아서 다시 empno로 재정렬함.
         order by 별칭 desc, 별칭;
 order by 1 desc, 3;

   정리
        select     3번: 지정된 컬럼만 선택
from       1번 : 14개의 레코드
where      2번 : 조건에 의한 필터링, 10개 추출됨
order by   4번: 지정된 정렬로 출력됨.

use testdb;

--  SQL문 주석문

-- 1. 테이블내의 모든 데이터 보기
 SELECT * FROM dept;
 
 SELECT * 
 FROM dept;
 
select * 
from dept;

-- 2. mysql 에서는 from 절 생략 가능 ( Oracle에서는 from절 생략 불가)
select  3455663 * 2245667;

select  3455663 * 2245667
from dual;  -- dummy table

select  now();

select  now()
from dual; 

-- 3. 특정 컬럼 데이터 보기
-- select 절에 지정된 컬럼순서대로 출력된다.
-- select 절에 지정된 표현식 그대로 컬럼헤더에 출력된다.
SELECT empno, ename, job, hiredate
FROM emp;
 
 SELECT ename, empno,  job, hiredate,  sal+10
FROM emp;
 
--  limit 은  ANSI 아님
-- 4. 출력할 데이터 갯수 제한1 : limit len 
SELECT empno, ename, job, hiredate
FROM emp
limit 3;

-- 4. 출력할 데이터 갯수 제한2 : limit start , len 
SELECT empno, ename, job, hiredate
FROM emp
limit  0 , 5;  -- 0 부터 5개 

-- 5. 연산 가능  ( +, - , *, /, %(나머지))
-- % : mysql 에서 지원, 대신  mod( ) 함수 추천
SELECT empno, ename,   sal,  sal * 1.1,  ROUND(sal * 1.1),  ROUND(sal * 1.1, 2) 
 FROM emp;

SELECT empno, ename,   sal,  sal + 10, sal-10, sal*1.1 , sal / 3,  sal % 3,  mod(sal, 3)
 FROM emp;
 
 -- 6. 별칭
 -- 컬럼헤더값을 별칭으로 출력
 -- 문법:  표현식 as  별칭,    as 생략 가능(권장안함)
 -- 필요시  "별칭" 사용. (권장),   '별칭' (홑따옴표 가능하지만 사용 안하는 것으로)
SELECT empno AS 사번, ename AS 성명,  sal 급여 , sal * 12  as 연봉
FROM emp;

SELECT empno AS "사 번", ename AS "성명",  sal "급여" , sal * 12  as "연봉"
FROM emp;

-- 7. 리터럴 (literal)
-- 문자(열)값, 날짜값:  반드시 '' (홑따옴표) 사용
-- 수치값:    10   3.14
SELECT empno , 10, 3.15 , 'hello', '2024-03-23'
FROM emp;

-- 8.  null 값
-- null 값의 연산결과는 null 값이 반환된다. (******)
-- ifnull (컬럼명, 기본값) 사용하여 null 값인 경우 기본값으로 처리 가능.
SELECT empno, ename,   sal,  comm,  (sal * 12) + comm as "연봉", 
            (sal*12) + ifnull(comm, 0) as "연봉"
 FROM emp;

-- 9. 중복제거 
--  distinct 키워드 이용
SELECT distinct job
FROM emp;
 
-- 10. where 절에 사용하는  연산자
-- 1) 비교연산자 ( =, !=, >, >= , <, <= )
 SELECT empno, ename, job, deptno , sal
 FROM emp
 WHERE sal <= 1000;

 SELECT empno, ename, job, deptno , sal
 FROM emp
 WHERE ename = 'SMITH';

 SELECT empno, ename, job, deptno , sal
 FROM emp
 WHERE ename = 'smith';   -- 리터럴값은 oracle에서는 대소문자 구별됨.
-- 
 SELECT empno, ename, job, deptno , sal, hiredate
 FROM emp
 WHERE hiredate = '1980-12-17';
 
  SELECT empno, ename, job, deptno , sal, hiredate
 FROM emp
 WHERE hiredate > '1982-12-17';
 
 -- 2) 비교연산자  : Between A and B 
  SELECT empno, ename, job, deptno, sal
 FROM emp
 WHERE sal BETWEEN 800 AND 2000;
 
 SELECT empno, ename, job, deptno , sal, hiredate
 FROM emp
 WHERE hiredate BETWEEN '1980-01-11' AND '1982-12-17';
 
 SELECT empno, ename, job, deptno , sal, hiredate
 FROM emp
 WHERE ename BETWEEN 'Adam' AND 'Dartin';
 
-- 3 ) 비교연산자 :      in ( 값, 값2, 값3) 
 SELECT empno, ename, sal
 FROM emp
 WHERE empno IN (7369,7566,7698);
 
 SELECT empno, ename, sal
 FROM emp
 WHERE ename IN ( 'SMITH', 'FORD', '홍길동');
 
  SELECT empno, ename, sal, hiredate
 FROM emp
 WHERE hiredate IN ( '1980-12-17', '1980-01-11');
 
 
 -- 4) like 연산자 :   % ,  _  패턴문자(와일드 카드문자)와 같이 사용
 SELECT empno, ename, sal
 FROM emp
 WHERE ename LIKE'A%';
 
 SELECT empno, ename, sal
 FROM emp
 WHERE ename LIKE '%T%';

SELECT empno, ename, sal
 FROM emp
 WHERE ename LIKE '_L%';
 
-- 5)  is null 연산자:   null 값 조회
SELECT empno, ename, sal, comm
 FROM emp
 where comm IS NULL;
 
 SELECT empno, ename, sal, comm, mgr
 FROM emp
 where mgr IS NULL;
 
 
-- 6) 논리 연산자;   and  , or  , not 
SELECT empno, ename, job, deptno, hiredate, sal
 FROM emp
 WHERE job = 'salesman'AND sal >= 1500;

SELECT empno, ename, job, deptno, hiredate, sal
 FROM emp
 WHERE job = 'salesman' or  sal >= 1500;
 
 
  SELECT empno, ename, sal, comm, job
 FROM emp
 WHERE comm IS NOT NULL;
 
  SELECT empno, ename, job, deptno , sal
 FROM emp
 WHERE NOT ename = 'SMITH';
 
   SELECT empno, ename, job, deptno, sal
 FROM emp
 WHERE sal NOT BETWEEN 800 AND 2000;
 
  SELECT empno, ename, sal
 FROM emp
 WHERE ename NOT IN ( 'SMITH', 'FORD', '홍길동');
 
  SELECT empno, ename, sal
 FROM emp
 WHERE ename NOT LIKE'A%';

'Programming > MySQL' 카테고리의 다른 글

MySQL 4일차  (0) 2024.04.02
MySQL 3일차정리  (0) 2024.04.02
MySQL 3일차  (0) 2024.04.01
MySQL 2일차  (0) 2024.03.29
1일차 수업  (0) 2024.03.28