Mysql专栏:@Mysql
本篇博客简介:介绍mysql的基本查询
mysql的基本查询
- create
- 单行插入+全列插入
- 多行查询+指定列查询
- 插入否则更新 (不常用)
- 替换
- Retrieve
- select列
- 全列查询
- 指定列查询
- 查询字段为表达式
- 结果去重
- where条件
- 找到英语小于60分的人及其英语成绩
- 语文成绩在 [80, 90] 分的同学及语文成绩
- 数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
- 筛选出叫孙某某的同学及叫孙某的同学(模糊搜索)
- 总分在 200 分以下的同学
- 语文成绩 > 80 并且不姓孙的同学
- 孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80
- null的查询
- order by asc/desc(对结果进行升序/降序)
- 同学及数学成绩,按数学成绩升序/降序显示
- 查询同学各门成绩,依次按 数学降序,英语降序,语文升序的方式显示
- 查询同学及总分,由高到低
- 查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示
- limit
- update
- 将孙悟空的数学成绩变更为 80 分
- 将曹孟德的数学成绩变更为 60 分,语文成绩变更为 70 分
- **将总成绩倒数前三的 3 位同学的数学成绩加上 30 分**
- 将所有同学的语文成绩更新为原来的 2 倍
- delete
- 删除孙悟空的考试成绩
- 删除整张表
- 总结
一般来说对于数据的操作可以分为四种 :CURD
- C Create(创建
- U Update(更新)
- R Retrieve(读取)
- D Delete(删除)
我们下面会分别介绍这四种操作 其中R操作(读取)为重点
create
语法:
INSERT [INTO] table_name
[(column [, column] ...)]
VALUES (value_list) [, (value_list)] ...
value_list: value, [, value]
实例:
我们创建一张学生表
单行插入+全列插入
简单来说就是我们不用指定插入的列插入全部列的一条记录
下面是示例
多行查询+指定列查询
我们这里插入两条记录 指定除邮箱以外其他列
下面是示例
插入否则更新 (不常用)
我们插入一条数据的时候可能会因为主键或者唯一键已经存在而产生冲突从而导致插入失败
下面是示例
此时我们可以选择同步更新语法
INSERT ... ON DUPLICATE KEY UPDATE column = value [, column = value] ...
其中ON DUPLICATE KEY
的意思是如果发生冲突 update
后面更上需要更新的选项以及值
下面是使用实例
我们发现此时数据更新成功
当我们使用该更新语句的时候会有下面的三种情况发生
- 0 row affected: 表中有冲突数据,但冲突数据的值和 update 的值相等
- 1 row affected: 表中没有冲突数据,数据被插入
- 2 row affected: 表中有冲突数据,并且数据已经被更新
如何查看受到影响的行数
- 在使用语句后下方会显示
- 通过row_count()函数显示
替换
语法
REPLACE INTO students (id, name) VALUES (105, '曹阿瞒');
替换时会有以下两种情况发生
- 主键 或者 唯一键 没有冲突,则直接插入
- 主键 或者 唯一键 如果冲突,则删除后再插入
下面是实例
Retrieve
语法:
SELECT
[DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
LIMIT ...
下面是实例
-- 创建表结构
CREATE TABLE exam_result (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT '同学姓名',
chinese float DEFAULT 0.0 COMMENT '语文成绩',
math float DEFAULT 0.0 COMMENT '数学成绩',
english float DEFAULT 0.0 COMMENT '英语成绩'
);
-- 插入测试数据
INSERT INTO exam_result (name, chinese, math, english) VALUES
('唐三藏', 67, 98, 56),
('孙悟空', 87, 78, 77),
('猪悟能', 88, 98, 90),
('曹孟德', 82, 84, 67),
('刘玄德', 55, 85, 45),
('孙权', 70, 73, 78),
('宋公明', 75, 65, 30);
Query OK, 7 rows affected (0.00 sec)
Records: 7 Duplicates: 0 Warnings: 0
select列
全列查询
语法:
SELECT * FROM exam_result
指定列查询
语法
SELECT id, name, english FROM exam_result
查询字段为表达式
表达式不包含字段
语法
SELECT id, name, 10 FROM exam_result;
这里解释下 单个数字也算是一个表达式 但是由于并没有这一列 所以说该列的所有记录都默认为该数字
表达式包含一个字段
此时english+10
列中就会显示英语成绩+10的数据 但是该列并不会影响数据库中原有的数据
表达包含多个字段
语法
SELECT id, name, chinese + math + english FROM exam_result;
为查询结果取别名
我们可以直接在表达式后面加上一段字符作为该表达式的别名
需要注意的是 该别名只能在选择阶段取
结果去重
语法:
SELECT **DISTINCT** math FROM exam_result;
where条件
比较运算符
运算符 | 说明 |
---|---|
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL |
<=> | 等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1) |
!=, <> | 不等于(这两个符号都是NULL不安全的) |
BETWEEN a0 AND a1 | 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1) |
IN (option, …) | 如果是 option 中的任意一个,返回 TRUE(1) |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE | 模糊匹配。like ‘A%’。% 表示任意多个(包括 0 个)任意字符;like ‘A_’。_ 表示任意一个字符 |
逻辑运算符
运算符 | 说明 |
---|---|
AND | 多个条件必须都为 TRUE(1),结果才是 TRUE(1) |
OR | 任意一个条件为 TRUE(1), 结果为 TRUE(1) |
NOT | 条件为 TRUE(1),结果为 FALSE(0) |
找到英语小于60分的人及其英语成绩
语文成绩在 [80, 90] 分的同学及语文成绩
查询在区间中的数据有两种用法
用法一:
用法二:
数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
筛选出叫孙某某的同学及叫孙某的同学(模糊搜索)
总分在 200 分以下的同学
我们这里发现在前面给三门成绩取了别名总分之后在后面缺并不能使用 这是为什么呢?
这里本质上其实是因为sql语句中每句话的执行顺序不同所引起的
我们想一想 是不是首先要筛选出总分低于200分成绩的人 然后才能选择他们的名字和成绩啊
也就是说 where语句实际上是比select语句要先执行的 所以自然不能使用select语句中取的别名了
语文成绩 > 80 并且不姓孙的同学
孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80
null的查询
我们查询NULL的时候不能使用等于号 我们这里推荐的用法是IS 或者 NOT IS
order by asc/desc(对结果进行升序/降序)
- ASC 为升序(从小到大)
- DESC 为降序(从大到小)
- 默认为 ASC
- NULL 视为比任何值都小
同学及数学成绩,按数学成绩升序/降序显示
查询同学各门成绩,依次按 数学降序,英语降序,语文升序的方式显示
解释下数学降序,英语降序,语文升序的方式显示
这句话的含义 我们首先按照数学降序的方式排序 如果数学成绩相同就按照英语成绩降序 如果数学英语成绩还相同就按照语文成绩升序
查询同学及总分,由高到低
大家看到这里的sql语句是不是有点奇怪 为什么一会儿能用别名一会儿不能用别名呢?
这里能够使用别名的原因其实是因为排序这个阶段要在选择了数据之后
查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示
limit
对于未知表查询的时候我们最好加上一条limit 1 避免表中数据过大数据库卡死的情况
update
语法
UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]
将孙悟空的数学成绩变更为 80 分
将曹孟德的数学成绩变更为 60 分,语文成绩变更为 70 分
将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
将所有同学的语文成绩更新为原来的 2 倍
如果没有where的话是直接更新全表 实际上where就是加上了一个限制条件
delete
语法
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
删除孙悟空的考试成绩
删除整张表
删除整张表有两种方式
第一种就是用delete删除整张表
第二种就是使用truncate截断整张表
两种删除方式有何区别
- delete删除整表可以回滚 truncate整表不可以回滚
- delete删除表的时候不会清空auto_incement truncate删除表的时候会清空auto_incement