MySql关系型数据库——node

介绍

关系型数据库

  • 付费:Oracle、SQL Server、DB2、Sybase
  • 开源免费:MySql、PostgreSQL

关系型数据库和非关系型数据库的区别

关系型和非关系型数据库的主要差异是数据存储的方式。

  • 关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。
  • 与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。
  • 关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织
  • 非关系型数据库严格.上不是一种数据库,应该是- -种数据结构化存储方法的集合,可以是文档或者键值对等。

关系型数据库的优缺点

优点:
1、易于维护:都是使用表结构,格式-致;
2、使用方便: SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是-个很大的瓶颈。

Sql语句

基本操作

  • 插入:
insert into students (name,score,gender,class_id)values('yang',100,1,1)
  • 更新:
update students set score = 80 where name ='yang'
  • 删除:
delete from students where id =1
  • 查询
select * from students
select name,score from students
select * from students where gender =1
select * from students where gender =1 and score >=100

查找名字中包含a的(%表示一个或多个字符)

select * from students where name like '%a%'

排序查询(从小到大)

select * from students order by score

排序查询(从大到小)

select * from students order by score desc

分页查询(要偏移量为0的两条数据)

select * from students limit 2 offset 0

查找数据条数(num表示数据书,可以自己起名字)

select count(*) num from students

多表查询

  • 笛卡尔查询
select * from students,classes
  • 连表查询
select students.name,students.class_id,classes.name from students inner join classes on students.class_id = classes.id

可以给表起别名

select s.name,s.class_id,c.name from students s inner join classes c on s.class_id = c.id

对于两个表相同的列在连表查询时也可以将列重命名

select s.name sname,s.class_id,c.name cname from students s inner join classes c on s.class_id = c.id

在这里插入图片描述

  • 内连接:(inner join
    单写join默认是inner join
    表示两表公共字段取相同的部分
    在这里插入图片描述
select s.name sname,s.class_id,c.name cname from students s inner join classes c on s.class_id = c.id

在这里插入图片描述

  • 左外连接left join

在这里插入图片描述

select s.name sname,s.class_id,c.name cname from students s left join classes c on s.class_id = c.id

在这里插入图片描述

  • 右外连接right join
    在这里插入图片描述
select s.name sname,s.class_id,c.name cname from students s right join classes c on s.class_id = c.id

在这里插入图片描述

  • 全外连接
    在这里插入图片描述

外键约束

外键
如果公共关键字在一个关系中是主关键字(这个表是父表),那么这个公共关键字被称为另一个关系的外键(这个表是子表)。

  • CASCADE(级联)
    在父表上update/delete记录时,同步update/delete掉子 表的匹配记录
  • SET NULL
    在父表上update/delete记录时,将子表上匹配记录的列设为null (要注意子表的外键列不能为not null)
  • NO ACTION
    如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
    RESTRICT
  • 同no action,都是立即检查外键约束

图像化设置外键
在这里插入图片描述
sql语句建表时设置外键

constraint student_class foreign key (class_id) references classes(id), 

nodejs操作数据库(mysql)

一般查询

  • 下载模块:npm i --save mysql2
    (这里以express框架演示: npm i --save express
  • 数据库查询
    index.js
const express = require("express")
const app = express()
const mysql2 = require("mysql2")

app.get("/", async (req, res) => {
    // 创建连接池,进行操作
    const config = getDBConfig()
    const promisePool = mysql2.createPool(config).promise()
    var users = await promisePool.query("select * from students")
    console.log(users[0])

    res.send({
        ok: 1,
        data:users[0]
    })
})

app.listen(3000)


function getDBConfig(){
    return {
        host: '127.0.0.1',
        port: 3306,
        user: "数据库用户名",
        password: "密码",
        database: "数据库名",
        connectionLimit:1
   }
}

查询结果:
在这里插入图片描述

带参数的查询

  • 使用 ${变量名} 格式
const express = require("express")
const app = express()
const mysql2 = require("mysql2")

app.get("/", async (req, res) => {
    // 创建连接池,进行操作
    const config = getDBConfig()
    const promisePool = mysql2.createPool(config).promise()
    var name ="yang"
    var users = await promisePool.query(`select * from students where name="${name}"`)
    console.log(users[0])

    res.send({
        ok: 1,
        data:users[0]
    })
})

app.listen(3000)


function getDBConfig(){
    return {
        host: '127.0.0.1',
        port: 3306,
        user: "root",
        password: "0303.yang",
        database: "yang_text",
        connectionLimit:1
   }
}

查询结果:
在这里插入图片描述

  • 使用占位符(建议)
    var users = await promisePool.query(`select * from students where name=?`,[name])

输出:
在这里插入图片描述

插入操作

const express = require("express")
const app = express()
const mysql2 = require("mysql2")

app.get("/", async (req, res) => {
    // 创建连接池,进行操作
    const config = getDBConfig()
    const promisePool = mysql2.createPool(config).promise()
    var name ="yang"
    var users = await promisePool.query(`insert into students (name,score,gender,class_id)values(?,?,?,?)`,[name,120,1,2])
    console.log(users[0])

    res.send({
        ok: 1,
        data:users[0]
    })
})

app.listen(3000)


function getDBConfig(){
    return {
        host: '127.0.0.1',
        port: 3306,
        user: "root",
        password: "0303.yang",
        database: "yang_text",
        connectionLimit:1
   }
}

输出:
在这里插入图片描述

更新操作

const express = require("express")
const app = express()
const mysql2 = require("mysql2")

app.get("/", async (req, res) => {
    // 创建连接池,进行操作
    const config = getDBConfig()
    const promisePool = mysql2.createPool(config).promise()
    var name ="xiaoba"
    var users = await promisePool.query(`update students set name=?,gender=2 where id=?`,[name,9])
    console.log(users[0])

    res.send({
        ok: 1,
        data:users[0]
    })
})

app.listen(3000)


function getDBConfig(){
    return {
        host: '127.0.0.1',
        port: 3306,
        user: "root",
        password: "0303.yang",
        database: "yang_text",
        connectionLimit:1
   }
}

在这里插入图片描述

删除操作

const express = require("express")
const app = express()
const mysql2 = require("mysql2")

app.get("/", async (req, res) => {
    // 创建连接池,进行操作
    const config = getDBConfig()
    const promisePool = mysql2.createPool(config).promise()
    var name ="xiaoba"
    var users = await promisePool.query(`delete from students where id=?`,[9])
    console.log(users[0])

    res.send({
        ok: 1,
        data:users[0]
    })
})

app.listen(3000)


function getDBConfig(){
    return {
        host: '127.0.0.1',
        port: 3306,
        user: "root",
        password: "0303.yang",
        database: "yang_text",
        connectionLimit:1
   }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值