mysql sum 条件_MySQL学习记录

这篇博客主要介绍了MySQL的SUM函数结合条件查询的使用,包括在Navicat中的实践操作。文章通过逐步学习和练习,讲解了SQL基础如SELECT、WHERE、GROUP BY、HAVING等,还涉及子查询、联结、CASE语句的应用,并提供了SQLZOO的错题解析,帮助读者巩固知识点。
摘要由CSDN通过智能技术生成
  • mySQL,Navicat的安装
  • 熟悉创建表,更改设置的基本操作的练习

1.1准备

  1. 安装MySQL

mysql是数据库的管理系统。官网下载安装,直接next,除了密码验证选择旧版本5.7....的方式是第二个(如果没注意全是默认第一个Next请看3.),安装完成之后,就会弹出以下界面吗,确认安装成功。

46229d3ac7a6f0d907b76e400d1f087e.png

如果不小心关闭这个,从开始菜单里搜索MySQL 8.0 Command Line Client - Unicode

2.可视化工具Navicat

这个软件与mysql建立联结之后,就可以把这些语句转化成表单式操作,十分简便。

安装完成之后点击mysql,输入密码连接就可以用了。

4ec5213c4cac79db166d2e4d2c5f310a.png

037937c9d49ae7fe24508786fb3437c4.png

3.如果连接不上,报错显示2059,也就是密码验证方式问题,旧版mysql连接完全没问题,只需要把验证改成旧版的,怎么改呢?参考https://blog.csdn.net/pan_zzq/article/details/81078564

此时此刻,我们已经有了前面的步骤,直接从3.3步骤开始:

 use mysql;
 select user,plugin from user where user ='root';

更改加密方式:

ALTER USER'root'@'localhost' IDENTIFIED BY '替换password' PASSWORD EXPIRE NEVER;


更新用户密码:

ALTER USER'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; 

分别执行后如下,重新执行3.3查询结果如下,加密方式已经该改变。

3.5 刷新权限:FLUSH PRIVILEGES;

3.6 重新打开Navicat Premium 12,可连接成功。

1.2练习

查询数据

dff575db6d94812555d055a4f8633c82.png

关于ex3:

开始简单的练习很简单,点一点就知道怎么回事了。

另外,新建表的时候会设置列的数据类型,如果要更改,鼠标右键,设计表即可。

下面是输入语句的操作。

90fb527ab3748abab238a21af9e9b009.png

0e2c71f57f4e4db91dbd1dcf950b57e8.png

  • 接下来开始select基本语句练习
  • where查询
  • 练习题

2.1语句学习

dec9fafc7a65c4172829e15d8fd86b6a.png

2.2练习

必备练习网站,十分简便:SQLZOO

d4a5f887ee06ec02b2e6df983486e523.png

433e7a1768832764718f30d3103267e4.png
  • 错题:

98eb3d8ef08e76253bbe7c961c393537.png

  • 汇总:count,sum,avg,max,min,(对数据)order by(直接对结果排序)desc,asc,limit
  • 分组:group by,having

3.1如何从数据库调取有用的信息呢?

  1. 比如有时候需要知道符合要求数据多少行
  2. 比如涉及求平均值,需要排序
  3. 比如数据一对多

分析思路是先把要求精确化,然后写出对应函数,再根据条件完成语句。这个类似分析汉语的句子。

我 (user) 吃了(select查询) 三块以上(条件1) 大大 (条件2) 西瓜(查询结果)。

例子:

统计 每门课程的学生选修人数( 超过2人的课程才统计),要求输出 课程号选修人数
查询结果按人数降序排序,若人数相同,按课程号升序排序。
  • 课程号,选修人数------select from
  • 每门课程------ group by
  • 超过两人------having,count
  • 结果降序------orderby desc,asc
select 课程号, count(学号) as '选修人数'
from score
group by 课程号
having count(学号)>2
order by count(学号) desc,课程号 asc;

3.2练习

5831d45cb3fd58b9be2144b8ceda20f7.png

47daf0fa9e6882f533f46ae72a8fa4d5.png

  • 视图
  • 子查询
  • 标量子查询
  • 关联子查询
  • 常用函数汇总图

4.1子查询

理论和规则:把一个查询分解成一系列的逻辑步骤。提供一个列表作为WHERE子句和 IN / ANY / ALL 的目标对象。嵌套子查询只朝一个方向进行——要么返回一个而用于外部查询的值,要么返回一个与IN运算符一起使用的的值的列表。嵌套子查询中,内部查询只处理一次。

如何理解?

select语句要分三次查询,一次查的结果返回值作为另一次的where语句条件。

用AS 新表名好处是简洁。

关系数据库的设计基础知识:

  • 重复数据出现多次不是一件好事(更改不便、浪费空间、纰漏),就是要把信息拆解成多个表,一类数据一个表。通过共同的值关联,也叫联结。
  • 联结两个表的时候实际上是把表1的每一行与表2的每一行配对。where作为筛选条件,只包含匹配关联条件的行,没有where的话,每一行交叉出笛卡尔积结果,逻辑上就乱了。
  • where x. continent= y.continent,列名限定,然后句点起到隔断,免得逻辑混乱,DBMS报错。

4.2练习

关联子查询还需要再练习

209d155f4c868b4cda37e3798dd97fb0.png

18a005cda06062417b7951d948b8897f.png

2bb2b31b71c4b9d7752c2c5538d2d6b7.png

5f49a0efdcd976edcd793cef5ff69339.png

0484feaf231c5993712d02cf60e2c72b.png

949fca11491a266d2be9d9cf91fc43bd.png

7db79488dbb947d0b5a7413360397c77.png

499b0f61c36c37b42516d67958b9e45c.png

  • 交叉联结,内联结,左连接,右联结(带函数),case
  • MySQL突然连不上错误代码2003(计算机--属性---服务---mysql---手动启动)

5.1联结的语法和功能图:

内联结:a,b表各抽取部分信息

左联结:对左边的表格联结,按表一来补充数据。把左边的数据全部取出。

6042f1027d3fbc59ad586011e9215443.png

5.2case

用于自定义的那种分组,比如筛选各科不及格人数

select 课程号,
sum(case  when 成绩<60  then 1 
         else 0 
          end) as 不及格人数,
sum(case when 成绩>=60 then 1
            else 0 
          end ) as 及格人数
from course 
group by 课程号;

6fa048ab7b4ba2f3dc43f199a5bc4e51.png
select a.课程号,b.课程名称,
SUM(case when 成绩>60 then 1 else 0 end)as '<60',
sum(case when 60<=成绩 and 成绩<70 then 1 else 0 end)as '70-60',
sum(case when 成绩>=70 and 成绩<85 then 1 else 0 end)as '85-70',
sum(case when 成绩>=85 and 成绩<=100 then 1 else 0 end)as '100-85'
from course as a  right join score  as b
on a.课程号=b.课程号
group by a.课程号,b.`课程名称`; -- select 列名只能是group by 里面的

c81d9ce858c796010e96a3307884c2f7.png

5.3sqlzoo错题

8b09b77dbe590c55a6755fce4bfb7a17.png
不等号!=

e64dc6a330d36cb4044e8642b5e11a07.png
错误示范:distinct

27aeddb9fdae9e6e814d85c42cc8fcba.png
第二种解法

9f069a9682227403171a23365dc56628.png

5c44f0c271d47136506b56cda2f9a289.png

bbdb0cdd93a10530b0074c537c5c4c75.png

754b57ca064076aa137b6b9aa4b4dcb2.png
这里是left join 不是join

  • 简单查询
  • 汇总分析
  • 复杂查询
  • 多表查询
  • *行列转换综合应用

6.1语句

  • 查询姓小的学生姓名

24213ed1b91ba3a01946f0aa865ebeed.png
  • 查询名字是红的学生姓名

a6d8c7d90017eec302280fee17d34a65.png
  • 查询名字有红的姓名

2b67f5d0ef9a33208a7ff84004681750.png
  • 查询姓孟的老师姓名

80f379b37cdbafdcfb684df03968a1cf.png
  • 查询0002课程的总成绩

a8ec01f1ec65de56360e3c0622c71a4c.png
  • 查询选课同学人数

4cde06da50c2ccf6f9fc59e7e3047450.png
  • 查询各科最高成绩,最低成绩

ed67785884554e367898adf57fccd409.png
  • 查询各科人数

acdaedbbfde53aca880d02fc3c0c8adc.png
  • 统计男女人数

d0bf22c82f6433b69ed26d3c0592cad0.png
  • 查询平均成绩大于60的学生和平均成绩

a53866871d920126a06c86b359acb088.png
  • 统计学生人数大于2人的学科

56363803d35a83353fc80413d1215dc8.png
  • 查询同名同姓的学生姓名

48ad7a69c082aeff66dd8a4fccf97bc9.png

3df9c333edb7521c6adb9241a68542be.png

ba0e1372b0ad5ff587684d60fa1a0b6a.png

89f72b9084ca5d51adf40c41b01631d5.png

9f7f9ddf5ac1aef3444aad66f9dd7207.png

534fdc886312d199b1aec40032e4b9fb.png

71fd43a991dccd955e0eebebbc67fb84.png

cb6af2081195e1b135c3d4e0e9446838.png

09f1b2b54679a986eb76272a1d57aa75.png

0ca04679f07cb7a932da3646ac965e24.png

a1f46038d8136174b070271482a71c29.png

7c92a93a7887d6e9e7ea18c5b9a06bb9.png

3073b33099d67769b2e4d3be83495987.png

4625e710676b6624cfa1a0fb8c39c0fb.png

b65d8125753c1fee2a2003a20460c3bf.png

d1e32e60ac70c9515407a0e98614431a.png

98ac739fd21acb19d8d2aff53c4e2fe5.png

edaec506c5f4dc820d8c9f9fb9f65f4a.png

6ab3fd01c95b21384bee6abff15b0c1b.png

6.2*行列转换

d70daa371530662a9d4c5c2f68bfafe8.png

5f749c63c6185db65954486ca26695c2.png

【面试题类型总结】这类题目属于行列如何互换,解题思路如下:

【解答】

1)第1步,使用常量列输出目标表的结构

可以看到查询结果已经和目标表非常接近了

select 学号,'课程号0001','课程号0002','课程号0003'
from score;

ba09fcf6a625f1ce7ec11a93bff9f9ac.png

2)第2步,使用case表达式,替换常量列为对应的成绩

select 学号,
(case 课程号 when '0001' then 成绩 else 0 end) as '课程号0001',
(case 课程号 when '0002' then 成绩 else 0 end) as  '课程号0002',
(case 课程号 when '0003' then 成绩 else 0 end) as '课程号0003'
from score;

f733ec1377f60755b15b21d88823d544.png

在这个查询结果中,每一行表示了某个学生某一门课程的成绩。比如第一行是'学号0001'选修'课程号00001'的成绩,而其他两列的'课程号0002'和'课程号0003'成绩为0。每个学生选修某门课程的成绩在下图的每个方块内。我们可以通过分组,取出每门课程的成绩。

b1cfdd84c8cbf36d13124463c552f3c2.png

3)第3步,分组

分组,并使用最大值函数max取出上图每个方块里的最大值

select 学号,
max(case 课程号 when '0001' then 成绩 else 0 end) as '课程号0001',
max(case 课程号 when '0002' then 成绩 else 0 end) as '课程号0002',
max(case 课程号 when '0003' then 成绩 else 0 end) as '课程号0003'
from score
group by 学号

结果:

41b224bcf03ea84da5877a28dcb20ddd.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值