0.准备

首先安装mysql和navicat
配置:image

1.什么是数据库

  1. 在应用中很多数据一定要保存起来,例如操作日志,用户信息,聊天记录(数据的重要性的体现)
  2. 需要支持数据存储的容器,数据库主要就是当做数据存储的容器(可以将变量化(瞬时状态)的数据变成持久化数据)【游离状态:变量,计算机一关闭就小时了。持久化:变量转换成文件,永久存在】
  3. 数据库原理:test文本就是一个最简单的数据库

2.使用数据库

  1. 使用navicat连接到mysql
    • mysql是关系数据库,存储单元是表,较大存储单元是库(创建表)
    • 数据库—存储数据仓库(多个),每个数据库有多个表
    • 首先创建容器(创建数据库)—新建约束
      1. 表的创建一定要根据实际情况,表主要是用来描述实体的信息
      2. 多表的时候,不同表之间构建成一种应用模型
      3. 本质:实际上对应用进行建模
    • 电商类项目:
      • 商品表
      • 用户表
      • 商家用户表
      • 操作表
      • 订单表
    • 新建表
      • 1.表属性(表字段)表字段用来描述实体具体信息,规则最小的不可分割的
      • 2.表属性类型(数据类型以及长度)
      • 3.所有表属性中的主键,唯一可表示的一个属性,不能重复
        • 类型:
          • varchar —-相当于string 长字符串
      • 4.约束:指定属性是否为空,高级约束可以设定存入的数据必须要满足的类型

案例:
- 1. 管理用户,掌握用户所发布的商品信息
- 2. 选择完省—>市区—->县
- 3. 登录不同身份:管理员登录可以看一些内容,普通用户登录没有权限

  1. mysql中sql和数据库设计

    • 新建查询—sql编辑文本
    • 插入语句
      insert into 表名(列1,列2)value(值1,值2);
      插入的时候,控制台输出受影响的行数,说明插入成功

      insert into users(userid,username,password,address,phone,age,sex)
       values(1,'admin','1234','beijing',136510460,32,'男');
      
      insert into users(userid,username,password,address,phone,age,sex)
       values(2,'xinxin','1234','beijing',0000,10,'女');
      
      insert into users(userid,username,password,address,phone,age,sex)
       values(3,'sen','1234','beijing',18462358,22,'男');
      
      insert into users(userid,username,password,address,phone,age,sex)
       values(4,'yiyi','1234','beijing',6543987,1,'女');
      
      
    • 查询语句:
      select 列名1,列名2,列名3 from 表名
      *表示查询全部

      select userid,username,sex from users;
      select * from users;
    • 更新(修改)

      • 用在哪里:

        • 1.重置密码
        • 2.新用户VIP
        • 3.更换个人头像

        语法:update 表名 set 列1=新值 where 修改条件
        where 是sql中关键字 where 跟随一些判断条件

    • 删除
      delete from 表名 where 条件;

      delete from users where userid=3

      除了查询以外,增删改返回结果都是受影响的行数
      所以在应用将查询和增删改分开

3.数据库类型

  • 关系类型数据库:
    • 关系型数据库指的是由表来进行构建数据模型
    • 当表个数多的时候,不同的表之间会明显的关系结构
    • 优点:
      • 关系比较明显,描述的实体之间关系比较明确
  • 非关系型数据库:
    • 它不是通过表进行构建数据库,是通过文档进行存储,比如mongodb
    • 用json进行
{"provinceID":'001',provinceName:'',city:[
   {"cityId":'',cityName:'',xian:[
       {xianId:'',xianName:''},
       {xianID:'',xianName:''},
   ]}
 ]}

4.数据库设计三大范式以及数据表关联关系

  • 数据表关联关系:
    • 一对多 例子:一个省里面有多个市
    • 多对一 例子:多个订单归一个用户所有
    • 多对多 例子:一个老师会教多个班级,一个班级会有很多个老师教课
    • 意义:很多查询中都要借助于关联关系才能更清楚的找到不同数据
  • 三大范式:
    • 1.每个column都是最小原子项不可分割
    • 2.每一行的数据都应该对应其中一个列
      • 例如:一个用户同时买了很多个商品,那么用户要是和商品在同一个表里面就会出现一个用户id(column)对应多条数据,所以需要将用户表和商品表拆分。
    • 3.数据(列之间)直接关系,一定要是同一个类别的,不能都放在一起

5.条件查询和复杂查询

  • 条件查询

    • 1.查询一个用户名为admin 的密码
    • 2.and 同时满足and前后条件时
    • 3.or 满足or前后一个条件就可以
    • 4.子查询:就是一种查询嵌套,一个查询里面嵌套另一个查询。

      • 标准是:内部查询(子查询)返回一个结果 给外层查询(父查询)作为条件
      • 写内部查询(查询条件)

        select * from users where phone=(select phone from users where username='admin')
      • 使用子查询的原因:
          1. where筛选数据,条件都是写死的,不灵活.
          1. 子查询以后,能够实现子查询功能和父查询功能分离,子查询负责返回条件,父查询只要负责筛选结果就行了
    • 5.模糊查询:写在where里面,关键字 like

      • where id like “%关键字%” ‘%’匹配任意长度的字符串
      • where id like “_ 关键字 _ ” ’ _ ‘表示长度为1的任意字符
      • where name like “tom[0-5]” [单字符]匹配范围 a[a-c] —aa ab ac
      • where name like “tom[^0-5]” 表示匹配除了0-5以外的任意数值
      • 用途:用在关键字搜索,高级智能搜索方面
    • 6.连接查询

      • 增删改都是单表操作:
      • 进行多表操作:
        核心点:找准一个两个表中都具有的一个属性,等价于通过这个属性关联两个表,
      • 例如:用户可以下多个订单(商品表)
      • 设计这个商品表

        • 目前一个用户,对应一个或者多个订单信息
        useridusernameiduserid
        001admin1001
        002xinxin5002
      • 查询id为5用户的全部信息 以及购物详情

    • 表连接:

      • 全连接:select * from 表1,表2 where 表1.公共属性=表2.公共属性(严格模式下面 成为外键)

    解决在复杂情况下,查询内容,出现只要满足表1.公共属性=表2.公共属性 数据都会出现在同一张表里面

  • 如果希望将两张表数据全部合并在一起:

    • 左连接:select * from table1 t1(别名) left join table2 t2 on t1.userid = t2.userid;
    • 以左表(table1)为基准,右表和左表进行匹配,如果左表中具有右表有的值,匹配上去像是在结果里面,左表里面没有右表的内容的,左表显示空
    • 右连接:右边为基准,左表和右表进行匹配,有的话合并到一起,没有的为空
    • 分页查询:
      • limit获取数据从哪个下标开始,每页数据量

        select * from users u left join goods g on u.userid = g.userid limit 6,3;


        selest password from user where username='admin'
        select * from users where username='admin' and password='1234';
        select * from users where username='xin' or password='1234';
        select * from users,goods where users.userid=goods.userid;

6.实现nodeJs访问mysql

  • 目前掌握sql使用,但是无法直接从前端访问数据库
  • nodejs作为中间界,构建restapi服务,符合restful标准的webservice
  • 作用:
    • 1.接收前端的任何请球和参数
    • 2.访问数据库,从数据库得到结果,反馈给前端
      • nodejs 热启动:
        cnpm install supervisor -g
      • 命令行中输入:supervisor dbserver 启动实时刷新
  • 1.安装下载一个支持mysql的插件
    cnpm install mysql –save-dev
  • 2.写dbserver.js连接数据库

  • 3.测试操作数据库

    1. 条件查询
      • 增删改返回的结果是一个对象,对象里面包括了”affectedRows:1”,说明增删改成功,反应了受影响的行数。修改和新增套用sql语句,使用占位符[ ]将结果替换掉
    2. 在web应用如何去做
      view:html+css+js+ajax
      controller 控制器里面 webservice
      model nodejs+mysql构建应用程序
    var mysql = require('mysql');
    console.log(mysql);
    //1.连接数据库需要参数
    const DB_CONFIG={
        host:'localhost',port:3306,
        user:'root',password:'123456',
        database:'node_xin' //数据库实例名字
    }
    const sql ='select * from users where username=? and age=?';
    const delete_sql = 'delete from users where userid=23';
    //2.连接数据库需要的方法,这个方法有返回结果,
    /* 连接数据库所用的方法mysql.createConnection({
    *       host:,
    *       port:,
    *       user:,
    *       password:,
    *       database:
    *   })
    *   mysql.createConnection返回的是一个连接成功的对象
    *   打开连接 conn.connect();
    *   打开以后才能操作
    *
    */
     var conn=mysql.createConnection(DB_CONFIG);
     conn.connect();//打开连接
     //通过nodejs查询当前的用户列表
     console.log("query users list begin**************");
     //3.连接成功的操作,在这里输入数据需要的sql(程序和数据库通信语言)语句,数据库就会返回结果 sql 结构化查询语句,[]占位符  在sql中有些变量并不是写死的  而是外部传入的参数 所以通过占位符来表示
     //占位符具体值在query方法[]里面进行填充
     // conn.query(sql,['admin',32],(err,result)=>{
     //     if(err){
     //         console.log(err);
    
     //     }
     //         console.log(result);
    
     // });
     conn.query(delete_sql,[],(err,result)=>{
        if(err){
            console.log(err);
    
        }
            console.log(result);
    
     });
     console.log("query users list end**************");
     conn.end();//关闭连接,释放资源

    查询:

    var mysql = require('mysql');
    console.log(mysql);
    //1.连接数据库需要参数
    const DB_CONFIG={
        host:'localhost',port:3306,
        user:'root',password:'123456',
        database:'node_xin' //数据库实例名字
    }
    const sql ='select * from users where username=? and age=?';
    var conn=mysql.createConnection(DB_CONFIG);
     conn.connect();//打开连接
    
    conn.query(sql,[],(err,result)=>{
        if(err){
            console.log(err);
    
        }
            console.log(result);
    
      });
    

    删除:

    var mysql = require('mysql');
    console.log(mysql);
    //1.连接数据库需要参数
    const DB_CONFIG={
        host:'localhost',port:3306,
        user:'root',password:'123456',
        database:'node_xin' //数据库实例名字
    }
    const add_sql = 'insert into users'+
    '(userid,username,password,address,phone,age,sex)'+
     'values(?,?,?,?,?,?,?);'
     var conn=mysql.createConnection(DB_CONFIG);
     conn.connect();//打开连接
    
     console.log("query users list begin**************");
     conn.query(add_sql,[80,'addsql','1234','beijing',0000,10,'女'],(err,result)=>{
        if(err){
            console.log(err);
        }
            console.log(result);
     });
     console.log("query users list end**************");
     conn.end();//关闭连接,释放资源
     const dbserver=(sql,[],fn)=>{
     }

    dbserver.js

service.js

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐