联合多表查询——使用MSSQL实现

什么是联合多表查询?

在关系型数据库中,通常将数据存储在多个表中,而且每个表都有一个唯一的标识。有时候,为了获得更完整的数据,需要从多个表中检索数据。这个过程就是联合多表查询,也叫多表联结。

在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;

这个查询将返回一个包含所有学生的名字和他们的成绩(如果有的话),以及没有成绩的学生和没有对应学生的成绩。

数据库标签