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如何构建数据表索引
May 13 MySQL
新手必备之MySQL msi版本下载安装图文详细教程
May 21 MySQL
浅析MySQL如何实现事务隔离
Jun 26 MySQL
MySQL索引是啥?不懂就问
Jul 21 MySQL
使用ORM新增数据在Mysql中的操作步骤
Jul 26 MySQL
SQL实现LeetCode(178.分数排行)
Aug 04 MySQL
MySQL中CURRENT_TIMESTAMP的使用方式
Nov 27 MySQL
MySQL 开窗函数
Feb 15 MySQL
一文了解MySQL二级索引的查询过程
Feb 24 MySQL
MySQL如何快速创建800w条测试数据表
Mar 17 MySQL
提高系统的吞吐量解决数据库重复写入问题
Apr 23 MySQL
MySQL 条件查询的常用操作
Apr 28 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
thinkphp 多表 事务详解
2013/06/17 PHP
php实现格式化多行文本为Js可用格式
2015/04/15 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
2015/06/24 PHP
php使用gzip压缩传输js和css文件的方法
2015/07/29 PHP
php解决安全问题的方法实例
2019/09/19 PHP
传递参数的标准方法(jQuery.ajax)
2008/11/19 Javascript
Jquery截取中文字符串的实现代码
2010/12/22 Javascript
JS自动适应的图片弹窗实例
2013/06/29 Javascript
jquery五角星评分插件示例分享
2014/02/21 Javascript
最流行的Node.js精简型和全栈型开发框架介绍
2015/02/26 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
全面解析Bootstrap排版使用方法(文字样式)
2015/11/30 Javascript
jquery.cookie.js实现用户登录保存密码功能的方法
2016/04/15 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
JavaScript定义全局对象的方法示例
2017/01/12 Javascript
js CSS3实现卡牌旋转切换效果
2017/07/04 Javascript
AngularJS实现tab选项卡的方法详解
2017/07/05 Javascript
jQuery实现QQ空间汉字转拼音功能示例
2017/07/10 jQuery
关于js的三种使用方式(行内js、内部js、外部js)的程序代码
2018/05/05 Javascript
js实现无限瀑布流实例方法
2019/09/16 Javascript
[13:21]DOTA2国际邀请赛采访专栏:RSnake战队国士无双,Fnatic.Fly
2013/08/06 DOTA
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
[01:35:53]完美世界DOTA2联赛PWL S3 Magma vs GXR 第二场 12.13
2020/12/17 DOTA
[01:28]国服启动器接入蒸汽平台操作流程视频
2021/03/11 DOTA
Python heapq使用详解及实例代码
2017/01/25 Python
python实现自动发送邮件发送多人、群发、多附件的示例
2018/01/23 Python
Python2 Selenium元素定位的实现(8种)
2019/02/25 Python
Python列表元素常见操作简单示例
2019/10/25 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
2020/04/24 Python
解决python运行启动报错问题
2020/06/01 Python
viagogo英国票务平台:演唱会、体育比赛、戏剧门票
2017/03/24 全球购物
秋天的图画教学反思
2014/05/01 职场文书
员工团队活动方案
2014/08/28 职场文书
2015大学生党员自我评价范文
2015/03/03 职场文书
教师求职信怎么写
2015/03/20 职场文书
2019年冬至:天冷暖人心的问候祝福语大全
2019/12/20 职场文书