您的位置:首页 > 数据库

SQL Server 2005系列教学(6) 多表操作及子查询

2008-06-08 12:35 453 查看
多表查询;[/b]
人事表: 公司表:
姓名 性别 年龄姓名 公司 地址
张三 男 25
李四 女 25
张三 新浪 北京
李四 网易 广州
显示两个表的所有信息怎么办?
第一种方法:就是笛卡尔乘积[/b],总数=a表的记录数*b表的记录数
第二种方法 join on [/b]连接[/b]
[align=left]内连接:表中行与行之间的相互连接,仅包含满足连接条件的记录行[/align]

举例;显示人事表和公司表中职工的所有信息。
Select 人事表.姓名,人事表.性别,人事表.年龄,公司表.公司,公司表.地址 from 人事表 join 公司表 on 人事表.姓名=公司表.姓名
外连接分为三种:
[align=left]左外连接:LEFT JOIN 输出左表的所有行,如果左表的某行在右表中没有匹配行,则在右表的列均为空值。[/align]
[align=left]右连接接:RIGHT JOIN 将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。[/align]
[align=left]全外连接:FULL JION 全外部连接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则为空值。[/align]

联合:使用UNION [/b]合并多个查询结果[/b]
要使用UNION合并两个查询结果集必须满足以下几个条件:
所有查询中的列数和列的顺序必须相同。
要合并的数据类型必须兼容,即类型可以不同,但必须可以转换。
合并查询结果的字段名称以第一个查询结果的字段名为准,其他查询结果集的字段名称将被忽略。

[align=left]子查询[/align]
[align=left]子查询是嵌入到一个外部查询中的select语句。那么这个语法就很简单了:[/align]
[align=left] [/align]
[align=left]注意:内层查询称为子查询,子查询必须必括号括起来。[/align]
[align=left]执行顺序:先执行内层查询,将内层查询的结果返回给外层查询。[/align]
[align=left] 再次执行外层查询。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]SELECT 语句可以嵌套在其他许多语句中,例如SELECT、INSERT、UPDATE 或者DELETE,这些嵌套的SELECT 语句就是子查询。当一个查询依赖于另外一个查询的结果时,就可以使用子查询。[/align]
在使用子查询时,必须用括号把子查询括起来,以便区分外查询和子查询

对于教学数据库的三个基本表
学生 S(S#,SNAME,AGE,SEX) 学习 SC(S#,C#,GRADE) 课程 C(C#,CNAME,TEACHER)
试用SQL的查询语句表达下列查询:
(1)检索LIU老师所授课程的课程号和课程名。
SELECT C#,CNAME  FROM C WHERE TEACHER=‘LIU’
(2)检索年龄大于23岁的男学生的学号和姓名。
SELECT S#,SNAME FROM S WHERE (AGE>23) AND (SEX=‘M’)
(3)检索至少选修LIU老师所授课程中一门课程的女学生姓名。
SELECT SNAME FROM S WHERE SEX=‘F’ AND S# IN (SELECT S# FROM SC WHERE C# IN (SELECT C# FROM C WHERE TEACHER=‘LIU’)
(4)检索WANG同学不学的课程的课程号。
SELECT C# FROM C WHERE C# NOT IN (SELECT C# FROM SC WHERE S# IN (SELECT S# FROM S WHERE SNAME='WANG'))
(5)检索至少选修两门课程的学生学号。
SELECT S# FROM SC HAVING COUNT(C#)>=2
(6)检索全部学生都选修的课程的课程号与课程名。
SELECT C#,CNAME FROM C WHERE NOT EXISTS (SELECT * FROM S WHERE NOT EXISTS (SELECT * FROM SC WHERE SC.S#=S.S# AND SC.C#=C.C#))
(7)检索选修课程包含LIU老师所授课的学生学号。
SELECT S#  FROM S  WHERE S# IN (SELECT S#  FROM SC  WHERE S.S#=SC.S# AND C# IN  (SELECT C# FROM C  WHERE TEACHER='LIU'))

表名: people:

编号姓名性别职务工资部门
0001经理3000人事
0002主任2000IDC
0003工程师3000IDC
0004主管2600人事
找出工资比所在部门平均工资高的那个人
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息