单表查询
Posted zuihoudebieli
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单表查询相关的知识,希望对你有一定的参考价值。
单表查询
完整的查询语句语法
# []为可选项
select [distinct] *|字段名|四则运算|聚合函数 from 表名
[where 条件]
[group by 字段]
[having 条件]
[order by 条件]
[limit m,n] 控制从哪里开始显示以及显示几条
以上就是书写顺序,必须按照这个顺序来书写sql语句。书写顺序并不代表执行顺序
简单查询
1.distinct是可选项,用于去除重复记录
2.as 是用来取别名,取别名as可以省略
3.可以对字段的数据进行四则运算
4.concat()字符串连接,concat_ws()可以指定连接符连接字符串
# 准备数据
create table stu(id int primary key auto_increment,name char(10),math float,english float);
insert into stu(name,math,english) values("赵云",90,30),("小乔",90,60),("大乔",10,70),("李清照",100,100),("铁拐李",20,55),("小李子",20,55),("李四",59,98),("李",88,32),("狄仁杰",null,null);
# 1.查看所有的数据
select * from stu;
# 2.查看英语成绩
select name,english from stu;
# 3.查询所有人的数学数据,并去处姓名相同的数据
select distinct name,math from stu;
# 4.统计每个人的总分
select name,math+english as 总分 from stu;
# 5.为每个人的英语加10分显示
select name,english+10 from stu;
# 6.字符串连接
select name 姓名,concat("英语:",english),concat_ws(":","数学",math) from stu;
where关键字
支持的表达式
# 1.查询英语分数在90-100之前的同学
select * from stu where english between 90 and 100;
# 2.查询数学分数为89,90,91的同学
select * from stu where math in (89,90,91);
# 3.查询所有姓李的学生成绩
select * from stu where name like "李%";
# 4.查询所有姓名带有李的学生成绩
select * from stu where name like "%李%";
# 5.查询学分>80并且英语分>80的同学
select * from stu where math>80 and english>80;
# 6.查询数学分<60或则英语分<60的同学
select * from stu where math<60 or english<60;
# 7.查询数学分为空的同学
select * from stu where math is null;
group by 分组查询
需要一个字段作为分组依据,把一个整体分割为不同的部分
1.count():计数,为null时不会计入
2.sum():求和
3.avg():求平均书,为null时不计入分母
4.max():求最大值
5.min():求最小值
以上聚合函数可以写在字段的位置,或则是分组的后面
注意:mysql5.6默认分组后可以查看每个分组的第一条记录的字段,可以添加ONLY_FULL_GROUP_BY到sql_mode中避免这个问题
# 准备数据
create table emp(id int primary key auto_increment,name char(10),sex char, dept char(10),job char(10),salary double);
insert into emp(name,sex,dept,job,salary) values("刘备","男","市场","总监",5800),("张飞","男","市场","员工",3000),("关羽","男","市场","员工",4000),("孙权","男","行政","总监",6000),("周瑜","男","行政","员工",5000),("小乔","女","行政","员工",4000),("曹操","男","财务","总监",10000),("司马懿","男","财务","员工",6000);
# 1.查询每个部门有几个人
select dept,count(*) 人数 from emp group by dept;
# 2.查询每个部门的平均工资
select dept,avg(salary) 平均工资 from emp group by dept;
# 3.查询每个岗位的平均工资
select job,avg(salary) 平均工资 from emp group by job;
# 4.查询每个部门每个岗位的平均工资
select dept,job,avg(salary) 平均工资 from emp group by dept,job;
# 5.查询工资最高的人的姓名
select name,max(salary) from emp;
# 6.查询平均工资大于5000的部门
mysql> select dept from emp where avg(salary) > 50;
ERROR 1111 (HY000): Invalid use of group function
# 错误写法,where后面不能使用聚合函数
## having 用于对分组后的数据进行筛选,与where不同的是:having使用分组之后;having后面可以写聚合函数
select dept from emp group by dept having avg(salary)>5000;
# 7.查询部门人数少于3的部门名称,人员名称,人员个数
select dept,group_concat(name),count(*) from emp group by dept having count(*) <3;
# 8.查询岗位平均薪资高于6000的岗位名称和平均薪资
select dept,avg(salary) from emp group by dept having avg(salary) > 6000;
order by 排序
select * from emp order by salary; # 按薪资升序排序
select * from emp order by salary asc; # 按薪资升序排序
select * from emp order by salary desc; # 按薪资降序排序
select * from emp order by salary,id desc; # 先按薪资升序排序,工资相同的按id降序排序
Limit 限制显示的记录数
limit [start,] count;
start 开始记录的位置,从0开始数,不指定时则从第一条开始显示
count要显示的记录条数
select * from emp limit 3; # 查看前三条记录
select * from emp order by salary desc limit 1; # 查看工资最高的人的信息
select * from emp limit 2,4; # 从第3条记录开始查找4条记录
limit 可用于分页,分页原理;
先查询总数据条数 设为a
确定每页数量b
总页数c = a / b如果除不尽则需要加1,例如10/3正确页数为4
查询语句的起始位置为a = 当前页数d 减去1 乘以每页数量
即 s = (d - 1) * b
语句为:slect*from table_name limit s,b
以上是关于单表查询的主要内容,如果未能解决你的问题,请参考以下文章