MySQL表的增删改查

目录

一. . 新增 insert

1.简单方法

2. 指定列插入

3. 一次插入多行记录

二. 查询 select

1.最简单的查询, 全列查询

2. 指定列查询

​编辑 3. 表达式查询 

1)简单表达式查询

2)带别名的表达式查询 

4. 去重查询

5. 带有排序的查询

1)单个列排序

 2)多个列排序:

​编辑 **6. 条件查询(重要)

1)基本查询

2)and / or

3)范围查询

4)模糊查询 like

5)针对空值的比较

7. 分页查询

1)简单分页查询

2)带offset查询

3) 省略offset查询

三. 修改 update

1. 简单修改

 2. 一次修改多个列

3. 表达式的修改

4. 搭配 order by 或 limit

5. 不指定条件

 四. 删除 delete


一. . 新增 insert

1.简单方法

语法:
insert into 表名 values (值, 值...);
说明:
  • into可以省略
  • 执行这个命令首先要确保已经执行use 数据库;  并且数据库中包含这个表
  • 括号中的值,值... 要和定义表时的表头相对应
  • 如果是varchar类型的, 想要新增字符串, 用单引号和双引号都可以

student(id int,name varchar(20));

添加成功!
如果我们这样插入:

为什么也成功了呢?

原因:mysql是一个"弱类型"的 编程语言, 和java 这种"强类型"的编程语言是不同的

当mysql发现字符串'100'可以转化成int100, int2可以转化成字符串'2'时, 就会发生'隐式类型转换', 不会报错

2. 指定列插入

语法:

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

说明:

  • 列名个数和顺序不需要和表头一致,但要确保列都存在
  • 没有被添加的列会填NULL

3. 一次插入多行记录

语法:

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

说明: 一次插入多条记录, 往往比依次插入一条记录, 分三次差效率高

 datetime类型插入:

 插入datetime类型的数据, 要按照'2024-4-21 18:37:00' 的格式

例如, 我们新建一个表

插入数据:

 如果我们想插入当前的系统时间, 就要用mysql中专门的函数 now() 来获取:

SQL作为编程语言, 也提供了一些库函数, 但不像C/java 是标准库

二. 查询 select

1.最简单的查询, 全列查询

select * from 表名;

2. 指定列查询

select 列名,列名... from 表名; 

注意: 列名的顺序不影响 

 3. 表达式查询 

1)简单表达式查询

select 表达式 from 表名;

说明:

  • 查询的结果不仅仅是列, 而是可以将列带入到表达式中, 进行运算
  • SQL在进行算术运算时, 如果其中的某个操作数是NULL, 那么结果就是NULL, NULL怎么算都是NULL

假设创建这样的表:

 通过表达式查询:

注意:select 的所有用法, 都不会影响数据库服务区硬盘上存储的数据!!! 

上述我们知道chinese类型是decimal(3,1) 数字长度为3, 小数位数为1

那么如果我们将chinese+100, 数字长度变为4 可不可以呢?

显然是可以的

此时查询到的结果是一张'临时表' 并不存储到硬盘上decimal(3,1) 限制的是硬盘上的数据, 而不是临时表, 临时表会尽可能的保证你的计算结果是正确的 

表达式查询还可以多个列参与运算:

2)带别名的表达式查询 

 述过程中, 表达式就成了临时表表头的名字, 如果表达式太复杂就不太直观, 因此可以给临时表的列起别名

select 表达式 as 别名 from 表名;

说明:as可以省略, 但不建议

4. 去重查询

针对查询结果, 存在重复的数据, 就会把重复的数据合并成一行

select distinct 列名 from 表名; 

 假设先添加一个重复列:

去重查询:

如果是两个列去重查询, 必须是两个列的值都相等, 才能去重

5. 带有排序的查询

注:select 查询的默认结果是"无序"的, 要想让查询结果"有序", 就必须手动使用order by 语句, 让mysql主动排序!!!

1)单个列排序

语法:

select .... from 表名 order by 列名/表达式 [desc];

说明: 

  • select 后面的是要显示的列, 可以做去重等操作
  • order by 默认是按升序排列, 如果想要降序, 需要加desc关键字, 即order by 列名/表达式 desc; (desc 是descend 的缩写)
  • 排序 是按照行为单位进行排序的
  • NULL在order by 中, 视为"最小值", 如果存在多个NULL, 那么多个NULL 之间的顺序是不确定的

 举例:

升序:

 降序:

表达式:(可以用别名代替)

 order by 后面的表达式 不一定非要出现在select 后面:

 2)多个列排序:

select ... from 表名 order by 列名[desc],列名[desc]... ;

规则: 先按照第一个列名排序, 如果第一个列名相同, 按照第二个列名排序, 以此类推...

 **6. 条件查询(重要)

比较运算符:

注意:

  • SQL的'=' 是判断相等的意思, 没有'=='
  • null = null 的结果是null 即为false
  • null <=> null 的结果为true
  • 想判断某一个数据是否为空, 用<=>

逻辑运算符:

 相当于java中的 && || !

语法:

select ... from 表名 where 条件;

用逻辑运算符/条件运算符来描述条件

1)基本查询

  • 查询英语不及格的同学及英语成绩
  •  查询语文成绩好于英语成绩的同学
  • 查询总分在 200 分以下的同学

上述我们使用order by的时候可以用别名代替, 那么where是否可以呢?显然是不可以的!

原因:

一个SQL 的执行顺序:

  1. 遍历表
  2. 带入条件
  3. 计算列名中的表达式(定义别名)
  4. 排序/聚合 等操作

因为执行条件的时机, 比定义别名要靠前

2)and / or

  • 查询语文成绩大于80, 且英语成绩大于80 的同学
  • 查询语文成绩大于80, 或英语成绩大于80 的同学
  • 注: and的优先级大于or

3)范围查询

  • between...and...(左闭右闭)  是连续的区间
    • 查询语文成绩在[80,90] 的同学及语文成绩
  • in... 是离散的区间
    • 查询数学成绩是58或59或98或99的同学及数学成绩

4)模糊查询 like

  • % 表示任意个数的任意字符(包含0)
  • _ 表示一个任意的字符

5)针对空值的比较

  • is [not] null
  • <=>   也可以用于针对两个列的比较

7. 分页查询

有时候, 虽然是进行条件查询, 但是查询到的结果仍然会非常多, 如果直接把内容显示出来, 也不一定就合适

1)简单分页查询

select ... from 表名 limit n ...;

 说明: 只查询前n条记录

2)带offset查询

select ... from 表名 limit n offset m ... ;

说明:offset称为偏移量(相当于下标), 即跳过m行, 从第m+1行进行查询

3) 省略offset查询

select ... from exam_result 表名 limit m , n ... ;

 说明: 此时m表示偏移量, n表示行数

练习: 查询总成绩前三名同学

三. 修改 update

1. 简单修改

update 表名 set 列名 = 值 where 条件;

 注意: update会修改服务器硬盘上存储的数据

例: 将孙悟空同学的数学成绩改成80

 2. 一次修改多个列

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

例: 将曹孟德同学的数学成绩变为60,语文成绩变为70

3. 表达式的修改

update 表名 set 列名 = 表达式 where 条件;

 例: 把唐三藏的语文成绩+10

 如果把唐三藏的语文成绩再+20:

报错!  因为再加20 成绩超过两位数, 而我们定义时这个列最多能存三位数, 小数占一位, 整数部分只能存两位, 超过了范围, 所以修改失败!!! 

4. 搭配 order by 或 limit

update 表名 set 列名 = ... order by ... limit n;

例: 将总成绩倒数3位的数学成绩+10

5. 不指定条件

如果update不指定条件, 相当于条件永远为true, 所有的数据都会被修改

所以, 修改操作是一个非常危险的操作, 在日常开发中, 我们常与limit 1 搭配使用, 减少错误!!!

 四. 删除 delete

delete from 表名 where 条件;

注意:

  • 删除都是以"行" 为单位的 
  • delete是删除表内容, 不会删除表头drop table, 是删除表, 表头和内容都会删掉
  • 如果不指定条件, 则删除表的所有内容
  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值