3.2连表查询

连接查询包括合并、内连接、外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要。
1.UNION 
合并查询结果是将多个SELECT语句的查询结果合并在一起,进行合并操作
使用UNIONUNION ALL 关键字;

使用UNION关键字时,数据库系统会将所有的查询结果合并在一起,然后去除
相同的记录。

而UNION ALL关键字则只是简单的合并在一起。

注意:使用UNION时,两张表查询的结果有相同数量的列、列类型相似。
其语法规则:

 SELECT 语句1

           UNION | UNION ALL

      SELECT 语句2

           UNION | UNION ALL...

      SELECT 语句n  


例子:
--学生信息表
CREATE TABLE Students(
        ID int primary key not null,
        Name nvarchar(50),
        Age int,
        City nvarchar(50),
        MajorID int
)
--专业信息表
CREATE TABLE Majors(
ID int primary key not null,
Name nvarchar(50)
)
--教师信息表
CREATE TABLE Teachers(
    ID int primary key not null,
    Name nvarchar(20) not null
)
--预置数据
INSERT INTO Students(ID,Name,Age,City,MajorID)              
                    VALUES(101,'Tom',20,'BeiJing',10)
INSERT INTO Students(ID,Name,Age,City,MajorID) 
                    VALUES(102,'Lucy',18,'ShangHai',11)
INSERT INTO Teachers(ID,Name) VALUES(101,'Mrs Lee')
INSERT INTO Teachers(ID,Name) VALUES(102,'Lucy')

--合并查询
SELECT ID,Name FROM Students
UNION
SELECT ID,Name FROM Teachers

SELECT ID,Name FROM Students
UNION ALL
SELECT ID,Name FROM Teachers

2.INNER JOIN(内连接),也成为自然连接
作用:根据两个或多个表中的列之间的关系,从这些表中查询数据。
注意: 内连接是从结果中删除其他被连接表中没有匹配行的所有行,所以内连接
可能会丢失信息。
重点:内连接,只查匹配行。
语法:(INNER可省略)


--预置脚本
INSERT INTO Students(ID,Name,Age,City,MajorID) 
                    VALUES(101,'Tom',20,'BeiJing',10)
INSERT INTO Students(ID,Name,Age,City,MajorID) 
                    VALUES(102,'Lucy',18,'ShangHai',11)

INSERT INTO Majors(ID,Name) VALUES(10,'English')
INSERT INTO Majors(ID,Name) VALUES(12,'Computer')

实例:查询学生信息,包括ID,姓名、专业名称

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students INNER JOIN Majors
ON Students.MajorID = Majors.ID

3. 外连接查询:外连接可以查出某一张表的所有信息;`
 基本语法:

 SELECT 属性名列表
       FROM 表名1  LEFT | RIGHT|FULL JOIN 表名2
       ON 表名1.属性1=表名2.属性2;

左连接查询:结果集保留左表的所有行,但只包含第二个表与第一表匹配的行。
第二个表相应的空行被放入NULL值。
--执行语句
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students LEFT JOIN Majors
ON Students.MajorID = Majors.ID

通过结果,我们可以看到左连接包含了第一张表的所有信息,
在第二张表中如果没有匹配项,则用NULL代替。 



右连接查询:右外连接保留了第二个表的所有行,但只包含第一个表与第二个表
匹配的行。第一个表相应空行被入NULL值。
--执行语句
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students RIGHT JOIN Majors
ON Students.MajorID = Majors.ID

通过结果可以看到,包含了第二张表Majors的全集,
Computer在Students表中没有匹配项,就用NULL代替。 



全外连接,简称:全连接。会把两个表所有的行都显示在结果表中
--执行语句
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students FULL JOIN Majors
ON Students.MajorID = Majors.ID

包含了两张表的所有记录,没有记录丢失,没有匹配的行用NULL代替。
4.交叉连接(CROSS JOIN)
交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。
交叉连接也称作笛卡尔积。 
简单查询两张表组合,这是求笛卡儿积,效率最低。

笛卡儿积:笛卡尔乘积,也叫直积。假设集合A={a,b},集合B={0,1,2},
则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。
可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,
B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。

4.1.交叉连接查询学生的信息,其中包括学生ID,学生姓名和专业名称。
--执行语句
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students CROSS JOIN Majors

4.2.查询多表,其实也是笛卡儿积,与CROSS JOIN等价,以下查询同上述结果
一样。这个可能很常见,但是大家一定要注意了,这样就查询了两张表中所有
组合的全集。
--执行语句
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students,Majors

4.3.加了查询条件
注意:在使用CROSS JOIN关键字交叉连接表时,因为生成的是两个表
的笛卡尔积,因而不能使用ON关键字,只能在WHERE子句中定义搜索条件。
--执行语句
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students CROSS JOIN Majors
WHERE Students.MajorID = Majors.ID

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值