内连接:将符合条件的行进行连接
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)