sql之查询语句(2)--跨表查询

内连接:将符合条件的行进行连接

SELECT CustomerName,IdentityNo,Adddress,A.AccountName,A.Balance FROM Customer AS C
INNER JOIN Account AS A
ON (C.CustomerNo=A.CustomerNo)

内连接查询两张表中的所有字段:

SELECT C.*,A.* FROM Customer AS C
INNER JOIN Account AS A
ON (C.CustomerNo=A.CustomerNo)

另外一种实现方式:

SELECT CustomerName,IdentityNo,Adddress,A.AccountName,A.Balance FROM Customer AS C,Account AS A
WHERE C.CustomerNo=A.CustomerNo

外连接:
左外连接:保留左表的全部记录以及右表中符合条件的记录,
–如果左表中的记录在右表中,,没有匹配的行,列显示为NULL
连接条件:基于公共字段值相等

SELECT CustomerName,IdentityNo,Adddress,A.AccountName,A.Balance FROM Customer AS C
LEFT JOIN Account AS A
ON (C.CustomerNo=A.CustomerNo)
WHERE C.CustomerNo=5

外连接的核心问题
—1.连接的核心:公共字段/主外键关系
左外连接:以左表为准
左表:假设作为主键表 右表:假设右表作为外键表(主键表有的列值外键表不一定有,没有的列则为NULL)
—右外连接:以右表为准
右表:假设右表作为外键表,左表:假设作为主键表
–(外键有的主键表一定有,不会产生NULL列值)

先看左右,再看主外(左表、右表是主键表/外键表)
内连接:不要求以哪个表为准,所有数据必须完全匹配,不会产生NULL值

—涉及到数量的查询概念:可以考虑使用分组查询(聚合函数)

SELECT * FROM Customer WHERE Adddress IN(
SELECT Adddress FROM Customer GROUP BY Adddress HAVING COUNT(1)>1
)
SELECT Adddress,COUNT(1)AS 'Count' FROM Customer GROUP BY Adddress HAVING COUNT(1)>1
ORDER BY Adddress DESC

多次连表查询:哪两张表连接,取决于连接的条件使用的字段的是哪两张表的字段

SELECT C.courseName AS '课程' ,COUNT(1) AS '数量',MAX(score) AS '最大值',MIN(score) AS '最小值' 
FROM Results R
INNER JOIN Students S
ON(R.stuno=S.stuNo)
INNER JOIN Course C
ON (R.courseId=C.courseId)
WHERE R.score>=80
GROUP BY C.courseName
HAVING COUNT(1)>=2 --对分组后的数据进行筛选
ORDER BY MAX(score) DESC --降序排序

eg:
—查询男同学的姓名、学号、所在年级的名称

SELECT stuNo,stuName,C.ClassName FROM Students S
INNER JOIN ClassInfos C
ON (S.classId=C.ClassId) --连接条件
WHERE sex='男'

查询三张表的数据:
–查询学生姓名、科目、考试时间和成绩
—注意:合并顺序–>必须找到公共字段(一般是主外键)

—从Students表开始做连接查询:

SELECT  stuName, C.courseName,R.examDate,R.score FROM Students S
LEFT JOIN Results R
ON(S.stuNo=R.stuno)
LEFT JOIN Course C
ON(R.courseId=C.courseId)

—从Course表开始做连接查询:

SELECT S.stuName,C.courseName,R.examDate,R.score FROM Course C
INNER JOIN Results R
ON(C.courseId=R.courseId)
INNER JOIN Students S
ON (R.stuno=S.stuNo)

四张表的连接查询:
–查询学生姓名、科目名、成绩以及班级名称

—从Students表开始做连接查询
–优先从表的主键是其他表的外键的数据表开始连表
–通过公共字段确定

SELECT S.stuName,C.courseName,CI.ClassName,R.score FROM Students S
INNER JOIN ClassInfos CI
ON(S.classId=CI.ClassId)
INNER JOIN Results R
ON(S.stuNo=R.stuno)
INNER JOIN Course C
ON(R.courseId=C.courseId)
发布了98 篇原创文章 · 获赞 1 · 访问量 854

猜你喜欢

转载自blog.csdn.net/qq_34550459/article/details/105584739