第二种方法 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 |
人事 |
找出工资比所在部门平均工资高的那个人