괄호 묶기, DB(완)

calis_ws·2023년 5월 19일
0
post-custom-banner

괄호 묶기

https://school.programmers.co.kr/learn/courses/30/lessons/12909
‘()((()))’와 같은 임의의 문자열을 주고 괄호의 짝이 맞으면 True, 짝이 맞지 않으면 False를 반환한다.

.replace() 메서드

주어진 문자열에서 특정 문자열을 다른 문자열로 변경(대체)한다.
대체한 문자열을 자동으로 변수에 할당해주지는 않는다는 것에 주의

String str = "Hello, sixsense";
String replace = str.replace("Hello", "Thanx");

System.out.println(replace);    // Thanx, sixsense
System.out.println(str);    // Hello, sixsense

.indexOf() 메서드

주어진 문자열에서 특정 문자열의 인덱스(순서, 위치)를 찾는다.
찾는 문자열이 없는 경우 ‘-1’을 반환한다.

  • 찾는 문자열이 있는 경우
String str = "반가워요 멋쟁이사자";

int index = str.indexOf("멋");

System.out.println(index);    // 5
  • 찾는 문자열이 없는 경우
String str = "반가워요 멋쟁이사자";

int index = str.indexOf("출");

System.out.println(index);    // -1

replace, indexOf 메소드 사용

public class BracketWithoutStack {
    public static void main(String[] args) {
        String brackets = "((()(()))))";

        while(brackets.indexOf("()") != -1) {    // "()"가 있을 때 반복
            brackets = brackets.replace("()", "");    // 괄호를 공백으로 Replace
        }

        if (brackets.length() == 0) {    // brackets 문자열의 길이가 0이면 짝이 맞음
            System.out.println("올바른 괄호 입니다");
        } else {
            System.out.println("올바른 괄호가 아닙니다");
        }
    }
}

.split() 메서드

문자열을 구분자(delimiter) 기준으로 분할한다. 원본을 변경하지 않는다.

String str = "LIKE LION";
String[] sArr = str.split(" ");    // 문자열을 읽으면서 공백을 만나면 문자열 분할

System.out.println(Arrays.toString(sArr));    // [LIKE, LION]
System.out.println(Arrays.toString(str));    // LIKE LION

.join() 메서드

문자열을 구분자로 연결하여 하나의 문자열로 합친다.

String[] sArr = {"멋쟁이", "사자", "처럼"};
String str = String.join("-", sArr);    // 배열의 문자열들을 "-"로 연결하여 str에 할당

System.out.println(str);    // 멋쟁이-사자-처럼

split, join 메소드 사용

public class bracketWithoutStack2 {
    public static void main(String[] args) {
        String brackets = "(()(())())";

        while(brackets.indexOf("()") != -1) {
            String[] split = brackets.split("\\(\\)");    // "()"를 찾으면 문자열 분할
            brackets = String.join("", split);    // 분할한 문자열을 합쳐서 brackets에 할당
        }

        if (brackets.length() == 0) {
            System.out.println("올바른 괄호 입니다");
        } else {
            System.out.println("올바른 괄호가 아닙니다");
        }
    }
}

DB

Table task 생성

CREATE TABLE `task` (
`id` bigint NOT NULL AUTO_INCREMENT,
`created_at` datetime(6) DEFAULT NULL,
`last_modified_at` datetime(6) DEFAULT NULL,
`day_of_week` bigint DEFAULT NULL,
`deleted_at` datetime(6) DEFAULT NULL,
`description` varchar(255) DEFAULT NULL,
`task_status` varchar(255) DEFAULT NULL,
`title` varchar(255) DEFAULT NULL,
`week` bigint DEFAULT NULL,
`course_id` bigint DEFAULT NULL,
`user_id` bigint DEFAULT NULL,
PRIMARY KEY (`id`)
)

Table users 생성

CREATE TABLE `users` (
`id` bigint NOT NULL AUTO_INCREMENT,
`created_at` datetime(6) DEFAULT NULL,
`last_modified_at` datetime(6) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`real_name` varchar(255) DEFAULT NULL,
`role` varchar(255) DEFAULT NULL,
`user_name` varchar(255) DEFAULT NULL,
`profile` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
)

Table course 생성

CREATE TABLE `course` (
`id` bigint NOT NULL AUTO_INCREMENT,
`created_at` datetime(6) DEFAULT NULL,
`last_modified_at` datetime(6) DEFAULT NULL,
`course_status` varchar(255) DEFAULT NULL,
`description` varchar(255) DEFAULT NULL,
`end_date` date DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`start_date` date DEFAULT NULL,
`user_id` bigint DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UK_4xqvdpkafb91tt3hsb67ga3fj` (`name`)
)

user 테이블 데이터 추가

INSERT INTO `course-student-db`.users 
(`created_at`,`last_modified_at`,`email`,`password`,`real_name`,`role`,`user_name`) VALUES 
('2023-03-12 20:31:58.841752','2023-03-29 15:24:49.345051','aaaa-test@aaaaa.com','1234','테스트학생','ROLE_STUDENT','student1234');
INSERT INTO `course-student-db`.users 
(`created_at`,`last_modified_at`,`email`,`password`,`real_name`,`role`,`user_name`) VALUES 
('2023-03-12 20:31:58.841752','2023-03-29 15:24:49.345051','abcd@aaaaa.com','1234','김미미','ROLE_STUDENT','student1234');

task 테이블 데이터 추가

INSERT INTO `course-student-db`.task
(`created_at`,`last_modified_at`,`day_of_week`,`deleted_at`,`description`,`task_status`,`title`,`week`,`course_id`,`user_id`) VALUES 
('2023-04-02 00:14:51.586722','2023-04-02 00:14:51.586722',4,NULL,'description','IN_PROGRESS','user, task 테이블 만들기',5,1,1);
INSERT INTO `course-student-db`.task
(`created_at`,`last_modified_at`,`day_of_week`,`deleted_at`,`description`,`task_status`,`title`,`week`,`course_id`,`user_id`) VALUES 
('2023-04-02 00:14:51.586722','2023-04-02 00:14:51.586722',4,NULL,'description','IN_PROGRESS','CourseTable만들기',5,1,1);

5주차 4일차의 모든 task를 task id, title만 출력

select id, title from `course-student-db`.task
where week = 5
and day_of_week = 4;

course 테이블에 id와 name에 데이터를 추가

User를 Course와 연결하기

course_user 테이블을 생성 후 데이터 추가

Join걸어서 Query하기

course, course_user, user를 Join한다.

여기서 course_user는 ‘연결 테이블’ 이다.

use `course-student-db`;
select course.name, users.real_name
from users, course, course_user
where users.id = course_user.user_id
and course_user.course_id = course.id;

Q. 쿼리를 입력하고 실행했는데 에러가 난다면?

  • Error Code: 1146. Table 'course-student-db.course_user' doesn't exist

    A. 테이블이 존재하지 않는다는 에러코드로 스키마 이름이 course-student-db 가 아니거나, course-user 라는 테이블이 존재하지 않는 경우이다.

    course_user 테이블을 만들지 않았거나, 만들고 데이터를 넣지 않아서 에러가 날 수 있으니 확인을 잘 해야한다.

  • Error Code: 1046. **No database selected** Select the default DB to be used by double-clicking its name in the SCHEMAS list in the sidebar

    A. "No database selected" 즉, "선택된 데이터베이스가 없음" 을 의미하므로 이 에러는 데이터베이스를 선택하지 않은 채로 쿼리를 실행하려고 할 때 발생한다.

    위의 쿼리에서 use 문을 먼저 실행하지 않고 밑의 select 문을 실행하면 발생하는 에러이므로 반드시 use 문을 먼저 실행한 후에 select 문을 실행 해야한다.

Join 성공

Join 걸어서 조건 주기

멋사 백엔드 5기 (id : 1) 의 모든 학생의 real_name출력

user_task 테이블과 join 활용하여 원하는 정보 출력하기

전체 구조

User와 User_task 그리고 Task와 User_task 간의 관계를 나타낸다.

Join 코드 (Where문 Join)

select real_name, task.title, user_task.task_status 
from users, task, user_task
where users.id = user_task.user_id
AND task.id = user_task.task_id

관계형 데이터베이스 관리 시스템(RDBMS)

1:1 관계

한 테이블의 레코드가 다른 테이블의 레코드와 하나씩 매핑되는 관계

  • 각 사용자는 하나의 프로필만 가지며, 각 프로필은 특정 사용자와 관련된 정보를 포함한다.

1:N 관계

한 테이블의 레코드가 다른 테이블의 여러 레코드와 매핑되는 관계

  • 한 그룹에 여러 사용자가 속할 수 있으며, 각 사용자는 하나의 그룹에만 속할 수 있다.

N:M 관계

한 테이블의 레코드가 다른 테이블의 여러 레코드와 매핑되는 관계
반대로 다른 테이블의 레코드도 한 테이블의 여러 레코드와 매핑된다.

  • 한 명의 학생은 여러 과목을 들을 수 있고, 한 수업에는 여러 과목이 포함되어 있다.
  • 연결 테이블(student_subject)을 통해 다대다 관계가 일대다 관계와 다대일 관계로 분리되어 데이터베이스의 정규화와 성능을 향상시킨다.

Dump

단순 DB 백업, 데이터를 다른 MySQL 인스턴스로 옮겨야 할 때, 재설치 등 상황에서 사용한다.

Export

원하는 MYSQL 데이터를 .sql 파일로 원하는 위치에 저장한다.

  • MySQL Workbench > Server > Data Export

Import

.sql 파일을 Import 함으로써 데이터 불러오기 및 백업이 가능하다.

  • MySQL Workbench > Server > Data Import

Group by

주로 집계함수와 사용 되며, 여러 개의 다양한 계산을 하기 위해 행을 그룹화 한다. (그룹 별 집계)

Order by

내림차순 혹은 오름차순으로 데이터를 정렬할 때 사용한다.

인사이트 타임

백엔드 위키 작성

review

알고리즘 시간은 어제 배운 Stack구문 없이 프로그래머스의 괄호 묶기를 풀어보았다. 다양한 메소드를 이용하여 풀이를 해보았는데 빠르게 이해하긴 어려워서 우리팀이 작성한 위키를 참고하여 복습해보았다. 알아두면 알고리즘 문제에 유용하게 쓸 수 있을 것 같다.

어제 이어서 진행한 DB 수업은 난이도가 갑자기 확 올라갔다. 중간에 에러가 또 발생해서 해결하느라 두 시간은 잡아먹은 것 같다. 에러가 발생하고 해결하는데 애를 먹는 일이 하루에 한 번은 꼭 일어나는 것 같다.
해결이 되니까 다행이지, 끝까지 해결 못 하는건 상상조차 하기 싫다. 배운 것들이 어려워서 전부 다 이해는 하지 못 했지만 복습을 꼭 해놔야겠다.

오늘의 위키 작성은 그야말로 역대급으로 힘들었다. 분량이 너무 많아서 제대로 작성하지도 못 한 느낌이다. 그래도 실력있는 팀원들 덕분에 오늘도 해낼 수 있었다. 내일이 휴일이라 천만다행이다. 다음 위키작성은 덜 힘들었으면 좋겠다. 팀원분들 정말 고생 많으셨습니다.

profile
반갑습니다람지
post-custom-banner

0개의 댓글