join을 배워보자

 

데이터베이스의 조인은 두 개 이상의 테이블에서 데이터를 결합하여 새로운 결과를 생성

테이블 간의 관계를 통해 의미 있는 정보를 얻어내야 할 때 조인을 사용하 여 관련된 데이터를 결합하고 원하는 정보를 추출

 

조인의 종류

• INNER JOIN: 공통된 값만을 가진 행 반환.

• LEFT JOIN: 왼쪽 테이블 모든 행 포함하며, 오른쪽 테이블과 일치하는 경우 함께 반환.

• RIGHT JOIN: 오른쪽 테이블 모든 행 포함하며, 왼쪽 테이블과 일치하는 경우 함 께 반환.

• FULL JOIN: 양쪽 테이블 모든 행을 포함하며, 일치하는 경우 함께 반환.

• CROSS JOIN: 두 테이블 모든 가능한 조합 반환.

 

조인 명령어

selet 조회할 필드 from 테이블명 inner join 조인할 테이블명 on 일치해야할 필드

ex)

 orders 테이블의 고객아이디와 customers 테이블의 고객아이디가 같은 필드를 order테이블과 customers테이블에서 찾아서 orders 테이블의 아이디와 customers 테이블의 고객 이름을 출력해서 보여준다

 

Relationship (관계 설정)

 ▶ 1:1

 ▶ 1:다

 ▶다:다

관계를 형성해야 무결성 오류가 나지 않는다.

1:1

각 테이블은 서로 한가지 정보를 공유하며 관계되어 있다

ex) 사용자와 프로필, 주문과 송장

MYSQL

id를 공유한다

씨퀄라이즈

- hasOne: 한 모델이 다른 모델을 가리키는 1:1 관계를 설정하는 데 사용

- belongsTo: 다른 모델이 한 모델을 가리키는 1:1(1:다) 관계를 설정하는 데 사용

 

 

1:다 관계

한 쪽 레코드(행)가 다른 쪽 레코드(행)의 여러개와 관련되어 있다.

ex) 부서와 직원, 학교와 학생

MYSQL

씨퀄라이저

다수를 hasMany로 먼저 선언한다.

hasMany: 한 개의 모델(테이블)이 다른 모델과 1:n 관계를 가질 때 사용

belongsTo: 다른 모델이 한 모델을 가리키는 1:1(1:다) 관계를 설정하는 데 사용

 

다:다

실무에서 많이 사용하지는 않는다. 

하나의 레코드가 다른 하나의 레코드와 관련되어 있는 관계를 의미합니다. 이 관계에서 각 레코드는 서로 한 가지 정보만을 공유합니다.

ex) 학생과 과목, 주문과 제품, 배우와 영화

MYSQL

씨퀄라이저

belongsToMany: 다:다 관계를 설정할 때 사용되는 메서드

 

sequelize로 데이터베이스 만드는 법

1. 폴더 생성

2. npm init -y

3. npm i express mysql2 sequelize sequelize-cli(모듈 다운로드)

4. npx sequelize init(씨퀄라이즈 실행)

5. config 제이슨 파일에서 데이터베이스 연결하기

development에서 유저이름과 패스워드 데이터베이스 지정하여 입력하기

(유저 등록법)

위의 명령어를 입력하여 유저를 등록할 수 있다.

유저이름 : user

비밀번호: 1234

select * from mysql.user; // 등록 확인을 할 수 있다.

유저의 plugin에 이렇게 표기되어 있어야한다.

6. models의 index.js에서 fs 지우고,

if 어쩌고의 else문을 const로 선언해준다.

7. 데이터 베이스 만들기

models 폴더에서 만들어줘야한다.

학생

const studentModel = (sequelize) => {
    const Stdent = sequelize.define(
        'student',
        {
            id:{
                type: DataTypes.INTEGER,
                allowNull: false,
                primaryKey: true,
                autoIncreament: true,
            },
            name: {
                type: DataTypes.STRING(15),
                allowNull: false,
            },
            major:{
                type: DataTypes.STRING(31),
                allowNull: false,
            },
            enroll: {
                type: DataTypes.INTEGER,
                allowNull: false,
            }
        });
        return Stdent;
}

module.exports = studentModel;

수업

const classModel =(sequelize) => {
    const Classes = sequelize.define(
        'classes',
        {
            id: {
                type: DataTypes.INTEGER,
                allowNull: false,
                primaryKey: true,
                autoIncreament: true,
            },
            name: {
                type: DataTypes.STRING(31),
                allowNull: false,
            },
            room:{
                type: DataTypes.STRING(7),
            },
            code:{
                type: DataTypes.STRING(7),
                allowNull: false,
            },
            reacher_name:{
                type: DataTypes.STRING(15),
            },


        });
        return Classes;
};

module.exports = classModel;

을 통해 데이터베이스를 만들 수 있다.

8. 서버를 열어줘야지 적용할 수있다.

메인 폴더의 index.js

const express = require('express');
const app = express();
const PORT = 8080;
const db = require('./models');

app.set('view engine', 'ejs');
app.use('/views', express.static('./views'));
app.use('/static', express.static('./static'));
app.use(express.json());
app.use(express.urlencoded({extended : true}));


const router = require('./routes/student');
app.use('/', router);

db.sequelize.sync({force: false}).then(() => {
    app.listen(PORT, () => {
        console.log(`http://localhost:${PORT}`);
    });
});

routes 폴더의 student.js

const express = require('express');
const router = express.Router();
const controller = require('../controller/Cstudent');

router.get('/', controller.index);

module.exports = router;

controller 폴더의 Cstudent.js

exports.index = (req, res) => {
    res.render('index');
}

models 폴더의 index.js

'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const process = require('process');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};
const  sequelize = new Sequelize(config.database, config.username, config.password, config);


//모델

db.Student = require('./Students')(sequelize)
db.Classes = require('./Classes')(sequelize)

//관계형성
db.Student.hasMany(db.Classes, {foreignKey: 'student_id'});
db.Classes.belongsTo(db.Student, {foreignKey: 'student_id'});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

이렇게 만든 후에 node index.js를 실행시켜주면 테이블이 만들어지는 것을 확인할 수 있다.

 

이는 1:다 관계이다.

한명의 학생이 여러개의 수업을 들을 수 있다.

 

※ 메인 폴더의 index.js

db.sequelize.sync({force: true}).then(() => {//true 값을 넣어야 다시 index.js를 실행할 때 삭제하고 다시만들어준다.
    app.listen(PORT, () => {
        console.log(`http://localhost:${PORT}`);
    });
});

왜래키 지정을 잘못해서 다시 실행시키려고 할때 위와 같이 true값을 넣어줘야 삭제하고 다시 만들어준다.

 

1:다 관계로 테이블을 만들었으니 join을 해보자

as를 사용해서 더 간편하게 사용하는 것도 가능하다

그리고 as를 통해 테이블 헤드의 이름도 바꿀 수 있다

+ Recent posts