数据库查询操作
- 数据准备
- 查询的基本操作
- 查询部分字段的值
- 取别名
- 去重
- 条件查询
- 比较运算符
- 逻辑运算符
- 模糊查询
- 范围查询
- 为空判断
- 排序
- 分组聚合
- count(*) : 求表的总的记录数
- max(字段名): 查询对应字段的最大的值
- min(字段名): 查询对应字段的最小的值
- sum(字段名): 查询对应字段的值的总和
- avg(字段名): 查询对应字段的值的平均数
- 总和运用
- 分组查询
- group by
- having
- 分页查询
数据准备
drop table if exists students;
create table students (
studentNo varchar(10) primary key,
name varchar(10),
sex varchar(1),
hometown varchar(20),
age tinyint(4),
class varchar(10),
card varchar(20)
);
insert into students values
( '001', '王昭君 ', '女 ', '北京 ', '20', '1班 ', '340322199001247654'), ( '002', '诸葛亮 ', '男 ', '上海 ', '18', '2班 ', '340322199002242354'), ( '003', '张飞 ', '男 ', '南京 ', '24', '3班 ', '340322199003247654'),
( '004', '白起 ', '男 ', '安徽 ', '22', '4班 ', '340322199005247654'),
( '005', '大乔 ', '女 ', '天津 ', '19', '3班 ', '340322199004247654'),
( '006', '孙尚香 ', '女 ', '河北 ', '18', '1班 ', '340322199006247654'),
( '007', '百里玄策 ', '男 ', '山西 ', '20', '2班 ', '340322199007247654'), ( '008', '小乔 ', '女 ', '河南 ', '15', '3班 ', null),
( '009', '百里守约 ', '男 ', '湖南 ', '21', '1班 ', ''),
( '010', '姐己 ', '女 ', '广东 ', '26', '2班 ', '340322199607247654'), ( '011', '李白 ', '男 ', '北京 ', '30', '4班 ', '340322199005267754'), ( '012', '孙眠 ', '男 ', '新疆 ', '26', '3班 ', '340322199000297655');
查询的基本操作
查询部分字段的值
-- 查询某些字段
select name,sex,age from students;
取别名
-- 表起别名
select s.name,s.sex,s.age from students as s;
-- 字段取别名
select s.name as 姓名,s.sex as 性别,s.age as 年龄 from students as s;
去重
-- 字段内容去重
select DISTINCT sex from students;
条件查询
比较运算符
比较运算符: 大于(>)、等于(=)、小于(<)、大于等于(>=)、小于等于(<=)、不等于(<>或者!=)
-- //条件查询:比较运算符
-- 例1: 查询小乔的年龄
select age from students where name = '小乔';
-- 例2: 查询20岁以下的学生
select * from students where age <20;
-- 例3: 查询家乡不在北京的学生 != 之间不能有空格
select * from students where hometown != '北京';
-- 1、 查询学号是'007'的学生的身份证号
select card from students where studentNo= '007';
-- 2、 查询'1班 '以外的学生信息
select * from students where class <> '1班';
-- 3、 查询年龄大于20的学生的姓名和性别
select name,sex from students where age >20;
逻辑运算符
逻辑运算符: and(且,同时符合对应的条件), or (或,符合其中的—个条件), not (非,不符合该条件)
-- //条件查询:逻辑运算符
select * from students where age=18 and sex='女';
-- 查询出女学生或者是1班的学生
select * from students where sex='女' or class='1班';
-- 查询非天津的学生的记录
select * from students where not hometown='天津';
select * from students where hometown != '天津';
模糊查询
模糊查询: like关键字
% : 匹配任意个字符
_ :匹配任意单个字符
—般LIKE关键字只用来匹配字段类型为字符串的
-- //条件查询:模糊查询
-- 例1: 查询姓孙的学生
select * from students where name like '孙%';
-- 例2: 查询姓孙且名字是—个字的学生
select * from student where name like '孙_';
-- 例3: 查询姓名以‘ 乔 ’ 结尾的学生
select * from students where name like '%乔';
-- 例4: 查询姓名中包含‘ 白 ’ 的学生
select * frm students where name like '%白%';
-- 1、 查询姓名为两个字的学生
select * from students where name like '__';
-- 2、 查询姓‘百’且年龄大于20的学生
select * from studen where name like '百%' and age >20;
-- 3、 查询学号以1结尾的学生
select * from students where studentNo like '%1';
范围查询
in : 查询非连续范围内的数据
between … and : 查询连续范围内的数据(用来数值型字段中)
-- //条件查询:范围查询
-- 查询家乡为北京或上海或广东的学生(in)
select * from students where hometown in ( '北京 ', '上海 ', '广东 ');
select * from students where hometown= '北京 ' or hometown= '上海 ' or hometown= '广东 '
-- -- 查询年龄在18到20之间的学生(between and)
select * from students where age between 18 and 20;
select * from students where age >=18 and age <= 20;
-- 1、 查询年龄为18或19或22的女生
select * from students where age >= 18 age <= 20;
select * from students where age betwwen 18 and 20;
为空判断
null 和 ''空字符串不一样
空判断: is null
非空判断: is not null
-- //条件判断:为空判断
-- 查询出学生身份证号为空的信息
select * from students where card is null;
-- 查询出学生身份证不为空的信息
select * from studnts where card is not null;
排序
select * from 表名 order by 字段1 asc |desc, 字段2 asc |desc
字段的排序规则默认为升顺排列(从小到大)
asc: 表示从小到大排序(升序)
desc: 表示从大到小排序(降序)
-- //排序
-- 例1: 查询所有学生信息,按年龄从小到大排序
select * from students order by age;
-- 例2: 查询所有学生信息,按年龄从大到小排序, 年龄相同时,再按学号从小到大排序
select * from students order by age desc,studentNo;
-- 1、 查询所有学生信息,按班级从小到大排序, 班级相同时,再按学号从小到大排序
select * from students order by class, studentNo;
分组聚合
使用聚合函数方便进行数据统计
聚合函数不能在where中使用
count(*) : 求表的总的记录数
-- 查询学生表的总记录数
select count(*) from students;
max(字段名): 查询对应字段的最大的值
-- 查询女生的最大年龄
select age from students where sex='女';
select max(age) from students where sex='女';
min(字段名): 查询对应字段的最小的值
-- 查询1班的最小年龄
select class,age from students where class ='1班';
select min(age) from students where class ='1班';
sum(字段名): 查询对应字段的值的总和
-- 查询北京学生的年龄总和
select hometown,age from students where hometown='北京';
select sum(age) from students where hometown='北京';
avg(字段名): 查询对应字段的值的平均数
-- 查询女生的平均年龄
select sex,age from students where sex ='女';
select avg(age) from students where sex='女';
总和运用
-- 查询所有学生的最大年龄、最小年龄、平均年龄
select max(age),min(age),avg(age) from students;
-- 一班共有多少个学生
select count(*) from students where class='1班';
-- 查询3班年龄小于18岁的同学有几个
select count(*) from students where class='3班' and age < 18;
分组查询
group by
- 格式
select 字段名1,字段名2,聚合函数 .... from 表名 group by 字段名1,字段名2....
- 例子
-- //分组查询--group by
-- 查询各种性别的人数
select sex,count(*) from students group by sex;
-- 查询各种性别年底最大的
select sex,max(age) from students group by sex;
-- 查询各个班级的人数
select class,count(*) from students group by class;
-- 查询各个班级中不同性别的人数
select class,sex,count(*) from students group by class,sex;
having
- 格式
select 字段名1,字段名2,聚合函数 .... from 表名 group by 字段名1,字段名2....
having 条件
- 例子
-- //分组查询--having
-- 查询男生总人数
select count(*) from students where sex='男';
select sex,count(*) from students group by sex having sex='男';
-- 查询每个班级男生的总记录数
select class,sex,count(*) from students group by class,sex having sex='男';
-- 查询所有班级中不同性别的记录数大于1的信息
select class,sex,count(*) from students group by class,sex haxing count(*)>1;
分页查询
- 格式
select * from limit start, count
- 例子
-- //分页查询
-- 查询前3行的学生信息
select * from students limit 0,3;
select * from students limit 3;
-- //公式select * from students limit (n-1)*m, m;
-- n=1,m=3(n代表的是页数,m代表的是每页显示的记录数)
select * from students limit 0,3;