连接查询

连接查询:列的扩展
1. 等值连接查询 (内连接)
笛卡尔积
join on

2. 外连接(left.right.full)

left左连接:
left 左边表为主表 ,右边的为从表,显示的结果集以主表为主
如果从表中没有和它匹配的数据,就以NULL值填充

right右连接:
right 右边的表为主表

full 全连接
每个表都完全显示,互相匹配数据,如果对方没有则以NULL填充

联合查询:行的扩展

用Union将两个查询联合起来显示,追加行的形式在结果集中显示
必须保证两个查询结果的列的格式是一样的

SELECT * FROM Info
SELECT * FROM Nation
SELECT * FROM Family

select Info.Code,Info.Name,Nation.Name from Info,Nation where Nation.Code = Info.Nation

SELECT Info.Code,Info.Name,Nation.Name,Family.Name from Info JOIN Nation on Nation.Code = Info.Nation JOIN Family on Info.Code=Family.InfoCode

SELECT Info.Code,Info.Name,Nation.Name from Info right JOIN Nation on Nation.Code = Info.Nation

SELECT Info.Code,Info.Name,Nation.Name from Info full JOIN Nation on Nation.Code = Info.Nation


SELECT Code,Name from Info
UNION
SELECT code,Name from Nation


无关子查询

查询嵌套,外层查询成为主查询,内层查询成为子查询
子查询的结果成为主查询的条件

例子:查INFO表中和学号为‘p005’的学生出生年份一样的学生信息
select * FROM Info where YEAR(Birthday)=(SELECT YEAR(Birthday) from Info where Code = 'p005')

分页
SELECT top 5 * from News where ids NOT IN (SELECT top 5 ids from News)

查成绩超过学号为105的同学的所有成绩的成绩表

SELECT * FROM score where degree>ANY(SELECT degree from score where sno='105')

相关子查询

需要依赖于外层查询

外层查询和子查询存在联系

例子:查询计算机系与电子工程系不同职称的教师

SELECT * FROM teacher t1 where depart='计算机系' AND NOT EXISTS(
SELECT * FROM teacher t2 WHERE t2.depart='电子工程系' AND t1.prof = t2.prof
)
UNION
SELECT * FROM teacher t1 where depart='电子工程系' AND NOT EXISTS(
SELECT * FROM teacher t2 WHERE t2.depart='计算机系' AND t1.prof = t2.prof)

原文地址:https://www.cnblogs.com/languang/p/4547141.html