SQL数据库高级查询语句--去重,排序,分组查询,聚合函数,分组及综合查询

2023-11-08

高级查询–distint,order by,limit

#`select`语句中,可以使用`distinct`关键字对查询的结果集进行去重。
select distinct 列1, ... , 列n  from table_name [其他子句];
#`order by`用于对结果进行排序显示,可以使用`ASC`(升序) / `DESC`(降序)两种方式进行排序,可以有多个排序条件
select [distinct] 列1, ... , 列n from table_name [其他子句] order by 排序列1 [DESC], 排序列2 [DESC];
#分页查询limit子句
select * from emp limit 0,2;
#- 第一个参数0是表示从第几条开始查询 (这里 0 是可省略);第二个参数 表示查询出几条数据
select * from table_name  limit (页码 - 1) * 每页数量, 每页数量;
select distinct deptname  from dept ;
select * from dept order by deptno desc;-- 部门编号降序, 部门名称降序
select * from dept order by deptno DESC, deptname DESC;
-- ASC升序,DESC降序。默认升序。select * from dept order by deptno;
select * from dept limit 1,3;-- 从第一条开始查三条数据
select * from dept limit 2,3;-- 从第二条数据开始查三条数据
-- n表示页数 s 表示页大小.  limit (n - 1) * s, s
insert into dept(deptno, deptname) values(10, '研发部');
Query OK, 1 row affected (0.04 sec)

mysql> insert into dept(deptno, deptname) values(2, '研发部');
Query OK, 1 row affected (0.00 sec)

mysql> select * from dept;
+--------+-------------+
| deptno | deptname    |
+--------+-------------+
|      1 | kfm·研发部 |
|      1 | kfm·人事部 |
|      1 | kfm·宣传部 |
|      5 | kfm·组织部 |
|      6 | kfm·后勤部 |
|      7 | kfm·财务部 |
|     10 | 研发部      |
|      2 | 研发部      |
+--------+-------------+
8 rows in set (0.00 sec)

mysql> select distinct deptname  from dept ;
+-------------+
| deptname    |
+-------------+
| kfm·研发部 |
| kfm·人事部 |
| kfm·宣传部 |
| kfm·组织部 |
| kfm·后勤部 |
| kfm·财务部 |
| 研发部      |
+-------------+
7 rows in set (0.00 sec)

mysql> select * from dept;
+--------+-------------+
| deptno | deptname    |
+--------+-------------+
|      1 | kfm·研发部 |
|      1 | kfm·人事部 |
|      1 | kfm·宣传部 |
|      5 | kfm·组织部 |
|      6 | kfm·后勤部 |
|      7 | kfm·财务部 |
|     10 | 研发部      |
|      2 | 研发部      |
+--------+-------------+
8 rows in set (0.00 sec)

mysql> select * from dept order by deptno desc;
+--------+-------------+
| deptno | deptname    |
+--------+-------------+
|     10 | 研发部      |
|      7 | kfm·财务部 |
|      6 | kfm·后勤部 |
|      5 | kfm·组织部 |
|      2 | 研发部      |
|      1 | kfm·研发部 |
|      1 | kfm·人事部 |
|      1 | kfm·宣传部 |
+--------+-------------+
8 rows in set (0.00 sec)

mysql> select * from dept order by deptno DESC, deptname DESC;
+--------+-------------+
| deptno | deptname    |
+--------+-------------+
|     10 | 研发部      |
|      7 | kfm·财务部 |
|      6 | kfm·后勤部 |
|      5 | kfm·组织部 |
|      2 | 研发部      |
|      1 | kfm·研发部 |
|      1 | kfm·宣传部 |
|      1 | kfm·人事部 |
+--------+-------------+
8 rows in set (0.00 sec)

mysql> select * from dept limit 1,3;
+--------+-------------+
| deptno | deptname    |
+--------+-------------+
|      1 | kfm·人事部 |
|      1 | kfm·宣传部 |
|      5 | kfm·组织部 |
+--------+-------------+
3 rows in set (0.00 sec)

mysql> select * from dept limit 2,3;
+--------+-------------+
| deptno | deptname    |
+--------+-------------+
|      1 | kfm·宣传部 |
|      5 | kfm·组织部 |
|      6 | kfm·后勤部 |
+--------+-------------+
3 rows in set (0.00 sec)

聚合函数

SUM 求和、max求最大值、min求最小值、avg求平均值、count求数量

select sum(列)/max(列)/min(列)/avg(列)/count(列) from table_name [其他子句];
select sum(deptno) deptno from dept;
select max(deptno) deptno from dept;
select min(deptno) deptno from dept;
select avg(deptno) deptno from dept;
select count(deptno) deptno from dept;
-- 使用了聚合函数的查询,目前 在select 的字段只能是聚合函数
mysql> select sum(deptno) deptno from dept;
+--------+
| deptno |
+--------+
|     33 |
+--------+
1 row in set (0.00 sec)

mysql> select max(deptno) deptno from dept;
+--------+
| deptno |
+--------+
|     10 |
+--------+
1 row in set (0.00 sec)

mysql> select min(deptno) deptno from dept;
+--------+
| deptno |
+--------+
|      1 |
+--------+
1 row in set (0.00 sec)

mysql> select avg(deptno) deptno from dept;
+--------+
| deptno |
+--------+
| 4.1250 |
+--------+
1 row in set (0.00 sec)

mysql> select count(deptno) deptno from dept;
+--------+
| deptno |
+--------+
|      8 |
+--------+
1 row in set (0.00 sec)

group by,having

group by—对数据进行分组,表中有相同值的分为一组。

group by分组后的查询中,select的列不能出现除了group by 分组条件以及聚合函数外的其他列。

select 列1, 列2, (聚合函数) from table_name group by 列1, 列2;
-- group by 语句通常用于配合聚合函数
select cart_id,goods_no,num,count(*) from cart group by cart_id,goods_no,num; 

mysql> use store;
Database changed
mysql> show tables;
+-----------------+
| Tables_in_store |
+-----------------+
| account         |
| cart            |
| category        |
| goods           |
+-----------------+
4 rows in set (0.00 sec)

mysql> select * from cart;
+---------+----------+------+------------+---------------------+
| cart_id | goods_no | num  | account_id | create_time         |
+---------+----------+------+------------+---------------------+
|       1 |        1 |    2 |          2 | 2023-03-11 19:50:00 |
|       2 |        2 |    2 |          3 | 2023-03-12 19:50:00 |
|       3 |        4 |   10 |          4 | 2023-03-13 19:50:00 |
|       4 |        6 |   20 |          3 | 2023-03-12 19:50:00 |
|       5 |        9 |    2 |          2 | 2023-03-12 17:50:00 |
|       6 |        2 |   10 |          4 | 2023-03-13 17:50:00 |
+---------+----------+------+------------+---------------------+
6 rows in set (0.00 sec)

mysql> select cart_id,goods_no,num,count(*) from cart group by cart_id,goods_no,num;
+---------+----------+------+----------+
| cart_id | goods_no | num  | count(*) |
+---------+----------+------+----------+
|       1 |        1 |    2 |        1 |
|       2 |        2 |    2 |        1 |
|       3 |        4 |   10 |        1 |
|       4 |        6 |   20 |        1 |
|       5 |        9 |    2 |        1 |
|       6 |        2 |   10 |        1 |
+---------+----------+------+----------+
6 rows in set (0.00 sec)

having是对group by分组后的结果集进行筛选。

select 列1, 列2, (聚合函数) from table_name group by 列1, 列2 having 分组后条件;
select good_no,sum(price) from goods group by good_no having sum(price) > 3;
mysql> select good_no,sum(price) from goods group by good_no having sum(price) > 3;
+---------+------------+
| good_no | sum(price) |
+---------+------------+
|       1 |          5 |
|       2 |        3.5 |
|       3 |       25.5 |
|       6 |         50 |
|       7 |          8 |
|       8 |       1700 |
|       9 |         50 |
+---------+------------+
7 rows in set (0.00 sec)

综合查询

SELECT DISTINCT emp.deptno FROM emp JOIN dept ON emp.deptno = dept.deptno WHERE bridate >= '2000-01-01' GROUP BY emp.deptno HAVING count(*) >= 2 ORDER BY count(*) DESC 
select distinct cost,max(category_no) from goods where good_no > 3 group by cost having max(category_no);
mysql> select distinct cost,max(category_no) from goods where good_no > 3 group by cost having max(category_no);
+------+------------------+
| cost | max(category_no) |
+------+------------------+
|  0.8 |                2 |
|  0.2 |                2 |
|   30 |                3 |
|    5 |                3 |
| 1350 |                5 |
|   40 |                4 |
+------+------------------+
6 rows in set (0.00 sec)

rows in set (0.00 sec)


### 综合查询

```mysql
SELECT DISTINCT emp.deptno FROM emp JOIN dept ON emp.deptno = dept.deptno WHERE bridate >= '2000-01-01' GROUP BY emp.deptno HAVING count(*) >= 2 ORDER BY count(*) DESC 
select distinct cost,max(category_no) from goods where good_no > 3 group by cost having max(category_no);
mysql> select distinct cost,max(category_no) from goods where good_no > 3 group by cost having max(category_no);
+------+------------------+
| cost | max(category_no) |
+------+------------------+
|  0.8 |                2 |
|  0.2 |                2 |
|   30 |                3 |
|    5 |                3 |
| 1350 |                5 |
|   40 |                4 |
+------+------------------+
6 rows in set (0.00 sec)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL数据库高级查询语句--去重,排序,分组查询,聚合函数,分组及综合查询 的相关文章

  • 在 where 子句中使用聚合函数和不同的列条件

    select PO Order Qty Avg PO Order Qty as totalAverage FROM FirstStrike Retail custom Whse Pricing QR where item code 111
  • Oracle - 获取星期几

    今天是星期二 为什么当我运行这个 SQL 语句时 它说今天不是星期二 SELECT CASE WHEN TO CHAR sysdate Day Tuesday THEN Its Tuesday ELSE Its Not Tuesday EN
  • 计算包含字母/数字的行数

    我想要实现的目标很简单 但是解释起来有点困难 我不知道在 postgres 中这是否真的可能 我处于相当基础的水平 SELECT FROM WHERE LEFT JOIN ON HAVING 等等基本的东西 我正在尝试计算包含特定字母 数字
  • Php mysql 30秒后执行任务

    如何让 mysql 查询命令在访问 php 站点 30 秒后执行 您可以对执行 mysql 查询的 php 脚本发出 AJAX 请求 在 js 中使用计时器
  • 如何根据同一个表中的先前数据更新 SQL 表

    我有一张衡量学生表现的表格student在我的数据库中如下 ID TestDate PerformanceStatus PS 1 15 03 2016 0 1 01 04 2016 2 1 05 05 2016 1 1 07 06 2016
  • 在shell命令行中创建mysql触发器

    我需要在命令行中创建一个mysql触发器 这个sql在mysql控制台中运行良好 sql USE DB1 DROP TRIGGER IF EXISTS my trigger DELIMITER CREATE TRIGGER my trigg
  • 在 Laravel 中按数据透视表 create_at 排序

    在我的数据库中 我有以下表格 courses id 名称 创建时间 更新时间 students id 名称 创建时间 更新时间 课程 学生 id course id student id created at updated at 我正在尝
  • MySQL:“您的 SQL 语法错误...靠近键...”? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我发现了一个非常酷的用于丢失密码的脚本 但是这一行给我带来了问题 r mysql query INSERT INTO keys u
  • 如何将彼此“接近”的纬度/经度点分组?

    我有一个用户提交的纬度 经度点的数据库 并且正在尝试将 接近 点分组在一起 接近 是相对的 但目前看来约为 500 英尺 起初 我似乎只能按前 3 个小数位具有相同纬度 经度的行进行分组 大约是一个 300x300 的盒子 了解当您远离赤道
  • 如何检查oracle数据库中分配给模式、角色的对象的权限(DDL、DML、DCL)?

    大多数时候 我们都在与愚蠢的事情作斗争 以获取架构 角色及其对象的权限详细信息 并尝试找到一些简单的方法来获取有关它的所有详细信息以及伪查询代码 以批量生成授予语句以供进一步使用执行 所以我们在这里得到它 关于数据字典视图前缀的一些简单介绍
  • SQL Server 批量插入 - “批量加载数据转换错误”

    bulk insert dbo A FROM d AData csv WITH FIELDTERMINATOR ROWTERMINATOR n 将批量数据插入数据库时 在检查可疑数据后 我遇到了无法解释的错误 消息 4867 16 级 状态
  • 合并两个具有相同列名称的 MYSQL 表

    我有两张桌子 表一是计划时间 id edition time 1 1 9 23am 2 2 10 23am 表二为实际时间 id edition time 1 1 10 23am 2 2 11 23am 我想要的结果是 Caption Ed
  • 使用 Flot、html、PHP 和 MySql 查询绘制多个图表

    我正在尝试使用 Flot html PHP 和 MySql 查询绘制多个图表 但我陷入了困境 因为我找不到在同一个 html 页面中绘制多个 flot 的方法 为简单起见 在数据库 test db3 映像中包含以下字段 表1 用户名 发送邮
  • 如何编写可以补偿拼写错误数据的 MySQL 搜索?

    有没有什么方法可以编写一个 MySQL 搜索来弥补用户在拼写等方面的错误 作为随机示例 有人可能会输入 电子邮件受保护 cdn cgi l email protection代替 电子邮件受保护 cdn cgi l email protect
  • 如何将 sql 数据输出到 QCalendarWidget

    我希望能够在日历小部件上突出显示 SQL 数据库中的一天 就像启动程序时突出显示当前日期一样 在我的示例中 它是红色突出显示 我想要发生的是 当用户按下突出显示的日期时 数据库中日期旁边的文本将显示在日历下方的标签上 这是我使用 QT De
  • nvarchar 值“3001822585”的转换溢出了 int 列

    我使用以下方法将 Excel 文件导入到 SQL Server Excel 文件将所有值作为字符串 我可以导入文件 除了Barcode SalePrice and Price2 我收到错误 nvarchar 值 3001822585 条形码
  • Magento 设置脚本中的 ALTER TABLE 不使用 SQL

    乔纳森 戴 https stackoverflow com users 336905 jonathan day says 更新不应采用以下形式 SQL命令 我没遇到过 任何 DDL 或 DML 语句不能 通过 Magento 的配置执行 结
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • Oracle 按月滚动或运行总计

    目标 每个月末所有报表的滚动 运行总计 Code select TRUNC ACTHX STMT HX STMT DATE MM AS MNTH COUNT ACTHX INVOICE as STMTS from ACTHX group b
  • 创建日期范围表

    我正在编写一份需要显示每天值的报告 我有查询的开始日期和结束日期 但我希望避免丢失日期 以防表不包含特定日期的值 我正在考虑创建一个基本日期范围表 其中包含开始和结束之间的所有日期 然后将其与数据表左连接以显示每一天的值 我找到了一些适用于

随机推荐