• 【MySQL】增删查改CURD(基础版)



    前言

    明确方向+不断努力

    1. 注释:在SQL中可以使用“- -空格+描述”来表示注释说明

    2. CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写

    3. MySQL中的增删查改操作是比较重要的,尤其是【查】操作比较复杂,但是也比较重要!

    4. 【补】:

     public String toUpperCase()
    //该方法将字符串中的字母全部转化为大写状态,需要使用字符串类型接收,原来的字符串是不变的!
    
    • 1
    • 2

    也就是说:String类型调用toUpperCase方法时,是要将该字符串的所有字母全部转化为大写,但是要有String类型进行接收,原来的String字符串是不变的

    1. 【补充】:右移>>1位:相当于除以2; 左移<<1位:相当于乘以2
    2. (参考:运算符(移位)
      (左移:右侧补0,左侧不要; 右移:右侧不要,左侧根据符号位补0/1,无符号右移就补0)

    喜欢就去争取!

    一、新增

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

    1. into可以省略,但是不建议省略,因为加上into可以更加清晰

    2. value (值,值…):插入的值的类型和个数要和表的列的类型和个数匹配
      注:【字符串可以使用单引号 or双引号(因为MySQL中没有字符类型,所以使用单引号or双引号都是ok的)】

    3. 如果输入的字符串是中文时出现错误,那就说明:对于当前数据库来说,内部存储中文是需要指定对应的编码方式的(数据库默认的字符集是“拉丁文”,不能存储中文!)

    4. 查看数据库编码方式

    use 数据库名;    
    show variables like ‘%char%;
    
    • 1
    • 2
    1. 如何让数据库能够插入中文呢? 【本质上都是修改数据库的字符编码】
      ①创建数据库时就设置字符编码方式:
      eg. create database 数据库名 character set utf8;
      -> 只针对当前数据库
      ② 一劳永逸:直接修改mysql配置文件,把数据库字符集配置成默认是utf8
      -> 方法:

    Ps.
    “配置文件”:很多程序内部支持多种“模式”,可以调整当前程序,让它应用某种模式,可以通过类似“开关”来切换模式;而软件的开关通常是使用图形化界面来表示,但对于mysql等程序员专用软件则一般没有图形化界面来表示开关,而是通过一个专门的文件(配置文件)来保存这些开关;故如果程序员要修改某种模式,就需要修改该文件。

    • 找配置文件的方法:打开“服务”–> 找到mysql:右键-属性 --> 可执行文件的路径:完整复制 --> file= 之后引号中的 路径就是mysql的配置文件所在路径! --> 照着路径打开:如果打开路径后看不到ProgramData,不是没有,而是隐藏了

    (Ps.隐藏文件:系统运行的必要文件,为了防止文件被不恰当操作导致系统无法正常工作)----找到方式(顶部 查看–勾选 隐藏的项目)

    –> 找到.ini的文件并使用记事本打开编辑

    【注意:在进行编辑之前一定要先进行备份!!(因为配置文件及其关键,一旦改错,mysql就启动不了;备份之后还有还原回去的余地)】–>
    (so:在进行重大修改之前都要先进行备份!!-复制粘贴)

    –>

    (补:my.ini中#开头的都是注释; [内容]成为一个section/块; port=3306(=两侧无空格)
    类似的是配置的实际内容,一般是以键值对的方式来体现的)

    –> 在[mysql] no-beep 后面加上语句【default-character-set=utf】,如果直接有,就去掉前面的#即可;没有就加上(注意:一定要保证正确性,否则mysql运行不了) --> 在[mysqld]一直往后找,在【created…后面】 去掉【character-set-server=utf8】前面的# --> 改完后 ctrl+s保存文件 --> 重启mysql服务器(不是客户端)–> 在服务下,右键mysql选择 重新启动
    (注意:修改完后的配置只针对在这儿之后建的库,不针对之前的库,则后续需要重新建库)

    1. insert进行“指定列插入”
    insert into 表名 (列名,列名, ...) values(,,...);
    
    • 1

    【多个列间使用,分割】

    1. insert一次插入多行
     insert into 表名values(,,...),(,,...),(,,...),...;
    
    • 1

    【一个括号中代表一组值(也就是一行),这样效率更高:因为每次往数据库插入记录时并不是单纯就插入到硬盘中,还有一些额外的工作】


    二、查询

    SQL中使用select关键字

    查找语句其实是SQL中最复杂的语句

    1. 全列查找:

    1. 全列查找:查找出当前表的所有行和所有列:
    select * from 表名;
    
    • 1
    1. 【* 称为 通配符,表示所有的列】
    2. 全列查询其实是一个“危险操作”:

    select * 操作会让服务器大规模读取存储于磁盘上的数据,服务器再把数据通过网卡写回到客户端;而如果当前存储的数据量很大,就可能会导致读磁盘和写网卡的时间过长,甚至把磁盘带宽和网卡带宽都吃满,严重时甚至会导致服务器被卡死而无法正常相应其他客户端的请求。

    –> 为了反制该问题,公司里生产环境的机器,通常都是很多网卡的,一个网卡专门用来作为线上业务,一个网卡专门用于内部使用来传递大量数据。

    2. 指定列查询

    select 列名 from 表名;  
    
    • 1
    • 这里也要求列名要和表中的列名匹配,同样可以写多个列名,使用,进行分割

    【注:查询过程中显示的内容只是一个 临时表!! 所有的查询操作对于数据库服务器磁盘上的原始数据表并不会有任何的影响

    3. 查询字段为表达式(一边查一边计算)

    eg. select name(列名), english+10(给该列每个字段+10)
        from exam(表名);
    
    • 1
    • 2

    ——同样:计算只影响该临时表!

    4. 查询:各列之间的计算

    1. 计算是在相同类型之间,但是varchar之间是无法进行算术运算的,并且varchar与decimal之间也是无法进行算术运算,会报警告warnings :

    Eg. select name(列名),chinese+math+english(原来表的每条记录的对应字段之和,变成了新的表的列名以及字段) from exam(表名);

    1. 【注意:如果临时表的查询结果数据超出了原来表的范围其实并不影响:因为查询结果是临时表,临时表的数据类型不一定和原来的表一样,而是会尽量保证数据的正确有效
    2. 如果出现警告warnings信息,可以使用 show warnings; 去查看警告信息
    3. 在表达式查询过程中,临时表的列名其实就是表达式的内容,有时可读性不高,所以SQL在进行查询时运行给临时表的该列起别名:

    5. 起别名

    1. 给查询结果列起别名:
    select 表达式 [as] 别名 from 表名;// (as可以省略,但是不建议)
    
    • 1
    • 2
    1. 起别名,不仅是列名能起,表名以及表达式都可以起

    6. 查询时进行去重:

    1. distinct关键字 修饰某个列就可以对该列进行去重
    2. 【对某一列去重】:
    select distinct 列名 from 表名;  // 对该列字段去重
    
    • 1
    1. 可以【对很多列去重】,但是只有在这些列中的各列的每一条记录完全相同时才认为列相同 :

    eg. Select 列名1,列名2 from 表名;

    7. 查询结果进行排序:升序/降序/其他

    selsect 列名 from 表名 order by 列名1;  
    //(根据列名1进行排序,输出的是列名对应的字段)
    
    • 1
    • 2
    1. 【注意:未指定排序方式时,默认是:升序!
    2. 如果想要按照降序排列,在最后加上desc
    selsect 列名 from 表名 order by 列名1 desc;
    
    • 1
    1. 区分:之前的【desc 表名;】 中desc是describe缩写,表示描述; 而此时的desc是descend的缩写,表示下降
    2. 升序可以啥都不加,也可以在最后加一个asc 表示升序,但是其实没必要
    3. 【补充:此处降序这里的desc不能写全称,但是 查看表结构的desc可以写全称describe】
    4. 排序指定多个列排序:指定多个列的时候,【在原始数据表中】哪个列靠前那个列的优先级就高,先按优先级高的进行排序
    selsect 列名 from 表名 order by 列名1,列名2;  
    
    • 1

    (按列名1和列名2来排序,但是如果在原始数据表中列名2在前就说明其优先级更高:先按照列名2来进行排序,如果列名2相同再按照列名1排序)
    7. 【注意一个关键点】:就是对于按照多个列排序的多个列要分别指定排序方法:
    eg. selsect 列名 from 表名 order by 列名1 desc,列名2 desc/asc; // 不写就是默认升序

    8. 条件查询

    1. 查询的时候指定筛选条件–> where子句表示条件
    select 列名 from 表名 where 条件;
    
    • 1
    1. 条件:使用 比较运算符(注:在SQL中=不是赋值,而是比较相等)和 逻辑运算符
    2. 【比较运算符中,=和<=>都是进行比较相等,但是区别是:NULL=NUll结果是NULL,也就是相当于false; 而NULL<=>NULL就是true。
      -> 也就是体现在NULL上
    3. 条件查询相当于是针对表进行遍历:每一次取出一条记录代入条件进行判断,是true就放到结果中,是false就跳过
    4. where 条件 的时候可以使用表达式,但是条件表达式的书写和所显示的列没有关系
    5. 【条件查询的SQL中,先执行where条件部分,筛选出符合条件的记录,再执行select前半部分决定显示哪些列以及进行什么运算】
    6. 排序order by 则是在select筛选完之后执行的,所以可以使用别名
    7. 【注意】:where不可以使用别名,但是order by可以使用别名
    8. 在SQL中,AND 优先级比OR高。所以当一个条件里同时又有AND和OR的时候,先算AND后算OR; 如果想要改变优先级就加括号()
    9. 优先级问题不确定的话就添加括号来直接限定优先级
    10. 条件查询是需要遍历表的,则在表很大数据很多的时候,遍历操作是非常低效的;所以数据库中提出了使用【索引】来进行优化,更便于SQL引擎(SQL引擎:是在数据库服务器中,针对SQL语句解析的模块)来优化代码
    11. 【补充】:datetime类型获取插入当前时间值:now(),now是SQL内置的函数,获取当前时间;
    12. datetime插入指定时间数值:
      yyyy-MM-dd HH:mm:ss 一定要加引号!!

      (按照时间比较,> < = 就ok)
    13. alter table 可以修改表结构:可以新增列/删除列/修改列的类型/修改列的约束…
      (比较复杂,但是又没啥用; so:修改表更简单的做法是 drop table 、 create table)】
    14. 【注:NULL=NULL 的结果依旧是NULL,也就是false,查询不到! 与空指针NULL进行比较时使用<=>
    15. where条件可以使用表达式,但是不能使用别名!

    9. 分页查询

    limit关键字

    select 列名 from 表名 limit N;  // 查询前N条记录
    
    • 1
    select 列名 from 表名 limit N offset M;  
    // 从第M条记录开始,查询N条记录(M从0开始算)
    
    • 1
    • 2

    【建议使用这种写法:
    select 列名 from 表名 limit m,n; // 从第m条记录开始,查询n条记录 】

    • 上述的各种查询语句是可以组合在一起使用的
    • 执行顺序:where / select/ order by / limit )
      【实际上的执行顺序和代码书写顺序关系不大,实际执行顺序:先条件查询,然后排序,再查询记录条数】

    三、修改

    使用 update

    update 表名 set 列名=,列名=,... [where 条件]; 
    
    • 1
    1. 多个列名以及值之间是使用,进行连接,而不是and!!
      (明确:针对哪些表的哪些行的哪些列改成哪些值)
    2. 【NULL和其他值进行运算,结果还是NULL】
    3. update操作中,可以使用order by / limit等作为修改限制条件
    4. (SQL中没有+= 运算符)
    5. update中没有限制条件,就会对set的该列的所有值都改变
    6. 【update操作也是一个“危险”操作; delete也是危险操作】
      (注:“危险操作”:select* / update / delete)
    7. 为了反制mysql的危险操作,降低风险,提出了以下想法:
      ① 权限控制:每个人能够操作的范围是不一样的(DBA数据库管理员 拥有最高的权限);
      ② 备份:对数据内容进行定期/实时备份
      –> 这两个方案都只是在进行限制,一旦出现问题,保证杀伤力不要太大
      ③ 把问题扼杀在摇篮里:进行高危操作的时候,可以找一个有经验的小伙伴【一般找leader领导/monitor导师(师父)帮忙一起盯着】

    (但凡是进行生产环境的操作,一定要心怀敬畏!)


    四、删除delete

    【delete也是危险操作!】

    delete from 表名 where 条件; 
    
    • 1
    1. 通过条件来控制删除哪些/哪条记录;该条件选中几个记录就会删除几个记录
    2. 如果没有条件就是全部删除,相当于删表,但是不等同,因为删表是表已经不存在,全部删除删除的是记录,表依旧存在,只是该表中没有any记录,即:空表。

    (注:代码风格要尽量统一!)


    五、运算符

    1. 比较运算符

    比较

    2. 逻辑运算符

    逻辑


    THINK

    1. 新增:单行、多行插入
    2. 查询:全列、指定列、查询表达式字段、别名、去重distinct、排序order by、条件查询(比较运算符+逻辑运算符)
    3. 修改update
    4. 删除delete
    5. 相关知识点(where后面是不能使用别名的)
  • 相关阅读:
    具有柔性结构的孤岛直流微电网的分级控制(Malab代码实现)
    使用Github Action来辅助项目管理
    《微信小程序开发从入门到实战》学习二十一
    例39:使用List控件
    网站都变成灰色了,它是怎么实现的?
    UI控件Telerik UI for WinForms新主题——VS2022启发式主题
    MySQL数据类型总结与使用
    iperf3: error - unable to connect to server: No route to host 但嵌入式Linux设备
    java中类加载与双亲委派机制
    go——内存分配机制
  • 原文地址:https://blog.csdn.net/weixin_54150521/article/details/127411478