133 MySQL单表查询

目录

  • 一、单表查询

    • 1.1 语法
    • 1.2 关键字优先级
    • 1.3 注意(重点)
    • 1.4 测试一个单表的distinct去重
  • 二、表记录查询测试
    • 2.1常用函数
    • 2.2 数据准备
    • 2.3 表记录测试
      • 2.3.1 where条件查询
      • 2.3.2 group by 分组查询
      • 2.3.3 having 和 where
      • 2.3.4 排序 order by
      • 2.3.5 limit限制

一、单表查询

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 | 安徽   | 巢湖   | 教学部    |
    +----+------+------+------+--------+--------+--------+-----------+

原文地址:https://www.cnblogs.com/xichenHome/p/11588406.html

时间: 2024-08-02 10:21:56

133 MySQL单表查询的相关文章

python开发mysql:单表查询&amp;多表查询

一 单表查询,以下是表内容 1 一 having 过滤 2 1.1 having和where 3 select * from emp where id > 15; 4 解析过程;from > where 找到数据 > 分组(没有默认一个组)> select 打印 where是出结果之前 5 select * from emp having id > 15; 6 解析过程;from > where 找到数据(没有约束条件,就是整个表)) > 分组(没有默认一个组)&

0x06 MySQL 单表查询

一 单表查询语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二 关键字执行优先级(重点) 重点中的重点:关键字的执行优先级 1)from 2)where 3)group by 4)having 5)select 6)distinct 7)order by 8)limit 1.找到表:from 2.拿着where指定的约束条件,去文件/表中取出一条条记录 3.将取出的一

python之路--MySQl单表查询

一 单表查询语法 #查询数据的本质:mysql会到你本地的硬盘上找到对应的文件,然后打开文件,按照你的查询条件来找出你需要的数据.下面是完整的一个单表查询的语法 select * from,这个select * 指的是要查询所有字段的数据. SELECT distinct 字段1,字段2... FROM 库名.表名 #from后面是说从库的某个表中去找数据,mysql会去找到这个库对应的文件夹下去找到你表名对应的那个数据文件,找不到就直接报错了,找到了就继续后面的操作 WHERE 条件 #从表中

一个MySQL 单表查询SQL,引起一次“故事”

一.描述故事的过程是这个样子的,MySQL 数据库有一张40多G的大表,开发人员执行了一个单表查询,结果我就收到了一个磁盘空间满的告警.一下子就不淡定了,谁在搞事情,脑海里各种可能行想了一遍,想到的最多的就是ibtmp1爆了,第一时间线上看一下,查到了最大的那个文件,结果和想的一样.这里我们要看SQL是怎么写的,表结构是什么样子,然后和官网对比,MySQL在查询的时候有很多可能会使用磁盘临时表,包括表连接.排序.大字段等等. 二.解决方法临时解决方法:1.临时扩一下硬盘2.直接重启 终结解决方案

mysql 单表查询

目录 单表查询 准备数据 简单查询 比较运算符 范围筛选 between 多选 in 模糊查询 like 逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not 身份运算 - 关于null is null /is not null 正则匹配 regexp 分组 group by 聚合 (把很多行的同一个字段进行一些统计,最终的到一个结果) 分组+聚合 HAVING过滤 单表查询 准备数据 只是把查询结果按照自己想要的方式返回,不对数据做修改 #准备表和记录 company.emplo

mysql单表查询&amp;&amp;多表查询(职员表14+9)

dept(deptno,dname,loc) emp(empno,ename,job,mgr,hiredate,sal,COMM,deptno) salgrade(grade,losal,hisal) stu(sid,sname,age,gander,province,tuition) 单表查询题目 ==================================================== dept(deptno,dname,loc) emp(empno,ename,job,mgr

mysql单表查询语句优化

Mysql语句优化 范例1:优化语句SELECT * FROM `tbl_order_buy_eta` WHERE `id_order`=1843 #通过explain分析语句结果如下 mysql> explain SELECT * FROM `tbl_order_buy_eta` WHERE `id_order`=1843\G *************************** 1. row ***************************            id: 1   se

MySQL 单表查询(Day42)

阅读目录 一,查询语法 二,简单查询 三,where约束 四,having过滤 五,分组查询 group by 六,关键字的执行优先级 七,查询排列 order by 八,使用聚合函数查询 九,where补充 十,限制查询的记录数:limit ================================================================================================================================

MySQL单表查询之分组查询

分组查询 mysql> select countrycode as total fromCity where id<10; +-------+ | total | +-------+ | AFG  | | AFG  | | AFG  | | AFG  | | NLD  | | NLD  | | NLD  | | NLD  | | NLD  | +-------+ 9 rows in set (0.00 sec) mysql> select countrycode,count(*) ast