zoukankan      html  css  js  c++  java
  • MySQL初识

    MySQL初识

    知识点

    数据库是所有软件体系中最核心的内容

    数据库的分类

    关系型数据库 SQL

    MySQL、Oracle

    通过表与表之间、行与列之间的关系进行存储

    例如 : 学生信息表与学生选课表之间的联系

    非关系型数据库 **NoSQL ** Not Only SQL

    Redis、MongDB

    通过对象存储、通过对象之间的属性去决定

    例如 : 存一个人对象到数据库中

    MySQL

    MySQL是一个 关系型数据库管理系统

    Oracle旗下的产品,之前是MySQL AB 公司的

    MySQL 是最好的 RDBMS (关系数据库管理系统) 之一

    MySQL命令行

    连接数据库

    mysql -uroot -p1024+
    

    image-20201218122201238

    修改密码

    密码存在 mysql数据库里面的 user 表里面

    image-20201218123530817

    image-20201218123425403

    修改密码语句
    update mysql.user set authentication_string=password('新密码') where user='root' and Host='localhost';
    // 刷新权限
    flush privileges;
    
    查看所有的数据库
    show databases;
    

    image-20201218165031567

    查看数据库中所有的表
    show tables;
    

    image-20201218165148542

    查看某个表的详细信息

    相当于查看表的设计结构

    describe func; -- 函数表举例
    

    image-20201218165343877

    查看一个表的结构

    以表格的形式显示一个表的各个字段的结构信息

    desc user;
    

    image-20201220090213981

    创建数据库
    create database lee; -- 创建数据库
    

    退出连接
    exit; -- 退出
    
    SQL的注释
    -- 这是一个注释
    
    /*
    多行注释
    */
    

    数据库的语言 CRUD

    DDL

    数据库定义语言 define

    DML

    数据库操作管理语言 manage

    DQL

    数据库查询语言 query

    DCL

    数据库控制语言 control

    操作数据库

    基本操作

    创建数据库

    CREATE DATABASE IF NOT EXISTS lee; -- 创建数据库 如果不存在这个数据库
    

    删除数据库

    DROP DATABASE IF NOT EXISTS lee2; -- 删除数据库
    
    查看数据库
    SHOW DATABASES; -- 显示所有的数据库
    

    数据库列的类型

    数值

    由小到大的顺序排列的

    字段类型 描述 占字节数
    tinyint 十分小的数据 1
    smallint 比较小的数据 2
    int (常用) 标准的整数 4
    bigint 较大的数据 8
    float 浮点数 4
    double 浮点数 8
    decimal 金融计算时 字符串形式的浮点数

    字符串

    字段类型 描述 占字节数
    char 固定大小的字符串 0~255
    varchar (来存取常用的 java的 String变量) 可变字符出 0~65535
    tinytext 微型文本 2^8 - 1
    text (保存大文本) 大型文本 文章 2^16 - 1

    时间日期

    对应的 java.util.Date 类

    字段类型 描述
    date 日期格式
    time 时间格式
    datatime 最常用的时间表示字段
    timestamp 时间戳 代表 : 从 1970.1.1 到现在所经过的毫秒数 是最统一的时间
    year 年份表示

    null

    就是没有值和未知的意思

    常规运算中不参与到其中

    特殊字符的处理

    如果在操作数据库时,关键字与操作的列名或者字段名相冲突,使用

    select * from time -- time 是关键字
    -- 可以写成
    select * from `time` 
    

    数据库的字段属性

    unsigned

    无符号整数

    声明该列不可以为负数

    zerofill

    0 填充效果

    自增

    • 自动在上一条的记录的基础上 + 1
    • 一般在设计在主键上
    • 必须作用于 int 类型
    • 可以自己定义主键自增的初始值与步长

    非空

    null

    不填写值,就默认填充该列为空 null

    not null

    不给其赋值时,就会报语法错误

    每张表之中固定的5个字段

    字段名称 字段含义
    id 自增主键
    version 记录版本 乐观锁
    is_delete 伪删除 标识
    gmt_create 创建时间
    gmt_update 修改时间

    运用于项目之中

    创建表时的注意事项

    使用判断重复创建

    create table if not exists `user`
    

    所有的列名必须 加上

    ``
    

    主键自增的关键字

    auto_increment

    字段注释

    comment

    一个创建表单的案例

    创建一个用户表 user

    账号 username

    密码 pwd

    主键 id

    create table `user`
    (
        -- 主键列 int宽度为4的类型    非空     自动增加     列注释为 主键自增 id
        id	int(4) not null auto_increment comment '主键自增 id',
        -- 用户名称列  可变字符长度  非空  默认值为 admin  列注释为 用户名称
        username	varchar(50)	not null default 'admin' comment '用户名称',
        -- 密码列  可变字符长度  非空  默认值是 12456 列注释为 用户密码
        pwd  varchar(50)  not null default '123456' comment '用户密码',
        -- 主键的设置  最好在建表的下面设置, 便于查看sql语句
        primary key(`id`)
    )
    -- 设置数据库引擎 
    engine = innodb 
    -- 设置字符集
    default charset=utf8
    

    要设置字符集的编码

    • mysql 默认的编码不支持中文编码
    • 默认编码是 Latin1

    建表的时候设置即可

    charset=utf8
    

    修改表

    修改表的名字

    修改用户表名字 (重命名)

    alter table `user` rename as `leeUser`;
    -- alter table 旧表名 rename as 新的名字
    

    增加一个字段

    添加一个状态列 status 向user表中

    alter table `user` add status int(2)
    -- alter table 表名 add 列名 字段类型(宽度)
    

    修改表的字段

    修改约束条件 (修改字段类型)

    • 修改 user 表的 username 列 -> int(20)
    • modify
    alter table user modify username int(20);
    -- alter table 表名 modify 列名 字段类型(宽度) ……
    

    重命名字段

    • 修改 user 表的 pwd 列 -> password
    • change
    alter table user change pwd password varchar(50);
    -- alter table 表名 change 旧的字段名 新的字段名 字段类型
    

    modifychange

    运用时的区别

    运用场景 modify change
    修改字段的类型 、长度 Y N
    重命名字段时 N Y

    删除表的字段

    删除 user 表的 status 列

    alter table user drop status;
    -- alter table 表名 drop 列名
    

    删除表

    删除 test 表

    drop table if exists test;
    -- 如果表存在,在删除
    

    所有的创建表的语句或删除修改语句,加上

    if exists
    

    数据管理

    外键(了解)

    • 通常为 java 里面的形式外键, 一般不做mysql 里面的物理外键
    • 因为在 insert update 等数据维护操作时,还要考虑外键的约束,及其不方便
    foreign key
    

    DML语言

    • 意义 : 数据存储、数据管理

    • 数据操作语言

    • insert

    • update

    • delete

    添加

    向store表中插入一条数据

    insert into `store` (`store`,`address`) values('qweq2','asdfgh2');
    

    插入多个值时

    insert into `store` (`store`,`address`) 
    values('qweq2','asdfgh2'),('qweq3','asdfgh3'),
    

    修改

    修改 store 表,id 为 2 的 address 列 设置为 黑龙江东方学院

    update `store` set `address` = '黑龙江东方学院' where `id` = 2;
    

    不指定条件时,全部都修改

    update `store` set `address` = '黑龙江东方学院';
    

    修改多个列

        update `store` set `address` = '黑龙江东方学院', `store` = '你好世界' where `id` = 4;
    

    运算符

    = <> !=

    between

    在某个区间内查找

    • 在闭合区间内的数值 between 2 and 3 --> 包含id 2,3
    select * from store where id between 2 and 3
    -- id 在 2~3范围内查找
    

    删除

    语法 delete

    • delete from 表名 where 条件
      

    清空数据库 truncate

    truncate 表名
    

    deletetruncate 的区别

    truncate 命令操作数据库时

    1. 重新设置自增列 例如:主键id 同时计数器归零
    2. 不会影响事务

    delete 命令操作数据库时

    1. 不会设置自增列 保留删除前的最后一条的 增量的值
      • 例如 : 自增id 增加到了5 -> 使用 delete 语句删除了所有数据(删库)
      • 再次增加一条记录后 id 继续叠加到 6
    2. 重启数据库,断电重开机现象
      • 不同引擎,会出现不同的现象
        • InnoDB
          • 自增列会变成从 1 开始
          • InnoDB 操作时的数据存在内存当中,断电即失
        • MyISAM
          • 自增列会继续从上一次删库的自增值继续
          • 存在文件中不会丢失

    DQL语言

    查询数据的重要语言 data query language

    字符串拼接显示查询 Concat 函数

    -- 字符串拼接显示查询  Concat
    select CONCAT('所在学院 :',address) as 拼接信息 from store;
    

    image-20201220162727981

    数据重复问题 用 distinct

    select distinct `address` from store;
    

    去除查询结果中重复的数据,只显示一条数据

    SQL 语句的模糊查询

    本质上是比较运算符

    LIKE 模糊查询

    like 关键字结合

    • % (代表后面是0~任意一个字符)

    • _ (代表后面接一个字符)

    例子

    • 查询姓的所有的信息

      select * from user where username like '李%';
      
    • 查询姓且名字只有三个字的人

      select * from user where username like '李__';
      
    • 查询名字中间是的同学

      select * from user where username like '%佳%';
      

    IN

    范围查询

    一个字段的内容的值 包含在某一个区间范围内 如 number(学号) 包含在 (1,2,3,4,5)内

    select * from user where id In(1,2,3,4,5);
    

    查询地址在北京,洛阳、河南的学生

    select * from user where username in ('北京','洛阳','河南');
    
    • IN查询为精确查询,不可以与模糊查询一起使用

    null || not null

    null 代表的是NULL ' '

    查询姓名为 null 或者 '' 的学生

    select * from user where username = '' or username is null;
    

    JOIN连接查询

    共有7种连接查询

    常见错误提示

    ambiguous

    模棱两可的,再多表连接查询时出现指代不明确字段的时候

    -- 内连接
    select a.username, b.count from user as a inner join store as b on a.id = b.uid;
    

    image-20201228141538655

    inner join 与 join 是相同的

    左连接实例

    表结构图

    person 表

    image-20201228154538107

    orderC表

    image-20201228155422468

    查询所有人订购的数量

    select a.lastname as 名字, b.orderCount as 订购数量 from person as a inner join orderc as b on a.id = b.id_p;
    

    左连接 右连接 内连接的理解

    左连接 left join

    左连接的数据是以左表的数据为主要数据,如若右表里面没有与其对应并关联的数据,那么也会列出左表的数据,而在第二个表的所查列的数值会显示为空,证明该列的值,没有被左表用到

    如图左表的所有数据

    image-20201230125041490

    连表查询的数据

    image-20201230125151431

    显然左表有佳奇 的数据,没有与之右表关联的列数据,但是同样列了出来,然而右表显示的即是为空

    右连接 与左连接的思想相反

    右表的数据

    image-20201230125624279

    包含了两个 personID是2 的列值

    左表的数据

    image-20201230125706106

    左表的数据并没有id为2的这个人

    联表查询的数据

    image-20201230125809689

    显然右表数据所对应的左表数据没有数值,但是列出了信息,并显示为NULL

    内连接 inner join

    内连接显示的是并集,必须左表有数据,右表也有数据才可以列出

    连接查询

    image-20201230130235680

    自连接 (本身联表查询)

    如一个二级或者三级菜单的数据库设计

    image-20201230134913550

    通过本身的父子ID进行连接查询实现,父子二级(或多级)菜单的查询

    自连接的查询技巧:将一个表看成两个表的拆分,进行join的连接查询

    假设:本张菜单表,有顶级菜单表

    menuID 菜单名称
    1 视频类别
    2 直播类别
    3 游戏类别
    4 文章类别

    假设:本张菜单表,有二级菜单表

    pID menuID menuName
    1 5 动作视频
    2 13 游戏主播
    3 15 FPS游戏
    4 17 创意文章

    假设:本张菜单表,有三菜单表

    pID menuID menuName
    5 22 速度与激情
    6 23 一个木头
    6 24 吉他阿木
    16 32 率土之滨

    通过将一表的表示形式,转化成三张表(三级菜单时)的抽象思维进行多表join连接,对同一个列取一些相对的别名(如菜单名称)来进行查询

    SQL

    -- 自连接查询三级菜单表
    select a.menuName as 父级菜单, a.menuID as 菜单ID, a.pID as 父级菜单ID, b.menuName as 二级菜单, b.menuID as 二级菜单ID, b.pID as 父级菜单ID, c.menuName as 三级菜单, c.menuID as 三级菜单ID, c.pID as 父级菜单ID from menu as a inner join menu as b on a.menuID = b.pID inner join menu as c on b.menuID = c.pID;
    

    image-20201230154924281

    分页和排序

    分页limit 排序order by

    排序

    基本语法

    • desc : 降序排序
    • asc : 升序排序
    select * from tableName where tableCell = '列名' order by tableCell desc (asc) 
    

    实例

    学生表按成绩降序排序

    select * from student order by score desc;
    

    image-20210101122521350

    学生表按成绩升序排序

    select * from student order by score asc;
    

    image-20210101122646567

    分页

    运用 limit

    用法:limit (起始值,页面大小 )

    从 0 开始 查询 5 条数据 并按分数降序排序

    select * from student order by score desc limit 0,5;
    

    image-20210101123843579

    分页的实现方法本身是结合前端的公式计算,从而产生的结果,后端仅仅只是执行了limit语句的查询并没有做过多计算

    分页公式

    1. 页面大小 pageSize

      该数值由分页前端的需求所指定 :指显示在本页的数据一共想要显示多少条

    2. 当前页 page

      该数值由分页前端的需求所指定 :指当前所显示的是第几页

    3. 数据总数 count

      该数值由后端计算给出 :指数据的总条数

    4. 总页数 pageNum

      • 该数值由分页前端的需求和后端计算给出 :指数据经过处理之后所形成的总页数
      • count / pageSize = pageNum
    5. 起始值 start

      • 该数值由分页前端的需求和后端计算给出 :指每一次从数据库查询时,limit的起始条数
      • (page - 1) * pageSize = start

    Mysql函数

    常用函数

    并不常用 哈哈哈哈

    数学运算

    1. abs

      绝对值

      select abs(-8);
      -- 8
      

      image-20210101132438825

    2. ceiling

      向上取整

      select ceiling(9.87);
      -- 10
      

      image-20210101132556833

    3. floor

      向下取整

      select floor(9.87);
      -- 9
      

      image-20210101132711026

    4. rand

      返回 0 ~ 1之间的随机数

      select rand();
      

      image-20210101132825477

    5. sign

      判断一个数的符号 0 返回0,整数返回1,负数返回-1

      select sign(10); -- 1
      select sign(0); -- 0
      select sign(-10) -- -1
      

      image-20210101134039028

    日期函数

    1. current_date()

      获取当前日期

      同理于 :CURDATE()

    2. NOW()

      获取当前时间

    3. LOCALTIME()

      获取本地时`间

    4. SYSDATE()

      获取系统时间

    聚合函数(重点)

    函数名 功能描述
    count 统计表中数据总行数
    max 统计该列的最大值
    min 统计该列的最小值
    avg 计算本列的平均值
    sum 计算本列的加和

    count 函数的查询注意事项

    count的聚合查询有三种形式

    count(*)、count(1)、count(列名)

    三种查询的优化对比

    count(1)count(*)

    count(1)是啥意思

    百科说的是啥呢,"其实就是计算一共有多少符合条件的行",啥意思呢。

    1 这个东西,它表示的不是咱想的表里面存在的第一个字段,它表示的是表中,咱自己遐想的一个字段,这个字段的名称就是1 ,所以说count(1)就是计算 1 这列一共有多少条,因为表的结构是平行的嘛,所以自然就代表着表中的总数据条数。

    同理:count(2)count(300)count('xyz')所查询的结果与count(1)是相同

    • 基本无差别
    • count(*)会自动优化指定到哪一个字段。所以执行效率方面几乎无差别

    count(1) 和 count(字段)

    • count(1)统计的是表中所有的记录条数,包含字段为NULL的记录
    • count(字段)统计的是该字段中记录出现的额次数,如果本列中出现空值,那就跳过计数。也就是不统计字段值为NULL的记录

    user 表

    image-20210102141722036

    count(1)

    image-20210102141839027

    count(username)

    image-20210102141916476

    摘自csdn的总结

    image-20210102142033521

    MysqlMD5加密算法

    特点: 数字指纹认证

    场景理解:比如写了一个文件叫做 readme.txt 同时对这个文件进行了MD5加密并且记录,随后将文件传输给其他人,但在中途这个文件被第三个人篡改,最后收到放拿到文件后,按照MD5加密算法进行解密,发现与记录在案的MD5数值不相同,进而发现文件被恶意篡改,配合相关认证机构,即可查证

    加密运用函数MD5

    加密插入 一条用户注册信息

    INSERT INTO testmd5(`name`,pwd) VALUES('zhang',MD5(123456));
    

    登陆验证

    select * from testmd5 where `name`='zhang' and pwd=MD5(123456);
    

    同时运用MD5加密插入,和MD5加密查询即可进行加密模式的登录验证

  • 相关阅读:
    gateway调用Fegin失败问题解决
    JVM调试命令简介
    oracle10g登录em后,提示“java.lang.Exception: Exception in sending Request :: null”
    vs2019中让ashx 文件中折叠收起代码
    oracle多表视图不自动更新,手动刷新视图获得基本表的数据
    可以对表单中的隐藏字段进行操纵 问题参数 __VIEWSTATEGENERATOR
    SQL Server 检测到基于一致性的逻辑 I/O 错误 页撕裂
    WIN2016和WIN10关闭同步主机服务,节省磁盘频繁读取,并关闭自动维护
    IIS网站应用程序配置不继承网站.net框架版本
    c#web错误码CS0227,不安全代码只会在使用/unsafe编译情况下出现
  • 原文地址:https://www.cnblogs.com/JQ04/p/14213208.html
Copyright © 2011-2022 走看看