avg最多用多少列 mysql_MySQL 学习记录

2a7604158d9b9b42bcb4555d78bb46e8.png

1.入门

1.1 什么是数据库?

简单的说,数据库(英文Database)就是一个存放数据的仓库,这个仓库是按照一定的数据结果(数据结构是指数据的组织形式或数据之间的联系)来组织、存储的,我们可以通过数据库提供的多种方法来管理数据库里的数据,数据库和我们生活中存放杂物的仓库性质一样,区别只是存放的东西不同。在当今的互联网中,最常用的数据库模型主要是两种,即关系型数据库(RDBMS)非关系型数据库(NoSQL)

1.2 MySQL数据库介绍

MySQL是互联网领域一款深受广大用户欢迎的开源关系型数据库软件之一,由瑞典MySQL AB公司开发与维护。2006年MySQL AB公司被SUN公司收购,2008年,SUN公司又被传统数据数据库领域大佬甲骨文(oracle)公司收购,因此,MySQL数据库软件目前属于Oracle公司。

为什么选择MySQL数据库

原因可能有以下几点:

(1)MySQL性能卓越、服务稳定,很少出现异常宕机

(2)MySQL开放源代码且无版权制约,自主性及使用成本低

(3)MySQL历史悠久,社区及用户活跃,遇到问题可以解决

(4)MySQL软件体积小,安装使用简单,并且易于维护,安装及维护成本低

(5)MySQL品牌口碑效应,使得企业无需考虑就直接用,LAMP、LEMP流行架构

(6)MySQL支持多用操作系统,提供多种API接口,支持多用开发语言,特别对流行的PHP语言有很好的支持

1.3 SQL的基本知识

SQL 的全称是 Structured Query Language,中文含义是:结构化查询语言,是访问和处理关系数据库的计算机标准语言。SQL语句既可以查询数据库中的数据,也可以添加、更新和删除数据库中的数据,还可以对数据库进行管理和维护操作。不同的数据库,都支持SQL,我们通过学习SQL这一种语言,就可以操作各种不同的数据库。

  • SQL的分类

29d4c1f7ac639db48355044887ea47bf.png
SQL分类
  • SQL的基本书写规则
  1. SQL语句以英文分号(;)结尾
  2. SQL语句不区分关键字的大小写
  3. 列名不能加单引号(列名命名时不能有空格)
  4. 符号只能使用英文符号
  5. 字符串和日期常数需要使用单引号(')括起来,数字常数无需加注单引号
  6. 单词之间需要使用半角空格或者换行符进行分隔
  • SQL常见数据类型

1.字符串类型

644fdcb6d040511c0dc9c402806494ea.png

2.日期/时间类型

b241c946760f2d0ea15721b8a74ac49a.png

3.数值型

15cff0c9128d56dd4d8adabb26b62daa.png

4.约束

567830b56910b01846b100dd150ce1f3.png

1.4 学习回顾

在本节课程中,学习了关系数据库的基本概念,如何使用SQL操作数据库,以及一种最流行的开源数据库MySQL的基本安装和使用方法。并同时学习了如何使用数据库客户端工具Navicat对MySQL进行连接,并且对Navicat的基本操作进行了学习,包括表的创建、删除和更新,用查询编辑器进行数据的插入、删除和更新。

1.如何安装MySQL以及Navicat客户端?

MySQL数据库安装教程

mysql数据库安装教程​mp.weixin.qq.com
42c049ada073caa3818afffd6931de9c.png

Navicat客户端安装教程

客户端navicat安装教程​mp.weixin.qq.com
291a23f165d7e4b4d37aee85a93e2549.png

2.练习一:创建学校数据库的表

  • 创建学生表(student)

1d49f27947e9371ddb46105e900a351e.png
  • 创建成绩表(score)

01a47847d28718c11cac52cb34115acf.png
  • 创建课程表(course)

0d380fb1620dece27253f7e850456240.png
  • 创建教师表(teacher)

0af0afcff07d5fe7efb811dba51d13ef.png

3.练习二:往4个表里插入数据

  • 往课程表(course)里添加数据

ab15ff5e414c57aa2fdee16c72d0bbba.png

c994a3c9ac34b78bb8ee9378f8b1dfe0.png
  • 往成绩表(score)里添加数据

a91b135ab3dd4cfa63284fcd3b77417e.png

a9449abfdb7a507ed3377b6a2a4a5dc7.png
  • 往学生表(student)里添加数据

851d9735fe56e8c8bfdeb2a590fadcb1.png
  • 往教师表(teacher)里添加数据

6715339f01cd943402fe09b596f4ce93.png

2.简单查询

2.1 基本的查询语句

  • 查询指定列
select 列名1,列名2,......
from 表名

b51113fafbe31cad7f68995270a02f8b.png
  • 查询全部列

3bc6e223e2f4de3e8395ac6d52340a9d.png
  • 为列设定别名(使用as关键字)

别名可以使用中文,使用中文时需要用双引号(")括起来,请注意不是单引号(')。

39367f3402d8d1dd35bf8c3650e62b3d.png
  • 删除重复数据(使用distinct关键字)

distinct关键字只能用在第一个列名之前

84c47a1558a5c6faee618a1f93de157d.png

8e4b4361287a8e9f50655186c8069a59.png

2.2 指定查询条件

select 列名1,列名2,......
from 表名
where 条件表达式

5fb4bedbc74b6f97ff1551ef1168755c.png

2.3 注释

注释是SQL 语句中用来标识说明或者注意事项的部分。注释对SQL 的执行没有任何影响。因此,无论是英文字母还是汉字都可以随意使用。注释的书写方法有如下两种。

  • 单行注释

书写在“--”之后,只能写在同一行。(MySQL中需要在“--”之后加入半角空格)

6a4256fff231cc59abf12da5513c6691.png
  • 多行注释

书写在“/*”和“*/”之间,可以跨多行。

c29b99c6202d230a1ceb11908acc050b.png

2.4 运算符

ddeaa4e5454b20ed3aead2cf2ec8c88d.png

注意:

  • 字符串类型的数据原则上按照字典顺序进行排序,不能与数字的大小顺序混淆。
  • 不能对NULL使用比较运算符,查询NULL值,使用 is null运算符或者 is not null。

练习:

48d0994ba10ebd607f818957c22c0725.png

2.5 字符串模糊查询(使用关键字 like )

%:表示任意 0 个或多个字符。可匹配任意类型和长度的字符;

_:表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句。

练习:

d395735eaffce099cc7b04a3972168d8.png

8132ce01f4da34180a2067d8f25badc2.png

fad2ed9791df1eae59347b55d673789b.png

2.6 sqlzoo平台练习

  • select basic(简单查询)练习

18ad092d865fc3beac5264d0d6213f9e.png
  • select from world(运算符)练习

9ef8d72dfe0284a6ee265fd34b7e3f31.png
  • select names (字符串模糊查询)练习

8d7dee7f41e95b45292bbc0368b342c2.png

3.汇总分析

3.1 汇总分析

汇总函数

  • count(列名) 求某列的行数,count(*)
  • sum(列名) 对某列数据求和,只能对数值类型的列计算
  • avg(列名) 求某列数据的平均值,只能对数值类型的列计算
  • max(列名) 求某列数据的最大值
  • min(列名) 求某更数据的最小值

72eac45e98c2c5948fb1420c78bd52c2.png

8673e8098bedcd4da27e1ba16c1db2b3.png

5b435eddbc6e3b804e083ca364078812.png

f338f31387c17977bc4e9ec59ab7dc00.png

939659e43525be2d3ae5cc73057b2c41.png

8aabc8179eb5780a39a464d189d8e451.png

练习:汇总分析

  • 查询课程编号为"0002"的总成绩

6159f8440bfb08b7916ada6f4ae59bb7.png
  • 查询选了课程的学生人数

be1f659095c5401f54a0a2adf8a8c9ed.png

3.2 分组

sql分组:group by

数据分组-应用函数-结合结果

SQL运行顺序

4 select 性别,count(*)

1 from student

2 where 出生日期>'1990-01-01'

3 group by 性别;

练习:分组

  • 查询各科成绩最高和最低的分

80d73a29baac19e23a8e30e7502bb33b.png
  • 查询每门课程被选修的学生数

812be75f312256fe52dc7faa0801985a.png
  • 查询男生、女生人数

93e72a52bf1c45b99f3962e36502a877.png

3.3 对分组结果指定条件(having)

练习:分组结果的条件

  • 查询平均成绩大于60分学生的学号

936553ba6b3df199afcc05bb7c27b6cf.png
  • 查询至少选修两门课程的学生学号

5a9226ea3832b728ba69ff883a064fb8.png
  • 查询同名同姓学生名单并统计同名人数

980fbe9781688d8c81c9ce856c878f7b.png

3.4 用sql解决业务问题

练习:计算每门课程的平均成绩并且平均成绩大于等于80分

64dd7e924ca838a03b2d8974fabc0e0c.png

3.5 对查询结果排序(order by)

desc 降序 从大到小

asc 升序 从小到大

练习:查询不及格的课程并按课程号从大到小排列

613ff0f52cc7f318433002fe0a4cefbb.png

练习:查询每门课程的平均成绩,结果按平均成绩升序排序。平均成绩相同时,按课程号降序排列

931e6cbbae1312a65cd6cf588dfac1e2.png

3.6 sqlzoo练习

SELECT from Nobel Tutorial

c1abb3e180e4d4c57f88db15c37d014c.png

SUM and COUNT

43cecdee7e767752f12f5c7d790132bb.png

4.复杂查询

4.1 视图

  • 从SQL的角度来看,视图和表是相同的,两者的区别在于表中存储的是实际数据,而视图中保存的是从表中取出数据所使用的SELECT语句(视图本身并不存储数据)。

16ccbb439b83ad285ffdec70d1d0e3f6.png
  • 视图的优点
  1. 由于视图无需保存数据,因此可以节省存储设备的容量
  2. 可以将频繁使用的SELECT 语句保存成视图,这样就不用每次都重新书写了
  • 创建视图(CREATE VIEW语句)
create view 视图名称<视图列名1>,<视图列名2>,......
as
<SELECT语句>

333b2191239742ad026ec66e233ec325.png

c8a9bc2aa01b1cdf30550ceaaf0656df.png

0e832dca5367a80d1845f0806c85cbcf.png
  • 删除视图(DROP VIEW 语句)
DROP VIEW 视图名称(<视图列名1>, <视图列名2>, ……)

9962f2dcbe2d37d6ae1f4359ce5084eb.png

要点:

  • 应该避免在视图的基础上创建视图。
  • 定义视图时不要使用ORDER BY子句。
  • 视图和表需要同时进行更新,因此通过汇总得到的视图无法进行更新。
  • 不能往视图里插入数据。

4.2 子查询(in any all)

any(子查询)与some(子查询)相同

练习:

  • 哪些学生的成绩比课程号0002的全部成绩里的任意一个都高呢?

4f31bc48c241ad8c7124cfe23ee09e45.png
  • 哪些学生的成绩比课程号0002的全部成绩都高呢?

40ba742d2d89e1ac8d399f6c4db782c3.png

4.3 标量子查询

  • 大于平均成绩的学生的学号和成绩

6b0f6cb6080ad5bc44d27851c6155796.png
  • 成绩介于差生平均成绩和优等生平均成绩之间的学生有哪些?

(差生:成绩<=60,优等生:成绩>=80)

SELECT 学号,成绩
from score
where 成绩 BETWEEN (select avg(成绩) from score where 成绩 <=60) and (select avg(成绩) from score where 成绩>=80);

18de7dc6218636b053fde9bfe5c7c2c1.png

4.4 关联子查询

练习:

  • 查找出每个课程中大于对应课程平均成绩的学生?
select 学号,课程号,成绩
from score as s1
where 成绩>(select avg(成绩) from score as s2 where s1.课程号 = s2.课程号 group by 课程号);

11d205b38775e049764d769390fe87b6.png
  • 找出每门课程成绩最低的学号?
select 课程号,学号,成绩
from score as a
where 成绩=(select min(成绩) from score as b where b.课程号 = a.课程号)
order by 课程号;

b4f4b2d8198307a529c6cc10fb6c95be.png

4.5 各种函数

14eefb8d3c62d301efc1fd532d3fccf2.png

a220daf0683aad14fb8332dd990123e9.png

e49739f6d7a7ef026b08a8f3b1db675a.png

4.6 sqlzoo练习

SELECT within SELECT Tutorial

8781e6ac83efa05317a51cc2fd150af6.png

5.多表查询

5.1 表的加法(union)

  • 新建一个表course1

51c4294cd0c02484b5ebd8ead3e7f5a8.png

6c05892adf1aabf6fc16f03b60d74473.png

3c92138b8144c520ce53bb54c1abbd5b.png

9c6af6b616a56a489d37bbb1f3e4ac78.png
course1表
  • 练习:如何合并两个表?

union 去掉了重复数据

union all没有去掉重复数据

select *
from course
union
select *
from course1;

e462d427c0b1ccbe936219e0b85c94f1.png
select *
from course
union all
select *
from course1;

d8cc3e2fbdd3de5cd07840668f06f142.png

5.2 表的联结(以列为单位对表进行联结)

  • 交叉联结(cross join)是其他所有联结的基础
  • 内联结(inner join)
select a.学号,a.姓名,b.课程号
from student as a 
INNER JOIN score as b 
on a.学号=b.学号;

d8c24cffc5688a2441cc26728be342a4.png
  • 左联结(left join)
select a.学号,a.姓名,b.课程号
from student as a 
LEFT JOIN score as b 
on a.学号=b.学号;

29b8b26e486a04c26a37ed59e77c1501.png

579d1c8f8808c2991ec1654818dcbe5c.png
  • 右联结(right join)
select a.学号,a.姓名,b.课程号
from student as a 
RIGHT JOIN score as b 
on a.学号=b.学号

2e8a87dd97c7c435313d3dbc6ad0e825.png

9ef9f591671d5700186eeef1edc104d1.png

bb919f8b8ea436fed2c86911496ba330.png

5.3 联结应用案例

练习:

  • 查询所有学生的学号、姓名、选课数、总成绩
select a.学号,a.姓名,count(b.课程号) as 选课数,sum(b.成绩) as 总成绩
from student as a 
left join score as b
on a.学号 = b.学号
group by a.学号;

d56e79eea8533fd3e0e00d9acc46d831.png
  • 查询平均成绩大于85的所有学生的学号、姓名和平均成绩
select a.学号,a.姓名,avg(b.成绩) as 平均成绩
from student as a 
left join score as b
on a.学号 = b.学号
GROUP BY a.学号
HAVING avg(b.成绩)>85;

1811ed9ea02e5a89341b60ac3ba56421.png
  • 查询学生的选课情况:学号,姓名,课程号,课程名称(三个表联结)
select a.学号,a.姓名,c.课程号,c.课程名称
from student as a 
INNER JOIN score as b
on a.学号 = b.学号
INNER JOIN course as c
on b.课程号 = c.课程号

ed7260b8912a5f08a7c2b7b323bc1abb.png

5.4 case表达式

case when <判断表达式> then <表达式>
when <判断表达式> then <表达式>
when <判断表达式> then <表达式>
...
else  <表达式>
  • 成绩是否及格
select 学号,课程号,成绩,(case when 成绩>=60 then '及格'
when 成绩<60 then '不及格'
else null end) as 是否及格
from score;

e99850c551b0794e757c4cc8ae229d82.png

练习:

  • 查询出每门课程的及格人数和不及格人数
select 课程号,sum(case when 成绩>=60 then 1 else 0 end) 
as 及格人数,
sum(case when 成绩<60 then 1 else 0 end) 
as 不及格人数
from score
GROUP BY 课程号;

f3e369c73b190fe658f13edf9c5cf3af.png
  • 使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称
select a.课程号,b.课程名称,
sum(case when 成绩 between 85 and 100 then 1 else 0 end) as '[100-85]',
sum(case when 成绩 >=70 and 成绩<85 then 1 else 0 end) as '[85-70]',
sum(case when 成绩 >=60 and 成绩<70 then 1 else 0 end) as '[70-60]',
sum(case when 成绩 <60 then 1 else 0 end) as '[<60]'
from score as a RIGHT JOIN course as b
on a.课程号=b.课程号
GROUP BY a.课程号,b.课程名称;

c14c18f13eec8a3cf114a05803636319.png

8d9cab8f73481acb2f76b7b9ee67b725.png

5.5 sqlzoo练习

The JOIN operation

881e544ee93592694c929202c7d40e78.png

a9014b4085ff3b6a504f567c3b928493.png

6.其他补充

1.SQL语句书写顺序和执行顺序

  • 书写顺序
  1. SELECT [列名称 *代表所有的列]
  2. FROM [表名称]
  3. join [表名称]
  4. ON [join条件]
  5. WHERE [过滤条件]
  6. GROUP BY [分组字段]
  7. HAVING [分组条件]
  8. ORDER BY [排序字段]
  • 执行顺序
  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. HAVING
  7. SELECT
  8. DISTINCT
  9. ORDER BY
  10. LIMIT(MySQL)

在where中不可以使用select中的别名,而having却可以使用,为什么having可以使用,搜索网上得出如下回答,大意是MySQL新版本号做了扩展。

2086b4ba1cdd5b290ef602764bf4d20c.png

2.查询SQL版本号

新建查询,输入代码select @@version,点击运行。

4832618a8902a9cff87c53d02112bc44.png

3.Where与Having的区别

Where关键字的作用是过滤,选取符合条件的记录,而Having关键字的作用则是,为聚合结果指定条件。但是,在某些条件下,使用这两者可以得到一样的结果。

比如以下的例子:

1.

SELECT BoxType,COUNT(1) FROM BoxType 
GROUP BY BoxType
HAVING BoxType='小箱';

2.

SELECT BoxType,COUNT(1) FROM BoxType
WHERE BoxType='小箱'
GROUP BY BoxType;

这两段语句得到的结果是一样的。那么他们两者的区别在哪呢?

1、

Where 子句 = 指定行所对应的条件

Having 子句 = 指定组所对应的条件

因此,2 语句会比较合适。

2、当在Where子句和Having子句中都可以使用的条件,从语句的执行效率来看,最好写在Where子句中。在使用Count函数等对表中的数据进行聚合操作时,DBMS内部会进行排序处理,而排序操作会增加机器的负担,减少排序的行数,可以增加处理速度。使用Where子句指定条件时,由于排序之前就对数据进行了过滤,所以能够减少排序的数据量。但是Having子句是在排序之后才对数据进行分组的,因此与前者相比,需要排序的数据量就要多得多。

3、使用Where子句更具速度优势的另一个理由是,可以对Where子句指定条件所对应的列创建索引,这样可以大幅提高处理速度。

4、Where子句中不能使用聚合函数,而Having子句中可以。

4.时间戳与日期转换

  • 日期转时间戳

select UNIX_TIMESTAMP('2018-12-25 12:25:00');

结果:1545711900

  • 时间戳转日期

FROM_UNIXTIME(unix_timestamp) --unix_timestamp为时间戳

select FROM_UNIXTIME(1545711900);

结果:2018-12-25 12:25:00

  • 将字符串类型转换为日期类型

SELECT CAST('2009-12-14' AS DATE) AS date_col;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值