133 MySQL单表查询

一、单表查询

1.1 语法

  • 每次查询出来的一些记录,他们都是一张表,只不过这张表是存在内存中的
  • 查询记录如果想要二次利用的话,可以给这些查出来的表记录起一个别名
  • 查询表的某些记录在显示数据时,我们可以设置取出来的这个表的字段名,在查的时候直接在字段的后面as 别名,如下
select ditinct 字段1 as 别名1,字段2 as 别名2,···· from 表名
                                where 条件
                                group by 字段名
                                having 筛选
                                order by 字段名
                                limit 限制条数

1.2 关键字优先级

from : 找到表
where : 拿着where 后面的约束的条件,去表/文件中取出一些记录
group by : 将取出的某些记录进行分组,如果没有group by,则整体作为一组
select : 执行select
distinct : 对去取出的重复数据进行去重
having : 将分组的结果进行having过滤
order by : 将结果按条件排序
limit : 限制显示的记录条数

1.3 注意(重点)

  • 一条查询语句,可以拥有多种筛选条件,条件的顺序必须按照上方顺序进行逐步筛选

  • distinct稍有特殊(书写位置),条件的种类可以不全
  • 可以缺失某个条件,但不能乱序

1.4 测试一个单表的distinct去重

# 创建一个表
create table t1(
    id int,
    x int,
    y int
);
1.插入几条数据
insert into t1 values(1, 1, 1), (2, 1, 2), (3, 2, 2), (4, 2, 2);
############################cmd 图示
mysql> select * from t1;
+------+------+------+
| id   | x    | y    |
+------+------+------+
|    1 |    1 |    1 |
|    2 |    1 |    2 |
|    3 |    2 |    2 |
|    4 |    2 |    2 |
+------+------+------+

2.查询全部数据
select distinct * from t1; 
############################cmd 图示
mysql> select distinct * from t1;
+------+------+------+
| id   | x    | y    |
+------+------+------+
|    1 |    1 |    1 |
|    2 |    1 |    2 |
|    3 |    2 |    2 |
|    4 |    2 |    2 |
+------+------+------+
4 rows in set (0.00 sec)

3.查询结果中,把重复的数据去掉
select distinct x, y from t1
############################cmd 图示
mysql> select distinct x,y from t1;
+------+------+
| x    | y    |
+------+------+
|    1 |    1 |
|    1 |    2 |
|    2 |    2 |
+------+------+
3 rows in set (0.00 sec)

4.查询字段y,把y字段的重复值去掉
select distinct y from t1;  # 结果 1  2
############################cmd 图示
mysql> select distinct y from t1;
+------+
| y    |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)
  • distinct对参与查询的所有字段,整体去重(所查的全部字段的值都相同,才认为是重复数据)

二、表记录查询测试

在此之前,先提几个常用函数

2.1常用函数

  • 拼接:concat() 、concat_ws()
  • 大小写:upper() 、 lower()
  • 浮点型操作:ceil() 、 floor() |、round()
  • 整型:可以直接运算

2.2 数据准备

我们以员工表(emp)为例:

员工id :id :int

员工姓名 : name : varchar

员工性别 :gender :enum

员工年龄 :age : int

员工工资 : salary : float

员工所在城市 :area :varcahr

员工所在地址 :addr : varchar

员工部门 :dep :varchar

1.先创建员工表(emp)
create table emp(
    id int primary key auto_increment,
    name varchar(10) not null,
    sex enum('男','女') default '女',
    age int unsigned default 25,
    salary float default 0,
    area varchar(20) null default '中国',
    addr varchar(20) null default '上海',
    dep varchar(20) null default '咨询部'
);
########查看表结构
mysql> desc emp;
+--------+-------------------+------+-----+-----------+----------------+
| Field  | Type              | Null | Key | Default   | Extra          |
+--------+-------------------+------+-----+-----------+----------------+
| id     | int(11)           | NO   | PRI | NULL      | auto_increment |
| name   | varchar(10)       | NO   |     | NULL      |                |
| sex    | enum('男','女')   | YES  |     | 女        |                |
| age    | int(10) unsigned  | YES  |     | 25        |                |
| salary | float             | YES  |     | 0         |                |
| area   | varchar(20)       | YES  |     | 中国      |                |
| addr   | varchar(20)       | YES  |     | 上海      |                |
| dep    | varchar(20)       | YES  |     | 咨询部    |                |
+--------+-------------------+------+-----+-----------+----------------+


2.插入数据
insert into emp values
    (1, 'aaa', '男', 42, 10.5, '上海', '浦东', '教职部'),
    (2, 'bbb', '男', 38, 9.4, '山东', '济南', '教学部'),
    (3, 'ccc', '女', 30, 3.0, '江苏', '张家港', '教学部'),
    (4, 'ddd', '女', 28, 2.4, '广州', '广东', '教学部'),
    (5, 'eee', '男', 28, 2.4, '江苏', '苏州', '教学部'),
    (6, 'fff', '男', 18, 8.8, '中国', '黄浦', '咨询部'),
    (7, 'ggg', '男', 18, 8.8, '安徽', '宣城', '教学部'),
    (8, 'hhh', '男', 28, 9.8, '安徽', '巢湖', '教学部'),
    (9, 'iii', '女', 36, 1.2, '安徽', '芜湖', '咨询部'),
    (10, 'jjj', '男', 36, 5.8, '山东', '济南', '教学部'),
    (11, 'kkk', '女', 28, 1.2, '山东', '青岛', '教职部'),
    (12, 'lll', '男', 30, 9.0, '上海', '浦东', '咨询部'),
    (13, 'mmm', '男', 30, 6.0, '上海', '浦东', '咨询部'),
    (14, 'nnn', '男', 30, 6.0, '上海', '浦西', '教学部'),
    (15, 'ooo', '女', 67, 2.501, '上海', '陆家嘴', '教学部');
########查看表记录
mysql> select * from emp;
+----+------+------+------+--------+--------+-----------+-----------+
| id | name | sex  | age  | salary | area   | addr      | dep       |
+----+------+------+------+--------+--------+-----------+-----------+
|  1 | aaa  | 男   |   42 |   10.5 | 上海   | 浦东      | 教职部    |
|  2 | bbb  | 男   |   38 |    9.4 | 山东   | 济南      | 教学部    |
|  3 | ccc  | 女   |   30 |      3 | 江苏   | 张家港    | 教学部    |
|  4 | ddd  | 女   |   28 |    2.4 | 广州   | 广东      | 教学部    |
|  5 | eee  | 男   |   28 |    2.4 | 江苏   | 苏州      | 教学部    |
|  6 | fff  | 男   |   18 |    8.8 | 中国   | 黄浦      | 咨询部    |
|  7 | ggg  | 男   |   18 |    8.8 | 安徽   | 宣城      | 教学部    |
|  8 | hhh  | 男   |   28 |    9.8 | 安徽   | 巢湖      | 教学部    |
|  9 | iii  | 女   |   36 |    1.2 | 安徽   | 芜湖      | 咨询部    |
| 10 | jjj  | 男   |   36 |    5.8 | 山东   | 济南      | 教学部    |
| 11 | kkk  | 女   |   28 |    1.2 | 山东   | 青岛      | 教职部    |
| 12 | lll  | 男   |   30 |      9 | 上海   | 浦东      | 咨询部    |
| 13 | mmm  | 男   |   30 |      6 | 上海   | 浦东      | 咨询部    |
| 14 | nnn  | 男   |   30 |      6 | 上海   | 浦西      | 教学部    |
| 15 | ooo  | 女   |   67 |  2.501 | 上海   | 陆家嘴    | 教学部    |
+----+------+------+------+--------+--------+-----------+-----------+
15 rows in set (0.00 sec)

2.3 表记录测试

2.3.1 where条件查询

  • 语法

    select 字段1,字段2···· from 表名 where 条件表达式
  • 条件判断规则

    1.比较符合  >   <   >=   <=   =    !=
    2.区间符合  between开始 and结束     in(自定义容器)
    3.逻辑符合  and    or   not
    4.相似符合  like _(下划线代表单个字符)   %(可以匹配多个)
    5.正则符合  regexp 正则语法
  • 数据测试实例(以员工表为例)

    • 查询工资salary大于5的的员工(比较符合)

      mysql> select * from emp where salary >5;
      
      +----+------+------+------+--------+--------+--------+-----------+
      | id | name | sex  | age  | salary | area   | addr   | dep       |
      +----+------+------+------+--------+--------+--------+-----------+
      |  1 | aaa  | 男   |   42 |   10.5 | 上海   | 浦东   | 教职部    |
      |  2 | bbb  | 男   |   38 |    9.4 | 山东   | 济南   | 教学部    |
      |  6 | fff  | 男   |   18 |    8.8 | 中国   | 黄浦   | 咨询部    |
      |  7 | ggg  | 男   |   18 |    8.8 | 安徽   | 宣城   | 教学部    |
      |  8 | hhh  | 男   |   28 |    9.8 | 安徽   | 巢湖   | 教学部    |
      | 10 | jjj  | 男   |   36 |    5.8 | 山东   | 济南   | 教学部    |
      | 12 | lll  | 男   |   30 |      9 | 上海   | 浦东   | 咨询部    |
      | 13 | mmm  | 男   |   30 |      6 | 上海   | 浦东   | 咨询部    |
      | 14 | nnn  | 男   |   30 |      6 | 上海   | 浦西   | 教学部    |
      +----+------+------+------+--------+--------+--------+-----------+
    • 查询id号为偶数的所有员工(比较符合)

      mysql> select * from emp where id%2=0;
      
      +----+------+------+------+--------+--------+--------+-----------+
      | id | name | sex  | age  | salary | area   | addr   | dep       |
      +----+------+------+------+--------+--------+--------+-----------+
      |  2 | bbb  | 男   |   38 |    9.4 | 山东   | 济南   | 教学部    |
      |  4 | ddd  | 女   |   28 |    2.4 | 广州   | 广东   | 教学部    |
      |  6 | fff  | 男   |   18 |    8.8 | 中国   | 黄浦   | 咨询部    |
      |  8 | hhh  | 男   |   28 |    9.8 | 安徽   | 巢湖   | 教学部    |
      | 10 | jjj  | 男   |   36 |    5.8 | 山东   | 济南   | 教学部    |
      | 12 | lll  | 男   |   30 |      9 | 上海   | 浦东   | 咨询部    |
      | 14 | nnn  | 男   |   30 |      6 | 上海   | 浦西   | 教学部    |
      +----+------+------+------+--------+--------+--------+-----------+
    • 查询工资在6和9之间的所有员工(区间符合between and)

      mysql> select * from emp where id between 6 and 9;
      
      +----+------+------+------+--------+--------+--------+-----------+
      | id | name | sex  | age  | salary | area   | addr   | dep       |
      +----+------+------+------+--------+--------+--------+-----------+
      |  6 | fff  | 男   |   18 |    8.8 | 中国   | 黄浦   | 咨询部    |
      |  7 | ggg  | 男   |   18 |    8.8 | 安徽   | 宣城   | 教学部    |
      |  8 | hhh  | 男   |   28 |    9.8 | 安徽   | 巢湖   | 教学部    |
      |  9 | iii  | 女   |   36 |    1.2 | 安徽   | 芜湖   | 咨询部    |
      +----+------+------+------+--------+--------+--------+-----------+
    • 查询工资在1,3 ,7 ,20之间的(区间符合、自定义容器 in)

      mysql> select * from emp where id in(1,3,7,20);
      
      +----+------+------+------+--------+--------+-----------+-----------+
      | id | name | sex  | age  | salary | area   | addr      | dep       |
      +----+------+------+------+--------+--------+-----------+-----------+
      |  1 | aaa  | 男   |   42 |   10.5 | 上海   | 浦东      | 教职部    |
      |  3 | ccc  | 女   |   30 |      3 | 江苏   | 张家港    | 教学部    |
      |  7 | ggg  | 男   |   18 |    8.8 | 安徽   | 宣城      | 教学部    |
      +----+------+------+------+--------+--------+-----------+-----------+
    • 查询所有名字带有o字符的员工(相似符合 like %)

      mysql> select * from emp where name like '%o%';
      
      +----+------+------+------+--------+--------+-----------+-----------+
      | id | name | sex  | age  | salary | area   | addr      | dep       |
      +----+------+------+------+--------+--------+-----------+-----------+
      | 15 | ooo  | 女   |   67 |  2.501 | 上海   | 陆家嘴    | 教学部    |
      +----+------+------+------+--------+--------+-----------+-----------+
    • 查询所有名第二个字符是m的员工**(相似符合 like _)**

      mysql> select * from emp where name like '_o%';
      
      +----+------+------+------+--------+--------+-----------+-----------+
      | id | name | sex  | age  | salary | area   | addr      | dep       |
      +----+------+------+------+--------+--------+-----------+-----------+
      | 15 | ooo  | 女   |   67 |  2.501 | 上海   | 陆家嘴    | 教学部    |
    • 查询所有名字前两个字符是a的员工**(相似符合 like __)**

      mysql> select * from emp where name like '__a%';
      
      +----+------+------+------+--------+--------+--------+-----------+
      | id | name | sex  | age  | salary | area   | addr   | dep       |
      +----+------+------+------+--------+--------+--------+-----------+
      |  1 | aaa  | 男   |   42 |   10.5 | 上海   | 浦东   | 教职部    |
      +----+------+------+------+--------+--------+--------+-----------+
    • 查询id号所有包含1的所有员工(正则匹配)

      • sql只支持部分正则语法
      • '.*\d'; 不支持\d代表数字,认为\d
      • '.*[0-9]'; 支持[]语法
      mysql> select * from emp where id regexp '.*[1]';
      
      +----+------+------+------+--------+--------+-----------+-----------+
      | id | name | sex  | age  | salary | area   | addr      | dep       |
      +----+------+------+------+--------+--------+-----------+-----------+
      |  1 | aaa  | 男   |   42 |   10.5 | 上海   | 浦东      | 教职部    |
      | 10 | jjj  | 男   |   36 |    5.8 | 山东   | 济南      | 教学部    |
      | 11 | kkk  | 女   |   28 |    1.2 | 山东   | 青岛      | 教职部    |
      | 12 | lll  | 男   |   30 |      9 | 上海   | 浦东      | 咨询部    |
      | 13 | mmm  | 男   |   30 |      6 | 上海   | 浦东      | 咨询部    |
      | 14 | nnn  | 男   |   30 |      6 | 上海   | 浦西      | 教学部    |
      | 15 | ooo  | 女   |   67 |  2.501 | 上海   | 陆家嘴    | 教学部    |
      +----+------+------+------+--------+--------+-----------+-----------+

2.3.2 group by 分组查询

一、分组查询的问题

  • 1.在sql_mode没有 ONLY_FULL_GROUP_BY 限制下,可以执行,但结果没有意义

    • 分组后,表中数据考虑范围就不是 单条记录,因为每个分组都包含了多条记录,参照分组字段,对每个分组中的 多条记录 统一处理,所以对以上叙述进行如下测试
    # 按部门分组,每个部门都有哪些人
    mysql> select * from emp group by dep;
    +----+------+------+------+--------+--------+--------+-----------+
    | id | name | sex  | age  | salary | area   | addr   | dep       |
    +----+------+------+------+--------+--------+--------+-----------+
    |  6 | fff  | 男   |   18 |    8.8 | 中国   | 黄浦   | 咨询部    |
    |  2 | bbb  | 男   |   38 |    9.4 | 山东   | 济南   | 教学部    |
    |  1 | aaa  | 男   |   42 |   10.5 | 上海   | 浦东   | 教职部    |
    +----+------+------+------+--------+--------+--------+-----------+
  • 2.有 ONLY_FULL_GROUP_BY 限制,报错

    • 在数据库配置文件my.ini中配置如下代码,然后重启服务

      sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

    # 重启服务后重新进行如上的分组测试
    1.会发现直接报错,因为我们有了这个分组限制以后,那么select查询的字段只能是分组的那个字段dep
    mysql>  select dep from emp group by dep;
    
    +-----------+
    | dep       |
    +-----------+
    | 咨询部    |
    | 教学部    |
    | 教职部    |
    +-----------+

二、聚合函数

因为我们有了这个分组限制以后,那么select查询的字段只能是分组的那个字段dep,而表里日他字段的值都获取不到,所以我们这样分组并不是我们想要的结果,所以想要获取组内的其他相关信息,需要借助函数

1.聚合函数分类
最大值  max()
最小值  min()
平均值  avg()
求和    sum()
计数    count()
组内字段拼接,用来查看组内其他字段   group_concat()
2.数据测试(以员工表为例)
  • 按照部门分组,并查看组内成员名(group_concat())

    mysql> select dep,group_concat(name) from emp group by dep;
    
    +-----------+-------------------------------------+
    | dep       | group_concat(name)                  |
    +-----------+-------------------------------------+
    | 咨询部    | mmm,lll,fff,iii                     |
    | 教学部    | ooo,nnn,jjj,hhh,ggg,eee,ddd,ccc,bbb |
    | 教职部    | kkk,aaa                             |
    +-----------+-------------------------------------+
  • 按部门分组,每个部门都有哪些人、最高的薪资、最低的薪资、平均薪资、组里一共有多少人

    mysql> select
        -> dep 部门,
        -> group_concat(name) 成员,
        -> max(salary) 最高薪资,
        -> min(salary) 最低薪资,
        -> avg(salary) 平均薪资,
        -> sum(salary) 总薪资,
        -> count(sex) 人数
        -> from emp group by dep;
  • 按部门分组,查看最高年龄

    mysql> select dep 部门,max(age) 最高年龄 from emp group by dep;
    
    +-----------+--------------+
    | 部门      | 最高年龄     |
    +-----------+--------------+
    | 咨询部    |           36 |
    | 教学部    |           67 |
    | 教职部    |           42 |
    +-----------+--------------+

2.3.3 having 和 where

  • 在没有分组的情况下,where与having结果相同

  • 重点:having可以对 聚合结果 进行筛选

    # 没有分组时where和having测试
    mysql> select * from emp where id in (5, 10, 15, 20);
    +----+------+------+------+--------+--------+-----------+-----------+
    | id | name | sex  | age  | salary | area   | addr      | dep       |
    +----+------+------+------+--------+--------+-----------+-----------+
    |  5 | eee  | 男   |   28 |    2.4 | 江苏   | 苏州      | 教学部    |
    | 10 | jjj  | 男   |   36 |    5.8 | 山东   | 济南      | 教学部    |
    | 15 | ooo  | 女   |   67 |  2.501 | 上海   | 陆家嘴    | 教学部    |
    +----+------+------+------+--------+--------+-----------+-----------+
    
    
    mysql> select * from emp having salary > 5;# 报错了,这里因为我之前配置了数据库的文件
    ERROR 1463 (42000): Non-grouping field 'salary' is used in HAVING clause
  • 分组后的having 进行筛选测试

    • 按部门分组,查看所有人、最高的薪资、最低的薪资、平均薪资、总人数当中的最低工资小于2的

      mysql> select
          -> dep 部门,
          -> group_concat(name) 成员,
          -> max(salary) 最高薪资,
          -> min(salary) 最低薪资,
          -> avg(salary) 平均薪资,
          -> sum(salary) 总薪资,
          -> count(sex) 人数
          -> from emp group by dep having min(salary)<2;
      # 由于工资是小数,所以在数据库里可能会出现一些错误
      +-----------+-----------------+--------------+--------------------+---------------
      | 部门  | 成员            |最高薪资| 最低薪资| 平均薪资| 总薪资 |人数|
      +-----------+-----------------+--------------+--------------------+---------------
      | 咨询部| mmm,lll,fff,iii |9      | 1.20  | 6.250  | 25.0  | 4 |
      | 教职部| kkk,aaa         |10.5   | 1.20  | 5.85   | 11.7  | 2 |
      +-----------+-----------------+--------------+--------------------+---------------

2.3.4 排序 order by

一、语法规则

asc : 字段升序排序,默认是升序
desc : 字段降序排序

# 语法
order by 主排序字段 [asc|desc], 次排序字段1 [asc|desc], ...次排序字段n [asc|desc]
#1.先按主排序字段排序,如果出现主排序字段有某两个或多个字段相同,那就再去按次排序字段排序

二、数据测试

  • 未分组状态下测试

    • 按年龄升序

      mysql> select * from emp order by age asc;
      +----+------+------+------+--------+--------+-----------+-----------+
      | id | name | sex  | age  | salary | area   | addr      | dep       |
      +----+------+------+------+--------+--------+-----------+-----------+
      |  7 | ggg  | 男   |   18 |    8.8 | 安徽   | 宣城      | 教学部    |
      |  6 | fff  | 男   |   18 |    8.8 | 中国   | 黄浦      | 咨询部    |
      | 11 | kkk  | 女   |   28 |    1.2 | 山东   | 青岛      | 教职部    |
      |  8 | hhh  | 男   |   28 |    9.8 | 安徽   | 巢湖      | 教学部    |
      |  5 | eee  | 男   |   28 |    2.4 | 江苏   | 苏州      | 教学部    |
      |  4 | ddd  | 女   |   28 |    2.4 | 广州   | 广东      | 教学部    |
      |  3 | ccc  | 女   |   30 |      3 | 江苏   | 张家港    | 教学部    |
      | 14 | nnn  | 男   |   30 |      6 | 上海   | 浦西      | 教学部    |
      | 12 | lll  | 男   |   30 |      9 | 上海   | 浦东      | 咨询部    |
      | 13 | mmm  | 男   |   30 |      6 | 上海   | 浦东      | 咨询部    |
      |  9 | iii  | 女   |   36 |    1.2 | 安徽   | 芜湖      | 咨询部    |
      | 10 | jjj  | 男   |   36 |    5.8 | 山东   | 济南      | 教学部    |
      |  2 | bbb  | 男   |   38 |    9.4 | 山东   | 济南      | 教学部    |
      |  1 | aaa  | 男   |   42 |   10.5 | 上海   | 浦东      | 教职部    |
      | 15 | ooo  | 女   |   67 |  2.501 | 上海   | 陆家嘴    | 教学部    |
      +----+------+------+------+--------+--------+-----------+-----------+
    • 按薪资降序

      mysql> select * from emp order by salary desc;
      +----+------+------+------+--------+--------+-----------+-----------+
      | id | name | sex  | age  | salary | area   | addr      | dep       |
      +----+------+------+------+--------+--------+-----------+-----------+
      |  1 | aaa  | 男   |   42 |   10.5 | 上海   | 浦东      | 教职部    |
      |  8 | hhh  | 男   |   28 |    9.8 | 安徽   | 巢湖      | 教学部    |
      |  2 | bbb  | 男   |   38 |    9.4 | 山东   | 济南      | 教学部    |
      | 12 | lll  | 男   |   30 |      9 | 上海   | 浦东      | 咨询部    |
      |  6 | fff  | 男   |   18 |    8.8 | 中国   | 黄浦      | 咨询部    |
      |  7 | ggg  | 男   |   18 |    8.8 | 安徽   | 宣城      | 教学部    |
      | 14 | nnn  | 男   |   30 |      6 | 上海   | 浦西      | 教学部    |
      | 13 | mmm  | 男   |   30 |      6 | 上海   | 浦东      | 咨询部    |
      | 10 | jjj  | 男   |   36 |    5.8 | 山东   | 济南      | 教学部    |
      |  3 | ccc  | 女   |   30 |      3 | 江苏   | 张家港    | 教学部    |
      | 15 | ooo  | 女   |   67 |  2.501 | 上海   | 陆家嘴    | 教学部    |
      |  5 | eee  | 男   |   28 |    2.4 | 江苏   | 苏州      | 教学部    |
      |  4 | ddd  | 女   |   28 |    2.4 | 广州   | 广东      | 教学部    |
      | 11 | kkk  | 女   |   28 |    1.2 | 山东   | 青岛      | 教职部    |
      |  9 | iii  | 女   |   36 |    1.2 | 安徽   | 芜湖      | 咨询部    |
      +----+------+------+------+--------+--------+-----------+-----------+
    • 按薪资降序,如果相同,再按年龄降序

      mysql> select * from emp order by salary desc,age desc;
      +----+------+------+------+--------+--------+-----------+-----------+
      | id | name | sex  | age  | salary | area   | addr      | dep       |
      +----+------+------+------+--------+--------+-----------+-----------+
      |  1 | aaa  | 男   |   42 |   10.5 | 上海   | 浦东      | 教职部    |
      |  8 | hhh  | 男   |   28 |    9.8 | 安徽   | 巢湖      | 教学部    |
      |  2 | bbb  | 男   |   38 |    9.4 | 山东   | 济南      | 教学部    |
      | 12 | lll  | 男   |   30 |      9 | 上海   | 浦东      | 咨询部    |
      |  6 | fff  | 男   |   18 |    8.8 | 中国   | 黄浦      | 咨询部    |
      |  7 | ggg  | 男   |   18 |    8.8 | 安徽   | 宣城      | 教学部    |
      | 14 | nnn  | 男   |   30 |      6 | 上海   | 浦西      | 教学部    |
      | 13 | mmm  | 男   |   30 |      6 | 上海   | 浦东      | 咨询部    |
      | 10 | jjj  | 男   |   36 |    5.8 | 山东   | 济南      | 教学部    |
      |  3 | ccc  | 女   |   30 |      3 | 江苏   | 张家港    | 教学部    |
      | 15 | ooo  | 女   |   67 |  2.501 | 上海   | 陆家嘴    | 教学部    |
      |  5 | eee  | 男   |   28 |    2.4 | 江苏   | 苏州      | 教学部    |
      |  4 | ddd  | 女   |   28 |    2.4 | 广州   | 广东      | 教学部    |
      |  9 | iii  | 女   |   36 |    1.2 | 安徽   | 芜湖      | 咨询部    |
      | 11 | kkk  | 女   |   28 |    1.2 | 山东   | 青岛      | 教职部    |
      +----+------+------+------+--------+--------+-----------+-----------+
    • 按龄降序,如果相同,再按薪资降序

      mysql> select * from emp order by age desc,salary desc;
      +----+------+------+------+--------+--------+-----------+-----------+
      | id | name | sex  | age  | salary | area   | addr      | dep       |
      +----+------+------+------+--------+--------+-----------+-----------+
      | 15 | ooo  | 女   |   67 |  2.501 | 上海   | 陆家嘴    | 教学部    |
      |  1 | aaa  | 男   |   42 |   10.5 | 上海   | 浦东      | 教职部    |
      |  2 | bbb  | 男   |   38 |    9.4 | 山东   | 济南      | 教学部    |
      | 10 | jjj  | 男   |   36 |    5.8 | 山东   | 济南      | 教学部    |
      |  9 | iii  | 女   |   36 |    1.2 | 安徽   | 芜湖      | 咨询部    |
      | 12 | lll  | 男   |   30 |      9 | 上海   | 浦东      | 咨询部    |
      | 14 | nnn  | 男   |   30 |      6 | 上海   | 浦西      | 教学部    |
      | 13 | mmm  | 男   |   30 |      6 | 上海   | 浦东      | 咨询部    |
      |  3 | ccc  | 女   |   30 |      3 | 江苏   | 张家港    | 教学部    |
      |  8 | hhh  | 男   |   28 |    9.8 | 安徽   | 巢湖      | 教学部    |
      |  5 | eee  | 男   |   28 |    2.4 | 江苏   | 苏州      | 教学部    |
      |  4 | ddd  | 女   |   28 |    2.4 | 广州   | 广东      | 教学部    |
      | 11 | kkk  | 女   |   28 |    1.2 | 山东   | 青岛      | 教职部    |
      |  7 | ggg  | 男   |   18 |    8.8 | 安徽   | 宣城      | 教学部    |
      |  6 | fff  | 男   |   18 |    8.8 | 中国   | 黄浦      | 咨询部    |
      +----+------+------+------+--------+--------+-----------+-----------+
  • 分组状态下

    • 按最高薪资降序(已上面group by分组后为例)

      mysql> select
          -> dep 部门,
          -> group_concat(name)成员,
          -> max(salary) 最高薪资,
          -> min(salary) 最低薪资,
          -> avg(salary) 平均薪资,
          -> sum(salary) 总薪资,
          -> count(sex) 人数
          -> from emp group by dep order by 最高薪资 desc;
      
      # 由于工资是小数,所以在数据库里可能会出现一些错误
      +-----------+-------------------------------------+--------------+--------------+-
      | 部门 | 成员                                 |最高薪资| 最低薪资|平均薪资|总薪资|人数   |
      +-----------+-------------------------------------+--------------+--------------+-
      | 教职部| kkk,aaa                             |10.5  |1.2     |5.85   |11.7 |2 |
      | 教学部| ooo,nnn,jjj,hhh,ggg,eee,ddd,ccc,bbb |9.8   |2.4     |5.56   |50.1 |9 |
      | 咨询部| mmm,lll,fff,iii                     |9     |1.2     |6.2    |25.0 |4 |
      +-----------+-------------------------------------+--------------+--------------+-

2.3.5 limit限制

一、语法

limit 条数 
limit 偏移量,条数 偏移量就是跳过几条数据后开始取

二、数据测试(限制 limit)

  • 工资小于8的员工姓名和工资,按工工资降序排列后,选取1条

     select name,salary from emp where salary<8 order by salary desc limit 1;
    +------+--------+
    | name | salary |
    +------+--------+
    | mmm  |      6 |
    +------+--------+
  • 查询所有员工表里的数据,先偏移5条满足条件的记录,再查询3条

    mysql> select * from emp limit 5,3;
    +----+------+------+------+--------+--------+--------+-----------+
    | id | name | sex  | age  | salary | area   | addr   | dep       |
    +----+------+------+------+--------+--------+--------+-----------+
    |  6 | fff  | 男   |   18 |    8.8 | 中国   | 黄浦   | 咨询部    |
    |  7 | ggg  | 男   |   18 |    8.8 | 安徽   | 宣城   | 教学部    |
    |  8 | hhh  | 男   |   28 |    9.8 | 安徽   | 巢湖   | 教学部    |
    +----+------+------+------+--------+--------+--------+-----------+

猜你喜欢

转载自www.cnblogs.com/xichenHome/p/11588406.html
133