MySQL数据库(十二)2018.11.16

可以通过order by对查找结果进行排序:升序和降序

order by 字段名称 asci|desc;

这个功能也是很常用的,比如我们在商城中按照价格对商品进行一个排序。

想实现这样一个排序功能,就可以通过order by来进行一个排序

#测试排序
#按照id降序排序
SELECT id,username,age
FROM user1
ORDER BY id DESC;
#默认是降序

#按照age升序
SELECT  id username,age
FROM user1
ORDER BY age;
#默认升序

按多个字段排序,如果第一个字段已经把序排出来了,就不用第二个字段了

#按照多个字段排序
SELECT id,username,age
FROM user1
ORDER BY age ASC,id ASC;

#测试条件+排序
SELECT id,username,age
FROM user1
WHERE age>=30
ORDER BY age DESC;
#年龄由大到小排序

实现随机记录:

#实现随机记录
SELECT id,username,age
FROM user1
ORDER BY RAND();
#每次刷新的结果排序结果都不一样

select中用到的最后一个筛选条件就是limit,limit语句限制结果集的显示条数,有了它以后,其实就可以实现我们的分页效果。

想实现分页显示的结果核心就是limit语句。

1.limit+值:的作用就是显示结果集的前几条记录。

2.limit offset,row _count:从offset开始,显示几条记录。

什么是结果集呢?

就是我们的查询语句查询出来的结果,我们就叫做一个结果集。

#测试limit语句
#显示结果集中的前五条记录
SELECT id,username,age,sex
FROM user1
#显示结果集的前5条记录
LIMIT 5;

偏移量offset默认从0开始

#显示三条
SELECT id,username,age,sex
FROM user1
LIMIT 0,3;

#显示下三条
SELECT id,username,age,sex
FROM user1
LIMIT 3,3;

#删除前三条记录
DELETE FROM user1
LIMIT 3;

#按照id降序排列,更新前三条记录,将age-10
UPDATE user1 SET age=age-10 ORDER BY id DESC LIMIT 3;

#删除前三条记录
DELETE FROM user1
LIMIT 3;

成功之后再查询一下,只会少三条记录。

接下来我们把这个数据表清空一下。

INSERT user1 VALUES(1,'king',23,'男','北京',1,50000,NULL);
INSERT user1(id,username,age,sex,addr,married,salary,userDesc)VALUES(DEFAULT,'queen',27,'女','上海',0,25000,NULL);
INSERT user1 SET username='imooc',age=31,sex='女',addr='北京',salary=40000;
INSERT user1 VALUES(NULL,'张三',38,'男','上海',0,15000,NULL),
(NULL,'张三风',38,'男','上海',0,15000,NULL),
(NULL,'张子怡',39,'女','北京',1,85000,NULL),
(NULL,'汪峰',42,'男','深圳',1,95000,NULL),
(NULL,'刘德华',58,'男','广州',0,115000,NULL),
(NULL,'吴亦凡',28,'男','北京',0,75000,NULL),
(NULL,'奶茶妹',18,'女','北京',1,65000,NULL),
(NULL,'刘嘉玲',36,'女','广州',0,15000,NULL);

DROP TABLE user1;
#测试查询操作
#那么我们以后的测试就用这个表来测试了
CREATE TABLE user1(
	id INT UNSIGNED AUTO_INCREMENT KEY,
	username VARCHAR(20) NOT NULL UNIQUE COMMENT '姓名',
	age TINYINT UNSIGNED NOT NULL DEFAULT 18 COMMENT '年龄',
	sex ENUM('男','女','保密')NOT NULL DEFAULT '保密' COMMENT '性别',
	addr VARCHAR(20) NOT NULL DEFAULT '北京',
	married TINYINT(1)NOT NULL DEFAULT 0 COMMENT '0代表未婚,1代表已婚',
	salary FLOAT(8,2)NOT NULL DEFAULT 0 COMMENT '薪水'

)ENGINE=INNODB CHARSET=utf8;
INSERT user1 VALUES(1,'king',23,'男','北京',1,50000);
INSERT user1(username,age,sex,addr,married,salary)VALUES('queen',27,'女','上海',0,25000);
INSERT user1 SET username='imooc',age=31,sex='女',addr='北京',salary=40000;
INSERT user1 VALUES(NULL,'张三',38,'男','上海',0,15000),
(NULL,'张三风',38,'男','上海',0,15000),
(NULL,'张子怡',39,'女','北京',1,85000),
(NULL,'汪峰',42,'男','深圳',1,95000),
(NULL,'刘德华',58,'男','广州',0,115000),
(NULL,'吴亦凡',28,'男','北京',0,75000),
(NULL,'奶茶妹',18,'女','北京',1,65000),
(NULL,'刘嘉玲',36,'女','广州',0,15000);

#测试完整的select语句形式
SELECT addr,
GROUP_CONCAT(username)AS userDetail,
COUNT(*)AS totalUsers,
SUM(age)AS sum_age,
MAX(age)AS max_age,
MIN(age)AS min_age,
AVG(age)AS avg_age
FROM user1
WHERE id>=2
GROUP BY addr
#得到结果集之后,我想按照总人数升序的方式进行排序
ORDER BY totalUsers;
#升序你可以不写

#测试完整的select语句形式
SELECT addr,
GROUP_CONCAT(username)AS userDetail,
COUNT(*)AS totalUsers,
SUM(age)AS sum_age,
MAX(age)AS max_age,
MIN(age)AS min_age,
AVG(age)AS avg_age
FROM user1
WHERE id>=2
GROUP BY addr
#对分组结果进行二次筛选
HAVING totalUsers>=2;

排序之后我们可以控制显示结果集中的记录个数。

实现了一个我们综合的select语句。

#测试完整的select语句形式
SELECT addr,
GROUP_CONCAT(username)AS userDetail,
COUNT(*)AS totalUsers,
SUM(age)AS sum_age,
MAX(age)AS max_age,
MIN(age)AS min_age,
AVG(age)AS avg_age
FROM user1
WHERE id>=2
GROUP BY addr
#对分组结果进行二次筛选
HAVING totalUsers>=2
ORDER BY totalUsers ASC
LIMIT 0,2;

猜你喜欢

转载自blog.csdn.net/weixin_40316053/article/details/84147095