目录
- 前言
- 1. 新增 insert
- 补充: 插入时间日期 (datetime 类型的数据)
- 2. 查询 select
- 2.1. 全列查询 select * from 表名;
- 2.2. 指定列查询 select 列名,列名... from 表名;
- 2.3. 表达式查询 select 表达式 from 表名;
- 2.4. 给查询结果指定别名 select 表达式 as 别名 from 表名;
- 2.5. 查询的时候进行去重 select distinct 列名 from 表名;
- 2.6. 查询的同时进行排序 select 列名 from 表名 order by 列名;
- 2.7. 条件查询 select ... where ...
- 模糊查询 like 关键字
- where 列名 is (not) null
- 2.8. 分页查询 select ... limit ...
- 3. 修改 update
- 4. 删除 delete
前言
在 MySQL 中,在对表中的数据进行增删查改之前,要确保选中数据库,并且创建好对应的表
1. 新增 insert
实际上 sql 使用 insert 来往表里插入数据
insert into 表名 values(数据, 数据…);
这里注意:在sql中,字符串可以使用 ’ ’ 也可以使用 " "
可以把一个数据插入到指定的列: insert into 表名 (指定的列) values(数据);
还可以一次插入多组数据,在values 后面写多组 () 即可
mysql 是一个客户端 - 服务器结构的程序
客户端和服务器之间, 使用网络进行通信
因此,每个 sql 都涉及到下面的交互过程:
补充: 插入时间日期 (datetime 类型的数据)
用特定的格式化字符串来表示时间日期:
这里的 ‘2024-2-22 11:45:00’ 是一个格式化时间字符串, mysql 会自动解析这个字符串,转换成 8 个字节的时间戳 (整数)
也可以用 now() 函数直接获取到当前的时间日期
2. 查询 select
所有的 select 操作都是得到临时表进行操作,不影响数据库本体上的数据
2.1. 全列查询 select * from 表名;
‘*’ 称为通配符
在公司的生产环境服务器上,不要随便敲 select *,因为公司的服务器上,数据可能非常多,一旦数据量很大,此时这个操作就会产生大量的硬盘IO 和 网络 IO 就可能把硬盘或者网卡的带宽给吃满,一旦带宽吃满了,此时服务器就无法正常响应其他客户端的需求了
2.2. 指定列查询 select 列名,列名… from 表名;
2.3. 表达式查询 select 表达式 from 表名;
把查询出来的每一行,都带入表达式进行运算,这里先创建出一个新的表然后在这个表当中增添数据
这里的 english + 10就是一个表达式,对原来的英语成绩的数据进行了计算
这里注意:
- 当前的表达式查询,并没有修改服务器上硬盘中存储的数据本体,只是在查询结果的基础上进行运算的,得到的是一个临时表,当这个表达式查询结束的时候,这里的数据就消散了,但是数据库服务器 (数据的本体) 内容不会发生任何改变 .select 进行的任意操作,都不会修改数据本体
- 此处查询出来的临时表,每个列的类型不再受限于原始表,比如, english 列的类型是decimal(3,1),如果原始数据是100.0就是不合法的,但是在临时表中,会保证数据的正确性,也就不会收到 decimal(3,1)的限制
表达式还可以是多个列之间进行运算
2.4. 给查询结果指定别名 select 表达式 as 别名 from 表名;
如果表达式比较复杂,建议给表达式起一个别名
as 可以省略,但不推荐省略
2.5. 查询的时候进行去重 select distinct 列名 from 表名;
如果想要在查询结果中重复的元素只想保留一个,就用 select distinct 列名 from 表名;
它会根据查询的出的列名进行去重,把列的值相同的记录合并成一个
如果要查找多个列去重,这个时候必须是多个列的值都是相同的,才算是重复
2.6. 查询的同时进行排序 select 列名 from 表名 order by 列名;
order by 只是针对临时表进行排序,不会影响到键盘上的数据的顺序
如果一个查询语句没有 order by ,此时查询到的结果集 (临时集) 数据之间的相互顺序是不可预期的
一定要使用 order by 才能够明确指定一个顺序
order by 也可以指定多个列来进行排序,指定多个列的时候,是带有优先级的,前面的列优先级高,后面的列优先级低
优先级高的列值相同,才会比较优先级低的列
没有排序的例子
升序排序了 chinese 的例子
降序排序了 chinese 的例子 ( 后面多加了 desc, 此处的 desc 是 descending order 降序 )
2.7. 条件查询 select … where …
查询的时候,指定筛选条件,条件满足,这个数据就被保留 (作为结果集,就是所有满足条件的数据) ,不满足,这个数据直接跳过
如何表示条件?
一些例子:
in(可以填一些离散的数据),查询的时候如果有在表中找到就会显示
在条件查询中, = 就表示比较相等
还可以使用表达式描述条件, 如果where 后面同时有 or 和 and,优先级是 and,然后是 or
这里使用别名就会报错
因为 SQL 的执行顺序是:
- 取出一条记录 (遍历表)
- 把记录带入条件,判定是否满足
- 如果条件满足,再把 select 后面指定的列取出来,并且进行一些表达式运算
上面这个过程是先执行的 where,后执行的表达式取别名操作
模糊查询 like 关键字
需要用到通配符
% : 匹配任意个任意字符, % 也可以匹配到 0 个字符
_ : 只能匹配到一个字符
where 列名 is (not) null
不能写 列名 = null,但可以写 列名 <=> null, <=> 符号相比于 = 可以进行空值的比较
2.8. 分页查询 select … limit …
limit 限制这次请求返回多少个记录 (一页里有几条)
还可以使用 offset 描述当前结果从第几条开始获取,不写 offset 默认就是第0条
3. 修改 update
update 表名 set 列名 = 值 where 条件 / order by / limit;
update 的操作都不是临时表了,都是修改硬盘数据了
此处的 = 就是赋值了
set 设置
where 条件 就是要修改哪些行
进行修改,是要定位到行和列,再修改值
如果条件不写,就是针对所有的行进行修改
对于 update 也可以使用 order by , limit 一些操作的
比如:将总成绩倒数前三的 3 位同学的数学成绩加上 10 分
4. 删除 delete
delete from 表名 where 条件 / order by / limit;
把条件匹配出来的符合要求的记录,给删除掉
如果删除语句中没有指定任何条件,就会删掉表里的所有数据
删除所有数据,和 删表,还是有一些差别
drop table 是把表 本身 和 表里的数据都给删掉了, delete 则只是删除了表里面的数据