마흔 한 번째 수업

정혅·2024년 4월 9일

더 조은 아카데미

목록 보기
46/76

오전문제

스트림 문제

  1. 11, 22, 33, 44을 요소로 갖는 스트림을 생성하고 그 각요소를 출력하자.
    "So Simple"이라는 요소로 갖는 스트림을 생성하고 그 각요소를 출력하자.
    "Toy", "Robot", "Box"를 요소로 갖고 있는 리스트를 요소로 갖는 스트림을 생성하고 그 각요소를 출력하자.
package com.test.memo;

import java.util.stream.IntStream;
import java.util.stream.Stream;

class Organize {

    public static void main(String[] args) {
        IntStream.of(11, 22, 33, 44).forEach(s -> System.out.print(s + " "));
        System.out.println();
        Stream.of("So Simple").forEach(System.out::println);
        Stream.of("Toy", "Robot", "Box").forEach(s -> System.out.print(s + " "));
    }
}
//11 22 33 44 
//So Simple
//Toy Robot Box 

  1. 다음을 IntStream을 이용하여 코딩하시오.
    7, 5, 3을 인자로 전달해서 스트림으로
    숫자 5 부터 8 이전까지 스트림으로
    숫자 5 부터 8 까지 스트림으로
    그리고 각각의 스트림의 요소를 출력하시오.
package com.test.memo;

import java.util.stream.IntStream;

class Organize {

    public static void main(String[] args) {
        IntStream.of(7, 5, 3).forEach(s -> System.out.print(s + " "));
        System.out.println();
        IntStream.range(5, 8).forEach(s -> System.out.print(s + " "));
        System.out.println();
        IntStream.rangeClosed(5, 8).forEach(s -> System.out.print(s + " "));
    }
}
//7 5 3 
//5 6 7 
//5 6 7 8 

  1. 다음 문자열을 요소로 가지는 스트림을 생성해서, 가장 긴 문자열을 구해서 출력하자.
    병렬스트림을 이용하자.
    "Box", "Simple", "Complex", "Robot"
package com.test.memo;

import java.util.function.BinaryOperator;
import java.util.stream.Stream;

class Organize {

    public static void main(String[] args) {

        BinaryOperator<String> bo = (s1, s2) -> {
            if (s1.length() > s2.length())
                return s1;
            return s2;
        };
        String s1 = Stream.of("Box", "Simple", "Complex", "Robot").parallel().reduce("", bo);
        System.out.println(s1);
    }
}
//Complex

  1. "Cake", "Milk"를 요소로 하는 스트림을 생성한다.
    "Lemon", "Jelly"를 요소로 하는 스트림을 생성한다.
    유소를 하나로 묶은 후에 각 요소를 출력한다.
package com.test.memo;

import java.util.stream.Stream;

class Organize {

    public static void main(String[] args) {
        Stream<String> s1 = Stream.of("Cake", "Milk");
        Stream<String> s2 = Stream.of("Lemon", "Jelly");
        Stream.concat(s1, s2).forEach(s -> System.out.print(s + " "));

    }
}
//Cake Milk Lemon Jelly 

  1. 다음 문자열을 요소로 가지고 있는 스트림을 생성하고, 알파벳 순으로 정렬한 후, 전체요소를 출력하자.
    "Box", "Apple", "Robot"

  2. 다음 문자열을 요소로 가지고 있는 스트림을 생성하고, 문자열의 길이순으로 정렬한 후, 전체요소를 출력하자.
    "Box", "Apple", "Rabbit"

package com.test.memo;

import java.util.stream.Stream;

class Organize {

    public static void main(String[] args) {
        Stream.of("Box", "Apple", "Robot").sorted((s1, s2) 
                -> s1.compareTo(s2)).forEach(s -> System.out.print(s + " "));
        System.out.println();
        Stream.of("Box", "Apple", "Rabbit").sorted((s1, s2)
                -> s1.length() - s2.length()).forEach(s -> System.out.print(s + " "));

    }
}
//Apple Box Robot 
//Box Apple Rababit 
 Box Robot 

  1. 다음 정수를 요소로 갖고 있는 스트림을 생성하고, 정렬한 후, 모든 요소를 출력하자.
    3, 9, 4, 2
    다음 실수를 요소로 갖고 있는 스트림을 생성하고, 정렬한 후, 모든 요소를 출력하자.
    3.3, 6.2, 1.5, 8.3
package com.test.memo;

import java.util.stream.DoubleStream;
import java.util.stream.IntStream;

class Organize {

    public static void main(String[] args) {
        IntStream.of(3, 9, 4, 2).sorted().forEach(s -> System.out.print(s + " "));
        System.out.println();
        DoubleStream.of(3.3, 6.2, 1.5, 8.3).sorted().forEach(s -> System.out.print(s + " "));
    }
}
//2 3 4 9 
//1.5 3.3 6.2 8.3 

  1. 다음 문자열을 스트림을 이용하여 길이가 5미만인 요소들로 이루어진 ArrayList로 만들자.
    "Hello", "Box", "Robot", "Toy"
package com.test.memo;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

class Organize {

    public static void main(String[] args) {
        Stream<String> str = Stream.of("Hello", "Box", "Robot", "Toy");

        List<String> ls = str.filter(s -> s.length() < 5).collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
        System.out.println(ls);
    }
}
//[Box, Toy]

My SQL

알고 있어야하는 기본

  1. 현재 사용자 확인 : select user();

  2. 현재 선택 중인 db확인 : select database();

  3. 화면 지우기 : system cls

  4. 주석 : # , /* */ , --

  5. 해당 사용자(root)의 정보 조회 : select user, authentication_string, file_priv from mysql.user where user = 'root';

    • authentication_string : 인증 문자열

    • file_priv : 파일 권한 >> 아래 컬럼으로 확인하고싶은 권한 넣으면 됌

  6. 사용자 항목에 host까지 보기 : select user, host from mysql.user;

  7. db테이블에서 사용자 , 호스트, db보기 : select host, db, user, select_priv from mysql.db;

  8. mysql.user 테이블의 컬럼 설명

    • Select_priv : select문을 수행할 수 있는 권한
    • Insert_priv : insert문을 수행할 수 있는 권한
    • Update_priv : update문을 수행할 수 있는 권한
    • Delete_priv : delete문을 수행할 수 있는 권한
    • Create_priv : create문을 수행하거나 테이블을 생성할 수 있는 권한
    • Drop_priv : drop문을 수행하거나 데이타베이스를 삭제할 수 있는 권한
    • Reload_priv : mysqladmin reload명령을 이용하여 접근정보를 다시 읽을 수 있는 권한
    • Shutdown_priv : mysqladmin shutdown명령을 이용하여 서버를 종료시킬 수 있는 권한
    • Process_priv : 서버 프로세스를 관리할 수 있는 권한
    • File_priv : select into outfile과 load data infile과 같은 명령을 이용하여 파일에 읽고 쓸 수 있는 권한
    • Grant_priv : 자신의 권한을 남에게 부여할 수 있는 권한
    • References_priv : 사용하지 않음
    • Index_priv : 인덱스를 만들거나 삭제할 수 있는 권한
    • Alter_priv : alter table문을 수행할 수 있는 권한

DDL명령문의 종류

Data Difinition language : 테이블을 관리하는 데이터 정의 언

  • create table : 테이블을 생성
  • alter table : 테이블과 열(column) 변경 - 추가, 삭제, 자료형 길이 변경(alter table 테이블 명 modify 컬럼명 데이터 자료형), 새로운 무결성 규칙 추가, 기존에 존재하는 무결성 규칙 삭제
  • drop table : 테이블 삭제
  • rename table 바꿀 이름 to 바뀔 이름 : 테이블 이름 변경

기본 키 primary key

항상 유일한 열, 열의 집합 >> 각 행을 고유하게 식별하기 위함

  • null값이 허용되지 않는다.

  • 각 테이블에는 오직 하나의 기본 키만 정의할 수 있다. : 기본 키 열 목록에서 열의 이름은 한번만 나타나야 한다.

  • 테이블에서 여러 개의 열을 사용해 기본 키를 정의할 수 있다. : 복합키 (composite key) >> 각각의 값이 고유한지를 알기 위해서 이 복합키가 기본키가 될 수 있음

복합키를 사용하더라도, 이 중 하나의 키를 기본키로 지정해야 한다. 나머지는 후보기(cardidate key)가 된다.

create table diplomas
(
    course varchar(20) not null, #과목명 
    professor varchar(10) not null, #교수 
    cou_num int(2), #과목 인원 
    end_date date not null, #과목 개설 일자 
    primary key(course, professor, end_date)
);

3개의 열을 사용해 기본 키를 정의하며 학생은 지정된 일자에 한 과목에 대해 취득할 수 있다. >> primarykey는 not null을 명시하지 않아도, null이면 안되고, 3개를 합친 값이 고유해야 한다.

  • 그러므로 위의 코드는 3개의 열이 하나의 복합키를 형성하고, 이 복합키가 테이블의 기본키로 사용되는 것이다.

실습 따라하기

  1. haksa라는 db생성 >> sakila나 world는 샘플 DB

  2. insa테이블 생성

    • auto_increment >> unique / not null의 성질을 지니고 있다.(자동증가가 되게끔 한다.) >> 데이터를 넣을때는 null값으로 넣으면 됌

    • not null > null을 주지 않는다는 의미

  3. 데이터 삽입

    • 전체데이터를 만들때 컬럼의 순서로 삽입할때 컬럼명을 생략할 수 있다.

    • 부분데이터를 넣게되면 컬럼명을 생략할 수 없다. 부분 데이터를 넣을경우, 해당 컬럼명을 insert into ~ 에 넣고 values ~ 데이터를 넣어야한다.

  4. Commit / Rollback 작업

    • Commit : 변경된 데이터를 DB에 적용시킨다.

    • Rollback : 변경된 데이터를 취소싴니다. 직전에 Commit이 수행된 시점까지 취소

  5. autocommit상태 보기

    • select @@autocommit;

    • show variables like 'autocommit'; >> on은 활성화, off는 비활성화

  6. insa테이블의 내용 변경 update 테이블 명 set 바뀔 where 바꿀 행 ;

  7. savepoint / truncate 작업

    • savepoint 는 변경된 지점(저장점)의 위치를 저장

    • 저장점을 저장하고, insert, delete, update작업을 수행하고 rollback to 저장점 하면 그 위치까지 다시 복구시킬 수 있다.

    1. savepoint aa; > point지정

    2. 행삭제하고

    3. rollback to aa; >> aa가지 복구 그럼 삭제했던게 복구됌

    • truncate 작업 : 저장공간과 내용(모든 행이 삭제)까지 다 삭제하고 틀만 남긴다. >> rollback이 불가능

      • 작업 후에는 복구가 되지 않는다.

      • delete는 내용만 날리고 테이블 용량은 줄어들지 않는다. 후에 잘못 삭제한것을 되돌릴 수 있다,

      • truncate는 용량과, 내용까지 모두 삭제해 후에 잘못 삭제한 것을 되돌릴 수 없다.

  8. SQL 데이터형

    1. 숫자 데이터형

      • int > 정수

      • float(m, d) > 실수

      • m은 소수 부분을 포함한 실수의 총 자릿수, d는 소수 부분의 자릿수

    2. 문자 데이터형

      • varchar ~
    3. 날짜 데이터형

      • 날짜 및 시간 데이터를 저장하기 위한 select now() 하면 현재 시간 출력
  9. 새로운 haksa DB생성

  10. 파일을 C드라이버에 따로 저장해서 mysql에서 use haksa_database; 하고, c드라이브에 저장한 파일 중 하나를 불러온다.

    • \. c:\sql\table.sql > query ok 가 뜨면, show tables; 해서 확인
  • view : 가상테이블 > 저장공간을 차지하지 않는다. table처럼 활용

    • create view ages(stu_no, stu_name, age) as select stu_no, stu_name, year(now())-birth_year+1 from student; : ages라는 뷰를 주고 컬럼으로 인자 안 이름을 주고 as select 뒤에는 값

    • select * from ages; 해서 확인하면 view가 table처럼 출력되고, 저장되어 있지는 않고 가상 테이블로서 그때그때 바로 읽어오는 것이다.

      1. 반복되는 명령문이나 루틴(routine)을 간단히 사용하고자 할 때,

      2. 테이블의 출력 방법을 재구성하고자 할 때,

      3. 여러 단계에서 select 명령문이 사용될 때,

      4. 데이터를 보호하고자 할 때

  1. 새로운 유저 생성 및 확인

    • create user choi identified by 'choi123'; > choi라는 유저 생성

    • select user, host from mysql.user; > 현재 user 목록 생성

    • %는 로컬, 원격에서도 접속 가능하다는것을 의미

학사("haksa")데이터베이스 생성 작업

[실습 따라하기]

  1. MySQL 접속하기

    • mysql -u root -p
  2. MySQL 새로운 데이터베이스 생성

    • create database haksa;
  3. 생성된 Database 확인

    • show databases;
  4. 생성된 Database 사용하기 위해 데이터베이스 변경

    • use haksa;

인사테이블("insa") 생성 및 데이터 입력 - key주기

[실습 따라하기]

  1. insa 테이블 만들기
    create table insa(
    bunho int auto_increment,
    name char(8) not null,
    e_name char(10) not null,
    town char(6) not null,
    primary key(bunho)
    );

    • auto_increment : n++ 처럼 자동으로 고유한 정수값을 할당한다. 새로운 레코드가 추가될 때 마다 이전 레코드보다 1씩 증가된다. >> 고유한 식별자 역할을 하는것, (데이터의 무결성 유지)

    • 테이블을 생성할 때 기본 키(primary key)를 설정하려면 키워드 primary key 를 사용해 열의 정의하는 부분 뒤에 따로 기술한다.

    • 기본 키 : bunho열의 값은 고유하고, null값이 허용되지 않는다.

  2. 데이터 삽입

    • insert into insa values(1, '홍길동', 'Hong', '순천');
  3. 데이터 삽입

    • insert into insa values(2, '제갈공명', 'Je', '여수');
  4. 데이터 삽입

    • insert into insa values(3, '순자', 'Soon', '부산');
  5. 데이터 삽입

    • insert into insa values(4, '이순신', 'Lee', '여수');
  6. 데이터 삽입

    insert into insa(name, e_name, town) values('배트맨', 'batman', '고담');

    • insa테이블 데이터 확인
      select * from insa;
  • 위에서 bunho 필드를 auto_increment로 주고, primary key 로 줬기 때문에 꼭 bunho에 값을 입력하지 않고, insert into insa(name, e_name, town) values('제갈공명', 'je', '여수'); 이렇게 입력하면 buho에는 자동으로 이전 레코드보다 1씩 증가된 값이 자동으로 들어간다.


Commit/Rollback 작업

  • Commit : 변경된 데이터를 데이터베이스에 적용시킨다.
  • Rollback : 변경된 데이터를 취소시킨다. 직전에 Commit이 수행된 시점까지 취소시킨다.

[실습 따라하기]

  1. 주의사항으로 MySQL은 명령어를 실행하면 자동(Default)으로 Commit를 하게 되어 있다. 우선 AutoCommit를 하지 않도록 한다.
    set autocommit = 0;

    autocommit 상태 보기
    select @@autocommit;
    1은 활성화 0은 비활성화
    또는
    show variables like 'autocommit';
    on은 활성화 off는 비활성화

  1. "insa"테이블의 내용 변경 : 번호 4번 도시(TOWN)을 한산도로 변경
    update insa
    set town = '한산도'
    where bunho = 4;

  2. 변경된 "insa" 테이블 질의

    • select * from insa;
  3. 변경된 데이터 복구작업 : Rollback

    • rollback;

    • select * from insa;

  4. "insa" 테이블 내용 변경 도시(town)가 '여수'인 데이터를 '대구'로 변경

    • update insa
      set town = '대구'
      where town = '여수';
  5. "insa" 테이블 내용 데이터베이스에 저장 : Commit

    • commit;
  6. 변경된 데이터 복구작업 : Rollback(복구가 되지 않음) >> 위에서 db에 저장했으니까 commit;
    rollback;


Savepoint/truncate 작업

savepoint

savepoint 는 변경된 지점(저장점)의 위치를 저장한다.

  • savepoint로 저장점을 저장하고 INSET, DELETE, UPDATE작업을 수행 후 Rollback to 저장점 을 수행하면 그 위치까지 다시 복구시킬 수 있다.
  1. "INSA" 테이블 변경 작업 : 번호 2의 도시(TOWN)을 "여수"로 변경
    • update insa
      set town = '여수'
      where bunho = 2;
  2. Savepoint "aa" 지정 > 저장점
    • savepoint aa;
  3. 번호 3번 행 삭제 : DELETE 작업
    • delete from insa
      where bunho = 3;
  4. "insa" 테이블 질의
    • select * from insa;
  5. "INSA" 테이블 Savepoint "aa" 까지 복구 > savepoint로 지정한 저장점까지 복구
    • rollback to aa;
  6. "INSA" 테이블 질의
    • select * from insa;

truncate

데이터베이스에서 테이블의 모든 행을 삭제하는 SQL 문이다.

테이블의 데이터가 삭제되지만 테이블의 구조는 그대로 유지되고, DELETE문과 비교하면 TRUNCATE는 보다 빠르고 효율적으로 테이블의 데이터를 삭제한다.

  1. Truncate 작업 : "insa" 테이블의 삭제 처리(모든 행이 삭제 처리됨)
    • truncate table insa;
      8 Truncate 작업 후 "insa" 테이블 복구(복구가 되지 않음)
      rollback;
  2. "insa" 테이블 질의
    select * from insa;
    @ Truncate 작업의 "insa" 테이블 삭제 처리시 복구가 되지 않는다.

  • truncate를 사용하면 구조는 남아있지만 데이터는 비어있는 걸 볼 수 있다.

[실습 따라하기]

  1. MySQL 접속하기

    • mysql -u root -p
  2. MySQL 새로운 데이터 베이스 생성

    • create database haksa_database;
  3. 생성된 Database 확인

    • show databases;
  4. 사용자 생성 및 권한 부여(haksa_admin에 비밀번호 1234로 모든 권한)

    • CREATE USER haksa_admin IDENTIFIED BY '1234'; > 생성

      (또는 CREATE USER 'haksa_admin'@'%' IDENTIFIED BY '1234';)

    • GRANT ALL PRIVILEGES ON haksa_database.* TO 'haksa_admin'@'%' WITH GRANT OPTION; > 권한 부여

      • haksa_database의 모든 테이블에 대한 권한을 가지게끔 부여, 어떤 호스트에서든 접속 가능 (%), 해당 사용자가 다른 사용자에게 권한을 부여할 수 있음(WITH GRANT OPTION)

파일로 실행시키기

위에서 생성한 haksa_admin으로 haksa_database에 접속하자.

  1. MySQL 접속하기

    • mysql -u haksa_admin -p haksa_database
  2. 테이블 생성 - 파일로 실행
    MySQL에서 파일을 실행시키는 명령은 아래와 같다.

    • mysql> \. [path]\[filename]

      \. C:\sql\table.sql > 내 컴퓨터 실행 명령


    [실습 따라하기]

    학사관리 테이블 생성(SQL 명령어 사용)

  3. MySQL 접속하기

    • mysql -u haksa_admin -p haksa_database
  4. table.sql 파일을 이용한 데이터 삽입
    SQL 파일을 c:\sql 이라는 폴더로 복사한다.

    • mysql>\. c:\sql\table.sql
      테이블 데이터 삽입 : 정상적으로 삽입되면 Query OK이라고 뜸
  5. MySQL 에 데이터베이스로 바로 접속하기

    • mysql -u haksa_admin -p haksa_database
  6. data.sql 파일을 이용한 data 삽입

    • mysql>\. c:\sql\data.sql > Query OK

정상적으로 테이블과 데이터가 들어간 것을 볼 수 있다.


정리된 표로 데이터 보는 법

  • select * from attend하게되면

  • 이렇게 정신없게 뜨는데, 이걸 정리되서 보고싶다면 해당 문장에 \G 를 붙이면 된다. 반드시 대문자 G


정렬해서 원하는 값만 출력시키기 - Order by , Limit<> where절

order by(정렬) <> where절과 함께 쓰일 수 있는데, where절이 order by절 보다 먼저 쓰여야 한다.

정렬 기준은 한개의 열이 아닌, 여러개 열로 지정 가능하다. 각 열의 정렬을 다르게 설정도 가능 Ex) order by stu_no, stu_name desc; 처럼 한 열은 오름, 만약 stu_no가 같다면 stu_name에서 비교해 내림으로 출력할 수 있다.

Limit : 출력하는 개수를 제한한다. 형식은 Limit 시작, 개수이다. limit 3만 쓰면 limit 0, 3과 동일하다. (0번째 부터 3개 출력)

ex) order by 로 정렬시킨 후 원하는 출력 열의 개수를 제한해서 출력할 때 사용한다.(order by절 보다 뒤에 사용)

distinct는 중복을 제거하는 함수다. select 뒤 열 이름 앞에 붙이면, 중복된 값은 1개만 출력된다.

ex) select distinct grade from student;

  1. STUDENT 테이블로부터 성별이 남자인 각 학생의 학번, 이름, 영문이름, 학년, 주민등록번호를 영문이름 순서로 출력하라.

    • mysql> select stu_no, stu_name, stu_ename, grade, id_num from student where substring(id_num, 8, 1)=1 order by stu_ename;

      order by 는 오름차순(asc)으로 할건지 내림차순(desc)로 할건지 정렬할 때 사용한다. 디폴트가 asc이므로, 위처럼 생략가능하다.

      substring함수는 문자열에서 지정된 위치에서 시작하여, 지정된 길이의 부분 문자열을 반환하는 함수다. 위에서는 id_num열에서 8번째 문자에서 1개의 문자만가져와 =1과 비교하는것이다. >> 8번째 문자에서 1개의 문자만 가져와 =1인 경우의 행만 출력(성별이 남자인 행만 출력이니까 )

      (select stu_no, stu_name, stu_ename, grade, id_num from student where substring(id_num, 8, 1)=1 order by stu_ename asc;) > asc는 stu_ename을 기준으로 오름차순 정렬 (생략 가능)

  2. 학년이 1학년이고 성별이 남자인 각 학생의 학번과 이름을 출력하는데, 출력 순서는 학번 내림차순이다.

    • select stu_no, stu_name from student where grade = 1 and substring(id_num,8,1)=1 order by stu_no desc;

  1. 교과목 테이블에 관한 모든 정보를 출력하라

    • select * from subject;
  2. 교과목 중 운영체제의 생성년도를 2006년으로 변경하라.

    • update subject set create_year = '2006' where sub_name = '운영체제';
  3. 교과목 테이블에서 교과목코드, 교과목명, 교과목 영문이름, 생성년도를 생성년도를 오름차순으로 출력하라.

    • select sub_code, sub_name, sub_ename, create_year from subject;

컬럼의 자료형 변경

alter table [테이블명] modify [컬럼명][바꿀 자료형]

  1. diplomas 테이블의 sex 열의 길이를 2에서 4로 증가시켜라.

    • alter table diplomas modify sex char(4);
  2. diplomas 테이블에서 sex의 자료형을 char에서 int로 변경하라

    • alter table diplomas modify sex int;

  • 자료형의 변경에 있어서 테이블에 기본키로 정의되어 있지 않은 열이 중복된 값을 가지고 있지 않을 때 기본 키의 추가가 허용된다.

    • alter table 테이블 이름 add primary key(professor)

삭제처리 작업 Delete / Drop

테이블의 내용을 제거할 때 행(ROW) 단위로 이루어진다.

  • 만약에 "SAMPLE"이라는 테이블의 모든 행을 삭제한다면 DELETE FROM SAMPLE; 이렇게 쓰인다.

    • 이는 테이블 자체가 없어진 것이 아니라, 해당 테이블의 행만 삭제한 것이다.
  • 테이블의 명세표, 인덱스, 부여된 권한 등 환경 테이블 정보 자체를 삭제하고 싶다면 Drop 명령어를 사용한다.

    • DROP TABLE SAMPLE;

테이블 복사

create table [새로 만들 테이블 이름] (새로 붙일 컬럼명 - 생략가능) as select [복사할 컬럼] from [복사할 테이블 이름]

  1. student 테이블과 동일한 테이블 구조와 데이터를 가지고 있는 student1 테이블을 복사하라

    • create table student1 as select * from student;

    • 확인 : desc student1;

  2. post 테이블에서 post_no와 post_address로 구성된 신규 post1 테이블을 생성하라

    • create table post1 as select post_no, post_address from post;

    • 확인 : desc post1;

  3. post1 테이블의 모든 열을 조회하라.

    • select * from post1;

테이블 이름 변경

뷰, 시퀀스 등 mysql객체의 이름 변경 가능 >> alter table ~ rename~

  1. "post1" 테이블을 "test_post" 테이블명으로 변경하라.

    • alter table post1 rename test_post;

뷰 View 개념

쿼리 결과를 저장하지 않고 결과를 기반으로 가상의 테이블을 생성하는 논리적인 데이터베이스 객체다.

뷰는 ALTER문을 사용하여 변경할 수 없으므로 필요한 경우는 삭제한 후 재생성한다.

  • 가상 테이블 : 뷰는 데이터를 저장하지 않고 쿼리 결과를 기반으로 가상의 테이블을 생성한다.(물리적으로 저장되어 있지 않음) >> 사용자에게 접근이 허용된 자료만을 제한적으로 보여줄 수 있다.

  • 데이터 무결성: 뷰를 통해 접근하면 원본 테이블에 대한 데이터 무결성을 유지할 수 있습니다.

  • 복잡한 쿼리 간소화: 복잡한 쿼리를 간소화하고 가독성을 높이는 데 사용할 수 있습니다.

  • 동적 업데이트: 일부 뷰는 데이터를 직접 수정할 수 있지만, 대부분의 경우 뷰는 읽기 전용입니다.

특징

  1. 뷰는 기본테이블로부터 유도된 테이블이기 때문에 기본 테이블과 같은 형태의 구조를 사용하며, 조작도 기본 테이블과 거의 같다.
  2. 뷰는 가상 테이블이기 때문에 물리적으로 구현되어 있지 않다.
  3. 데이터의 논리적 독립성을 제공할 수 있다.
  4. 필요한 데이터만 뷰로 정의해서 처리할 수 있기 때문에 관리가 용이하고 명령문이 간단해진다.
  5. 뷰를 통해서만 데이터에 접근하게 하면 뷰에 나타나지 않는 데이터를 안전하게 보호하는 효율적인 기법으로 사용할 수 있다.
  6. 기본 테이블의 기본키를 포함한 속성(열) 집합으로 뷰를 구성해야지만 삽입, 삭제, 갱신, 연산이 가능하다.
  7. 일단 정의된 뷰는 다른 뷰의 정의에 기초가 될 수 있다.
  8. 뷰가 정의된 기본 테이블이나 뷰를 삭제하면 그 테이블이나 뷰를 기초로 정의된 다른 뷰도 자동으로 삭제된다.

장단점

장점

  1. 논리적 데이터 독립성을 제공한다.
  2. 동일 데이터에 대해 동시에 여러사용자의 상이한 응용이나 요구를 지원해 준다.
  3. 사용자의 데이터관리를 간단하게 해준다.
  4. 접근 제어를 통한 자동 보안이 제공된다.

단점
5. 독립적인 인덱스를 가질 수 없다.
6. ALTER VIEW문을 사용할 수 없다. 즉 뷰의 정의를 변경할 수 없다.
7. 뷰로 구성된 내용에 대한 삽입, 삭제, 갱신, 연산에 제약이 따른다.

생성

create view ~ as select문

CREATE VIEW 뷰이름 AS
SELECT 컬럼1, 컬럼2, ...
FROM 테이블이름
WHERE 조건;

CREATE VIEW 뷰이름(컬럼 이름1, 이름 2, 이름 3 ) AS
SELECT 컬럼1, 컬럼2, ... // >> 컬럼 이름 수와 맞게
FROM 테이블이름
WHERE 조건;

삭제

  • DROP VIEW 뷰이름 RESTRICT or CASCADE

    • Restrict : 뷰를 다른곳에서 참조하고 있으면 삭제가 취소

    • Cascade : 뷰를 참조하는 다른 뷰나 제약 조건까지 모두 삭제

view 항목 보기

  1. show full tables : 만들어진 테이블과 뷰를 한번에 볼 수 있다.

  2. show full tables in 데이터베이스 이름 : 특정 데이터베이스의 뷰만 확인

  3. describe 뷰이름 : 뷰의 컬럼 및 세부 데이터형 볼 수 있다.

  4. SHOW FULL TABLES IN 디비명 WHERE TABLE_TYPE LIKE 'VIEW'; : 해당 데이터베이스 안에 타입이 view인 항목 모두 보기

    • SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_TYPE LIKE 'VIEW' AND TABLE_SCHEMA LIKE 'haksa_database';

      • haksa_database스키마에 있는 모든 뷰의 테이블 이름 검색, (information_schema테이블에서 view인 항목을 찾아 이름 반환 >> information_schema는 객체의 메타데이터가 포함된 시스템 데이터베이스임)

뷰 문제 - now() / year()

[실습하기]

  1. 학적 테이블의 학번, 이름, 출생년도, 나이를 출력하라.

    select stu_no, stu_name, birth_year "출생년도", year(now()) - birth_year+1 "나이" from student;

    • "" : 쌍따옴표를 이용해 별칭을 지정했다.(원하는 컬럼명 뒤에 붙이면 별칭으로 지정되서 출력)

    • now() : 현재 날짜와 시간을 반환하는 내장함수다. 시스템의 현재 날짜와 시간을 사용한다.

    • year() : now()함수의 값은 dateTime형식이므로, now() 반환 값에서 year() 함수를이용해 현재 연도를 추출해 계산할 수 있다.

      • year(now()) - birth_year+1 : 현재 년도 - 컬럼의 생년일 + 1( 한국은 태어나자마자 1살이니까)
  2. 학적 테이블의 학번, 이름, 나이로 구성된 AGES 뷰 테이블을 생성하라.

    create view ages(stu_no, stu_name, age) as select stu_no, stu_name, year(now())-birth_year+1 from student;

    • 위 코드는, 새로 만들 뷰 이름 뒤에 컬럼명을 따로 명시해주고 as~를 이용해 추가할 컬럼을 선택해 뷰를 생성한다.

  1. 서울고객이라는 뷰를 삭제해라

    • DROP VIEW 서울고객 RESTRICT;
  2. student 테이블에 있는 모든 데이터를 가지고 studentInfo1이라는 view를 만든다.

    • CREATE VIEW studentInfo1 AS SELECT * FROM student;
  3. student 테이블에 있는 stu_no, stu_name을 가지고 studentInfo2라는 view를 만든다.

    • CREATE VIEW studentInfo2 AS SELECT stu_no, stu_name from student;
  4. student 테이블에 있는 stu_no, stu_name을 각각 '학번', '이름' 이라는 컬럼명으로 studentInfo3라는 view를 만든다.

    • CREATE VIEW studentInfo3 (학번, 이름) AS SELECT stu_no, stu_name from student;
  5. studentInfo1 view를 삭제한다.studentInfo2, studentInfo3 view를 삭제한다.

    • DROP VIEW studentInfo1;

    • DROP VIEW studentInfo2, studentInfo3; : 한번에 여러개 삭제 가능


사용자 생성 및 권한 부여 / 패스워드 변경

select user(); : 하게 되면 내가 현재 사용하는 계정을 보여준다.

유저[root] 패스워드 변경

  • ALTER user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '변경할 비밀번호';
    • alter user root@localhost identified with mysql_native_password by '12345';

사용자 생성 및 권한 부여

MySQL에서 사용자를 생성하는 방법은 command 방법과 GUI 방법(MySQL Administrator)이 있다.

  • 비밀번호 변경 : alter user sky identified with mysql_native_password by '5678';
    1) create 문으로 user 생성하기

    • create user 사용자명 identified by '비밀번호';
      (1) create 문을 사용하여 새로운 사용자 "choi"를 암호(password) "choi123"으로 생성해 보자.

      • create user choi identified by 'choi123';

      (2) create 문을 사용하여 새로운 사용자 "lee@localhost"를 암호(password) "lee123" 으로 생성해 보자.

      • create user lee@localhost identified by 'lee123';

      (3) "user" 테이블에서 새로이 생성된 사용자를 확인하기 위해 호스트명, 사용자, 비밀번호를 출력해 보자.

      • select host, user, authentication_string from mysql.user; : mysql데이터베이스에서 현재 사용자에게 할당된 권한을 조회

      • 로컬 호스트 : mysql서버와, 클라이언트 모두 동일한 컴퓨터에서 실행 > 로컬 시스템에서만 연결을 허용

      • 원격 : 로컬시스템이 아닌 다른 컴퓨터로, 다른 컴퓨터에 위치해 원격으로 접속 가능

      • % : 모든 호스트를 의미, 원격, 로컬 클라이언트 모두 포함

2) 사용자 권한 부여
grant all privileges on 데이터베이스명.* to 사용자명;
grant 부여할 권한 SQL 명령문 on 데이터베이스명. * to 사용자명;
(1) grant select, insert, update, delete on haksa. * to lee@localhost;

  • 'lee'에게 'haksa' 데이터베이스를 select, insert, update, delete 할 수 있는 권한을 부여

    (2) grant all privileges on haksa. * to choi;

  • 사용자 'choi'에게 'haksa' 데이터베이스를 관리할 수 있는 모든 권한을 부여(3) grant all privileges on . to lee@localhost;

    (3) grant all privileges on *.* to lee@localhost;

  • 사용자 'lee'는 모든 데이터베이스를 모든 권한을 가지고 관리할 수 있도록 권한을 부여하였으므로 DBA의 권한을 부여한 것과 같다.

3) 사용자 권한 회수- revoke
revoke priv_type [(column_list)],priv_type[(column_list)]...]

on tbl_name ||*.|db_name. * from user_name [, user_name ...]

revoke SQL 명령문 on DB명. * from '해당유저이름';
(1) 사용자 "choi"을 "haksa" 데이터베이스에서 select 할 수 있는 권한을 회수해보자.

  • revoke select on haksa. * from choi@'%';

    (2) 사용자 "lee@localhost"을 "haksa" 데이터베이스에서 select, update할 수 있는 권한을 회수해보자.

  • revoke select, update on haksa. * from lee@'localhost';

4) 사용자 삭제

drop문 이용, delete문은 테이블 행을 삭제하는데 사용

**drop user 해당유저이름;** 
  • 따옴표 사용 x, 지정된 사용자와 할당된 권한 모두 삭제, 해당 사용자에게 데이터베이스 객체에 대한 권한을 획득한 다른 사용자가 있을 경우, 이 권한도 함께 삭제

    desc mysql.db; : mysql 데어테비으세 있는 관련 정보를 포함하는 시스템 테이블

  1. 새로이 생성된 사용자의 데이터베이스 권한을 확인하기 위해 "db" 테이블에서 호스트명, DB명, 사용자, select 권한만을 출력해보자
    • select host, db, user, select_priv from mysql.db;
  2. 사용자 "kim"과 "lee"를 삭제처리 해보자.
    • drop user kim@localhost;
    • delete from user where user='lee';
    • delete from db where user='lee';

INT 와 zerofill

아래 데이터형 내용참조

zerofill 명시하는 법

create table TEST(
seq INT(11) not null auto_increment primary key, 
oops1_fillzero INT(1) zerofill, 
oops1_nozero INT(1) , 
oops2_fillzero INT(2) zerofill, 
oops2_nozero INT(2) , 
oops3_fillzero INT(3) zerofill, 
oops3_nozero INT(3) 
);
  • 위 코드를 보면, seq 는 null을 허용하지 않고 `auto_increment를 이용해 전 레코드보다 1씩 늘어나게끔 하고 있다. 또한, 기본키로 주었다.

!

  • 결과를 보면, zerofill을 사용한 컬럼은 01, 001로 출력되는 것을 알 수 있고, 사용하지 않은 컬럼은 그대로 1이 출력되는 것을 알 수 있다.

SQL 데이터 형(Data Type)

  • 숫자 데이터 형

    1. 정수 데이터형(INT) ex) INT

      • int(11) 등으로 과호로 옵션을 주는 경우는, 자릿수를 나타내 제한하는 것이 아니라, 출력하는 기본 자릿수를 설정하는 것이다. >> 출력되는 디스플레이 폭 설정

        ex) int(3)으로 정의하고 데이터를 12345를 저장, 12345데이터는 데이터에 저장되어 있지만, 출력할 때는 123만 출력 >> 디스플레이 폭을 설정하는 것

      • zerofill 과 함께 사용하면, int(5)로 정의하고 12를 저장하면 출력할 떄는 00012로 출력되는 것이다. > int만 사용하면 12를 출력

    2. 실수 데이터형(FLOAT) ex)FLOAT(M,D)
      M은 소수 부분을 포함한 실수의 총 자릿수를 나타내며, D는 소수 부분의 자릿수를 나타냅니다.

  • 문자 데이터형(CHAR, VARCHAR, BLOB)

    1. char 데이터형 ex) CHAR(n)
      1바이트에서 255바이트까지의 고정 길이 문자열을 저장하고, 정의된 저장공간보다 입력 데이터가 짧으면 나머지 공간은 공백(SPACE)으로 채워져, 정의된 길이보다 입력 데이터가 길면 길이에 맞게 잘린 데이터가 입력된다.
      그러므로 테이블 생성시 저장할 데이터의 최대크기로 정의해야만 데이터의 손실을 막을 수 있다.

    2. VARCHAR 데이터형 VARCHAR(n)
      CHAR 데이터형과 유사하나 정의된 저장공간보다 긴 문자열이 입력되면 CHAR 데이터형에서는 에러를 발생시키지 않고
      초과되는 데이터를 잘라서 입력하지만 VARCHAR에서는 에러 값을 리턴 한다.
      최대로 정의할 수 있는 데이터의 길이는 16383바이트까지 저장할 수 있고, 메모 등의 다양한 길이의 데이터에 적절하고,
      가변적인 길이의 문자열을 저장하기 때문에, 문자열을 저장하기 위하여 선호되는 데이터형이다.
      하지만 자료 구조의 원리로 볼 때는 CHAR가 VACHAR보다 검색 속도가 훨씬 빠르다.

    3. BLOB, TEXT 데이터형
      BLOB와 TEXT는 65,535 이상의 거대한 텍스트 데이터를 저장할 때 사용하면 된다. 다만 BLOB는 검색시 대소문자를 구분하고 TEXT는 대소문자의 구분이 없이 검색할 수 있다.

  • 날짜 데이터형
    MySQL은 날짜 및 시간 데이터를 저장하기 위해서 Date 데이터형을 제공한다. 사용자들은 SYSDATE이라는 함수를 사용해서 현재 OS의 날짜를 조회할 수 있다.

    1. select now();
  • 바이너리(binary) 데이터형
    MySQL은 음성, 화상(이미지), 동영상과 같은 데이터를 저장하기 위해서 바이너리 데이터형으로 RAW와 LONG RAW 데이터형을 사용하고
    제약점으로는 내장함수를 사용할 수 없다.

    1. RAW 데이터형
      이진형 데이터를 255바이트까지 수용할 수 있으나 저장 공간의 제한점 때문에 많이 사용하지 않는다.

    2. LONG RAW 데이터형
      이진형 데이터를 2GB까지 수용할 수 있다.

    3. BLOB 데이터형
      이진형 데이터를 4GB가지 수용할 수 있다.


char과 varchar의 차이점

  1. 저장 방식:

    • CHAR: 고정 길이 문자열을 저장한다. 지정된 길이보다 짧은 문자열이라도 공백 문자로 채워져 지정된 길이에 맞게 저장된다.
    • VARCHAR: 가변 길이 문자열을 저장한다. 실제 데이터의 길이만큼만 저장하며, 추가 공간은 필요하지 않다.
  2. 저장 공간:

    • CHAR: 고정된 길이로 저장되므로 지정된 길이만큼의 공간을 항상 차지한다. 따라서 데이터 길이가 고정되어 있고, 입력값의 길이가 일정한 경우에 유리하다.
    • VARCHAR: 실제 데이터 길이에 따라 저장 공간이 유동적으로 조정되므로, 입력값의 길이가 다양한 경우에 유리하다.
  3. 검색 및 정렬 성능:

    • CHAR: 데이터의 길이가 고정되어 있으므로 검색 및 정렬이 빠르다.
    • VARCHAR: 데이터의 길이가 가변적이므로 CHAR보다는 약간 느릴 수 있다.
  4. 사용 사례:

    • CHAR: 전화번호, 우편번호, 국가 코드 등과 같이 길이가 일정한 데이터에 적합하다.
    • VARCHAR: 주소, 이메일, 설명 등과 같이 길이가 다양한 데이터에 적합합니다.

데이터의 길이가 고정되어 있고 일정한 경우에는 CHAR를 사용하고, 데이터의 길이가 다양하거나 변할 수 있는 경우에는 VARCHAR를 사용하는 것이 일반적으로 더 효율적이다.


SQL 연습 문제

USE HAKSA_DATABASE;

  1. 사용자 ID를 "sky", 암호(PASSWORD) "SKY1234"로 생성하시오.

    • create user 'sky'@'localhost' identified by 'sky1234';
  2. 사용자 "sky"의 암호를 "sky5678"로 변경하시오.

    • alter user 'sky'@'localhost' identified with mysql_native_password by '5678';
  3. 사용자 "sky"에게 모든 데이터베이스를 관리할 수 있는 모든 권한을 부여하시오.

    • grant all privileges on *.* to sky@'localhost';

  1. . 다음과 같은 학생신상테이블(SINSANG)이 있다. 학번 : 정수, 이름 : 영수치 10자리, 출생년도 : 영수치 4자리, 성별 : 영수치 1자리, 도시명 : 영수치 10자리, 입학일자 : 날짜형, 우편번호 : 영수치 7자리, 전화번호 : 영수치 14자리이고 PRIMARY KEY는 학번이다.

    • create table SINSANG(no int primary key, name varchar(10), birth int, gender char(1), city varchar(10), entrance_date date, zipcode int, phoneNum varchar(14));

    • create table SINSANG(no int, name varchar(10), birth int, gender char(1), city varchar(10), entrance_date date, zipcode int, phoneNum varchar(14)); + alter table sinsang add primary key (no);

  2. 학생신상 테이블(SINSANG)로 부터 도시명이 "서울"인 학생의 학번(stu_no), 이름(stu_name), 성별(sex)을 학번 순으로 출력하는 SQL문을 쓰시오.

    • select stu_no, stu_name, sex from sinsang where city='서울' order by stu_no asc;
  3. 학생신상 테이블(sinsang)로 부터 우편번호(postcode)가 '546-121'인 모든 학생의 우편번호를 '540-100'으로 변경하는 SQL문을 쓰시오.

    • update sinsang set postcode ='540-100' where postcode = '546-121';
  4. 학생신상 테이블의 형식에 맞추어 본인의 데이터를 생성하여 보시오.(INSERT 명령문 사용)

    • insert into sinsang values(1, '홍길동', '1980', 'm', '한산도', now(), '546-121', '015');

My SQL 4

Literal 리터럴

고정되거나 변경할 수 없는 값 >> 상수 (constant)

  • select 명령문에서 행을 선택하는 조건에 사용되거나, insert 명령문에서 새로운 행에 값을 지정하기 위해 사용된다.

자료형

테이블에서 열과 같은 특별한 자료형 존재

  • 정수 리터럴
  • 십진 리터럴
  • 부동 소수점 리터럴
  • 영수치 리터럴
  • 날짜 리터럴

정수 리터럴 Integer Literal

  • 전체가 정수이거나 소수점이 없는 정수로써 양 의 부호(+) 또는 음의 부호(-)를 가질 수 있다.

    • 38, +12, -3404, -16

십진 리터럴 decimal literal

  • 소수점을 가지고 있거나 가지지 않는 수로서 필요하다면 양 또는 음의 부호를 사용할 수 있다. 각 정수 리터럴은 십진 리터럴 정의에 따른다.

    • 49, 18.47, -3400, -16, 0.83459, -349
  • 소수점 앞에 있는 숫자의 수를 정밀도(precision)라 하며 소수점 뒤에 있는 숫자의 수를 크기(scale) 라 한다. >>123.45는 3개의 정밀도와 2개의 크기를 가지고 있다. MySQL의 Number 데이터형에서는 123.45 값을 처리하기 위해서는 Size를 5자리 이상, Scale을 2자리 이상으로 정의하여 사용해야 한다.

    • suchi float(5, 2) not null // 123.45, 12.3 값이 입력 가능

부동 소수점 리터럴 floating point literal

  • 지수를 가지고 있는 십진 리터럴이다.

    • 49, 18.47, 4E-3

영수치 리터럴 alphanumeric literal

  • 인용부호(')로 감싼 0 또는 그 이상의 영수치 문자로 구성된 문자열이다. 여기서 인용부호는 리터럴에 포함되지 않고 문자열의 시작과 끝을 나타낸다.

    • 모든 영문자의 소문자(a-z)
    • 모든 영문자의 대문자(A-Z)

    • 모든 숫자(0-9)

    • 특수 기호(+, =, ?, _)

날짜 리터럴 date literal

  • 연도(year), 달(month), 일(day)로 구성하여 날짜를 표현한다.

  • 이와 같은 날짜를 구성하는 3개의 요소는 슬래쉬('/')로 구분되어 있는데, 앞에 0은 생략할 수 있으며, 년도가 2자리 수치를 사용한다면 19가 두 자리 수치 앞에 생략된 것이다.

    날짜 리터럴 한글 버전 입력 값 영문 버전 입력 값
1980/12/08 80/12/08 8 December 1980
1995/06/19 95/06/19 19 June 1995
99/1/1 96/01/01 1 January 1999


함수 == 수식

함수(수식)들은 데이터를 처리하고 변환하는데 사용된다.

함수 종류

  1. COALESCE(): 여러 개의 인자를 받아 그 중 첫 번째로 NULL이 아닌 값을 반환합니다.
  2. ISNULL(): 주어진 값이 NULL이면 다른 값으로 대체합니다.
  3. NVL(): Oracle에서 사용되며, 첫 번째 인자가 NULL이면 두 번째 인자를 반환합니다.
  4. IFNULL(): MySQL에서 사용되며, 첫 번째 인자가 NULL이면 두 번째 인자를 반환합니다.
  5. NULLIF(): 두 개의 인자를 받아 두 값이 같으면 NULL을 반환하고, 다르면 첫 번째 값을 반환합니다.

숫자 처리 함수 == 스칼라 함수

  1. mod(column_name1 or value1(분자), column_name2 or value2(분모) : 첫 번째 인수를 두 번째 인수로 나누어 나머지를 반환 (%와 같은 역할)

    • EX) select mod(10, 3), mod(5, 8); >> 결과: 1 / 5

    MYSQL에서는 mod함수에 0을 나누는 수로 넣어도 에러가 발생하지 않는다. 0을 반환한다.(바람직하지는 않은 수식)

  2. abs() : 절대값을 출력하는 함수

    • ex) select abs(124), abs(-124); >> 결과 124/ 124
  3. pow() / power() : 제곱의 값을 구하는 함수로, 소수점이 있는 경우에도 실행 가능 (단, 음수는 양수로 계산)

    • select pow(2,4), pow(-2.5, 2), pow(1.5, 6); >> 결과 : 16 / 6.25 / 11.390625
  4. greatest() : 주어진 숫자 중 가장 큰 수를 반환

4-1. least() : 주어진 숫자 중 가장 작은 수를 반환

  • ex) select greatest(15, 45, 32, 65), least(15, 45, 32, 65); >> 결과 : 65/ 15

반올림 함수 == 스칼라 함수

  1. ROUND(colume_name or value, n) : 함수를 소수점 이하 자릿수에서 반올림(자릿수는 양수, 0, 음수 가능)

    • 자릿수를 생략하면 소수점이 5이상일때 반올림/ 자릿수를 지정하면 지정한 자릿수에서 반올림

    • ex) select round(123456.789, 2); >> 결과 : 123456.79 : 소수점 아래 두 번쨰 자리에서 반올림

    • ex) select round(12345678.901, -3;) >> 결과 : 12346000 : 소수점을 기준으로 왼쪽 3자리는0으로 채워지고, 네번쨰 자리에서 반올림

  2. TURNCATE(column_name or value, n)) : 숫자를 소수점 이하 자릿수에서 버린다.

    • n 은 자릿수를 소수점 이하로 정하며, 해당 숫자가 자릿수보다 소수점이 모자라면 0으로 대체한다. 반드시 자리수를 명시해야한다.

    • ex) select truncate(123456.789, 2); >> 결과 :123456.78 : 소수점 아래 두번째 자리에서 절삭

    • ex) select truncate(12345678.901, -3); >> 결과 : 12345000 : 소수점을 기준으로 왼쪽 3자리는 0으로 채워지고 절삭

올림, 절삭해서 무조건 정수를 반환하는 함수(두 번째 인수 사용 x) == 스칼라 함수

  1. floor(column_name or value) : truncate() 함수와 유사해, 소수점 아래의 수를 무조건 절삭해 정수를 반환한다.

  2. ceil(column_name or value) : 소수점 아래의 수는 무시하고 무조건 올림하여 정수를 반환

  • ex) select floor(123456.789), ceil(123456.123); >> 결과 : 123456 / 123457

    round는 반올림(0.5이상)이어야 보다 큰 다음 정수를 나타내지만, ceil()은 0.5미만이라도 인수보다 큰 다음 정수를 반환한다.

문자열 처리 함수

select 붙이고 아래 사용

  1. concat('Data', 'Base') ---> DataBase : 두 문자열을 합친다.
  2. substring('Korea', 1, 3) ---> Kor : 지정된 위치에서 지정된 길이까지만큼 문자열을 추출
  3. length('lee_woo') ---> 7 : 문자열의 길이를 정수값으로 반환
  4. instr('Korea', 'e') ---> 4 : 특정 문자의 위치 반환
  5. lpad('Korea', 15, '*') ---> **Korea : 오른쪽에 지정된 문자를 지정된 길이만큼 왼쪽에 채운다.
  6. rpad('Korea', 15, '#') ---> Korea########## : 오른쪽에 지정된 문자를지정된 길이만큼 오른쪽에 채운다.
  7. lower('Korea') ---> korea : 문자열을 모두 소문자로 바꾼다.
  8. upper('Korea') ---> KOREA : 문자열을 모두 대문자로 바꾼다.
  9. INITCAP ('KOREA UNIVERSITY') ---> Korea University (오라클) : 첫글자만 대문자, 나머지는 소문자로 바꾼다.

중복 제거

  • DISTINCT

함수 문제

  1. 등록금 총액을 변경하라. - use haksa_datbase >fee테이블 이용

    • update fee set fee_total = ifnull(fee_enter, 0) + fee_price;

      • 등록금 총액(fee_total) 은 "입학금(fee_enter) + 수업료(fee_price)"가 된다. 입학금이 null일 수 있기 때문에 ifnull() 함수를 사용해 null 값을 0으로 변환하여 계산할 수 있다.
  2. 납입금 총액은 "등록금 총액 - 장학금 총액"이다. 납입금 총액을 변경하라.

    • update fee set fee_pay = fee_total - ifnull(jang_total, 0);
  3. 우편번호가 150-051 인 동이름과 지역전화번호(동이름과 지역번호는 합쳐서)를 출력하라.

    • select post_no, concat(post_dong, ddd) from post where post_no = '150-051';

      • concat() 함수를 이용해 동이름과, 지역번호를 합쳐서 출력

  1. 재학생들의 등록 금액에 비례한 장학금의 비율은 몇 % 인가?

    • select fee_total "등록금액", jang_total "장학금액", round(ifnull(jang_total, 0) / fee_total * 100, 2) "비율" from fee;

  1. 학번이 20001001인 학생의 학번, 이름, 영문이름을 출력하라. 단, 영문이름은 대문자로 출력하라.

    • select stu_no, stu_name, upper(stu_ename) from student where stu_no='20001001';
  2. 2학년 학생의 번호와 이름, 영문이름 그리고 영문이름의 길이를 나타내어라.

    • select stu_no, stu_name, stu_ename, length(rtrim(stu_ename)) "영문이름 길이" from student where grade = 2;

    • rtrim() 함수를 사용해 우측에 있는 불필요한 공백을 제거한다. >>문자의 수가 계산되기 전에 이름으로 부터의 모든 공백이 제거

  3. 영문이름의 길이가 정확히 12자인 각 학생의 번호와 영문이름을 출력하라.

    • select stu_no, stu_ename from student where length(rtrim(stu_ename)) = 12;
  4. 현주소의 우편번호가 "550"으로 시작하는 전남 여수시에 거주하는 학생의 학번과 이름, 우편번호를 나타내어라.

    • select stu_no, stu_name, post_no from student where substring(post_no, 1, 3) = '550';
  5. 학번이 '20001021'인 학생의 학번과 이름, 우편번호, 주소를 출력하라. 단, 주소출력에는 공백 부분을 삭제하여 출력하고 concat함수를 이용한다.

    • select s.stu_no, s.stu_name, s.post_no, concat(rtrim(p.post_address), rtrim(s.address)) "주소" from student s, post p where s.post_no = p.post_no and stu_no = '20001021';

    • from절에서 각 테이블에 대해 별칭을 지정하여 해당 테이블의 열에 접근할 수 있다.

    • where절에서 s.post_no = p.post_no 하는 이유는 이 둘의 열이 일치하는 행만 결합되어 새로운결과 집합을 얻게하기 위함이다.

      SELECT students.student_id, students.name, grades.grade
      FROM students
      JOIN grades ON students.student_id = grades.student_id;
      # 이와 같이 사용도 가능 join on 을 아직 안배워서리 

0개의 댓글