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