什么是联合多表查询?
在关系型数据库中,通常将数据存储在多个表中,而且每个表都有一个唯一的标识。有时候,为了获得更完整的数据,需要从多个表中检索数据。这个过程就是联合多表查询,也叫多表联结。
在MSSQL中,我们可以使用JOIN语句来实现联合多表查询。
JOIN语句概述
JOIN语句用于将多个表中的数据按照指定的条件关联起来,以便获得更完整的数据。JOIN语句可以用于检索数据,也可以用于更新数据。
JOIN语句的语法如下:
SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;
其中,table1和table2都是要查询的表的名称,column_name是要检索的列名。JOIN语句使用ON关键字来指定联接条件。
例如,我们有两个表,一个是学生表,一个是课程表,它们的结构如下:
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT NOT NULL,
course_id INT NOT NULL
);
CREATE TABLE courses (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
我们想要从这两个表中检索出学生的名字和所选课程的名称,可以使用以下SQL语句:
SELECT students.name, courses.name
FROM students
JOIN courses
ON students.course_id=courses.id;
这个查询将返回一个包含学生的名字和所选课程的名称的结果集。
LEFT JOIN和RIGHT JOIN
LEFT JOIN
LEFT JOIN语句用于返回左表中的所有行以及与右表匹配的行。如果右表中没有与左表匹配的行,则返回NULL值。
LEFT JOIN语句的语法如下:
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
例如,我们有一个学生表,一个成绩表,它们的结构如下:
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
CREATE TABLE grades (
id INT PRIMARY KEY,
student_id INT NOT NULL,
grade INT NOT NULL
);
我们想要返回所有学生的名字以及他们的成绩(如果有的话),可以使用以下SQL语句:
SELECT students.name, grades.grade
FROM students
LEFT JOIN grades
ON students.id=grades.student_id;
这个查询将返回一个包含所有学生的名字和他们的成绩(如果有的话),如果一个学生没有成绩,则成绩为NULL。
RIGHT JOIN
RIGHT JOIN语句用于返回右表中的所有行以及与左表匹配的行。如果左表中没有与右表匹配的行,则返回NULL值。
RIGHT JOIN语句的语法如下:
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;
例如,我们有一个学生表,一个成绩表,它们的结构如下:
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
CREATE TABLE grades (
id INT PRIMARY KEY,
student_id INT NOT NULL,
grade INT NOT NULL
);
我们想要返回所有成绩以及对应学生的名字(如果有的话),可以使用以下SQL语句:
SELECT students.name, grades.grade
FROM students
RIGHT JOIN grades
ON students.id=grades.student_id;
这个查询将返回一个包含所有成绩以及对应学生的名字(如果有的话),如果一个成绩没有对应的学生,则学生名字为NULL。
INNER JOIN和FULL OUTER JOIN
INNER JOIN
INNER JOIN语句用于返回同时存在于左表和右表的行。
INNER JOIN语句的语法如下:
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;
例如,我们有一个学生表,一个成绩表,它们的结构如下:
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
CREATE TABLE grades (
id INT PRIMARY KEY,
student_id INT NOT NULL,
grade INT NOT NULL
);
我们想要返回所有学生的名字以及他们的成绩(如果有的话),可以使用以下SQL语句:
SELECT students.name, grades.grade
FROM students
INNER JOIN grades
ON students.id=grades.student_id;
这个查询将返回一个包含所有有成绩的学生的名字和他们的成绩。
FULL OUTER JOIN
FULL OUTER JOIN语句用于返回左表和右表中的所有行。如果左表或右表中没有与另一个表匹配的行,则返回NULL值。
FULL OUTER JOIN语句的语法如下:
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;
例如,我们有一个学生表,一个成绩表,它们的结构如下:
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
CREATE TABLE grades (
id INT PRIMARY KEY,
student_id INT NOT NULL,
grade INT NOT NULL
);
我们想要返回所有学生的名字以及他们的成绩(如果有的话),还想要返回没有成绩的学生和没有对应学生的成绩,可以使用以下SQL语句:
SELECT students.name, grades.grade
FROM students
FULL OUTER JOIN grades
ON students.id=grades.student_id;
这个查询将返回一个包含所有学生的名字和他们的成绩(如果有的话),以及没有成绩的学生和没有对应学生的成绩。