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

简介:


多表查询;

人事表:                                                               公司表:
姓名      性别      年龄
姓名      公司       地址
张三             25
李四             25
张三      新浪        北京
李四      网易        广州
显示两个表的所有信息怎么办?
第一种方法:就是笛卡尔乘积,总数=a表的记录数*b表的记录数
第二种方法 join on  连接
内连接:表中行与行之间的相互连接, 仅包含满足连接条件的记录行
 
 
举例;显示人事表和公司表中职工的所有信息。
Select  人事表 . 姓名 , 人事表 . 性别 , 人事表 . 年龄 , 公司表 . 公司 , 公司表 . 地址  from  人事表  join  公司表   on  人事表 . 姓名 = 公司表 . 姓名
外连接分为三种:
左外连接: LEFT JOIN     输出 左表的所有行,如果左表的某行在右表中没有匹配行,则在右表的列均为空值。
右连接接: RIGHT JOIN   将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
全外连接: FULL JION     外部连接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则为空值。
 
联合:使用UNION  合并多个查询结果
要使用 UNION 合并两个查询结果集必须满足以下几个条件:
所有查询中的列数和列的顺序必须相同。
要合并的数据类型必须兼容,即类型可以不同,但必须可以转换。
合并查询结果的字段名称以第一个查询结果的字段名为准,其他查询结果集的字段名称将被忽略。
 
子查询
子查询是嵌入到一个外部查询中的 select 语句。那么这个语法就很简单了 :
 
注意:内层查询称为子查询,子查询必须必括号括起来。
执行顺序:先执行内层查询,将内层查询的结果返回给外层查询。
         再次执行外层查询。
 
 
 
SELECT  语句可以嵌套在其他许多语句中,例如 SELECT INSERT UPDATE  或者 DELETE ,这些嵌套的 SELECT  语句就是子查询。当一个查询依赖于另外一个查询的结果时,就可以使用子查询。
在使用子查询时,必须用括号把子查询括起来,以便区分外查询和子查询
 
 
对于教学数据库的三个基本表
学生  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
主任
2000
IDC
0003
工程师
3000
IDC
0004
主管
2600
人事
找出工资比所在部门平均工资高的那个人



 本文转自 dufei 51CTO博客,原文链接:http://blog.51cto.com/dufei/80752,如需转载请自行联系原作者

 
相关文章
|
9月前
|
SQL 关系型数据库 PostgreSQL
CTE vs 子查询:深入拆解PostgreSQL复杂SQL的隐藏性能差异
本文深入探讨了PostgreSQL中CTE(公共表表达式)与子查询的选择对SQL性能的影响。通过分析两者底层机制,揭示CTE的物化特性及子查询的优化融合优势,并结合多场景案例对比执行效率。最终给出决策指南,帮助开发者根据数据量、引用次数和复杂度选择最优方案,同时提供高级优化技巧和版本演进建议,助力SQL性能调优。
1016 1
|
SQL 关系型数据库 PostgreSQL
遇到SQL 子查询性能很差?其实可以这样优化
遇到SQL 子查询性能很差?其实可以这样优化
721 2
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
SQL 数据挖掘 数据库
SQL 子查询深度剖析来袭!嵌套查询竟有如此无限可能,带你轻松玩转复杂数据检索与操作!
【8月更文挑战第31天】在 SQL 中,子查询是一种强大的工具,允许在一个查询内嵌套另一个查询,从而实现复杂的数据检索和操作。子查询分为标量子查询、列子查询和行子查询,可用于 SELECT、FROM、WHERE 和 HAVING 子句中。例如,查找年龄大于平均年龄的学生或每个课程中成绩最高的学生。子查询具有灵活性、可重用性和潜在的性能优化优势,但需注意性能问题、可读性和数据库支持。合理使用子查询能够显著提升查询效率和代码维护性。
438 1
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
663 13
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
481 9
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
319 6
|
SQL 分布式计算 MaxCompute
SQL开发问题之对于ODPS中的UNION操作,执行计划的问题如何解决
SQL开发问题之对于ODPS中的UNION操作,执行计划的问题如何解决
337 7
|
SQL
什么是SQL中的子查询?
【8月更文挑战第2天】什么是SQL中的子查询?
283 1
|
SQL 分布式计算 DataWorks
MaxCompute操作报错合集之使用sql查询一个表的分区数据时遇到报错,该如何解决
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
292 2