面试官: 你了解MySQL的CURD相关基础操作吗?

255 阅读6分钟

​ 所谓的 CRUD 操作就是指 增(Create ), 查(Retrieve), 改(Update ), 删(delete) 这四个操作. 而 MySQL 的工作就是组织管理数据, 先保存, 保存好了后续好进行 CRUD

增(Create )

新增操作使用 insert关键字 往表里插入数据

语法: insert into 表名 values (列的值...)

插入操作

注意:

  1. 要求values后面 () 中的字段的个数和表头约定的列数以及每个列的类型都要匹配

  2. 在SQL中表示字符串, 可以使用单引号, 也可以使用双引号在SQL中没有单独的"字符类型"

  3. 如果某一列时 datetime , 此时如何进行插入呢?

    ​ 1)通过指定格式的字符串来插入一个指定时间

    ​ 2)通过 now() 函数来插入一个当前系统时间此处的时间日期格式支持多种写法. 推荐写法: YYYY-MM- DD hh:mm:ss (例如: 2022-07-12 10:56:13)

  4. insert 进行插入的时候可以直插入其中的某一列或者某几列的, 此时其他列将采用默认值

  5. insert 还可进行多行插入, values 后面的每个 () 都对应到一行, 可以一次性的带有多个(), 多个() 之间使用逗号来分割

  6. 如果需要插入中文此时插入失败,是因为MySQL 默认的编码方式 是 拉丁文~就需要把数据库给配置成支持中文的 (配置成utf8 编码方式)

指定列插入

语法: insert into (指定列名) 表名 values();

多行插入

语法: insert into 表名 values(), (), ();

查(Retrieve)

查找语句是 SQL中 最核心也是最复杂的操作

1.全列查找

语法: select * from 表名;

最基础的查找, 全列查找, 直接把一个表的所有的列, 和所有的行都查询出来

  • * 就叫做"通配符", 表示一个表的所有列
  • * 就可以把一个表里面的所有的行和所有的列都查找到,查找的结果是一个"临时表", 此处的这个查询结果临时表, 不是在硬盘上, 而是在内存中, 随着进行了输出之后, 数据也就被释放了
  • 像select * from 表名 这个操作也是一个危险操作! 如果直接在生产环境的服务器上, 执行select * from 表名, 很可能带来灾难! 生产环境保存的数据量可能非常大的! 可能几个TB级别的, 此时就i意味着MySql服务器就会疯狂的来读取数据,瞬间就会把硬盘的IO给吃满, 一旦服务器的硬盘和网络被吃满, 此时数据库服务器就难以对其他客户端的请求做出响应, 数据库就好像废了一样
  • 因此实际开发中, 一般公司都会对SQL的执行时间做出监控, 一旦发现出现了这个时间执行的"慢SQL", 就强制把这个SQL给杀死

2.指定列查找

语法: select 列名, 列名... from 表名;

相比于刚才的全列查询, 这种指定列查询就要更高效很多, 因此平时开发中还是这种指定列查询用的多

3.带表达式的查找

语法: select 表达式 from 表名;

在查询的时候, 同时进行一些运算操作 (行和列之间)

这里的查询结果变了, 只是数据库服务器针对查询的结果进行了加工, 把加工后的数据组为临时表显示出来了而已, 原来的数据库服务器上的数据并不发生改变 (select 的方法都是临时的)

  • 这里也要注意, 临时表中的结果中的数据类型不一定和原始的表的数据类型完全一致, 临时表的类型会自动的适应, 保证计算结果是正确的
  • 上述操作都是针对列来进行的运算操作, 也就是针对指定的每一列的每一行数据都是进行相同的运算, 行和行之间并不影响

4.带别名的查找

语法: select 表达式 as 别名 from 表名;

查询字段指定别名(as 自己命名), 相当于是给查询结果的临时表, 指定新的列名

  • 上图中的 total 就是指定的别名

5.查找结果去重(distinct)

语法: select distinct 列名 from 表名;

根据查询结果, 使用distinct关键字对某列数据进行去重

6.排序(order by)

语法: select 列名 from 表名 order by 列名 asc/desc, 列名 asc/desc;

指定多个列排序的时候, 第一列为主, 第二列其次... 当第一列的值相同, 才比较第二列

  • asc 表示升序排序, desc 表示降序排序
  • 在排序中空值会被视为最小值
  • 排序也可以依据表达式或者别名来进行排序
  • select 操作中, 如果没有使用 order by , 那么查询的结果的结果是不确定的
  • 排序的时候还可以通过 order by 来指定多个列进行排序
    • 先根据第一个列进行排序, 如果第一个列结果相同, 相同结果之间再通过第二个列排序

多个列排序的时候是有明确优先级的!

  • null 和其他值一起运算结果还是 null 和 0 没关系
  • 如果不指定多个列的话, 只能指定一个列, 此时如果结果相同, 彼此之间的顺序都是不可预期的

7.条件查询

语法: select 列名 from 表名 where 条件;

select 的后面加上一个 where 句, 后面跟上一个具体的筛选条件, 查询结果就会把满足条件的记录保留, 把不满足条件的记录给过滤掉

  • where 条件可以使用表达式但不能使用别名

MySQL 中等号比较问题:

  1. MySQL 中 = 比较相等, 而不是赋值了
  2. null = null -> 结果仍然是null null 视为是false
  3. <=> 也是比较相等, 用法和 = 基本一致, 只是使用 <=> 比较空值的结果为 true
  4. BETWEEN a0 AND a1 -> 构成的一个闭区间 [a0, a1] (左闭右闭)
  5. IN(option, ...) 通过后面这个() 给出几个固定的值, 判定当前结果是否在这几个值之中
  6. IS NULLIS NOT NULL 这个也是专门用来和空值比较的

8.分页查询

语法: select 列名 from limit N offset M;

M: 表示从第 M 条开始查询 (准确的说是偏移 M 次)

N: 表示最多返回 N 条记录

  • 此处的 M 也可以省略, 如果省略表示从第 0 条记录开始返回
  • limit 是可以和 order by , where 等字句搭配使用的

让查询结果, 之取出其中的一个部分, 一页中最多显示多少个结果,在进行查找的时候,就按照页来进行返回. 从而能够降低开销, 加快查询速度

  • 例如: 论坛类的网站, 展示帖子的时候往往都会有分页展示的效果

改(Update )

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

  • 此处的修改是针对"满足条件"的记录进行修改
  • 不加 where 条件语句的话就是对这一列的每一行记录进行修改

删(delete)

语法: delete from 表名 where 条件;

  • 一定要保证where的条件是正确的, 如果没有where就会删除整张表的数据!
  • delete 将整张表删除掉的话, 表是还存在的! 只是数据没有了!
  • drop 这个操作不仅把数据删除了, 连同表也会删除掉!