复杂查询

118 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天

连接查询   连接  联结  联接

注意:多表查询时,如果要引用不同表中的同名属性,则在属性名前加表名,即用“表名.属性名”的形式表示,以便区分。

1、交叉连接查询(广义笛卡尔积)

格式:SELECT 列表列名 FROM 表名1 CROSS JOIN 表名2

例题: 产生了152条记录(8*19=152)

use  学生管理

go 

SELECT 学生.学号,姓名,成绩  FROM 学生 CROSS JOIN 成绩

2、等值与非等值连接查询

格式:[<表名1>.]<列名1>  <比较运算符>  [<表名2>.]<列名2>

其中:比较运算符主要是:=,>,<,>=,<=,!=(或<>)

等值连接,格式如下:

SELECT  列表列名

FROM 表名1  [INNER]  JOIN 表名2

ON  表名1.列名=表名2.列名

例题:

use  学生管理

go 

SELECT 学生.学号,姓名,成绩.学号,课程号,成绩  

FROM  学生  JOIN  成绩

on  学生.学号=成绩.学号

 

为表起个别名

use  学生管理

go 

SELECT a.学号,姓名,b.学号,课程号,成绩  

FROM  学生 as  a  JOIN  成绩 as b

on  a.学号=b.学号

 

AS 可以省略

自然连接是最常用的:去掉重复属性的等值连接。

 

例题:

use  学生管理

go 

SELECT 学生.学号,姓名 ,课程号,成绩  

FROM 学生  JOIN  成绩

on 学生.学号=成绩.学号

 

等价于:

use  学生管理

go 

SELECT 学生.学号,姓名 ,课程号,成绩  

FROM  学生  , 成绩

where  学生.学号=成绩.学号  

 

例题:

use  学生管理

go 

SELECT 学生.学号,姓名 ,课程号,成绩  

FROM 学生  JOIN  成绩

on  学生.学号=成绩.学号

where  性别=’女’

 

等价于:

use  学生管理

go 

SELECT 学生.学号,姓名 ,课程号,成绩  

FROM  学生  , 成绩

where  学生.学号=成绩.学号  and  性别=’女’

三张表的连接

use  学生管理

go 

SELECT  学生.学号,姓名,课程名,成绩.成绩  

FROM 学生  JOIN  成绩 

on  学生.学号=成绩.学号

join  课程

on  成绩.课程号=课程.课程号

等价于:

use  学生管理

go 

SELECT  学生.学号,姓名,课程名 ,成绩.成绩

FROM 学生 , 成绩, 课程 

where 学生.学号=成绩.学号  and   成绩.课程号=课程.课程号 

非等值连接(75条记录,思考为什么?)

例题:

use  学生管理

go 

SELECT a.学号,姓名,b.学号,课程号,成绩  

FROM 学生 as  a  JOIN  成绩 as b

on  a.学号>b.学号

order by a.学号

image.png

3、自连接查询

连接操作既可在多表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接。使用自身连接时,必须为表指定两个别名,以示区别。

 

例题:

use  学生管理

go 

SELECT a.学号,b.姓名  

FROM 学生 as  a  JOIN  学生 as b

on  a.学号=b.学号

查找重名的学生

use  学生管理

go 

SELECT a.学号,b.姓名  

FROM 学生 as  a  JOIN  学生 as b

on a.姓名=b.姓名

where a.学号<>b.学号

image.png

4、外连接查询

①左外连接

左外连接(Left Outer Join)是结果表中除了包含满足连接条件的记录外,还包含左表中不满足连接条件的记录。

注意:左表中不满足条件的记录与右表记录连接时,右表的相应列上填充NULL值。

左外连接的语法格式为:

SELECT 列表列名

FROM  表名1  LEFT  [OUTER]  JOIN  表名2

ON  表名1.列名=表名2.列名

 

例题: 将“学生”表左外连接“成绩”表

use  学生管理

go 

SELECT 学生.学号,姓名 ,课程号,成绩  

FROM 学生 left JOIN  成绩

on  学生.学号=成绩.学号

image.png ②右外连接

右外连接(Right Outer Join)是结果表中除了包含满足连接条件的记录外,还包含右表中不满足连接条件的记录。

注意:右表中不满足条件的记录与左表记录连接时,左表的相应列上填充NULL值。

右外连接的语法格式为:               

SELECT  列表列名

FROM  表名1  RIGHT  [OUTER]  JOIN  表名2

ON  表名1.列名=表名2.列名

 

例题: 将“学生”表右外连接“成绩”表

use  学生管理

go 

SELECT 学生.学号,姓名 ,课程号,成绩  

FROM 学生 right JOIN  成绩

on  学生.学号=成绩.学号

image.png ③完全外连接

完全外连接(Full Outer Join)是结果表中除了包含满足连接条件的记录外,还包含两个表中不满足连接条件的记录。

注意:左(右)表中不满足条件的记录与右(左)表记录连接时,右(左)表的相应列上填充NULL值。

完全外连接的语法格式为:

SELECT  列表列名

FROM  表名1  FULL  [OUTER]  JOIN  表名2

ON  表名1.列名=表名2.列名  

例题:

use  学生管理

go 

SELECT 学生.学号,姓名 ,课程号,成绩  

FROM 学生 full JOIN  成绩

on  学生.学号=成绩.学号 ③完全外连接

image.png5、复合连接条件查询

ON连接条件表达式只有一个条件,允许ON连接表达式有多个连接条件,称为复合条件连接,或多表连接。

 

例题:

use  学生管理

go 

SELECT 学生.学号,姓名 ,课程号,成绩  

FROM 学生  JOIN  成绩  

on  学生.学号=成绩.学号  and  成绩>=90

 

等价于:

use  学生管理

go 

SELECT 学生.学号,姓名 ,课程号,成绩  

FROM 学生  JOIN  成绩  

on  学生.学号=成绩.学号 

where  成绩>=90