如图所示是我们接下来要用到的students表:
一、别名与重复记录
1.查询所有字段
select * from 表名;
例:查询students表的所有信息
select * from students;
2.查询指定字段
select 字段1,字段2, ... from 表名;
例:查询students表的name,sex,age字段
select name,sex,age from students;
3.字段的别名 同理表也可以起别名
select 字段名 (as) 别名 from 表名;
- 通过 字段名 as 别名,给字段起别名,别名可以是中文
- as可以省略
例:students表中name字段、sex字段、age字段别名分别为姓名、性别、年龄
select name as 姓名,sex as 性别,age as 年龄 from students;
select name 姓名,sex 性别,age 年龄 from students;
4.消除重复记录(不会改变原表内容)
select distinct 字段名 from 表名;
- 通过select distinct 字段名,字段名 from 表名 过滤select查询结果中的重复记录
例:查询students表中的sex字段,用distinct取消重复记录
select distinct sex from students;
二、条件查询
1.where子句
select 字段1,字段2, ... from 表名 where 条件;
- select 后面*或字段决定返回的字段(列)
- select中where子句决定返回的记录(行)
例:查询students表中年龄age大于30的姓名name,班级class
select name,class from students where age>30;
2.比较运算符
等于 | = |
大于 | > |
大于等于 | >= |
小于 | < |
小于等于 | <= |
不等于 | != 或 <> |
例1:查询students表中姓名name等于'小乔'学生的年龄age
select age from students where name='小乔';
例2:查询students表中年龄30以下的学生
select * from students where age<30;
例3:查询students表中家乡不在北京的学生
select * from students where hometown<>'北京';
3.逻辑运算符
3种:add(与)、or(或)、not(非)
例1:查询老家hometown是河南或河北的学生
select * from students where hometown='河南' or hometown='河北';
例2:查询班级class为1班且老家hometown为北京的学生
select * from students where class='1班' and hometown='北京';
例3:查询年龄age不是30的学生
select * from students where not age='30';
4.模糊查询 like
- %表示任意多个任意字符
- _表示一个任意字符
例1:查询姓名name为两个字的学生
select * from students where name like '__';
例2:查询name姓白且年龄age大于30的学生
select * from students where name like '白%' and age>30;
例3:查询学号studentNo以1结尾的学生
select * from students where studentNo like '%1';
5.范围查询
- in(值1,值2,值3):非连续范围
- between 值1 and 值2:连续范围
例1:查询年龄age在20或25或30的女生
select * from students where age in (20,25,30) and sex='女';
例2:查询年龄age在25到30以外的学生
select * from students where not age between 25 and 30;
6.空判断
判断空:is null 不能用 字段名 =null
判断非空:is not null
- null与 ''是不同的
- null:代表什么都没有
- '':代表长度为0的字符串
7.where子句用在update和delete中
例1:修改students表中姓孙的同学,班级为1班
update students set class='1班' where name like'孙%';
例2:删除students表中年龄在20到30之间所有的男同学
delete from students where (age between 20 and 30 )and sex='男';
三、排序
select * from 表名
order by 字段1 asc|desc,字段2 asc|desc, ...
- asc代表升序,为默认值可以省略
- desc代表降序
例1:查询students表中所有学生信息,按年龄age从大到小排序,年龄相同时,再按学号studentNo从小到大排序
select * from students order by age desc,studentNo;
例:查询students表中所有男学生信息,按班级class从小到大排序,班级相同时,再按studentNo学号从大到小排序
select * from students where sex ='男' order by class,studentNo desc;
四、聚合函数
- 聚合函数不能再where后面条件中使用
- 聚合函数不能与普通字段同时出现:select name,max(age) 错误
1.count 总记录数
count(字段)
例:查询性别sex为女的学生总数
select count(*) from students where sex='女';
2.max 最大值
max(字段)
例:查询性别sex为女的最大年龄age
select max(age) from where sex='女''
3.min 最小值
4.sum 求和
sum(字段)
例1:查询students中年龄总和:
select sum(age) from students
5.avg 求平均值
avg(字段)
- avg计算平均值时忽略null值
例1:查询所有学生的最大年龄、最小年龄、平均年龄
select max(age),min(age),avg(age) from students;
例2:查询3班年龄小于30岁的学生有几个
select count(*) from students where age<30 and class='3班';
五、数据分组
1.分组group by 配合聚合函数使用
select 字段1,字段2,... 聚合函数... from 表名 group by 字段1,字段2,...
例1:查询各个年龄段的同学数量
select age,count(*) from students group by age;
例2:分别查询1班不同性别学生数量
select sex,count(*) from students where class='1班' group by sex;
例3:统计各个班级学生总数、平均年龄、最大年龄、最小年龄
select class,count(*),avg(age),max(age),min(age) from students group by class;
例4:统计各个班级学生总数、平均年龄、最大年龄、最小年龄。但不统计3班,统计结果按班级名称从大到小排序
select class,count(*),avg(age),max(age),min(age) from students where class<>'3班' group by class order by class desc;
where、group by、oder by的顺序:
select * from 表名 where 条件 group by 字段 order by 字段;
2.分组后的数据筛选
select 字段1,字段2,聚合 ... from 表名
group by 字段1,字段2,...
having 字段1,...聚合...
- where先筛选符合,再统计聚合
- having先统计聚合,再筛选符合,只能出现在group by后面
- having后面可以用聚合函数,而where不能使用
例1:求班级人数大于3人的班级名字
select class from students group by class having count(*)>3;
例2:查询平均年龄大于30岁的班级名称和班级总人数
select class,count(*) from students group by class having avg(age)>30;
六、数据分页显示
1.limit 显示指定记录数
select * from 表名 limit start,count;
- limit总是出现在select语句最后
- start代表开始行数,count代表显示行数
- 省略start默认从0开始,从第一行开始
例1:查询从第4条记录开始的三条记录
select * from students limit 3,3;
例2:查询年龄最大的女学生信息
select * from students where sex ='女' order by age desc limit 1;
2.分页
已知:每页显示m条数据,求:查询第n页的数据
select * from 表名 limit (n-1)*m,m;
例1:每页显示4条数据,查询第3页的数据
m=4,n=3,(n-1)*m=8
select * from students limit 8,4;
例2:查询students表,要求每页显示5条记录,每页用一条select语句,分别用多条select语句,显示葱第一页到最后一页的数据
students表中一共有12条数据
select * from students limit 5;
select * from students limit 5,5;
select * from students limit 10,2;