MySQL数据查询(基础)
1. 基本查询
SELECT 语句
SELECT
语句用于从表中查询数据。可以选择特定的列,也可以选择所有列。
基本语法
SELECT 列1, 列2, ... FROM 表名;
选择所有列: 使用*
表示选择所有列。
SELECT * FROM customers;
示例
SELECT first_name, last_name FROM customers;
2. 筛选与条件
在 SQL 查询中,使用 WHERE
子句来指定条件,以筛选出满足特定条件的记录。这样可以限制返回的结果集,确保只得到需要的数据。
2.1 WHERE
子句
用途:用于指定查询条件,限制返回的记录。
语法:
SELECT column1, column2
FROM table_name
WHERE condition;
示例:
SELECT first_name, last_name
FROM customers
WHERE last_name = 'Smith';
- 固定格式:
SELECT
:开始查询。FROM
:指定数据来源表。WHERE
:用于筛选数据。
- 可更改字段:
first_name, last_name
:要选择的列。customers
:表名。last_name = 'Smith'
:筛选条件。
2.2 逻辑连词
2.2.1 AND
- 用途:同时满足多个条件。
- 示例:
WHERE last_name = 'Smith' AND first_name = 'John';
2.2.2 OR
- 用途:满足任一条件。
- 示例:
WHERE last_name = 'Smith' OR last_name = 'Johnson';
2.2.3 NOT
用途:排除某个条件。
示例:
WHERE NOT last_name = 'Smith';
2.3 选用修饰
2.3.1 BETWEEN
- 用途:筛选某个范围内的值(例如,价格在 100 到 500 之间)。
- 示例:
WHERE order_amount BETWEEN 100 AND 500;
- 说明:包括范围的起始值和结束值。
2.3.2 IN
- 用途:检查某列的值是否在指定的列表中。
- 示例:
WHERE last_name IN ('Smith', 'Johnson', 'Williams');
- 说明:相当于多个
OR
条件的组合。
2.3.3 LIKE
- 用途:进行模式匹配,常用于字符串匹配。
- 示例:
WHERE first_name LIKE 'A%';
- 说明:
%
代表任意字符,可以用于模糊查询。first_name则是你要查询的字段,这里会查询first_name字段是否存在AE、A8、A;这种模式的值。
2.3.4 IS NULL
- 用途:检查某列的值是否为 NULL。
- 示例:
WHERE phone_number IS NULL;
- 说明:用于查找没有值的记录。
2.4 综合示例
SELECT first_name, last_name
FROM customers
WHERE (last_name = 'Smith' OR last_name = 'Johnson')
AND phone_number IS NOT NULL;
-
SELECT first_name, last_name:
- 选择要返回的列,这里是客户的名(
first_name
)和姓(last_name
)。
- 选择要返回的列,这里是客户的名(
-
FROM customers:
- 指定要查询的表,这里是
customers
表。
- 指定要查询的表,这里是
-
WHERE:
- 这是筛选条件,用于限制返回的记录。
-
(last_name = 'Smith' OR last_name = 'Johnson'):
- 这是一个逻辑条件,表示筛选出姓氏为 'Smith' 或 'Johnson' 的客户。
- 使用了逻辑连词
OR
,意味着只要满足其中一个条件就会被选中。
-
AND phone_number IS NOT NULL:
- 这是另一个条件,用于确保筛选出的记录中,
phone_number
列的值不为 NULL。 - 这意味着只有那些有电话号码的客户才会被返回。
- 这是另一个条件,用于确保筛选出的记录中,
3. 结果处理
3.1 DISTINCT
概念: DISTINCT
关键字用于从查询结果中去除重复记录,确保返回的结果集中每一行都是唯一的。
用法:
SELECT DISTINCT column_name
FROM table_name;
-
固定格式:
SELECT
:关键字,用于指定要查询的列。DISTINCT
:关键字,表示只返回唯一值。FROM
:关键字,指定数据来源表。
-
可变字段:
column_name
:表示要选择的列名。table_name
:表示要查询的表名。
示例:
SELECT DISTINCT last_name
FROM customers;
-
解释: 从
customers
表中选择唯一的姓氏 (last_name
)。如果last_name
列中有重复值,返回的结果将只包含每个唯一姓氏一次。
3.2 AS
概念: AS
关键字用于给查询结果中的列或表达式起一个别名,使输出结果更易于理解和阅读。
用法:
SELECT column_name AS alias_name
FROM table_name;
-
固定格式:
SELECT
:关键字,用于指定要查询的列。AS
:关键字,用于指定别名。FROM
:关键字,指定数据来源表。
-
可变字段:
column_name
:表示要选择的列名。alias_name
:表示为列起的别名。table_name
:表示要查询的表名。
示例:
SELECT first_name AS Name, last_name AS Surname
FROM customers;
-
解释: 从
customers
表中选择first_name
和last_name
列,并将它们分别命名为Name
和Surname
。这样,结果集中将显示更友好的列名,便于理解。
最后返回的内容中这两个字段不再叫做 first_name
和 last_name
列,而是叫做Name和Usrname。
Name | Surname |
---|---|
John | Doe |
Jane | Smith |
Alice | Johnson |
DISTINCT
用于去重,确保查询结果中只有唯一的记录;AS
用于设置列别名,使结果输出更直观易读。
4. 排序与分组
4.1 ORDER BY
功能:用于对查询结果进行排序。
用法:
- 可以按一个或多个列排序。
- 支持升序(
ASC
,默认)或降序(DESC
)排列。
示例:
SELECT first_name, last_name
FROM customers
ORDER BY last_name ASC;
- 固定格式:
ORDER BY
:关键字,用于指定排序的列。ASC|DESC
:排序方式,可选,默认为升序。
- 可更改字段:
last_name
:要排序的列名。
4.2 GROUP BY
功能:GROUP BY
的主要功能就是将同一列中出现的相同值的记录归为一组。具体来说,当你使用 GROUP BY
语句时,数据库会扫描指定的列,并将所有相同的值聚合到一起,从而形成一个组。每个组中的数据可以通过聚合函数进行计算,比如求和、计数、平均值等。
用法:
- 常与聚合函数(如
COUNT()
、SUM()
)结合使用。
示例:
SELECT last_name, COUNT(*) AS count
FROM customers
GROUP BY last_name;
- 固定格式:
GROUP BY
:关键字,用于分组的列。
- 可更改字段:
last_name
:要分组的列名。COUNT(*)
:聚合函数,返回每组的记录数。
将一列中具有相同值的记录归为一组,然后在对这组记录进行操作。
4.3 HAVING
功能:用于对分组后的结果进行筛选。
用法:
- 常与
GROUP BY
结合使用,过滤分组的结果集。
示例:
SELECT last_name, COUNT(*) AS count
FROM customers
GROUP BY last_name
HAVING COUNT(*) > 1;
- 固定格式:
HAVING
:关键字,用于条件筛选。
- 可更改字段:
COUNT(*) > 1
:用于筛选条件,可以更改为其他聚合函数或条件。
结合这些功能,可以在查询中使用
ORDER BY
来对最终结果排序,使用GROUP BY
来对数据进行分组,并利用HAVING
来过滤这些分组结果,从而得到所需的信息。
5.聚合函数
聚集函数是 SQL 中用于对一组值进行计算的函数,通常与 GROUP BY
子句结合使用,用于对分组后的数据进行统计分析。以下是常用的聚集函数及其详细说明:
后面的示例中带有AS,只是值最后返回结果的时候,将这个字段命名为这个名字展示,与聚合函数的使用无关。
5.1 COUNT()
功能:计算行数或非 NULL 值的数量。
示例:
SELECT COUNT(customer_id) AS total_customers
FROM customers;
- 解释:返回
customers
表中所有具有客户 ID 的数量。
5.2 SUM()
功能:计算指定列的总和。
示例:
SELECT SUM(sale_amount) AS total_sales
FROM sales;
- 解释:返回
sales
表中所有销售金额的总和。
5.3 AVG()
功能:计算指定列的平均值。
示例:
SELECT AVG(sale_amount) AS average_sales
FROM sales;
- 解释:返回
sales
表中销售金额的平均值。
5.4 MIN()
功能:查找指定列的最小值。
示例:
SELECT MIN(price) AS lowest_price
FROM products;
- 解释:返回
products
表中价格的最小值。
5.5 MAX()
功能:查找指定列的最大值。
示例:
SELECT MAX(price) AS highest_price
FROM products;
- 解释:返回
products
表中价格的最大值。
5.6 使用场景
聚集函数通常用于生成报告和分析,例如:
- 统计客户数量、销售总额。
- 分析销售趋势,查找最低和最高价格。
- 计算产品的平均销量。
5.7 与 GROUP BY 的结合
聚集函数经常与 GROUP BY
结合使用,以便对分组后的数据进行统计。例如:
SELECT product_id, SUM(sale_amount) AS total_sales
FROM sales
GROUP BY product_id;
- 解释:对
sales
表按产品 ID 分组,并计算每种产品的总销售额。
如果不加GROUP BY的话,直接用SUM,会计算所有记录的sale_amount字段的总和,加了之后,就会将同一个组(product_id字段相同的)的sale_amount记录相加,然后将几个组的合展示出来。
6. 集合操作
6.1 UNION
功能:合并两个或多个 SELECT
查询的结果,并去除重复行。
示例:
SELECT first_name FROM customers
UNION
SELECT first_name FROM employees;
- 解释:此查询将
customers
表和employees
表中的first_name
列的所有唯一值合并,返回一个不重复的名字列表。
6.2 UNION ALL
功能:合并多个 SELECT
查询的结果,但保留所有重复行。
示例:
SELECT first_name FROM customers
UNION ALL
SELECT first_name FROM employees;
- 解释:此查询将返回两个表中的所有名字,包括重复的名字。
6.3 INTERSECT
功能:返回两个查询结果的交集,即只包含在两个结果集中都出现的记录。
示例:
SELECT first_name FROM customers
INTERSECT
SELECT first_name FROM employees;
- 解释:此查询将返回在
customers
表和employees
表中都存在的first_name
。
6.4 EXCEPT (或 MINUS)
功能:返回第一个查询结果中不在第二个查询结果中的记录。
示例:
SELECT first_name FROM customers
EXCEPT
SELECT first_name FROM employees;
- 解释:此查询将返回在
customers
表中存在,但不在employees
表中的first_name
。
使用场景
集合操作通常用于:
- 整合来自不同表的数据。
- 找出重复或唯一的记录。
- 比较不同数据集的相似性和差异性。
注意事项
- 所有
SELECT
查询的列数和数据类型必须相同。 - 在使用
UNION
或INTERSECT
时,结果会自动去除重复记录;使用UNION ALL
时则会保留所有记录。 - 不同数据库对集合操作的支持可能有所不同,部分数据库可能不支持
INTERSECT
或EXCEPT
。