MySQL之select、distinct、limit的使用

目录
  • 1、简介
  • 2、select
    • 2.1 查询单个列
    • 2.2 查询多个列
    • 2.3 查询所有列
  • 3、distinct
    • 4、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
      
      

      接着使用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使用内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

      (0)
      上一篇 2022年3月21日
      下一篇 2022年3月21日

      相关推荐