目录
一. . 新增 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查询
一. . 新增 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 的执行顺序:
- 遍历表
- 带入条件
- 计算列名中的表达式(定义别名)
- 排序/聚合 等操作
因为执行条件的时机, 比定义别名要靠前
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表示行数
练习: 查询总成绩前三名同学