MySQL之select、distinct、limit的使用


Posted in MySQL onNovember 11, 2021

 

1、简介

这篇博客将会非常基础,如果有MySQL经验的可以跳过,写这篇博客的原因是给初学者看的。下面将会讲解如何使用select查看指定表的单个列、多个列以及全部列。

首先准备一张表,表结构如下所示:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(255) NOT NULL COMMENT '用户名',
  `age` int(11) NOT NULL COMMENT '年龄',
  `sex` smallint(6) NOT NULL COMMENT '性别',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

表数据如下所示:

INSERT INTO `user` VALUES (1, '李子捌', 18, 1);
INSERT INTO `user` VALUES (2, '张三', 22, 1);
INSERT INTO `user` VALUES (3, '李四', 38, 1);
INSERT INTO `user` VALUES (4, '王五', 25, 1);
INSERT INTO `user` VALUES (5, '六麻子', 13, 0);
INSERT INTO `user` VALUES (6, '田七', 37, 1);

SET FOREIGN_KEY_CHECKS = 1;

注意在MySQL4.1之后,数据库关键字是完全不区分大小写;数据库名、表名、列名默认不区分大小写,但是可以修改(不建议修改)。

2、select

2.1 查询单个列

首先使用use指定需要操作的数据库。

mysql> use liziba;
Database changed

接着使用selectuser表中查询name列,select紧跟着列名称,from后面紧跟着表名称。

select column_name from table_name;

mysql> select name from user;
+--------+
| name   |
+--------+
| 李子捌 |
| 张三   |
| 李四   |
| 王五   |
| 六麻子 |
| 田七   |
+--------+
6 rows in set (0.00 sec)

2.2 查询多个列

查询多个列和单个列的区别在于,select后面紧跟多个列名,用英文逗号分割即可。

select column_name1,column_name2,column_name3 from table_name;

mysql> select name,age from user;
+--------+-----+
| name   | age |
+--------+-----+
| 李子捌 |  18 |
| 张三   |  22 |
| 李四   |  38 |
| 王五   |  25 |
| 六麻子 |  13 |
| 田七   |  37 |
+--------+-----+
6 rows in set (0.00 sec)

2.3 查询所有列

查询所有列有两种方式,第一种是上面两种推导出的方式,列出所有的列名。

mysql> select id,name,age,sex from user;
+----+--------+-----+-----+
| id | name   | age | sex |
+----+--------+-----+-----+
|  1 | 李子捌 |  18 |   1 |
|  2 | 张三   |  22 |   1 |
|  3 | 李四   |  38 |   1 |
|  4 | 王五   |  25 |   1 |
|  5 | 六麻子 |  13 |   0 |
|  6 | 田七   |  37 |   1 |
+----+--------+-----+-----+
6 rows in set (0.00 sec)

第二种,也是部分程序员使用的最多的一句SQL,使用 *** 通配符**代替表的所有列。

select * from table_name;

mysql> select * from user;
+----+--------+-----+-----+
| id | name   | age | sex |
+----+--------+-----+-----+
|  1 | 李子捌 |  18 |   1 |
|  2 | 张三   |  22 |   1 |
|  3 | 李四   |  38 |   1 |
|  4 | 王五   |  25 |   1 |
|  5 | 六麻子 |  13 |   0 |
|  6 | 田七   |  37 |   1 |
+----+--------+-----+-----+
6 rows in set (0.00 sec)

提示:是程序员使用的大忌, 如果我们不需要获取表的所有列且表的列名是移植的,就不应该使用查询全部数据,而是应该指定数据库列查询,这样可以提升查询的性能。

3、distinct

如果需要查询列值不重复的数据,可以使用distinct关键字去重。

我们在上面的表中插入一条新的数据,数据age和李子捌相等,sex也相同。

mysql> insert into user (name, age, sex) values('谢礼', 18, 1);
Query OK, 1 row affected (0.01 sec)

此时可以看到年龄列有相等的值

mysql> select * from user;
+----+--------+-----+-----+
| id | name   | age | sex |
+----+--------+-----+-----+
|  1 | 李子捌 |  18 |   1 |
|  2 | 张三   |  22 |   1 |
|  3 | 李四   |  38 |   1 |
|  4 | 王五   |  25 |   1 |
|  5 | 六麻子 |  13 |   0 |
|  6 | 田七   |  37 |   1 |
|  7 | 谢礼   |  18 |   1 |
+----+--------+-----+-----+
7 rows in set (0.00 sec)

此时我们想获取user表中的用户有哪些年龄。我们可以使用distinct关键字,应用于需要去重的列前面。

mysql> select distinct age from user;
+-----+
| age |
+-----+
|  18 |
|  22 |
|  38 |
|  25 |
|  13 |
|  37 |
+-----+
6 rows in set (0.00 sec)

这里有一个问题需要注意distinct关键字去重会作用于所有的字段,如果distinct关键字后面跟了多个字段,那么多个字段的值都不相等才算不重复。

比如说user表中不存在age,name同时都不重复的数据,此时distinct关键字并不是没生效,而是本身就不存在。

mysql> select distinct age,name from user;
+-----+--------+
| age | name   |
+-----+--------+
|  18 | 李子捌 |
|  22 | 张三   |
|  38 | 李四   |
|  25 | 王五   |
|  13 | 六麻子 |
|  37 | 田七   |
|  18 | 谢礼   |
+-----+--------+
7 rows in set (0.00 sec)

如果distinct关键字后跟的字段值都不相等,那么distinct关键字仍然能去重。比如李子捌和谢礼的年龄和性别均相等,此时distinct关键字会过滤一条数据。

mysql> select distinct age,sex from user;
+-----+-----+
| age | sex |
+-----+-----+
|  18 |   1 |
|  22 |   1 |
|  38 |   1 |
|  25 |   1 |
|  13 |   0 |
|  37 |   1 |
+-----+-----+
6 rows in set (0.00 sec)

4、limit

前面的查询会返回满足条件的所有记录,如果我们只需要指定数量的记录,可以使用limit关键字限制返回的行;这种场景多用于数据分页。

limit的取值需大于等于0的整数 ,如果传入负数和小数会报错。

mysql> select * from user limit 0;
Empty set (0.00 sec)

mysql> select * from user limit 1;
+----+--------+-----+-----+
| id | name   | age | sex |
+----+--------+-----+-----+
|  1 | 李子捌 |  18 |   1 |
+----+--------+-----+-----+
1 row in set (0.00 sec)

如果limit给定的值大于表的行记录值,那么将会返回所有数据。比如我们通过select count(1)查询user表的记录数值,一共7条数据,此时我们传入8,并不会报错,MySQL将会放回user表中的所有数据。

mysql> select count(1) from user;
+----------+
| count(1) |
+----------+
|        7 |
+----------+
1 row in set (0.01 sec)

mysql> select * from user limit 8;
+----+--------+-----+-----+
| id | name   | age | sex |
+----+--------+-----+-----+
|  1 | 李子捌 |  18 |   1 |
|  2 | 张三   |  22 |   1 |
|  3 | 李四   |  38 |   1 |
|  4 | 王五   |  25 |   1 |
|  5 | 六麻子 |  13 |   0 |
|  6 | 田七   |  37 |   1 |
|  7 | 谢礼   |  18 |   1 |
+----+--------+-----+-----+
7 rows in set (0.00 sec)

limit可以跟两个参数分别表示起始值和结束值,闭区间(包含起始值和结束值)。如果跟一个参数,则表示结束值,起始值默认为0。 注意MySQL数据的索引起始值为0。

limit 2 , 4表示查询第三条数据到第五条数据,其行号为2到4。

mysql> select * from user limit 2, 4;
+----+--------+-----+-----+
| id | name   | age | sex |
+----+--------+-----+-----+
|  3 | 李四   |  38 |   1 |
|  4 | 王五   |  25 |   1 |
|  5 | 六麻子 |  13 |   0 |
|  6 | 田七   |  37 |   1 |
+----+--------+-----+-----+
4 rows in set (0.00 sec)

到此这篇关于MySQL之select、distinct、limit的使用的文章就介绍到这了,更多相关MySQL之select、distinct、limit使用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL令人咋舌的隐式转换
Apr 05 MySQL
MySQL的join buffer原理
Apr 29 MySQL
MySQL大小写敏感的注意事项
May 24 MySQL
详解MySQL集群搭建
May 26 MySQL
MySQL CHAR和VARCHAR该如何选择
May 31 MySQL
Mysql数据库索引面试题(程序员基础技能)
May 31 MySQL
MySQL一些常用高级SQL语句
Jul 03 MySQL
MySQL令人大跌眼镜的隐式转换
Aug 23 MySQL
mysql 索引合并的使用
Aug 30 MySQL
MySQL中B树索引和B+树索引的区别详解
Mar 03 MySQL
为什么MySQL8新特性会修改自增主键属性
Apr 18 MySQL
MySql数据库触发器使用教程
Jun 01 MySQL
MySQL表类型 存储引擎 的选择
Nov 11 #MySQL
一文带你探究MySQL中的NULL
Nov 11 #MySQL
mysql函数全面总结
Nov 11 #MySQL
MYSQL 运算符总结
Nov 11 #MySQL
MySQL 数据类型详情
Nov 11 #MySQL
MYSQL 表的全面总结
Nov 11 #MySQL
MySQL 服务和数据库管理
You might like
学习php分页代码实例
2013/10/24 PHP
ThinkPHP模板替换与系统常量及应用实例教程
2014/08/22 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
2019/12/31 PHP
JavaScript中使用正则匹配多条,且获取每条中的分组数据
2010/11/30 Javascript
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
2010/12/02 Javascript
JavaScript Math.ceil() 函数使用介绍
2013/12/11 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
使用jQuery动态加载js脚本文件的方法
2014/04/03 Javascript
AngularJS入门教程之学习环境搭建
2014/12/06 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
AngularJS页面访问时出现页面闪烁问题的解决
2016/03/06 Javascript
最丑的时钟效果!js canvas时钟制作方法
2016/08/15 Javascript
微信小程序小组件 基于Canvas实现直播点赞气泡效果
2020/05/29 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
JS使用插件cryptojs进行加密解密数据实例
2017/05/11 Javascript
vue2.0 实现导航守卫的具体用法(路由守卫)
2018/05/17 Javascript
JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例
2018/07/30 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
2019/11/16 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
2020/02/11 Javascript
深入理解webpack process.env.NODE_ENV配置
2020/02/23 Javascript
jQuery实现电梯导航模块
2020/12/22 jQuery
详解Vue2的diff算法
2021/01/06 Vue.js
python入门基础之用户输入与模块初认识
2016/11/14 Python
Python解决走迷宫问题算法示例
2018/07/27 Python
matplotlib阶梯图的实现(step())
2021/03/02 Python
优秀团员个人的自我评价
2013/10/02 职场文书
大学生职业规划前言模板
2013/12/27 职场文书
总经理助理职责
2014/02/04 职场文书
幼儿园中班教学反思
2014/02/10 职场文书
企业后勤岗位职责
2014/02/28 职场文书
开工典礼策划方案
2014/05/23 职场文书
学校教师读书活动总结
2014/07/08 职场文书
乡镇干部个人对照检查材料(群众路线)
2014/09/26 职场文书
1000字打架检讨书
2014/11/03 职场文书
Python re.sub 反向引用的实现
2021/07/07 Python