本文共 1965 字,大约阅读时间需要 6 分钟。
连接查询是数据库查询中非常重要的概念,主要用于将两个或多个表中的数据按一定规则合并。常见的连接方式包括等值连接、自然连接、自身连接,全外连接、左外连接和右外连接等。
连接条件通常写在WHERE
子句中,格式如下:
WHERE <表名1> . <列名1> [比较运算符] [ <表名2> . <列名2> ] ... BETWEEN ... AND ...; 列名2> 表名2> 列名1> 表名1>
常用运算符包括>
、<
、>
、<=
, >=
, =
、<>
、!=
等。
外连接用于关联两个表时,仅显示左表的所有记录,并保留未在右表中找到匹配的记录。左外连接默认保留左表数据。
SELECT Student.sno, Sname, SsexFROM StudentLEFT OUTER JOIN SC ON Student.sno = SC.Sno;
或者使用USING
优化去重:
FROM StudentLEFT OUTER JOIN SC USING (sno);
多表连接需要通过外键和主键关联,确保数据一致性。例如,学生表与课程表进行连接。
嵌套查询是将子查询嵌入到父查询的WHERE
或HAVING
子句中,用于提高查询复杂度。
SELECT *FROM StudentWHERE exist( SELECT * FROM SC WHERE Student.sno = SC.sno);
SELECT sc.* FROM SC WHERE sc.sno = (SELECT sno FROM Student WHERE sage > 30);
ANY
/ ALL
谓词的子查询用于处理子查询返回多值的情况,ANY
表示存在匹配,ALL
表示全部匹配。
SELECT Sto.name FROM Student Sto WHERE Sto.sno IN( SELECT sno FROM SC WHERE grade > (SELECT max(grade) FROM SC));
EXIST
的谓词查询EXIST
量词用于检查是否存在匹配记录,返回逻辑值,不影响外层查询结果。
SELECT dept.name FROM Student WHERE EXISTS( SELECT * FROM SC WHERE Student.sno = SC.sno AND course_no = '数学');
常见集合操作包括UNION
、INTERSECT
、EXCEPT
、UNION ALL
。
UNION
:合并结果,自动去重。UNION ALL
:保留重复元组。INTERSECT
:返回两个SELECT
结果的交集。EXCEPT
:返回两个SELECT
结果的差集。SELECT name FROM Student UNION ALL SELECT name FROM SCWHERE grade > 80;
通过子查询生成临时表,用于复杂查询优化。
SELECT sno, course_no FROM SC WHERE sno IN( SELECT sno FROM SC GROUP BY sno HAVING COUNT(grade) > 5);
对于日期操作,常用函数包括:
getdate()
now()
datetime('now')
两个日期相差天数可通过DATEDIFF()
函数计算。
使用CAST
将数据类型转换,例如:
CAST(grade AS CHAR)
ANY
、ALL
、EXISTS
等谓词解决复杂查询。ANY
、ALL
。通过以上方法,可以高效地完成复杂的数据库查询任务。
转载地址:http://pghwk.baihongyu.com/