删除数据:delete、truncate和drop的区别

  1. delete from 表名 where 条件<br /> 属于DML操作语言,删除表中所有的数据并且保留主键,不释放空间<br /> truncate table 表名<br /> 属于DDL定义语言,只删数据,不删表结构,无法找回,立即释放空间<br /> drop table 表名<br /> 属于DDL定义语言,删表无法找回,立即释放空间<br />执行速度: drop > truncate > delete

属性:

  1. 3. primary key 主键<br /> 主键:代表一张表的唯一表示,主键不能为空,不能重复,对字段有约束作用<br /> 通过主键可以区分其他字段相同值的时候,这是完全不同的数据<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/21682952/1635166800893-3d9aef16-57ce-4f32-929c-06f5e8a7a13d.png#clientId=u74f6515f-f699-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=201&id=u9424fc31&margin=%5Bobject%20Object%5D&name=image.png&originHeight=261&originWidth=739&originalType=binary&ratio=1&rotation=0&showTitle=false&size=25832&status=done&style=none&taskId=udef3d55f-516e-4edc-be3f-d209a37d5a2&title=&width=570.4921875)

4.auto_increment 自增长
注意:1.需要跟着主键使用
2.需要用在int列
image.png
重新插入h_id为1的数据,被删的主键值依旧可以使用,但是不能反复插入,主键不可重复
image.png
image.png
create table huihui(
h_id int PRIMARY KEY auto_increment,
h_name VARCHAR(255),
h_address VARCHAR(255)
);
insert into huihui VALUES (1,’小王’,’上海宝山’),(2,’小明’,’上海静安’);
select * from huihui;
delete from huihui;
insert into huihui (h_name,h_address) VALUES (‘小新’,’上海松江’),(‘小张’,’上海黄浦’);
insert into huihui (h_id,h_name,h_address) VALUES (1,’小红’,’上海奉贤’);

练习:

1.创建一个表,id设为主键,自增长
2.插入两条数据,id 1 id 2 id primary key
3.删除这两条数据 用delete删除保留主键值
4.插入一条新的数据,不插入id, 结果:因为id是主键,delete删除保留主键,所以id从3开始
5.重新插入id是1的数据,插入成功,说明id 是1 的数据可以重新插入,并且按主键排序
6.再次插入一个id 是1的数据,报错,显示id是主键,不能重复

聚合函数,(分组函数:使用范围是作用于组内)

1.count()

  1. 语法:select count(字段)from where 条件;<br /> count():统计数据条数 注意:如果字段的值为null ,则不统计<br /> 1.count(*) 来统计字段的条数<br /> 2.count(1) 通过某个数字来统计条数 ,实际写任何数字都可以,但行业标准都是1,我们就写count(1)<br /> 查询某一列的总条数

例:统计score表中的成绩总数
image.png
例:统计score表中成绩是80分的总数
image.png
例:查询学生的个数
image.png

2.max()

  1. 语法:select max(字段) from where 条件;<br /> max(): 查询某个字段的最大值 数据类型一定是(int,float,double...)<br />**例:查询score表中成绩最高的分数**<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/21682952/1635248988658-497dce9c-21f6-4760-8287-c37b08228e7d.png#clientId=u28d57734-6e1e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=167&id=ue6b7471e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=207&originWidth=738&originalType=binary&ratio=1&rotation=0&showTitle=false&size=24062&status=done&style=none&taskId=uc482bd37-be5e-4db9-9a25-7388579957c&title=&width=595.9973754882812) <br />**例:查询score表中成绩最高的学员id号**<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/21682952/1635249161578-b9bfbfa0-7b40-4329-8b91-d810cd471c5f.png#clientId=u28d57734-6e1e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=182&id=u421f99bf&margin=%5Bobject%20Object%5D&name=image.png&originHeight=224&originWidth=773&originalType=binary&ratio=1&rotation=0&showTitle=false&size=28318&status=done&style=none&taskId=u971c4cf6-728a-4ed2-a59a-1f8c857af1a&title=&width=628.4973754882812)

3.min()

  1. 语法:select min(字段) from where 条件;<br /> min(): 查询某个字段的最小值,数据类型一定是(int,float,double...)<br /> <br />**例:查询score表中成绩最低的学员id**<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/21682952/1639713881854-f90bc323-c9b5-4ba6-87d8-0685e89c3946.png#clientId=u98cd0974-f32b-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=178&id=u175a7ec2&margin=%5Bobject%20Object%5D&name=image.png&originHeight=180&originWidth=580&originalType=binary&ratio=1&rotation=0&showTitle=false&size=19641&status=done&style=none&taskId=u788e1b75-423c-48bb-b416-f2917be6d0a&title=&width=574)<br /> 例:-- 查找语文学科最低分<br /> select min(score) from stu where course = '语文';

4.sum()

  1. 语法:select sum(字段) from where 条件;<br /> sum(): 查询某个字段的总和,数据类型一定是(int,float,double...)<br /> <br />**例:查询score表中成绩的总分**<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/21682952/1635249521187-fdbad9d6-e97e-4246-91db-d8b5d6d511b6.png#clientId=u28d57734-6e1e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=195&id=u51c22c44&margin=%5Bobject%20Object%5D&name=image.png&originHeight=232&originWidth=684&originalType=binary&ratio=1&rotation=0&showTitle=false&size=26281&status=done&style=none&taskId=u7778b603-da44-4dba-afe3-34a78123e96&title=&width=574.9921875)<br />例: -- 查找数学学科的总分<br /> select sum(score) from stu where course = '数学';

5.avg()

avg():Average 查询某个字段的平均值,数据类型一定是(int,float,double…)

例:查询score表中成绩的平均分
image.png
例:— 查找数学学科的平均值
select avg(score) from stu where course = ‘数学’;

练习:
1、查询出所有学生的总成绩
2、查询出所有学生的平均成绩
3、查询出所有学生的最高成绩
4、查询出所有学生的最低成绩
5、查询出成绩表中共有多少条记录
答案:
— 22、查询出所有学生的总成绩
SELECT SUM(s_score) FROM score;
— 23、查询出所有学生的平均成绩
SELECT AVG(s_score) FROM score;
— 24、查询出所有学生的最高成绩
SELECT MAX(s_score) FROM score;
— 25、查询出所有学生的最低成绩
SELECT MIN(s_score) FROM score;
— 26、查询出成绩表中共有多少条记录
SELECT COUNT(*) FROM score;

group by分组查询

  1. 查班级中学生的age,并统计出每个age的人数。

    1. SELECT age, COUNT(age) from student GROUP BY age;
  2. 查班级student表中学生的分数score,每个得分的人数统计出来。

    1. SELECT score , COUNT(* ) from student GROUP BY score;
  3. 查班级student表中学生的性别,并统计出每个性别的人数。

    1. SELECT sex , COUNT(*) from student GROUP BY sex;<br /> <br />select count(*)from group by cid;<br />第一组:cid1<br />第二组:cid2<br />第三组:cid3

统计:全部同学 全部班级 每个科目 每个班级

练习:
1、查询每个学生的总成绩
28、查询每个学生的平均成绩
29、查询每个学生的最高成绩
30、查询每个学生的最低成绩
31、查询每门课程中及格的学生数量
32、查询每门课都及格的学生编号
答案:
— 27、查询每个学生的总成绩
SELECT s_id, SUM(s_score) FROM score GROUP BY s_id;
— 28、查询每个学生的平均成绩
SELECT s_id, AVG(s_score) FROM score GROUP BY s_id;
— 29、查询每个学生的最高成绩
SELECT s_id, MAX(s_score) FROM score GROUP BY s_id;
— 30、查询每个学生的最低成绩
SELECT s_id, MIN(s_score) FROM score GROUP BY s_id;
— 31、查询每门课程中及格的学生数
SELECT c_id, COUNT(*) FROM score WHERE s_score >= 60 GROUP BY c_id;
— 32、查询每门课都及格的学生编号
SELECT s_id, MIN(s_score) FROM score GROUP BY s_id HAVING MIN(s_score) >= 60;

having 分组的条件

使用group by 进行分组,分组完成之后可以对返回的结果进行条件过滤。
having 放在group by 之后, 跟 group by 一起使用,不能单独使用。

例:以age字段进行分组,统计age的人数,查询人数为2的信息;
select age , count()
from student
group by age
having count(
) = 2;
例:以score字段进行分组,统计每个分数的人数,查询人数为2的相关信息;
select score , count()
from 表
group by score
having count(
)=2;
例:order 表中 每种水果p_name,销售总数量 p_num
select p_name , sum(p_num)
from 表
GROUP BY p_name;
例:查每种水果的销售总额(p_price*p_num)
SELECT p_name , sum(p_price * p_num)
from 表
GROUP BY p_name;

where 和 having区别

where:
1. 位置:放在表名后面,在group by 前面
2. 内容:不能接聚合方法条件,算数运算符、逻辑运算符、范围查询、模糊查询、判断是否null
3. 是否必须:不是,根据题目意思选择
having:
1. 位置:放在group by后面
2. 内容:只能接聚合方法条件
3. 是否必须:不是,有聚合方法条件才需要

语法顺序:
select 字段
from 表名
where 条件 (注意:where 后面不可以跟聚合函数)
group by 字段
having 聚合函数条件
order by 字段
limit n;

执行顺序
1:先from表名 找到哪张表
2:where条件,第一次进行筛选
3:group by 对哪个字段进行分组
4:having 使用聚合函数,进行聚合函数二次过滤
5:排序order by
6:limit 查询最终结果的前n行
7:select 什么字段

起别名

  1. 语法:select 字段 别名 from 表名;<br /> select 字段 别名 , 字段1 别名 from 表名<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/21682952/1635310721645-26d8bdb0-d137-4a0e-ae20-108ff4696aad.png#clientId=ud654ba56-7c94-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=216&id=uf99a9342&margin=%5Bobject%20Object%5D&name=image.png&originHeight=292&originWidth=771&originalType=binary&ratio=1&rotation=0&showTitle=false&size=33588&status=done&style=none&taskId=u9b948f5c-32a3-4081-bf49-79408ae94ca&title=&width=570.4947814941406)

练习:

商场专柜销售情况表
image.png
— 1、查询出每个商场专柜在情人节(2018-02-14)当天的香水总销售额。
— 2、查询出情人节(2018-02-14)或白色情人节(2018-03-14)的香水总销售额,并以总销售额由高到低排序;
— 3、 我想查询出香水总销售额大于600块的商场专柜记录,并将总销售额由高到低排列
— 4、查询久光百货每日的香水销售额,-显示“销售时间”和“总销售额”列即可,并以总销售额从高到低排列

答案:
— 1、查询出每个商场专柜在情人节(2/14)当天的香水总销售额。
select 商场专柜, SUM(销售价格)
from 商场专柜销售情况表
where 销售时间 = ‘2018-02-14’
group by 商场专柜;
— 2、查询出情人节(2/14)或白色情人节(3/14)的香水总销售额,并以总销售额由高到低排序;
select 销售时间, sum(销售价格)
from 商场专柜销售情况表
where 销售时间 in (‘2018-02-14’, ‘2018-03-14’)
GROUP BY 销售时间
order by sum(销售价格) desc;
— 3、我想查询出香水总销售额大于600块的商场专柜记录,并将总销售额由高到低排列
SELECT 商场专柜,sum(销售价格) 香水总销售额 from 商场专柜销售情况表
group by 商场专柜
having sum(销售价格) > 600
order by 香水总销售额 desc;
— 4、查询久光百货每日的香水销售额,-显示“销售时间”和“总销售额”列即可,并以总销售额从高到低排列
select 销售时间, sum(销售价格) 总销售额
from 商场专柜销售情况表
where 商场专柜 = ‘久光百货’
group by 销售时间
order by sum(销售价格) desc;

课后练习:
image.png
drop table if exists product;
create table product(
productid int not null,
productname varchar(255),
price int
);
drop table if exists sales;
create table sales(
productid int not null,
clientname varchar(255),
productnumber int,
price int
);
insert into product values (1,’HP1200打印机’,2000)
,(2,’LX360兼容机’,4800),(3,’IBM 350笔记本’,11000),(4,’BM360笔记’,12000);
insert into sales values(2,’北大青鸟’,10,4500),
(1,’北大青鸟’,25,1800),
(3,’联想集团’,10,11000),
(2,’联想集团’,30,4500),
(1,’联想集团’,20,1800),
(3,’北大方正’,40,10000),
(3,’诺基亚’,20,10500);

1、查询出每个客户的个数
2、 查询出单笔售出数量大于15的客户名称、购买数量、销售价格信息
3、 查询客户姓名、对应客户的销售总金额;
4、查询出所有商品的全部销售金额;
5、查询每个商品编号的产品实际的销售总数量
6、 查询sales表中平均销售单价
7、查询出Product商品的平均单价
答案:
1、查询出每个客户的个数
select clientname,count() from sales group by clientname
2、查询出单笔售出数量大于15的客户名称、购买数量、销售价格信息
select clientname,productnumber,price from sales where productnumber>15;
3、查询客户姓名、对应客户的销售总金额;
select clientname,sum(productnumber
price) from sales group by clientname;
4、查询出所有商品的全部销售金额;
select sum(productnumber*price) from sales;
5、查询每个商品编号的产品实际的销售总数量
select productid,sum(productnumber) from sales group by productid;
6、查询sales表中平均销售单价
select avg(price) from sales;
7、查询出Product商品的平均单价
select avg(price) from product;