1.关联查询简介
关系型数据库中,数据之间的关联性是非常重要的。在SQL Server中,关联查询是一种非常常见和重要的查询方式,它可以用于连接不同的数据表并返回相关的数据。
关联查询是通过使用JOIN语句来实现的,JOIN语句用于将两个或多个数据表中的相关数据列进行连接。在关联查询中,我们需要指定两个或多个表之间的关联条件,并从这些表中检索相关数据。
2.内连接查询
2.1.什么是内连接查询?
内连接查询用于返回两个或多个表中的相匹配的行。它只返回在所有关联表中都存在的匹配行,而不返回仅存在于一些表中的行。
2.2.内连接查询实例
以下示例演示了如何执行基本的内连接查询:
SELECT *
FROM 表1
JOIN 表2
ON 表1.列名=表2.列名;
在这个查询中,我们在SELECT语句中使用了星号(*)来检索所有列。然后我们使用JOIN关键字来指定要连接的两个表,使用ON关键字来指定关联条件。
下面是一个更具体的例子,假设我们有两个表students和grades:
-- 创建students表
CREATE TABLE students(
student_id int PRIMARY KEY,
name varchar(255),
age int,
class_id int
)
-- 创建grades表
CREATE TABLE grades(
student_id int,
course varchar(255),
grade int,
PRIMARY KEY(student_id, course),
FOREIGN KEY (student_id) REFERENCES students(student_id)
);
-- 插入数据
INSERT INTO students VALUES(1,'Alice',18,1);
INSERT INTO students VALUES(2,'Bob',19,2);
INSERT INTO students VALUES(3,'Charlie',17,1);
INSERT INTO students VALUES(4,'David',20,3);
INSERT INTO grades VALUES(1, 'math', 90);
INSERT INTO grades VALUES(1, 'english', 80);
INSERT INTO grades VALUES(2, 'math', 85);
INSERT INTO grades VALUES(2, 'english', 70);
INSERT INTO grades VALUES(3, 'math', 95);
INSERT INTO grades VALUES(4, 'english', 75);
现在我们想要查询每个学生的ID、姓名、数学成绩和英语成绩,我们可以使用如下查询:
SELECT students.student_id, students.name, grades.grade AS math_grade, grades_english.grade AS english_grade
FROM students
JOIN grades ON students.student_id = grades.student_id AND grades.course = 'math'
JOIN grades AS grades_english ON grades.student_id = grades_english.student_id AND grades_english.course = 'english';
在这个查询中,我们首先使用了JOIN关键字连接了students和grades表,并指定了ON关键字中的关联条件。然后我们使用JOIN关键字将grades表与自身连接,得到英语成绩。
结果如下:
student_id | name | math_grade | english_grade |
---|---|---|---|
1 | Alice | 90 | 80 |
2 | Bob | 85 | 70 |
3 | Charlie | 95 | null |
3.外连接查询
3.1.什么是外连接查询?
当我们需要返回匹配行以及右(左)表中没有匹配的行时,可以使用左(右)外连接查询。
3.2.外连接查询实例
下面的示例演示了如何执行基本的外连接查询:
SELECT *
FROM 表1
LEFT JOIN 表2
ON 表1.列名=表2.列名;
在这个查询中,我们使用LEFT JOIN关键字来连接两个表。LEFT JOIN关键字保留左表中的所有行和匹配到右表中的所有行,对于右表中没有匹配到左表中的行,返回NULL值。如果要获取左表和右表中所有的行,可以使用UNION操作符联合查询。
下面是一个具体的例子,我们想要查询每个班级的ID、姓名、年龄、以及班级名称:
SELECT students.student_id, students.name, students.age, class.name
FROM students
LEFT JOIN class
ON students.class_id = class.id;
在这个查询中,我们使用LEFT JOIN关键字连接students表和class表,将它们关联在students表的class_id和class表的id列上。
结果如下:
student_id | name | age | class.name |
---|---|---|---|
1 | Alice | 18 | class1 |
2 | Bob | 19 | class2 |
3 | Charlie | 17 | class1 |
4 | David | 20 | null |
4.交叉连接查询
4.1.什么是交叉连接查询?
交叉连接查询是一种由两个表返回的笛卡尔积,它将第一个表中的每一行与第二个表中的每一行进行匹配。如果第一个表中有m行,第二个表中有n行,则返回m * n行结果。
4.2.交叉连接查询实例
下面的示例演示了如何执行基本的交叉连接查询:
SELECT *
FROM 表1
CROSS JOIN 表2;
在这个查询中,我们使用CROSS JOIN关键字来执行笛卡尔积。
下面是一个具体的例子,我们想要查询所有学生和所有科目之间的成绩关系:
SELECT students.name, grades.course, grades.grade
FROM students
CROSS JOIN grades;
在这个查询中,我们使用CROSS JOIN关键字在students表和grades表中执行笛卡尔积。
结果如下:
name | course | grade |
---|---|---|
Alice | math | 90 |
Alice | english | 80 |
Bob | math | 85 |
Bob | english | 70 |
Charlie | math | 95 |
David | math | null |
David | english | 75 |
5.子查询
5.1.什么是子查询?
子查询是指在一个查询中嵌套另一个查询,常用于查询的结果中包含另一个查询的结果。子查询可以嵌套多次,即嵌套查询可以包含嵌套查询。
5.2.子查询实例
下面的示例演示了如何执行基本的子查询:
SELECT *
FROM 表1
WHERE 列名 IN (SELECT 列名 FROM 表2);
在这个查询中,我们在WHERE子句中使用一个嵌套的SELECT语句来检索在表2中存在的值。如果表1中的列名和表2中的列名有相等的值,则返回这些值对应的所有行。
下面是一个具体的例子,我们想要查询所有的学生和他们的数学成绩,我们使用了一个子查询来检索在grades表中与数学课程对应的grade值:
SELECT name, (SELECT grade FROM grades WHERE grades.student_id=students.student_id AND course='math') AS math_grade
FROM students;
在这个查询中,我们在SELECT语句中嵌套了一个子查询来检索每个学生的数学成绩。子查询中使用了WHERE子句来过滤仅检索与当前学生的ID和数学课程相关的成绩。
结果如下:
name | math_grade |
---|---|
Alice | 90 |
Bob | 85 |
Charlie | 95 |
David | null |
总结
在SQL Server中,关联查询是一种常见的查询方式,主要通过使用JOIN语句来连接两个或多个数据表并返回相关数据。内连接查询、外连接查询、交叉连接查询、子查询是常见的关联查询方式,可以根据实际的需求选择相应的查询方式。使用关联查询可以帮助我们更有效率地处理各种复杂的查询,提高查询结果的准确性和可靠性。