目录
一. . 新增 insert
1.简单方法
insert into 表名 values (值, 值...);
- into可以省略
- 执行这个命令首先要确保已经执行use 数据库; 并且数据库中包含这个表
- 括号中的值,值... 要和定义表时的表头相对应
- 如果是varchar类型的, 想要新增字符串, 用单引号和双引号都可以
student(id int,name varchar(20));
![](https://img-blog.csdnimg.cn/direct/888e844ae9e742448f86904e7f03ce1d.png)
![](https://img-blog.csdnimg.cn/direct/1fe7760c148b478bb022d422319badf9.png)
为什么也成功了呢?
原因: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 的执行顺序:
- 遍历表
- 带入条件
- 计算列名中的表达式(定义别名)
- 排序/聚合 等操作
因为执行条件的时机, 比定义别名要靠前
2)and / or
- 查询语文成绩大于80, 且英语成绩大于80 的同学
- 查询语文成绩大于80, 或英语成绩大于80 的同学
- 注: and的优先级大于or
3)范围查询
- between...and...(左闭右闭) 是连续的区间
- 查询语文成绩在[80,90] 的同学及语文成绩
- 查询语文成绩在[80,90] 的同学及语文成绩
- in... 是离散的区间
- 查询数学成绩是58或59或98或99的同学及数学成绩
- 查询数学成绩是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, 是删除表, 表头和内容都会删掉
- 如果不指定条件, 则删除表的所有内容