多表查询;
人事表: 公司表:
姓名
性别
年龄
|
姓名
公司
地址
|
张三
男
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,如需转载请自行联系原作者