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

相关推荐
不光头强12 分钟前
Spring框架的事务管理
数据库·spring·oracle
百***92022 小时前
【MySQL】MySQL库的操作
android·数据库·mysql
q***76662 小时前
Spring Boot 从 2.7.x 升级到 3.3注意事项
数据库·hive·spring boot
信仰_2739932433 小时前
Redis红锁
数据库·redis·缓存
人间打气筒(Ada)3 小时前
Centos7 搭建hadoop2.7.2、hbase伪分布式集群
数据库·分布式·hbase
心灵宝贝3 小时前
如何在 Mac 上安装 MySQL 8.0.20.dmg(从下载到使用全流程)
数据库·mysql·macos
想睡hhh3 小时前
mysql索引——理解索引机制及操作
mysql
剑动山河3 小时前
ubuntu 升级mysql由mysql5.7.42 升级到8.4.0
mysql·ubuntu·adb
奋斗的牛马4 小时前
OFDM理解
网络·数据库·单片机·嵌入式硬件·fpga开发·信息与通信
忧郁的橙子.4 小时前
一、Rabbit MQ 初级
服务器·网络·数据库