MySql-单表中数据增删改查(查是最重要的)

申明写作风格:

  1. 先写大的方向,例如添加数据
  2. 再写方法
  3. 再给截图,一般含有注释
  4. 给代码,套路。

添加数据

方法一:给一行数据的所有字段添加数据
在这里插入图片描述

insert into teacher values(001,"jack",78.4,89,76,'新闻学');
--insert into 表名 values(所有字段一一赋值);
--varchar单双引号都行

方法二: 给一行数据的指定字段赋值
在这里插入图片描述

insert into teacher (name,math) values("tom",8.6);
--insert into 表名 (字段名1,字段名2,字段名3,字段名4) values(字段名1的值,字段名2的值,字段名3的值,字段名4的值);
--字段名表中有哪些,想给哪些字段添加数据,没有赋值就全部赋值给null

方法三: 一次插入多条数据
在这里插入图片描述

--语法
--也就是values后面()之间用逗号隔开
insert into 表名(字段1,字段2) values (),(),(); --这是给指定字段插入三条数据
 

修改数据

方法一:某一字段全部修改,这种适用于特殊情况,某一字段取值完全相同。
在这里插入图片描述

update teacher set math=78;
--update 表名 set 字段名=值;

一次性修改多个字段

update teacher set math=78,major="软件工程";
--update 表名 set 字段名1=值,字段名2=值;

条件下修改一个甚至多个字段值

在这里插入图片描述

update teacher set chinese = 99, math = 88 where name ='lucy';
--update 表名 set 字段1 = 值, 字段2 = 值 where 某一字段 = 取值;

删除数据

一句话删空整张表,强烈不建议使用,不建议使用。而且这个是一行一行数据删除,效率低下。
在这里插入图片描述

 delete from teacher ;
 -- delete from 表名 ;
 --一键删空表中数据

一句话删除指定字段
如果是删除没有赋值的字段,即字段取值为null
在这里插入图片描述

delete from teacher where chinese is NULL;
--delete from 表名 where 字段名 is NULL;

删除赋值的
在这里插入图片描述

delete from teacher where name = 'john';
--delete from 表名 where 字段名 = 值;

一键删除表中数据,并保留表的结果,此行为很危险,谨慎使用
在这里插入图片描述

 truncate teacher;
 --truncate 表名;
 --truncate table 表名;
 --上面两种方式都行,效果是一样的

几种删除的不同点

  1. delete可以加条件删除,这样比较好,比较安全,这种可以回滚,也就是说误删可以找回来,前提是开启事务
  2. truncate一键删除表中数据,本质过程是删除整张表,再创建一张新表。速度很快,但是误删就真的没了,很严重,开启事务也无法回滚。

查询数据

前提条件:有个t_user表,有如下字段,表中有如下信息。
在这里插入图片描述
在这里插入图片描述

查询所有数据
方法一

在这里插入图片描述
在这里插入图片描述

代码如下:

SELECT * FROM t_user;
--SELECT * FROM 表名;
--这种方式简单,但是对于程序来说,需要将*解析出所有字段,所以字段多了,效率就不高
方法二

在这里插入图片描述
在这里插入图片描述

SELECT id,NAME,gender FROM t_user;
--SELECT 字段1,字段2,字段3...说有字段 FROM 表名;
--效率比第一种高
查询数据给列取别名

as取别名

结果

SELECT id,NAME AS '姓名',gender AS '性别' FROM t_user;
--SELECT 某字段 as '新字段名'  FROM 表名;

查询数据合并列

有个条件,字段类型必须是数字,一般用于统计,求和等。一般要取新的名字
字段之间只可以进行±*/四则运算。不一定非要是例子的加法

SELECT (math + chinese)AS '总分' FROM t_user;
--SELECT (某字段1 + 某字段2 - ... * 某字段n) as '新字段名'  FROM 表名;
查询时去除重复记录

在这里插入图片描述
在这里插入图片描述

SELECT DISTINCT NAME FROM t_user;
--SELECT DISTINCT 字段 FROM 表名;
--好像distinct 只能放在开头,并且有多个字段时,是多个字段都相同才去重
条件查询

查询出满足条件的字段,不是查询所有字段.

--语法结构
--select 字段1,字段2... from 表名 where 条件;

where和and 或者or搭配

在这里插入图片描述

SELECT id ,NAME FROM t_user WHERE NAME = '张三' AND gender = '男';
--SELECT 字段1 ,...字段n FROM 表名 WHERE 字段x = '值' AND 字段y = '值';

在这里插入图片描述

SELECT id ,NAME FROM t_user WHERE NAME = '王五' OR gender = '男';
----SELECT 字段1 ,...字段n FROM 表名 WHERE 字段x = '值' OR 字段y = '值';
where和<、>、<=、>=、!=、<>、between x and y 搭配

小于
在这里插入图片描述

SELECT id ,NAME ,gender FROM t_user WHERE id < 3;
--SELECT 字段1 ,...字段n FROM 表名 WHERE 字段 < 值;

不等于
在这里插入图片描述


SELECT id ,NAME ,gender FROM t_user WHERE id <> 3;
--SELECT 字段 FROM 表 WHERE 字段 <> 值;
--<>就是不等于的意思, != 也是不等于的意思

不等于方法二
在这里插入图片描述

SELECT id ,NAME ,gender FROM t_user WHERE id != 3;
--SELECT 字段 FROM 表名 WHERE 字段 != 值;

在某区间(闭区间)
between m and n 包含区间的两个端点值m,n ,并且m的值小于n的值。
在这里插入图片描述

SELECT id ,NAME ,gender FROM t_user WHERE id BETWEEN 3 AND 4;
--SELECT 字段 FROM 表名 WHERE 字段 BETWEEN 值 AND 值;

在这里插入图片描述

SELECT id ,NAME ,gender FROM t_user WHERE NAME BETWEEN '张三' AND '王五';
--SELECT 字段 FROM 表 WHERE 字段 BETWEEN '值' AND '值';
--字符串也可以用between and
判空查询
is null或者 is not null

在数据库中,null只能使用is 进行等于判断,不能使用=
null是啥都没有,真的空
在这里插入图片描述

SELECT * FROM t_user WHERE NAME IS NULL;
--SELECT * FROM t_user WHERE 字段 IS NULL;
--这个是判断是null

在这里插入图片描述

SELECT * FROM t_user WHERE NAME IS NOT NULL;
--SELECT 字段 FROM 表名 WHERE 字段 IS NOT NULL;
--查询某一字段不为空,可以查出某一字段为''的
’ '用=

''这个是空字符串,还是有值的
在这里插入图片描述

SELECT * FROM t_user WHERE NAME = '';
--SELECT 字段名 FROM 表名 WHERE 字段 = '';
--判断是不是空字符串

在这里插入图片描述

SELECT * FROM t_user WHERE NAME <> '';
--SELECT 字段 FROM 表名 WHERE 字段 <> '';
--查询字段不为空字符串
模糊查询
like和%或者_搭配使用

like 就是模糊查询主要用于字符串, %表示任意个字符长度,可以是0,1,2…个字符串;_表示一个字符
在这里插入图片描述

SELECT * FROM t_user WHERE NAME LIKE '王_';
--SELECT 字段 FROM 表名 WHERE 字段 LIKE '*_';
--上面这个表示以*开头的只有两个字的字符串,

在这里插入图片描述

SELECT * FROM t_user WHERE NAME LIKE '%_';

枚举查询
in(值1,值2,…值x)

在这里插入图片描述

SELECT * FROM t_user WHERE id IN(1,5,16);
--SELECT 字段 FROM 表 WHERE 字段 IN(值1,值2,...值x);
--只能查到取值和In里面的每个确切的值
分组聚合查询
常用的分组聚合函数: sum() avg() max() min() count()

分组聚合函数的特点:将表中多行数据以一行的形式输出。输出的结果一定是一行数据。同时忽略null这个数据
一般放在select 之后,并且能作用于数字,除了count()可以还作用于字符串,select在分组函数后面执行。没有写group by 的查询,整张表看成一组。
分组聚合函数不能放在where后面,因为where先于分组函数执行,但是分组函数必须先执行才能用。
5个分组函数自动屏蔽null

  • sum()求和
  • avg()求平均值
  • max()最大值
  • min()最小值
  • count()统计个数,但是不会加上取值为null的个数,统计表中数据个数时建议数主键数
    在这里插入图片描述
SELECT SUM(id) AS '主键值之和' FROM t_user ;
--SELECT SUM(id) AS '新的名字' FROM 表 ;
--如果不用新名字,那么就会显示 sum(id)不过意思也很明确

在这里插入图片描述

SELECT MAX(id)  FROM t_user ;
--SELECT MAX(字段)  FROM 表名 ;

在这里插入图片描述

SELECT MIN(id)  FROM t_user ;
--SELECT MIN(字段)  FROM 表名 ;

在这里插入图片描述

SELECT AVG(id)  FROM t_user ;
--SELECT AVG(字段)  FROM 表名 ;

count
在这里插入图片描述
在这里插入图片描述
count 不统计null取值的个数。
count(*)和count(某个字段)有何区别。
count(*)统计表中元素的个数,即查询有几行,因为一个表中不可能所有字段为null。
count(某个子段)是统计某个字段中除了null的其他所有字段。

分页查询,限定查询
limit offset_start,row_count

例如 limit 4,5 表示 从第四行开始,总共统计5行
起始行是从 0 开始,代表了第一行。第二个参数代表的是从指定行开始查询几行
在这里插入图片描述
在这里插入图片描述
说明limit 表示起始行为0

排序查询
order by ()

order by()默认是升序,也就是0,1,2,3…;如果想降序就order by() desc

  • order by() 效果和order by()asc是一样的,升序
  • order by() desc,降序
    在这里插入图片描述
select * from t_user order by id;
--select 字段1,字段2... from 表名 order by 字段;
--select 字段1,字段2... from 表名 order by 字段 asc;
--上面两种都是升序越来越大

在这里插入图片描述

select * from t_user order by id;
--select 字段1,字段2... from 表名 order by 字段 desc;
--这是按照字段降序,一般用于查询最大的几个值的时候

在这里插入图片描述

select * from t_user order by id desc ,gender;
--select 字段1,字段2... from 表名 order by 字段1 , 字段2;
--先按照字段1排,如果字段1加上desc就是先按照字段1降序排,字段1起主导作用
--如果字段1的值相同的时候,字段2才起作用,
分组查询(重要)

先进行分组再进行条件筛选
group by()必须放在where后面
select 后面字段只能是group by 后面的字段和聚合函数。
在这里插入图片描述

在这里插入图片描述

SELECT gender , COUNT(gender) FROM t_user GROUP BY gender;
--SELECT 字段 , COUNT(字段) FROM 表名 GROUP BY 字段;
--一般前面select 后面就是跟group by 字段和集合函数
分组查询多个字段。

group by 接多个字段,那么多个字段都相同的分为一组,否则就不会分成一组。
看个例子
在这里插入图片描述
在这里插入图片描述

分组查询后再过滤

group by …having …
having只能放在group by 后面,而且不能单独使用。having作用和where是一样的过滤。但是where后面不能能使用分组函数max(),min(),avg()所以就有having 这个关键字
举个栗子:查询年龄大于平均年龄的人数。

select count(*) from user where age > avg(age) group by gender;--注意这行是错误的。
select count(*) from user  group by gender having age >  avg(age);--这行是正确的
查询去重

使用distinct关键字查询去重,查询不会修改原表,只是输出看的时候没有重复的记录。
使用distinct 查询的时候前面不能添加其他字段。字段只能出现再distinct后面的,后面有多个字段时是多个字段联合去重,也就是多个字段相同的只能显示一个。
在这里插入图片描述

在这里插入图片描述

查询语句的套路

我们写的顺序

select 字段1,字段2... from 表名 where 条件 group by 聚合条件 having 筛选条件 order by 字段 (asc|desc) limit 起始行,总行数;

实际执行的顺序

--代码实际执行的顺序
-- from 表名
--where 条件
--group by 聚合条件 
--having 筛选条件
--select 字段1,字段2...
--order by 字段 (asc|desc)  排序总是在最后执行
--limit 起始行,总行数

where 和having 有何区别

  • where 和having 都是筛选条件
  • where 可以独立使用
  • where 和 group一起使用。where 放在group 的前面,执行顺序是先按照条件筛选出来再进行分组
  • having一般和 group by 一起连用。having 放在group by 的后面,执行顺序是先分组然后将组里面的按照条件进行筛选。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值