小白的MySQL,从零到精通(十五章)之第七章--Select查询

因为select知识比较多,我们单独列出一章来了解。

select [distinct] *| {column1,column2,...} from tbl_name;

创建一张学生表来测试:

create table student (
id int not null default 1,
name varchar(20) not null default '',
chinese float not null default 0.0 comment '语文成绩',
english float not null default 0.0 comment '英语成绩',
math float not null default 0.0 comment '数学成绩'
);

插入数据:

insert into student values(1, '李涛', 89,78, 90);
insert into student values(2, '唐僧', 67,98, 56);
insert into student values(3, '孙悟空', 87,78, 77);
insert into student values(4, '老妖婆', 88,98, 90);
insert into student values(5, '红孩儿', 82,84, 67);
insert into student values(6, '如来佛祖', 55,85, 45);
insert into student values(7, '菩萨', 75,65, 30);

可以指定查询哪些列,比如:查询id,姓名,数学成绩

mysql> select id, name, math from student;

这里写图片描述
*号表示查询所有列( 星号效率很低,用哪些字段就取哪些字段 )

mysql> select * from student;

这里写图片描述
distinct 如果结果中有完全相同的行,就去除重复行
这里写图片描述
在select语句中可以使用表达式对查询的列进行运算
select语句中可以使用as起别名

例:在所有学生分数上加上10分(查询所有学生的总分再加10分)

mysql> select name, chinese+math+english+10 as total from student;

例:将所有行唐的学生成绩增加60%(查询总分再增加60%)

mysql> select name, (chinese+math+english)*1.6 as total from student where name like '唐%'; -- 增加60%就是 乘以 1.6, like 是模糊查询

select的where子句
使用where子句,进行查询过滤。
在where子句中经常使用的运算符:
这里写图片描述
示例:查询姓李的学生的成绩

mysql> select * from student where name like '李%';

这里写图片描述
查询英语成绩大于90分的同学

mysql> select * from student where english > 90;

这里写图片描述
查询总分大于200分的所有同学

mysql> select id, name, math+english+chinese as 'total' from student where math+english+chinese>200;--注意在这里where后面不能使用前面定义的别名total

这里写图片描述
查询姓李并且成id大于10的学生

mysql> select * from student where name like '李%' and id > 10;

这里写图片描述
查询英语成绩大于语文成绩的同学

mysql> select * from student where english > chinese;

这里写图片描述
查询总分大于200分并且数学成绩小于语文成绩的姓唐的学生

mysql> select * from student where (math+english+chinese) > 200 and math < chinese and name like'唐%';

这里写图片描述
查询英语分数在80 - 90 之间的同学

mysql> select * from student where english>=80 and english<=90; --方法1
mysql> select * from student where english between 80 and 90; -- 方法2 between是闭区间
这两种方法是等价的

查询数学成绩为89,90,91的同学

mysql> select * from student where math=89 or math=90 or math=91; -- 方法1
mysql> select * from student where math in(89,90,91);--方法2,推荐使用这种方法

这里写图片描述
select的order by 子句
order by子句排序查询结果

select column1,column2,... from table order by column asc|desc,...;

order by 指定排序的列,排序的列可以使表中的列名,也可以是select语句后指定的别名
asc升序(默认),desc降序
order by 子句应该位于select语句的结尾

例:对数学成绩进行排序

mysql> select * from student order by math;--没有指定升序还是降序,默认是升序

这里写图片描述
对总分进行排序后,按从高到低输出

mysql> select id, name, math+english+chinese as total from student order by total desc;

这里写图片描述
对行李的学生按成绩进行从低到高排序,(因为表中只有一个姓李的学生,所以我插入一条记录)

mysql> insert into student values(8,'李雅',79,31,56);

mysql> select id, name, math+english+chinese as total from student where name like '李%' order bytotal;

这里写图片描述
count
count(列名)返回某一列,行的总数

select count(*)|count(列名) from tbl_name where condition

例:统计一个班级共有多少学生

mysql> select count(*) from student;

这里写图片描述
统计总分大于250的人数有多少

mysql> select count(*) from student where math+english+chinese>250;

这里写图片描述

说明:count(*)会统计一共的记录数,count(列名)会排除为null的情况

sum
sum函数返回满足where条件的行的和

select sum(列名) {,sum(列名)...} from tbl_name [where condition]

例:统计一个班级数学总成绩

mysql> select sum(math) from student;

这里写图片描述
统计一个班级语文,英语,数学各科的总成绩

mysql> select sum(chinese), sum(english), sum(math) from student;

这里写图片描述
统计一个班级语文,英语,数学的成绩总和

mysql> select sum(chinese+english+math) from student;

这里写图片描述
统计一个班级语文成绩平均分

mysql> select sum(chinese)/count(name) from student;

这里写图片描述

注意:sum仅对数值起作用,否则结果无意义

avg
agv函数返回满足where条件的一列的平均值

select avg(列名) [,avg(列名),...] from tbl_name [where condition];

例:求一个班级的数学平均分

mysql> select avg(math) from student;

这里写图片描述
求一个班级总分平均值

mysql> select avg(math+chinese+english) from student;

这里写图片描述

max/min
max/min函数返回满足where条件的一列的最大/最小值

select max(列名) from tbl_name [where condition]

例:求班级最高和最低分

mysql> select max(chinese+english+math), min(chinese+english+math) from student;

这里写图片描述

group by子句的使用
group by 子句对列进行分组

select column1, column2, .. from table group by column;

为了给大家说清楚分组,创建一个雇员信息表(来自oracle 9i的经典测试表)这个大家可以搜一下,网上都有
1. EMP员工表
2. DEPT部门表
3. SALGRADE工资等级表
例:如何显示每个部门的平均工资和最高工资

mysql> select deptno,avg(sal),max(sal) from EMP group by deptno;

这里写图片描述
显示每个部门的每种岗位的平均工资和最低工资

mysql> select avg(sal),min(sal),job, deptno from EMP group by deptno, job;

这里写图片描述
说明:首先按照deptno分组,然后各组再按照job进行分组。

显示平均工资低于2000的部门和它的平均工资
解题思路:
1.统计各个部门的平均工资

select avg(sal) from EMP group by deptno

2.having往往和group by配合使用,对group by结果进行过滤

mysql> select avg(sal) as myavg from EMP group by deptno having myavg<2000;

—知识未完,待看下篇!!!

猜你喜欢

转载自blog.csdn.net/guijun6/article/details/80748066