介绍
关系型数据库
- 付费: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
}
}