MySQL表的增删改查(操作的是表中的记录)
CRUD(增删改查)
- C-Create新增
- R-Retrieve检查,查询
- U-Update更新
- D-Delete删除
新增(Create)
语法:
单行数据+全列插入
insert into 表名[字段一,字段二] values(值一,值二);
通过看表的结果,我们可以看出内容已经写好
注:列和值的数据类型一定要匹配,如果不匹配,则无法写入数据表中
简写方式(可以将表后的字段进行省略)
指定列插入
只写一个name的值,那么其他的值则会默认为null
多行插入
show databases;create database u;use u;create table student(id bigint,name varchar(50),math int,english int,chinese int);insert into student(id,name,math,english,chinese) values(1,'zhangsan',88,86,74);insert into student(id,name,math,english,chinese) values(2,'lisi',85,76,94);insert into student(id,name,math,english,chinese) values(3,'xiaoliu',65,96,84);
insert into student values(4,'xiaohe',95,76,89);insert into student(name) values('daliu');insert into student(id,name) values(5,'ni'),(6,'wo'),(7,'hao');
查询(Retrieve)
全列查询
select * from 表名
注:查询表中所有的元素是一个很危险的事情,有些数据库的表很大,如果要一次性全部查询,会导致服务器崩塌,所以在查询的时候要加许多的限制条件。
指定列查询
select 字段 +from 表名
查询的结果是一个表达式
1.在字段名后加一个10后,会在临时创建的表上添加一个全为10的新列。
2.在某一列成绩加10,会使临时创建的表整个列的成绩都加10
3.将三个成绩的相加可以求成绩之和
表达式的别名
1.select 字段名 as +别名+from 表名
2.select 字段名 +'别名'+from 表名
3.select 字段名 别名 from 表名
注:最简单的方法是select 字段名 别名 from 表名,最标准的方法是select 字段名 as '别名' from 表名
如果在别名中有空格等符号必须用 ' 别名 '的形式。
否则会报错
注:所以查询出来的表都是一个临时表,返回给我们,执行完就自动删除了。
show databases;create database u;use u;create table student(id bigint,name varchar(50),math int,english int,chinese int);insert into student(id,name,math,english,chinese) values(1,'zhangsan',88,86,74);insert into student(id,name,math,english,chinese) values(2,'lisi',85,76,94);insert into student(id,name,math,english,chinese) values(3,'xiaoliu',65,96,84);
insert into student values(4,'xiaohe',95,76,89);insert into student(name) values('daliu');insert into student(id,name) values(5,'ni'),(6,'wo'),(7,'hao');select * from student;select name from student;select id,name,10 from student;select id,name,math+10 from student;select id,name,math+chinese+english from student;select id,name,math+chinese+english as 总分 from student;select id,name,math+chinese+english as '总分' from student;select id,name,math+chinese+english '总分' from student;select id,name,math+chinese+english 总分 from student;select id,name,math+chinese+english '总 分' from student;select id 编号,name 姓名,math 数学 ,chinese 语文,english 英语,math+chinese+english 总分 from student;
去重(distinct)
select 列名 from 表名
单独去重某一个列
去重好几个列
注:去重时所有的列都相同才会被认为是可以去重的
select * from student;insert into student values(8,'xiaohai',88,76,89);select * from student;select distinct * from student;select distinct math from student;select math from student;select distinct math,chinese,english from student;insert into student values(9,'zhu',88,76,89);select distinct math,chinese,english from student;
排序
select 列名 from 表名 order by 列名[ASC/DESC ]
ASC(降序)
DESC(升序)
注:如果既不写ASC或者DESC的话,则会默认为ASC
注:NuLL数据排序,视为比任何的数据都小,包括负数,比负数都小,升序出现在最上面,降序出现在最下面。
可以使用表达式及别名进行排序
对多个字段进行排序的时候,排序的顺序与出现的先后顺序有关
先对数学按逆序排序,在数学排序的基础上对语文按顺序排序,再对英语按逆序进行排序。
注:MySQL中的null比较特殊
- 无论和什么值进行运算,返回的值都是null。
- null始值被判定为false。
- null的值不是我们学习的其他语言中的0,在MySQL就是null。
select chinese from student order by chinese asc;select math from student order by math desc;select math from student order by math ;select id 编号,name 姓名,math+chinese+english total from student order by total desc;select id 编号,name 姓名,math,chinese,english total from student order by math desc,chinese asc,english desc;
条件查询(where)
可以通过条件查询,过滤掉一些不符合条件的记录,将符合条件的记录返回给用户
比较运算符
运算符 | 说明 |
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于, NULL 不安全,例如 NULL = NULL 的结果是 NULL |
<=> | 等于, NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1) |
!=, <> | 不等于 |
BETWEEN a0ANDa1 | 范围匹配, [a0, a1] ,如果 a0 <= value <= a1 ,返回 TRUE(1) |
IN (option, ...) | 如果是 option 中的任意一个,返回 TRUE(1) |
IS NULL | 是NULL |
IS NOT NULL | 不是NULL |
LIKE | 模糊匹配。 % 表示任意多个(包括 0 个)任意字符; _ 表示任意一个字符 |
注:
模糊查询(LIKE):
字符后加 % 意思为只要是开头为xiao的,无论后面是什么,有多少个都符合条件。
字符后加 _ 意思为有几个 _ ,则在xiao后就有多少个字符。
small后有两个字符
small后有三个字符
IS NULL
IS NOT NULL
逻辑运算符
运算符 | 说明 |
AND | 多个条件必须都为 TRUE(1) ,结果才是 TRUE(1) |
OR | 任意一个条件为 TRUE(1), 结果为 TRUE(1) |
NOT | 条件为 TRUE(1) ,结果为 FALSE(0) |
注:
AND类似于Java中的 && ,OR类似于Java中的 || ,NOT类似于Java中的 !
使用where的语法:select * from 表名 where 列名/表达式 运算符 条件
练习:
1.查询英语成绩<80分的同学及英语成绩
修改后:
select name,english from student where english<80;
注:自动过滤掉了值为null的列
select name,english,chinese from student where chinese>english;
注 :在一行数据的不同列的同种数据类型是可以进行比较的,如果是不同行的数据,就算是数据类型相同也是无法比较数据的大小
3.查询总分在 260 分以下的同学
select name,english+chinese+math total from student where (chinese+math+english)<260;
注:where中的语句不能用别名去当过滤的条件,使用了表达式就不能使用别名。
错误的示范:
为什么会出现这种情况呢?
出现这种情况跟MySQL中的SQL语句的执行顺序有关
- 如果在数据中查询某些条件,首先要确定表,执行from
- 在查询的过程中要根据查询的条件把符合条件的数据取出来,执行where子句
- 执行select后面指定的列,要把这些列加入到最终的结果中
- 排序操作,根据order by 将指定的列按排序规则进行最后的排序
4.查询语文成绩大于80分,且英语成绩大于80分的同学
select name,chinese,english from student where chinese>80 and english>80;
5.查询语文成绩大于80分或英语成绩大于80分的同学
select name,chinese,english from student where chinese>80 or english>80;
注:
优先级:NOT>AND>OR,我们不需要记,只需要在使用的时候加括号。
6.查询语文成绩在 [80, 90] 分的同学及语文成绩
select name,chinese from student where chinese between 80 and 90;
select name,chinese from student where chinese<=90 and chinese>=80;
也可以使用AND
7.查询语文成绩是74 或者 84分的同学及数学成绩
mysql> select name,chinese from student where chinese in(84,74);
select name,chinese from student where chinese=74 or chinese =84;
也可以使用OR
分页查询(Limit)
分页查询可以有效的控制一次性查询出来的条数,可以减小数据库服务器的压力,是一个非常友好的行为。
1.从 0 开始,筛选 n 条结果
n表示一次性查询出的条数
2.从 s 开始,筛选 n 条结果
3.从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
从0开始,限制两条
从2开始,限制两条
练习:
按 id 进行分页,每页 2 条记录,分别显示第 1、2、3 页
按顺序
select * from student where math order by id asc limit 2 offset 0;
select * from student where math order by id asc limit 2 offset 2;
select * from student where math order by id asc limit 2 offset 4;
按逆序
select * from student where math order by id desc limit 2 offset 0;
select * from student where math order by id desc limit 2 offset 2;
select * from student where math order by id desc limit 2 offset 4;
注:因为id为5,6,7都是NULL,所以默认不会读入。
修改(update)
练习
1.将xiaohe同学的数学成绩变更为 80 分
update student set math='80' where name='xiaohe' ;
注:
2.将xiaoliu同学的数学成绩变更为 60 分,语文成绩变更为 70 分
update 表名 set 列=?,列=? where 限制的条件
update student set math=60 and chinese=70 where name='xiaoliu' ;
3.将总成绩倒数前三的 3 位同学的数学成绩加上3分
原本成绩
select * from student;
进行修改
update student set math=math+3 where math order by math+english+chinese desc limit 3;
修改后成绩
select * from student;
4.将所有同学的数学成绩更新为原来的 二分之一倍
原来的成绩
select * from student;
进行修改
update student set math =math*2 where math;
修改后的成绩
select * from student;
删除(delete)
练习
select * from student;
delete from student where name='daliu';
select * from student;
2.将数学成绩倒数三名的人删除
删除前
select * from student order by math asc;
进行删除
delete from student order by math asc limit 3;
删除后
select * from student;
注:在删除时如果不加where条件会怎么样?
会导致整张表全部被删除,所以一定要慎重!!!!
希望能对大家有所帮助!!!!!