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语句的基本语法如下:
SELECT column1, column2, ...
FROM table_name
WHERE conditions
SELECT
关键字用于指定要返回的列。FROM
关键字用于指定要查询的表。WHERE
关键字用于指定查询条件,可选。
示例:从名为users
的表中选择所有年龄大于等于18岁的用户的名字和年龄:
SELECT name, age
FROM users
WHERE age >= 18;
2. 聚合查询
在MySQL数据库中,DQL(数据查询语言)提供了聚合函数,可以在查询中对数据进行聚合操作。聚合查询用于执行诸如计算总和、平均值、最大值、最小值等统计数据的操作。以下是DQL中常用的聚合函数以及示例:
-
COUNT:用于计算匹配条件的行数。
示例:统计名为users
的表中的记录数。SELECT COUNT(*) FROM users;
-
SUM:用于计算数值列的总和。
示例:计算名为products
的表中价格列的总和。SELECT SUM(price) FROM products;
-
AVG:用于计算数值列的平均值。
示例:计算名为sales
的表中销售额的平均值。SELECT AVG(sales) FROM sales;
-
MAX:用于找出数值列的最大值。
示例:找出名为scores
的表中分数列的最高分。SELECT MAX(score) FROM scores;
-
MIN:用于找出数值列的最小值。
示例:找出名为temperatures
的表中温度列的最低温度。SELECT MIN(temperature) FROM temperatures;
需要注意的是,聚合函数通常与GROUP BY子句一起使用,以便对分组后的数据进行聚合计算。GROUP BY子句根据指定的列对结果进行分组。
示例:计算名为products
的表中每个分类的总销售额。
SELECT category, SUM(sales) FROM products GROUP BY category;
上述是一些常见的聚合函数,MySQL还提供了其他函数和扩展功能,例如DISTINCT(用于查找唯一的值),HAVING(用于过滤分组后的数据)等等。根据实际需求,可以在查询中使用适当的聚合函数来满足特定的统计需求。
3. 分组查询
在MySQL数据库中,DQL(数据查询语言)提供了分组查询的功能,用于根据指定的列对查询结果进行分组。分组查询常与聚合函数一起使用,以便对每个分组进行聚合计算。以下是DQL中分组查询的详细讲解和示例:
分组查询使用 GROUP BY
子句来指定要根据哪些列进行分组。在分组查询中,可以选择一个或多个列作为分组依据。请注意,除了被分组的列,查询的 SELECT
语句中通常还包括聚合函数的使用。
分组查询的基本语法如下:
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
的表中按客户分组计算每个客户的订单总数。
SELECT customer, COUNT(*) as total_orders
FROM orders
GROUP BY customer;
示例2:从名为 products
的表中按分类分组计算每个分类的产品数量。
SELECT category, COUNT(*) as total_products
FROM products
GROUP BY category;
示例3:从名为 sales
的表中按年份和月份分组计算每个月的总销售额。
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 的分类。
SELECT category, AVG(price) as avg_price
FROM products
GROUP BY category
HAVING avg_price >= 100;
4. 排序查询
在MySQL数据库中,DQL(数据查询语言)提供了排序查询的功能,可以对查询结果按照指定的列进行排序。排序查询可以按照升序(默认)或降序的方式排列结果。以下是DQL中排序查询的详细讲解和示例:
排序查询使用 ORDER BY
子句来指定要按照哪个列进行排序。可以选择一个或多个列进行排序,对于多个列,按照列的顺序进行排序。默认情况下,排序是按照升序进行的(从小到大)。如果需要按照降序进行排序(从大到小),可以通过在排序列名后面加上 DESC
关键字来实现。
排序查询的基本语法如下:
SELECT column1, column2, ...
FROM table_name
WHERE conditions
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...
其中 column1, column2, ...
是要排序的列名,可以选择一个或多个列进行排序。 ASC
是升序排序(默认), DESC
是降序排序。
示例1:从名为 employees
的表中按照薪水进行升序排序。
SELECT name, salary
FROM employees
ORDER BY salary ASC;
示例2:从名为 products
的表中按照价格进行降序排序,如果价格相同,则按照产品名称进行升序排序。
SELECT product_name, price
FROM products
ORDER BY price DESC, product_name ASC;
需要注意的是,可以使用 ORDER BY
子句对多个列进行排序。在多列排序中,按照列在 ORDER BY
子句中的顺序进行排序。如果第一个列的值相同,则按照第二个列进行排序,依此类推。
示例3:从名为 sales
的表中按照销售日期和销售金额进行排序。
SELECT sale_date, amount
FROM sales
ORDER BY sale_date DESC, amount DESC;
在排序查询中,还可以使用表达式进行排序,也可以使用函数对排序列进行处理。此外,还可以使用位置索引来指定排序的列。
示例4:从名为 customers
的表中按照合并姓和名进行排序。
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。
分页查询的基本语法如下:
SELECT column1, column2, ...
FROM table_name
WHERE conditions
ORDER BY column1, column2, ...
LIMIT n
OFFSET offset;
其中 column1, column2, ...
是要查询的列名,可以选择一个或多个列进行查询。 n
是每页显示的记录数量, offset
是要跳过的行数。
示例1:从名为 employees
的表中查询前10条记录。
SELECT name, salary
FROM employees
LIMIT 10;
示例2:从名为 products
的表中查询第3页的记录,每页显示5条记录。
SELECT product_name, price
FROM products
ORDER BY product_name
LIMIT 5
OFFSET 10;
需要注意的是,LIMIT
子句接受两个参数,可以只提供一个参数。如果只提供一个参数,则表示要返回的记录数量。
示例3:从名为 sales
的表中查询最近的5条记录。
SELECT sale_date, amount
FROM sales
ORDER BY sale_date DESC
LIMIT 5;
可以使用变量或表达式来指定 LIMIT
和 OFFSET
的值,以便根据不同的情况进行分页查询。
示例4:从名为 customers
的表中查询根据用户输入动态指定的页码和记录数量。
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;
通过合理设置 LIMIT
和 OFFSET
的值,可以实现灵活的分页查询,以满足用户对查询结果的需求,并提供友好的界面交互体验。