sql查询每科成绩的最⾼分_第五章数据分析必备的SQL技能写在前⾯
从之前做开发,到现在转做运营、数据分析。SQL⼀直都是⾄关重要的。做开发或者做数据分析,需要的SQL技能点,都不完全相同。本篇主要偏向于数据分析必备的SQL技能。
Excel数据分析暂告⼀段落了,现在开始整理SQL笔记了。
已知有如下4张表:
学⽣表:student(学号,学⽣姓名,出⽣年⽉,性别)
成绩表:score(学号,课程号,成绩)
课程表:course(课程号,课程名称,教师号)
教师表:teacher(教师号,教师姓名)
根据以上信息按照下⾯要求写出对应的SQL语句。
⼀、简单⼊门介绍
SQL,即Structured Query Language的缩写,意思是:结构化查询语⾔,是⼀种在数据库管理系统(Relational Database Management System, RDBMS)中查询数据,或通过RDBMS对数据库中的数据进⾏更改的语⾔。
常见的RDBMS有:
Oracle Database:甲⾻⽂公司的RDBMS
SQL Server :微软公司的RDBMS
DB2:IBM 公司的RDBMS
PostgreSQL:开源的RDBMS
MySQL :开源的RDBMS
RDBMS不同RDBMS的SQL语⾔略微有所不同,由于MySQL是开源、免费的,国内很多公司⽤的都是MySQL,所以本篇⽂章汇总的主要是MySQL的SQL语⾔。
根据对RDBMS 赋予的指令种类的不同,SQL 语句可以分为以下三类:
提到数据库,就不得不提到“增、删、改、查”。作为数据分析师,⼤多数公司,出于安全的考虑,⼀般只会给数据分析师 查询数据 的权限,不会开放其他诸如“增、删、改”的操作权限,基于此,我们着重学习 select查询 语句即可,故本⽂以 select查询 为主。
⼆、简单查询
(⼀)基本规则
SQL语⾔以英⽂分号(;)结尾;
SQL语句不区分关键字的⼤⼩写;如:SELECT 同 select;
输⼊符号只能使⽤ 英⽂状态 ;如:逗号(,)、点号(.);
/* */ 可以⽤于插⼊多⾏注释;
(⼆)基础查询
1、基本语法:
列的基本查询
select <;列名> from <;表名>;
查询表中所有的列
该语句的显⽰结果为每条数据的顺序随机。
select * from <;表名>;
注:星号(*)是选取所有列的快捷⽅式;
为列设定别名
select <;列名> as <;新列名> from <;表名>;
常数的查询
select <;常值> as <;新列名> from <;表名>;
结果中删除重复⾏
第⼀个列名之前。
关键词 distinct ⽤于返回唯⼀不同的值。null数据会合并为⼀条,distinct 只能
只能 ⽤在第⼀个
select distinct <;列名> from <;表名>;
where条件查询
select <;列名> from <;表名> where <;列运算符值>;
注:where 只能指定⾏的条件,不能指定组的条件。对于分组后的筛选,需⽤ having ⼦句。
模糊查询
select <;列名> from <;表名> where <;列名> like 条件
其中关于 like 条件,SQL提供了四种匹配模式,本⽂介绍常⽤的两种:
% :表⽰任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中⽂,请使⽤两个百分号(%%)表⽰。
select * from user where u_name like '%三%'
'孟%';:表⽰以"孟"开头的;
'%孟%';:表⽰带"孟"的;
'%孟';:表⽰以"孟"结尾的;
将会把u_name为“张三”,“张猫三”、“三脚猫”,“唐三藏”等等有“三”的记录全出来。
另外,如果需要出u_name中既有“三”⼜有“猫”的记录,请使⽤and条件。
select * from [user] where u_name like '%三%' AND u_name like '%猫%'
_ : 表⽰任意单个字符。匹配单个任意字符,⼀个"_"代表⼀个字符,可以多个⼀起使⽤。它常⽤来限制表达式的字符长度语句select * from [user] where u_name like '_三_'
2、运算符
算术运算符
+、-、*、/。null经过运算仍然是 null
⽐较运算符
=、>、>=、<、<=、<>。不能对 null ⽤⽐较运算符,⽽是 is null 运算符和 is not null 运算符。
字符串类型的数据按照字典顺序进⾏排序,不同于数字⼤⼩。
逻辑运算符
and、or、not、and、between、in。可以⽤括号
括号指定优先级。
in 操作符允许我们在 where ⼦句中规定多个值
select <;列名> from <;表名> where <;列名> in (value1,value2,...)
sql语句查询不包含select <;列名> from <;表名> where <;列名> between value1 and value2;
数值、⽂本或者⽇期。
操作符 between ... and 会选取介于两个值之间的数据范围。这些值可以是数值、⽂本或者⽇期
select * from students where score >= 80 and gender = 'M';
select * from students where (score < 80 or score > 90) and gender = 'M';
(三)SQL运⾏顺序
SQL运⾏顺序流程图
三、聚合排序
⾯对⼤量数据我们时常需要对其做汇总的分析。这部分内容就是说明各类汇总操作的⽅法。
(⼀)聚合查询(汇总分析)
计数(求某列的⾏数)count
计算所有⾏数:count(*),会包括 null
计算除了null 以外⾏数:count(<;列名>)。即如果输⼊列名,会得到除去 null 之外的⾏数,函数返回指定列的值的数⽬(NULL 不计⼊)计算去除重复数据后的⾏数:count(distinct <;列名>)
对某列数据求和 sum(<;列名>)
求平均 avg(<;列名>)
求最值 max/min(<;列名>)
null 值排除在外,都可以使⽤ distinct 参数
案例1:查询课程编号为“0002”的总成绩
/*
分析思路
select 查询结果 [总成绩:汇总函数sum]
from 从哪张表中查数据[成绩表score]
where 查询条件 [课程号是0002]
*/
select sum(成绩)
from score
where 课程号 = '0002';
案例2:查询选了课程的学⽣⼈数
/*
这个题⽬翻译成⼤⽩话就是:查询有多少⼈选了课程
select 学号,成绩表⾥学号有重复值需要去掉
from 从课程表查score;
*/
select count(distinct 学号) as 学⽣⼈数
from score;
(⼆)分组
group by:对指定的列称为聚合键或分组列;null 也会作为⼀组数据
聚合键之外的列名不能在select⼦句中出现
group by ⼦句中不能写列的别名
where 和 group by 同时使⽤,where 中不能选择聚合函数。
案例1:查询各科成绩最⾼和最低的分, 以如下的形式显⽰:课程号,最⾼分,最低分
/*
分析思路
select 查询结果 [课程ID:是课程号的别名,最⾼分:max(成绩) ,最低分:min(成绩)]
from 从哪张表中查数据 [成绩表score]
where 查询条件 [没有]
group by 分组 [各科成绩:也就是每门课程的成绩,需要按课程号分组];
*/
select 课程号,max(成绩) as 最⾼分,min(成绩) as 最低分
from score
group by 课程号;
案例2:查询每门课程被选修的学⽣数
/*
分析思路
select 查询结果 [课程号,选修该课程的学⽣数:汇总函数count]
from 从哪张表中查数据 [成绩表score]
where 查询条件 [没有]
group by 分组 [每门课程:按课程号分组];
*/
select 课程号, count(学号)
from score
group by 课程号;
案例3:查询男⽣、⼥⽣⼈数

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。