数据库表查询中常用的 SQL 语句及其用法
在数据库管理中,SQL(结构化查询语言)是与数据库进行交互的核心工具,而表查询则是 SQL 的重要应用场景之一。无论是从单表中提取特定数据,还是在多表之间进行复杂的数据关联分析,合理使用 SQL 查询语句都能让我们高效地获取所需信息。本文将详细介绍数据库表查询中常用的 SQL 语句及其用法。
一、基础单表查询
1. 查询所有列
使用SELECT *语句可以查询表中的所有列数据。
SELECT
*
FROM
表名;
例如,有一个学生表students,包含id、name、age、gender等列,要查询所有学生的信息,就可以使用:
SELECT
*
FROM
students;
2. 查询指定列
若只需查询表中的部分列,可在SELECT关键字后指定列名,多个列名之间用逗号分隔。
SELECT
列1,
列2,
列3
FROM
表名;
比如,只查询学生的姓名和年龄:
SELECT
name,
age
FROM
students;
3. 去重查询
当需要查询某列中不重复的值时,可使用DISTINCT关键字。
SELECT
DISTINCT
列名
FROM
表名;
例如,查询学生表中所有不同的性别:
SELECT
DISTINCT
gender
FROM
students;
二、条件查询
通过WHERE子句可以对查询结果进行筛选,只返回满足条件的数据。WHERE子句中可以使用各种比较运算符和逻辑运算符。
1. 比较运算符
运算符 | 用途 |
---|---|
= | 等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
!=或<> | 不等于 |
例如,查询年龄大于 20 岁的学生:
SELECT
*
FROM
students
WHERE
age > 20;
2. 逻辑运算符
运算符 | 用途 |
---|---|
AND | 逻辑与,表示多个条件同时满足 |
OR | 逻辑或,表示多个条件中至少有一个满足 |
NOT | 逻辑非,对条件进行取反 |
- 查询年龄大于 20 岁且性别为男的学生:
SELECT
*
FROM
students
WHERE
age > 20
AND gender = '男';
- 查询年龄大于 20 岁或者性别为女的学生:
SELECT
*
FROM
students
WHERE
age > 20
OR gender = '女';
- 查询年龄不大于 20 岁的学生(即年龄小于等于 20 岁):
SELECT
*
FROM
students
WHERE
NOT age > 20;
3. 范围查询
- BETWEEN … AND …:查询在某个范围内的数据,包括边界值
- IN (值1, 值2, …):查询在指定列表中的数据
- 查询年龄在 18 到 25 岁之间的学生:
SELECT
*
FROM
students
WHERE
age BETWEEN 18
AND 25;
- 查询性别为男或女的学生(假设性别列只有这两个值):
SELECT
*
FROM
students
WHERE
gender IN ('男', '女');
4. 模糊查询
使用LIKE关键字可以进行模糊查询,配合通配符 % 和 _ 使用。
- %:匹配任意数量的字符,包括零个字符
- _:匹配任意一个字符
- 查询姓名以 “张” 开头的学生:
SELECT
*
FROM
students
WHERE
name LIKE '张%';
- 查询姓名中包含 “三” 字的学生:
SELECT
*
FROM
students
WHERE
name LIKE '%三%';
- 查询姓名为两个字的学生(假设每个字用一个字符表示):
SELECT
*
FROM
students
WHERE
name LIKE '__';
三、排序查询
使用ORDER BY子句可以对查询结果按照指定列进行排序,默认是升序排序(ASC),也可以指定降序排序(DESC)。
SELECT
列名
FROM
表名
ORDER BY
排序列 [ASC/DESC];
- 例如,按年龄升序排列学生信息:
SELECT
*
FROM
students
ORDER BY
age ASC;
- 按年龄降序且姓名升序排列学生信息:
SELECT
*
FROM
students
ORDER BY
age DESC,
name ASC;
四、聚合函数查询
聚合函数用于对一组数据进行计算,返回一个单一的值。常见的聚合函数有:
函数 | 用途 |
---|---|
COUNT() | 统计行数 |
SUM() | 计算数值列的和 |
AVG() | 计算数值列的平均值 |
MAX() | 获取列中的最大值 |
MIN() | 获取列中的最小值 |
1. 统计行数
统计学生表中的学生人数:
SELECT
COUNT(*)
FROM
students;
2. 计算总和
假设有一个成绩表scores,包含student_id和score列,计算所有学生的总成绩:
SELECT
SUM(score)
FROM
scores;
3. 计算平均值
计算所有学生的平均成绩:
SELECT
AVG(score)
FROM
scores;
4. 获取最大值和最小值
获取成绩表中的最高成绩和最低成绩:
SELECT
MAX(score),
MIN(score)
FROM
scores;
五、分组查询
使用GROUP BY子句可以将数据按照指定列进行分组,通常与聚合函数一起使用,对每个分组进行统计计算。
SELECT
分组列,
聚合函数 (其他列)
FROM
表名
GROUP BY
分组列;
1. 例如,按性别分组统计学生人数:
SELECT
gender,
COUNT(*) AS 人数
FROM
students
GROUP BY
gender;
2. 分组后的筛选
使用HAVING子句可以对分组后的结果进行筛选,筛选条件基于聚合函数的计算结果。
SELECT
分组列,
聚合函数 (其他列)
FROM
表名
GROUP BY
分组列
HAVING
筛选条件;
3. 统计成绩表中每个学生的平均成绩,并筛选出平均成绩大于80 分的学生:
SELECT
student_id,
AVG(score) AS 平均成绩
FROM
scores
GROUP BY
student_id
HAVING
AVG(score) > 80;
六、多表连接查询
当需要从多个表中获取数据时,需要使用表连接操作。常见的连接类型有:
链接类型 | 说明 |
---|---|
内连接(INNER JOIN) | 只返回两个表中连接条件匹配的行 |
左外连接(LEFT JOIN或LEFT OUTER JOIN) | 返回左表的所有行,右表中匹配的行,若右表没有匹配的行则用NULL填充 |
右外连接(RIGHT JOIN或RIGHT OUTER JOIN) | 返回右表的所有行,左表中匹配的行,若左表没有匹配的行则用NULL填充 |
全外连接(FULL JOIN或FULL OUTER JOIN) | 返回两个表中所有匹配的行和不匹配的行,不匹配的行用NULL填充 |
假设学生表students和成绩表scores通过student_id进行关联。
1. 内连接
查询学生的姓名和对应的成绩:
SELECT
students.name,
scores.score
FROM
students
INNER JOIN scores ON students.id = scores.student_id;
2. 左外连接
查询所有学生的姓名以及他们的成绩(包括没有成绩的学生):
SELECT
students.name,
scores.score
FROM
students
LEFT JOIN scores ON students.id = scores.student_id;
3. 右外连接
查询所有成绩对应的学生姓名(包括没有学生对应的成绩,这种情况可能较少见):
SELECT
students.name,
scores.score
FROM
students
RIGHT JOIN scores ON students.id = scores.student_id;
七、子查询
子查询是指在一个查询语句中嵌套另一个查询语句,子查询通常放在WHERE子句、FROM子句或HAVING子句中。
1. 在 WHERE 子句中使用子查询
查询成绩高于平均成绩的学生信息:
SELECT
*
FROM
students
WHERE
id IN (SELECT student_id FROM scores WHERE score > (SELECT AVG(score) FROM scores));
2. 在 FROM 子句中使用子查询(表子查询)
将子查询的结果作为一个临时表来使用:
SELECT
s.name,
sub.平均成绩
FROM
students s,
(SELECT student_id, AVG(score) AS 平均成绩 FROM scores GROUP BY student_id) sub
WHERE
s.id = sub.student_id;
八、限制查询结果数量
使用LIMIT子句可以限制查询结果返回的行数,常用于分页查询。
SELECT
*
FROM
表名
LIMIT 起始行数,
显示行数;
例如,查询前 5 条学生记录:
SELECT
*
FROM
students
LIMIT 0,
5;
九、别名的使用
为了使查询语句更易读,可以给表名或列名起别名,使用AS关键字(AS可以省略)。
SELECT
s.name AS 学生姓名,
sc.score AS 学生成绩
FROM
students s
INNER JOIN scores sc ON s.id = sc.student_id;
通过合理组合和运用以上各种 SQL 查询语句,我们可以在数据库表查询中灵活地获取所需的数据,满足不同的业务需求。在实际应用中,需要根据具体的数据库结构和查询目标,选择合适的查询方法,以提高查询效率和数据处理的准确性。