SQL 查询详解
SQL(Structured Query Language)是一种用于管理和操作关系数据库的标准语言。查询是SQL中最常用的操作之一,用于从数据库中检索所需的数据。本文将详细介绍SQL查询的相关知识,包括基本查询、条件查询、排序、分组、连接查询等,并通过丰富的示例帮助学生更好地理解。
1. 基本查询
基本查询是SQL中最简单的查询形式,用于从单个表中检索数据。基本查询使用SELECT
语句,语法如下:
SELECT 列名1, 列名2, ...
FROM 表名;
例如,从一个名为students
的表中检索所有学生的姓名和年龄:
SELECT name, age
FROM students;
如果需要检索表中的所有列,可以使用通配符*
:
SELECT *
FROM students;
2. 条件查询
条件查询用于从表中检索满足特定条件的数据。条件查询使用WHERE
子句,语法如下:
SELECT 列名1, 列名2, ...
FROM 表名
WHERE 条件;
例如,从一个名为students
的表中检索年龄大于18岁的学生:
SELECT name, age
FROM students
WHERE age > 18;
条件可以使用比较运算符(如=
、<>
、<
、>
、<=
、>=
)和逻辑运算符(如AND
、OR
、NOT
)。
例如,从一个名为students
的表中检索年龄大于18岁且性别为男的学生:
SELECT name, age, gender
FROM students
WHERE age > 18 AND gender = '男';
3. 排序
排序用于对查询结果进行排序。排序使用ORDER BY
子句,语法如下:
SELECT 列名1, 列名2, ...
FROM 表名
ORDER BY 列名 [ASC|DESC];
例如,从一个名为students
的表中检索所有学生的姓名和年龄,并按年龄升序排序:
SELECT name, age
FROM students
ORDER BY age ASC;
默认情况下,排序是升序(ASC),如果需要降序排序,可以使用DESC
:
SELECT name, age
FROM students
ORDER BY age DESC;
4. 分组
分组用于将数据按某个列进行分组,并对每个组进行聚合计算。分组使用GROUP BY
子句,语法如下:
SELECT 列名1, 聚合函数(列名2), ...
FROM 表名
GROUP BY 列名1;
例如,从一个名为students
的表中按性别分组,并计算每组的平均年龄:
SELECT gender, AVG(age)
FROM students
GROUP BY gender;
常用的聚合函数包括COUNT
、SUM
、AVG
、MAX
、MIN
等。
5. 连接查询
连接查询用于从多个表中检索数据。连接查询使用JOIN
子句,语法如下:
SELECT 列名1, 列名2, ...
FROM 表1
JOIN 表2 ON 表1.列名 = 表2.列名;
例如,有两个表students
和scores
,分别存储学生信息和成绩信息。我们需要从这两个表中检索学生的姓名、科目和成绩:
SELECT students.name, scores.subject, scores.score
FROM students
JOIN scores ON students.id = scores.student_id;
常用的连接类型包括内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN)。
6. 子查询
子查询是嵌套在另一个查询中的查询。子查询可以用于在WHERE
子句、FROM
子句或SELECT
子句中。
例如,从一个名为students
的表中检索年龄大于平均年龄的学生:
SELECT name, age
FROM students
WHERE age > (SELECT AVG(age) FROM students);
7. 联合查询
联合查询用于将两个或多个查询的结果合并成一个结果集。联合查询使用UNION
或UNION ALL
操作符,语法如下:
SELECT 列名1, 列名2, ...
FROM 表1
UNION [ALL]
SELECT 列名1, 列名2, ...
FROM 表2;
例如,有两个表students_china
和students_usa
,分别存储中国学生和美国学生的信息。我们需要将这两个表中的学生信息合并成一个结果集:
SELECT name, age, country
FROM students_china
UNION
SELECT name, age, country
FROM students_usa;
UNION
会自动去除重复的行,如果需要保留所有行,可以使用UNION ALL
。
8. 示例数据库
为了更好地理解SQL查询,我们可以创建一个示例数据库,包含以下表:
students
表:存储学生信息,包括id
、name
、age
、gender
。scores
表:存储成绩信息,包括id
、student_id
、subject
、score
。
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
gender CHAR(1)
);
CREATE TABLE scores (
id INT PRIMARY KEY,
student_id INT,
subject VARCHAR(50),
score DECIMAL(5, 2),
FOREIGN KEY (student_id) REFERENCES students(id)
);
插入一些示例数据:
INSERT INTO students (id, name, age, gender) VALUES
(1, '张三', 20, '男'),
(2, '李四', 19, '女'),
(3, '王五', 21, '男');
INSERT INTO scores (id, student_id, subject, score) VALUES
(1, 1, '数学', 90.5),
(2, 1, '英语', 85.0),
(3, 2, '数学', 88.0),
(4, 2, '英语', 92.5),
(5, 3, '数学', 95.0),
(6, 3, '英语', 89.5);
9. 综合示例
以下是一些综合示例,展示如何使用SQL查询从示例数据库中检索数据:
- 检索所有学生的姓名和年龄:
SELECT name, age
FROM students;
- 检索年龄大于18岁的学生:
SELECT name, age
FROM students
WHERE age > 18;
- 检索所有学生的姓名和年龄,并按年龄降序排序:
SELECT name, age
FROM students
ORDER BY age DESC;
- 按性别分组,并计算每组的平均年龄:
SELECT gender, AVG(age)
FROM students
GROUP BY gender;
- 检索学生的姓名、科目和成绩:
SELECT students.name, scores.subject, scores.score
FROM students
JOIN scores ON students.id = scores.student_id;
- 检索年龄大于平均年龄的学生:
SELECT name, age
FROM students
WHERE age > (SELECT AVG(age) FROM students);
- 将中国学生和美国学生的信息合并成一个结果集:
SELECT name, age, '中国' AS country
FROM students_china
UNION
SELECT name, age, '美国' AS country
FROM students_usa;
通过这些示例,学生可以更好地理解SQL查询的基本概念和用法。希望这些内容对学生的学习有所帮助。