1.UNION
合并查询结果是将多个SELECT语句的查询结果合并在一起,进行合并操作
使用UNION和UNIONALL 关键字;
使用UNION关键字时,数据库系统会将所有的查询结果合并在一起,然后去除
相同的记录。
而UNIONALL关键字则只是简单的合并在一起。
注意:使用UNION时,两张表查询的结果有相同数量的列、列类型相似。
其语法规则:
SELECT 语句1UNION | UNIONALLSELECT 语句2UNION | UNIONALL...
SELECT 语句n
例子:
--学生信息表
CREATETABLE Students(
ID intprimarykeynotnull,
Name nvarchar(50),
Age int,
City nvarchar(50),
MajorID int
)
--专业信息表
CREATETABLE Majors(
ID intprimarykeynotnull,
Name nvarchar(50)
)
--教师信息表
CREATETABLE Teachers(
ID intprimarykeynotnull,
Name nvarchar(20) notnull
)
--预置数据
INSERTINTO Students(ID,Name,Age,City,MajorID)
VALUES(101,'Tom',20,'BeiJing',10)
INSERTINTO Students(ID,Name,Age,City,MajorID)
VALUES(102,'Lucy',18,'ShangHai',11)
INSERTINTO Teachers(ID,Name) VALUES(101,'Mrs Lee')
INSERTINTO Teachers(ID,Name) VALUES(102,'Lucy')
--合并查询
SELECT ID,Name FROM Students
UNIONSELECT ID,Name FROM Teachers
SELECT ID,Name FROM Students
UNIONALLSELECT ID,Name FROM Teachers
2.INNER JOIN(内连接),也成为自然连接
作用:根据两个或多个表中的列之间的关系,从这些表中查询数据。
注意: 内连接是从结果中删除其他被连接表中没有匹配行的所有行,所以内连接
可能会丢失信息。
重点:内连接,只查匹配行。
语法:(INNER可省略)
--预置脚本INSERTINTO Students(ID,Name,Age,City,MajorID)
VALUES(101,'Tom',20,'BeiJing',10)
INSERTINTO Students(ID,Name,Age,City,MajorID)
VALUES(102,'Lucy',18,'ShangHai',11)
INSERTINTO Majors(ID,Name) VALUES(10,'English')
INSERTINTO Majors(ID,Name) VALUES(12,'Computer')
实例:查询学生信息,包括ID,姓名、专业名称
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students INNERJOIN Majors
ON Students.MajorID = Majors.ID
3. 外连接查询:外连接可以查出某一张表的所有信息;`
基本语法:
SELECT 属性名列表
FROM 表名1LEFT | RIGHT|FULLJOIN 表名2ON 表名1.属性1=表名2.属性2;
左连接查询:结果集保留左表的所有行,但只包含第二个表与第一表匹配的行。
第二个表相应的空行被放入NULL值。
--执行语句
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students LEFTJOIN Majors
ON Students.MajorID = Majors.ID
通过结果,我们可以看到左连接包含了第一张表的所有信息,
在第二张表中如果没有匹配项,则用NULL代替。
右连接查询:右外连接保留了第二个表的所有行,但只包含第一个表与第二个表
匹配的行。第一个表相应空行被入NULL值。
--执行语句
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students RIGHTJOIN Majors
ON Students.MajorID = Majors.ID
通过结果可以看到,包含了第二张表Majors的全集,
Computer在Students表中没有匹配项,就用NULL代替。
全外连接,简称:全连接。会把两个表所有的行都显示在结果表中
--执行语句
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students FULLJOIN 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 CROSSJOIN Majors
4.2.查询多表,其实也是笛卡儿积,与CROSSJOIN等价,以下查询同上述结果
一样。这个可能很常见,但是大家一定要注意了,这样就查询了两张表中所有
组合的全集。
--执行语句
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students,Majors
4.3.加了查询条件
注意:在使用CROSSJOIN关键字交叉连接表时,因为生成的是两个表
的笛卡尔积,因而不能使用ON关键字,只能在WHERE子句中定义搜索条件。
--执行语句
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students CROSSJOIN Majors
WHERE Students.MajorID = Majors.ID