【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 的值,可以实现灵活的分页查询,以满足用户对查询结果的需求,并提供友好的界面交互体验。

相关推荐
机器视觉知识推荐、就业指导11 分钟前
Qt/C++事件过滤器与控件响应重写的使用、场景的不同
开发语言·数据库·c++·qt
jnrjian17 分钟前
export rman 备份会占用buff/cache 导致内存压力
数据库·oracle
isNotNullX1 小时前
一文解读OLAP的工具和应用软件
大数据·数据库·etl
小诸葛的博客3 小时前
pg入门1——使用容器启动一个pg
数据库
sleP4o3 小时前
Python操作MySQL
开发语言·python·mysql
大熊程序猿4 小时前
python 读取excel数据存储到mysql
数据库·python·mysql
落落落sss4 小时前
sharding-jdbc分库分表
android·java·开发语言·数据库·servlet·oracle
jnrjian4 小时前
Oracle 启动动态采样 自适应执行计划
数据库·oracle
知识分享小能手4 小时前
mysql学习教程,从入门到精通,SQL DISTINCT 子句 (16)
大数据·开发语言·sql·学习·mysql·数据分析·数据库开发