【MySQL】DQL

DQL(数据查询语言)用于在MySQL数据库中执行数据查询操作。它主要包括SELECT语句,用于从表中检索数据。

0. 基本语法

SELECT 
    字段列表 
FROM 
    表名列表
WHERE 
    条件列表 
GROUP BY 
    分组字段列表
HAVING 
    分组后条件列表
ORDER BY 
    排序字段列表 
LIMIT 
    分页参数

1). 查询多个字段

SELECT 字段1,字段2... FROM 表名:

2). 字段设置别名

SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名;
SELECT 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... FROM 表名;

3). 去除重复记录

SELECT DISTINCT 字段列表 FROM 表名;

1. 条件查询

DQL的主要语句是SELECT语句,它允许我们在数据库表中进行复杂的查询操作。SELECT语句的基本语法如下:

sql 复制代码
SELECT column1, column2, ...
FROM table_name
WHERE conditions
  • SELECT关键字用于指定要返回的列。
  • FROM关键字用于指定要查询的表。
  • WHERE关键字用于指定查询条件,可选。

示例:从名为users的表中选择所有年龄大于等于18岁的用户的名字和年龄:

sql 复制代码
SELECT name, age
FROM users
WHERE age >= 18;

2. 聚合查询

在MySQL数据库中,DQL(数据查询语言)提供了聚合函数,可以在查询中对数据进行聚合操作。聚合查询用于执行诸如计算总和、平均值、最大值、最小值等统计数据的操作。以下是DQL中常用的聚合函数以及示例:

  1. COUNT:用于计算匹配条件的行数。

    示例:统计名为users的表中的记录数。

    sql 复制代码
    SELECT COUNT(*) FROM users;
  2. SUM:用于计算数值列的总和。

    示例:计算名为products的表中价格列的总和。

    sql 复制代码
    SELECT SUM(price) FROM products;
  3. AVG:用于计算数值列的平均值。

    示例:计算名为sales的表中销售额的平均值。

    sql 复制代码
    SELECT AVG(sales) FROM sales;
  4. MAX:用于找出数值列的最大值。

    示例:找出名为scores的表中分数列的最高分。

    sql 复制代码
    SELECT MAX(score) FROM scores;
  5. MIN:用于找出数值列的最小值。

    示例:找出名为temperatures的表中温度列的最低温度。

    sql 复制代码
    SELECT MIN(temperature) FROM temperatures;

需要注意的是,聚合函数通常与GROUP BY子句一起使用,以便对分组后的数据进行聚合计算。GROUP BY子句根据指定的列对结果进行分组。

示例:计算名为products的表中每个分类的总销售额。

sql 复制代码
SELECT category, SUM(sales) FROM products GROUP BY category;

上述是一些常见的聚合函数,MySQL还提供了其他函数和扩展功能,例如DISTINCT(用于查找唯一的值),HAVING(用于过滤分组后的数据)等等。根据实际需求,可以在查询中使用适当的聚合函数来满足特定的统计需求。

3. 分组查询

在MySQL数据库中,DQL(数据查询语言)提供了分组查询的功能,用于根据指定的列对查询结果进行分组。分组查询常与聚合函数一起使用,以便对每个分组进行聚合计算。以下是DQL中分组查询的详细讲解和示例:

分组查询使用 GROUP BY 子句来指定要根据哪些列进行分组。在分组查询中,可以选择一个或多个列作为分组依据。请注意,除了被分组的列,查询的 SELECT 语句中通常还包括聚合函数的使用。

分组查询的基本语法如下:

sql 复制代码
SELECT column1, column2, ..., aggregate_function(column)
FROM table_name
WHERE conditions
GROUP BY column1, column2, ...

其中 column1, column2, ... 是用于分组的列名, aggregate_function(column) 是应用于每个分组的聚合函数,例如 COUNT(column)、SUM(column)、AVG(column) 等。

示例1:从名为 orders 的表中按客户分组计算每个客户的订单总数。

sql 复制代码
SELECT customer, COUNT(*) as total_orders
FROM orders
GROUP BY customer;

示例2:从名为 products 的表中按分类分组计算每个分类的产品数量。

sql 复制代码
SELECT category, COUNT(*) as total_products
FROM products
GROUP BY category;

示例3:从名为 sales 的表中按年份和月份分组计算每个月的总销售额。

sql 复制代码
SELECT YEAR(sales_date) as year, MONTH(sales_date) as month, SUM(amount) as total_sales
FROM sales
GROUP BY YEAR(sales_date), MONTH(sales_date);

需要注意的是,分组查询中除了 GROUP BY 子句外,还可以使用 HAVING 子句来对分组后的数据进行筛选。 HAVING 子句与 WHERE 子句的功能类似,但是 HAVING 用于过滤分组后的数据,可以使用聚合函数和分组列进行条件筛选。

执行顺序: where > 聚合函数 > having 。

示例4:从名为 products 的表中按分类分组计算每个分类的平均价格,并仅显示平均价格大于等于 100 的分类。

sql 复制代码
SELECT category, AVG(price) as avg_price
FROM products
GROUP BY category
HAVING avg_price >= 100;

4. 排序查询

在MySQL数据库中,DQL(数据查询语言)提供了排序查询的功能,可以对查询结果按照指定的列进行排序。排序查询可以按照升序(默认)或降序的方式排列结果。以下是DQL中排序查询的详细讲解和示例:

排序查询使用 ORDER BY 子句来指定要按照哪个列进行排序。可以选择一个或多个列进行排序,对于多个列,按照列的顺序进行排序。默认情况下,排序是按照升序进行的(从小到大)。如果需要按照降序进行排序(从大到小),可以通过在排序列名后面加上 DESC 关键字来实现。

排序查询的基本语法如下:

sql 复制代码
SELECT column1, column2, ...
FROM table_name
WHERE conditions
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...

其中 column1, column2, ... 是要排序的列名,可以选择一个或多个列进行排序。 ASC 是升序排序(默认), DESC 是降序排序。

示例1:从名为 employees 的表中按照薪水进行升序排序。

sql 复制代码
SELECT name, salary
FROM employees
ORDER BY salary ASC;

示例2:从名为 products 的表中按照价格进行降序排序,如果价格相同,则按照产品名称进行升序排序。

sql 复制代码
SELECT product_name, price
FROM products
ORDER BY price DESC, product_name ASC;

需要注意的是,可以使用 ORDER BY 子句对多个列进行排序。在多列排序中,按照列在 ORDER BY 子句中的顺序进行排序。如果第一个列的值相同,则按照第二个列进行排序,依此类推。

示例3:从名为 sales 的表中按照销售日期和销售金额进行排序。

sql 复制代码
SELECT sale_date, amount
FROM sales
ORDER BY sale_date DESC, amount DESC;

在排序查询中,还可以使用表达式进行排序,也可以使用函数对排序列进行处理。此外,还可以使用位置索引来指定排序的列。

示例4:从名为 customers 的表中按照合并姓和名进行排序。

sql 复制代码
SELECT CONCAT(last_name, ' ', first_name) as full_name, age
FROM customers
ORDER BY 1; -- 使用位置索引 1 表示第一个列

5. 分页查询

在MySQL数据库中,DQL(数据查询语言)提供了分页查询的功能,可以限制查询结果的数量,以便显示在页面上,并允许用户浏览多个结果页。分页查询通常与排序查询一起使用,以确保分页结果的一致性。以下是DQL中分页查询的详细讲解和示例:

分页查询使用 LIMIT 子句来限制查询结果的数量,并使用 OFFSET 子句来指定要跳过的行数。假设每页显示的记录数量为 n,要显示第 k 页的结果,偏移量应为 (k-1) * n。

分页查询的基本语法如下:

sql 复制代码
SELECT column1, column2, ...
FROM table_name
WHERE conditions
ORDER BY column1, column2, ...
LIMIT n
OFFSET offset;

其中 column1, column2, ... 是要查询的列名,可以选择一个或多个列进行查询。 n 是每页显示的记录数量, offset 是要跳过的行数。

示例1:从名为 employees 的表中查询前10条记录。

sql 复制代码
SELECT name, salary
FROM employees
LIMIT 10;

示例2:从名为 products 的表中查询第3页的记录,每页显示5条记录。

sql 复制代码
SELECT product_name, price
FROM products
ORDER BY product_name
LIMIT 5
OFFSET 10;

需要注意的是,LIMIT 子句接受两个参数,可以只提供一个参数。如果只提供一个参数,则表示要返回的记录数量。

示例3:从名为 sales 的表中查询最近的5条记录。

sql 复制代码
SELECT sale_date, amount
FROM sales
ORDER BY sale_date DESC
LIMIT 5;

可以使用变量或表达式来指定 LIMITOFFSET 的值,以便根据不同的情况进行分页查询。

示例4:从名为 customers 的表中查询根据用户输入动态指定的页码和记录数量。

sql 复制代码
SET @page = 2; -- 用户输入的页码
SET @per_page = 10; -- 用户输入的每页记录数量

SELECT customer_name, age
FROM customers
ORDER BY customer_name
LIMIT @per_page
OFFSET (@page - 1) * @per_page;

通过合理设置 LIMITOFFSET 的值,可以实现灵活的分页查询,以满足用户对查询结果的需求,并提供友好的界面交互体验。

相关推荐
Karoku06619 分钟前
【企业级分布式系统】ELK优化
运维·服务器·数据库·elk·elasticsearch
小技与小术2 小时前
数据库表设计范式
数据库·mysql
安迁岚2 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作
运维·服务器·数据库·sql·mysql
安迁岚2 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验九 触发器
数据库·sql·mysql·oracle·实验报告
Loganer2 小时前
MongoDB分片集群搭建
数据库·mongodb
LKID体2 小时前
Python操作neo4j库py2neo使用之创建和查询(二)
数据库·python·neo4j
刘大浪2 小时前
后端数据增删改查基于Springboot+mybatis mysql 时间根据当时时间自动填充,数据库连接查询不一致,mysql数据库连接不好用
数据库·spring boot·mybatis
一只爱撸猫的程序猿2 小时前
简单实现一个系统升级过程中的数据平滑迁移的场景实例
数据库·spring boot·程序员
无敌岩雀2 小时前
MySQL中的索引
数据库·mysql
a_安徒生3 小时前
linux安装TDengine
linux·数据库·tdengine