CURD
插入数据
insert into[表名] values (对应的字段内容);
插入的字段的数目和表结构的类型要求一致
先创建一个表
create table exam_result(
id int,
name varchar(20),
chinese decimal(3,1),
math decimal(3,1),
english decimal(3,1)
);
插入数据
//单个数据
insert into exam_result values (1,'岛市老八',45.9,66.5,76.4);
//多个数据
insert into exam_result values
(1,'岛市老八',45.9,66.5,76.4),
(2,'抽象带篮子',99.9,99.5,96.4),
(3,'带带大师兄',35.9,56.5,86.4),
(4,'靳老师想开了',65.5,80.5,85.7),
(5,'口子姐',60.9,76.5,56.4),
(6,'小米粥',50.6,78.5,76.2);
查看数据
select * from exam_result;
这样的查找方式仅限于测试环境中使用,不能在生产环境中的服务器上使用
指定列插入
insert into exam_result(id,name) values(2,'太上老君');
关系型数据库由于对数据要进行大量的检验,所以牺牲了性能,换来的是完整性和可靠性,正因为关系型数据库效率比较低,再一个高并发的系统中,数据库很容易就称为性能瓶颈,数据库也是极端情况下最容易挂的服务.
指定列查找
select name,chinese from exam_result;
查询字段为表达式
查询所有同学的总成绩
select name,chinese + math + english from exam_result;
sum 是求多行数据的和,此处是求多列数据的和
所有同学语文成绩+50分
select name,chinese + 10 from exam_result;
删除操作
delete from exam_result where name = ' xxx ';
指定别名
select name,chinese + math + english as total from exam_result;
其中 as 可以省略
去重
select distinct chinese from exam_result;
select得到的结果也是一张表,(MySQL构造的一个临时表),大部分select操作的查找结果是无法和原来的表一一对应的.
使用distinct的时候必须把后面的列都放到distinct之后
排序
order by 指定针对哪个列进行排序
1.查找学生信息并按照语文成绩升序排序
select * from exam_result order by chinese asc;
2.查找学生信息并按照数学成绩降序排序
select * from exam_result order by math desc;
3.按总成绩降序
select name,chinese + math + english as total from exam_result order by total desc;
4.按照多个列来排序
先把所有同学按照语文成绩降序排序,在按照数学成绩降序排序,再按照英语成绩降序排序 (列越靠前,优先级越高)
select * from exam_result order by chinese desc,math desc, english desc;
条件查询
条件查询中涉及的运算符
- = 是比较相等,而不是赋值
- <=> 是比较相等,能够针对null进行比较
如果表达式 NULL = NULL => NULL 相当于条件不成立
*> 如果表达式NULL <=> NULL 相当于条件成立
- <>
- between x and y 表示当前值在[x,y]闭区间之间都满足条件.
- in (若干个选项) 表示当前值在()里满足任意一个都满足条件
- is null
- is not null 专门用于判定值是否为null
- like 模糊匹配 % 代表任意字符 _ 代表一个字符
- and 逻辑与
- or 逻辑或
- not 逻辑取反
具体操作
1.查找谁的语文成绩为空
select * name where chinese <=> null;
where chinese = null 是错误的写法
2.查找语文成绩比数学成绩好的同学
select name from exam_result where chinese > math;
3.查找总分在200分以下的同学
select name,chinese + math + english as total from exam_result where total < 200;
上面的代码是错误的,where 中不能使用别名
正确写法:
select name,chinese + math + english as total from exam_result where chinese + math + english < 200;
4.查询语文成绩大于60并且数学成绩也大于60的同学
select name,chinese,math from exam_result where chinese >60 and math > 60;
5.查询语文成绩大于80或者英语成绩大于60的同学
select name,chinese,english from exam_result where chinese > 80 or english > 80;
6.查询语文成绩在[50,60]之间的同学
select * from exam_result where chinese between 80 and 90;
7.查询语文成绩为60.9 或 65.5 的
select * from exam_result where chinese in (60.9,65.5);
8.查询姓带的同学
select * from exam_result where name like '带%';
9.查询叫带xx的同学
select * from exam_result where name like '带__';
10.查询语文成绩以9开头的同学
select * from exam_result where chinese like '9%';
进行复杂查询时遵循"最左原则"
11.取出总成绩最高的前三名
select name ,chinese + math + english as total from exam_result order by chinese + math + english desc limit 3;
12.从第四个同学开始取出总成绩最高的前三名
select name ,chinese + math + english as total from exam_result order by total desc limit 3 offset 3;
- 此处的 offset 可以当成从下标为3开始寻找
- 如果此处的 limit 后的数字过大超出可用结果个数,此时返回结果不会有任何错误
- 如果此处的 offset 后的数字过大超出表中数据行数,此时返回结果不会有任何错误,并返回一个空的结果.
网站的信息过大时,就会分页,分页功能就是基于limit实现
修改数据
语法
update [表名] set [列名] = [修改的值] , [列名] = [修改的值] where 子句;
1.把’太一的语文成绩改成80’
update exam_result set chinese = 80 where name = '太一';
如果不加where限定条件,此时就会把所有的记录进行修改.
update每次修改几行数据是不确定的,具体取决于where中的条件怎么写,得看where条件筛选过后还剩多少数据
2.把’太一’的数学成绩和英语成绩改成85,86
update exam_result set math = 85,english = 86 where name = '太一';
3.把所有同学的语文成绩减十分
update exam_result set chinese = chinese - 10;
4.将总分为后三名的同学英语加10分
update exam_result set english = english + 10 order by chinese + math + english asc limit 3;