• 【MySQL】超详细-基础操作


     数据库定义

    数据库是一类软件,用来管理数据,组织数据;

    • 关系型数据库MySQL(Oracle,SQL Server,SQLite)以表格形式组织数据,数据格式要求严格;
    • 非关系型数据库Redis(MongoDB,HBase)以键值对/文档形式组织数据,数据格式较松散,性能高,运用在分布式场景中;
    • 多维数据库:essbase;
    • 分布式数据库:DB2是IBM开发的一种大型关系型数据库平台;
    • (在软件开发领域中,经典结论:没有银弹)

     MySQL基本结构

    MySQL的基本结构:客服端-服务端 结构的程序

    客户端(client):发出请求的一方

    服务端(server):被动接受请求一方

    请求(request):客户端主动给服务端发的数据

    响应(response):服务端给客户端返回数据

    服务器的基本特点:

    1:7*24小时运行(引用分布式系统,做高可用支持);

    2:服务器是不知道客户端什么时候给他发请求,服务器是被动的一方;

    3:服务器(负责存储和管理数据,是数据库的本体)可以给多个客户端(和用户交互的界面)提供服务;

    (服务器本质就是一台电脑(计算机);

    计算机怎么构成的:

    CPU(中央处理器),

    主板(一块大的电路板,cup装在上面),

    内存,硬盘 ->负责存储数据的,

    电源,散热器,机箱,

    显卡(GPU 专门负责图形渲染相关的计算的,最贵的),

    显示器,鼠标,键盘;

    存储数据:

    1:内存->存储空间较小,访问速度较快,成本高,数据易失(断电数据丢失);

    2:硬盘->存储空间较大,访问速度较慢(速度比内存慢速度慢好几个数量级,一个数量级就是10倍),成本低,数据持久(断电数据不会丢失,持久是相对的,并不是永久存在);

    • 硬盘分类:机械硬盘,固态硬盘(固态硬盘比机械硬盘快一个数量级);
    • 外存:外存是一个“统称”,硬盘只是典型代表,还有U盘,软盘,光盘;
    • CPU:中央处理器,用于各种逻辑判断和算术运算(CPU是人类当前科技领域的巅峰之作,能相提并论的就是氢弹)是通用运算芯片;
    • 显卡(GPU是专用计算芯片,专门用来计算图形图像,GPU速度比CPU快;
    • 显存:显存就是专门给显卡使用的内存(平时内存是给CPU使用的,为了不冲突,会在显卡上单独焊上内存单元);
    • AI:显卡用于AI领域中;

    MySQL数据库存储数据,数据存储在硬盘(空间大,持久化存储)上;

    Redis是将数据存储在内存上,很特殊*;

    大数据:一个机器存不了的数据,使用多个机器来存储,这个操作数据的一系列技术体系叫做大数据;

    数据库的基本操作

    SQL是大小写不明感的,写成大写或者小写都可以;

    各种命名名称不能是SQL中的关键字-〉如果非要使用,可以使用反引号进行引起来;

    一个汉字占几个字节-〉这是不确定的,要根据字符集(GBK使用2个字节表示一个汉字,UTF8变长编码,一般是3个字节表示一个汉字);

    ❓误删数据库

    • 控制好权限,MySQL支持丰富的权限配置功能,根据账号限制权限;

    • 备份,重要的数据多备份几份;

    线上数据:表示真实的用户数据;

    线下数据:用来测试的数据,数据是假的;

    直观基本操作(简单)

    1:show databases; 查看现有的数据库

    2:create database 数据库名;创建数据库

    3:create database 数据库名 charset 字符集名;创建数据库指定字符集

    4:use 数据库名;选中数据库

    5:drop database 数据库名;删除数据库

    额外补充知识点(实际工作)

    2_26

    线上环境/生产环境

    一、线下环境

    1:办公环境-〉开会,做PPT,发邮件,写日报周报,软件聊天;

    2:开发环境-〉

    • 简单项目,开发环境就是办公环境;

    • 项目对环境要求较高,公司会发单独的服务器,通过办公电脑连到服务器上开发;

    3:测试环境-〉类似于开发环境

    二、线上环境

    1:生产环境-〉

    • 程序会放到上面,就可以被外面用户真实访问到,如果用户访问量比较大,对于配置比较高;

    • 在生产环境上的程序出现bug了,会被外面的用户直接访问到;

    • 把写好的程序发布到生产环境上,这个过程成为“上线”;

    • 上线是一个非常重要的操作,“误操作”引出的生产环境的问题;

    编程语言体系-〉“武当”,“少林”

    C(代码好理解,代码好写,不保证代码的正确性);Lisp(更好的能保证代码的正确性,代码不好理解,代码不好写,思考能力极强);

    MySQL中的数据类型

    1:数字

    bit 1

    tinyint 1

    smallint 2

    int 4

    bigint 8

    float(m,d) 4 (m表示长度,d表示小数位数)

    double(m,d) 8

    decimal(m,d) m/d最大值+2(要最大值)

    numeric(m,d) m/d最大值+2

    • float和double不能精确存储小数,所以避免在金钱,计算机科学前使用;

    • decimal和numeric是能够精确存储小数的,但是需要消耗的空间和时间更多;

    慎重使用 浮点数 比较相等-〉0.1+0.2=0.3 false

    2:字符串

    varchar(自定义可存放最大值) 可变长的字符串类型,varchar的单位是“字符”,而不是字节,一个汉字就是一个字符;

    text 长文本数据,长度靠自适应的,会自动扩容,但是实际开发中会明确数据存储的上限;

    mediumtext 更长文本数据,和text一样,谨慎使用;

    blob 存储二进制数据,指的是(图片,音频,视频,可执行程序,.class文件),谨慎使用;

    3:时间

    datetime 8 1000到9999年,不会进行时区的检索及转换;

    timestamp 4 1970到2038,自动检索当前时区并转换;

    4:null

    null-〉数据库中的null表示“这个单元格没填”

    MySQL核心操作(增、查、改、删 -> 详细)

    🦠create table 表名(列名 类型,列名 类型,....);创建表

    🦠desc 表名;查看表结构(desc-〉describe描述;在查询有一个desc-〉descend下降)

    🦠drop table 表名;删除表(不仅删除了表,还删除了表中的数据)

    MySQL中的注释#和-- (两横杠加一空格)

    额外补充知识点(类型)

    强类型和弱类型-〉

    • 越支持隐式类型转换的是弱类型,越不支持的是强类型(隐式类型转换就是不需要写代码就就能自动转换类型的);

    静态类型和动态类型-〉

    • 一个变量的类型,能否在程序运行过程中发生改变。允许发生改变,就是动态类型;不允许发生改变的就是静态类型;

    1:新增

    insert into 表名 values (值,值,...);

    insert into 表名 (列名,列名...) values (值,值...);

    insert into 表名 values(值,值...),(值,值...);

    insert into 表名 (列名,列名...) values (值,值...);

    MySQL中有一个专门的函数now()来获取当前系统时间;

    sql作为一个编程函数,提供了一些库函数;

    时间加入的标准是:“2024-3-2 16:01:00”

    2:查询

    select * from 表名;全列查询(select*是一个危险操作,实际工作中,生产环境上要慎用)

    select 列名,列名... from 表名;指定列的查询(列名必须存在于要查的表中)

    (select只是查询,是读操作,不会影响数据库服务器硬盘上存储的数据)

    (decimal限制的是硬盘上的数据,而不是临时表的数据,临时表能够尽可能保证最终计算结果是正确的)

    1:select*from 表名;全列查询

    2:select 列名,列名 from 表名;指定列查询

    3:select distinct 列名 from 表名;去重查询(distinct)

    4:select 列名,列名+列名 as 重命名 from 表名;计算查询

    5:select * from 表名 order by 列名/表达式;排序查询(order by)默认升序排序

    select * from 表名 order by 列名/表达式 desc;降序排序(descend)

    ❓在SQL中进行算术运算,如果其中某个操作数,结果是null,那么最后结果也是null。(我对这个定义还有一点疑问❓)

    6:select * from  表名 order by 列名1,列名2...;order by指定多个列排序(先按照列名1排序,如果列名1有相同的就按列名2排序...)

    7:select * from 表名 order by 列名1,列名2 desc...;按列名1升序排序,按列名2降序排序...

    8:👍select 列名,列名... from 表名 where 条件;

    • 条件-〉逻辑运算符,关系运算符;

    • “=”,就表示“等于”的意思。null不安全,例如:null=null结果是null。null和其他的值进行关系运算还是null,相当于false;

    • “〈=〉”,表示“等于”的意思。使用null是安全的,例如:null〈=〉null结果是true(1);

    • between a1 and a2,范围在[a1,a2]之间返回true(1);

    • in(值1,值2....)相当于是一个集合,判断这个值是不是在这个集合里;

    • is null 是null;is not null 是不为null;

    • and就是(&&)

    • or就是(||)

    • not就是(!)

    where和order by可以结合使用,where在前,order by在后;

    and的优先级比or优先级高;

    超详细查询

    1:select * from 表名;全列查询

    2:select 列名,列名... from 表名;指定查询

    3:select 表达式 from 表名;带有表达式的查询

    4:select 表达式 as 别名 from 表名;带有别名的查询(表达式查询只影响临时表)

    5:select distinct 列名 from 表名;去重查询

    6:select 列名 from 表名 order by 列名/列名 desc;排序查询

    7:select 列名 from 表名 where 条件;条件查询

    8:select 列名 from 表名 列名 like “x%”;模糊查询

    • 慎用like(🔥)

    • “x%”以x开头;“%x”以x结尾;“%x%”包含x;

    • “x_”x开头,_表示一个字,“x__”x开头,__表示两个字;

    9:针对空值的查询,〈=〉(可以通过两个列比较)、is null、is not null;

    10:分页查询(🌶️)

    • select * from 表名 limit 值;查询的值小于等于值(此处是offset 0)

    • select * from 表名 limit 值1 offset 值2;查询跳过值2的数据,查出小于等于值1的条数(offset表示的是偏移量)

    • select * from 表名 limit 值1,值2;值1是offset,值2是最大条数

    3:修改

    1:update 表名 set 列名 = 值,列名 = 值... where 条件;

    update修改的是硬盘上存储的数据,select修改的是临时表上的数据;

    4:删除

    1:delete from 表名 where 条件;删除的都是以行为维度进行删

    2:delete from 表名;删除表中所有数据

    一个sql的执行顺序

    1:遍历表

    2:带入条件

    3:计算列名中的表达式(定义别名)

    4:排序/聚合 等操作

    编程中谈到区间,区间都是前闭后开;

    数据库的约束

    约束可以理解为,数据库提供的一种针对数据的合法性,验证的机制;

    1:not null

    • 设定not null,说明列里不能存储空值,表里内容必填

    2:unique

    • 这定这一列的所有行的数据都得是唯一的(不能重复)

    3:default

    • 指定默认值,当不进行任何指定,默认值就是null

    4:primary key

    • 主键:一条记录的身份标识(类似于 学号/身份证 = not null + unique)

    5:foreign key

    • 外键涉及到两个表之间的关系

    6:check

    • 指定条件,插入/修改数据,数据符号才能插入/修改成功

  • 相关阅读:
    折纸问题
    分组查询&子查询
    国际结算习题(带答案)
    [qemu逃逸] XNUCA2019-vexx
    斩获 offer 的 Java 面试宝典
    直流有刷电机驱动基于STM32F302R8+X-NUCLEO-IHM07M1(二)
    【java】基础知识(1)
    简单的PCI总线INTx中断实现流程
    Pygame教程04:draw方法绘制矩形、多边形、圆、椭圆、弧线、直线和线条等
    CAN总线收发节点设计
  • 原文地址:https://blog.csdn.net/2201_75406088/article/details/136432323