select、distinct、limit使用

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: select、distinct、limit使用

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

接着使用select从user表中查询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数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6月前
|
SQL 数据库
SQL 查询优化指南:SELECT、SELECT DISTINCT、WHERE 和 ORDER BY
SQL的SELECT语句用于从数据库中选择数据。SELECT语句的基本语法如下:
108 1
|
11天前
|
SQL 数据库
INTO SELECT
【11月更文挑战第10天】
20 3
|
14天前
|
存储 SQL 关系型数据库
SELECT INTO
【11月更文挑战第08天】
24 2
|
19天前
|
SQL
SELECT DISTINCT
【11月更文挑战第02天】
21 1
|
1月前
|
前端开发 容器
select
【10月更文挑战第20天】
32 5
|
5月前
|
SQL Oracle 关系型数据库
SQL SELECT TOP, LIMIT, ROWNUM 子句
SQL SELECT TOP, LIMIT, ROWNUM 子句
55 4
|
数据库 索引
SELECT
SELECT
66 0
|
存储 前端开发 JavaScript
select2 使用详解
select2 使用详解
Distinct
SQL 去重
152 0
|
存储 SQL 缓存
到底为什么不建议使用SELECT *?
“不要使用SELECT *”几乎已经成为了MySQL使用的一条金科玉律,就连《阿里Java开发手册》也明确表示不得使用`*`作为查询的字段列表,本文从4个方面给出理由。
到底为什么不建议使用SELECT *?