Mysql基础操作(三)

2020-12-02 16:46:35 浏览数 (1)

文章总览图

排序

代码语言:javascript复制
-- 升序
-- select * from students order by age asc
-- asc可省略
-- select * from students order by age 

-- 如果不用排序就按添加的顺序排序
-- select * from students 

-- 降序
-- select * from students order by age desc

-- 查询所有学生信息,按年龄从大到小排序,如果年龄相同,就按照学号降序排列
-- 优先按第一个字段进行排序,如果第一个字段的值相同了,才按照第二个字段进行排序
select * from students order by age,studentno desc

代码语言:javascript复制
-- 查询所有学生信息,按班级从小到大排序,班级相同时,再按学号从小到大
-- select * from students order by class desc,studentno desc

-- gbk是中国的编码  对中文数据进行排序
-- select * from students order by convert(name using gbk)

聚合函数

count(*)代表一行记录任意字段有值,就会统计在内。

count(card) 代表只统计card字段的个数,如果有null值不会被统计。

代码语言:javascript复制
-- 统计所有记录 查询学生总数
-- select count(*) from students 

-- 统计某个字段
-- select count(card) from students

-- 查询女生的最大年龄 
-- select max(age) from students where sex='女'

-- 查询1班的最小年龄
-- select min(age) from students where class='1班'


-- 查询北京学生的年龄总和
-- select sum(age) from students where hometown='北京'

-- 查询女生的平均年龄
select avg(age) from students where sex='女'

分组

按照字段分组,表示此字段相同的数据会被放到一个组中。

分组后,分组的依据列会显示在结果集中,其它列不会显示在结果集中。

可以对分组后的数据进行统计,做聚合运算。

select 列1,列2,聚合...from 表名 group by 列1,列2....

代码语言:javascript复制
-- 查询各种性别的人数
-- select sex,count(*) from students group by sex

-- 查询各种年龄的人数
select age,count(*) from students group by age

分组后过滤

代码语言:javascript复制
-- 查询男生总人数
-- select count(*) from students where sex='男'

select sex,count(*) from students group by sex having sex='男'

where是对from后面指定的表进行数据筛选,属于对原始数据的筛选 having 是对group by的结果进行筛选

代码语言:javascript复制
-- 查询1班除外其它班级学生的平均年龄、最大年龄、最小年龄
-- select class,avg(age),max(age),min(age) from students where class !='1班' group by class

select class,avg(age),max(age),min(age) from students group by class having class !='1班'

分页

获取部分行

当数据量过大时,在一页中查看数据是一件非常麻烦的事情。

select * from 表名 limit start,count

从start开始,获取count条数据。

start索引从0开始。

代码语言:javascript复制
-- 查询前3行学生信息
-- select * from students limit 0,3
-- select * from students limit 4,4
-- select * from students order by age limit 0,3

-- 要求每页显示3条

-- select count(*) from students 
-- 12/3 获取总页数

-- 第一页
-- select * from students limit 0,3 

-- 第二页
-- select * from students limit 3,3

-- 第三页
-- select * from students limit 6,3

-- 第四页
select * from students limit 9,3

-- 每页显示5条数据,显示每一页的数据
-- 12/5 2 1

-- 第一页
-- select * from students limit 0,5
-- 第二页
-- select * from students limit 5,5
-- 第三页
select * from students limit 10,5

分页练习

代码语言:javascript复制
-- select * from students limit 7

-- 相当于
select * from students limit 0,7

连接查询-等值连接

使用方式一会产生笛卡尔积,产生虚拟的临时表,会放进计算机的内存中,再过滤出需要的数据。

方式二不会产生临时表,每次连接的时候先判断条件,再出来结果。

准备数据

代码语言:javascript复制
-- drop table if exists courses;
-- 
-- create table courses(
--   courses int(10) unsigned primary key auto_increment,
--  name varchar(10)
-- );
-- 

-- insert into courses values
-- ("1","数据库"),
-- ("2","qtp"),
-- ("3","linux"),
-- ("4","系统测试"),
-- ("5","单元测试"),
-- ("6","测试过程");

-- drop table if exists scores;
-- create table scores(
-- id int(10) unsigned primary key auto_increment,
-- courseNo int(10),
-- studentno varchar(10),
-- score tinyint(4)
-- );

insert into scores values
("1","1","001","90"),
("2","1","002","75"),
("3","2","002","98"),
("4","1","001","86"),
("5","3","003","80"),
("6","4","004","79"),
("7","5","005","96"),
("8","6","006","80");
代码语言:javascript复制
-- 查询学生信息以及学生的成绩
select * from students,scores where students.studentno=scores.studentno

连接查询-内连接

代码语言:javascript复制
-- 方式一
-- select * from students,scores where students.studentno=scores.studentno

-- 方式二  不会产生笛卡尔积,不会产生临时表,性能高

select * from students inner join scores on students.studentno=scores.studentno

0 人点赞