博客
关于我
SQL连接查询
阅读量:750 次
发布时间:2019-03-22

本文共 1965 字,大约阅读时间需要 6 分钟。

代表连接查询的格式

连接查询是数据库查询中非常重要的概念,主要用于将两个或多个表中的数据按一定规则合并。常见的连接方式包括等值连接、自然连接、自身连接,全外连接、左外连接和右外连接等。

1. 连接方式

  • 等值连接:通过等于运算符(如`=``)将两个表的指定列联结。
  • 自然连接:没有明确指定联结列的连接方式,默认根据列名匹配。
  • 自身连接:将一个表与自身联结,常用于多条记录操作。
  • 全外连接:所有记录都要匹配,未匹配的记录也保留。
  • 左外连接右外连接:分别保留左表或右表的未匹配记录。

2. 连接条件的书写

连接条件通常写在WHERE子句中,格式如下:

WHERE 
<表名1>
.
<列名1>
[比较运算符] [
<表名2>
.
<列名2>
] ... BETWEEN ... AND ...;

3. 比较运算符

常用运算符包括><><=, >=, =<>!=等。


外连接

外连接用于关联两个表时,仅显示左表的所有记录,并保留未在右表中找到匹配的记录。左外连接默认保留左表数据。

外连接示例

SELECT Student.sno, Sname, SsexFROM StudentLEFT OUTER JOIN SC ON Student.sno = SC.Sno;

或者使用USING优化去重:

FROM StudentLEFT OUTER JOIN SC USING (sno);

多表连接

多表连接需要通过外键和主键关联,确保数据一致性。例如,学生表与课程表进行连接。

多表连接注意事项

  • 学生表中的学号应对应SC表中的多条记录。
  • 选课记录通常包含唯一的学号和课程号。

嵌套查询

嵌套查询是将子查询嵌入到父查询的WHEREHAVING子句中,用于提高查询复杂度。

不相关子查询

  • 子查询结果不依赖于父查询。
  • 示例:
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 = '数学');

集合操作

常见集合操作包括UNIONINTERSECTEXCEPTUNION 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);

日期函数

对于日期操作,常用函数包括:

  • SQL Servergetdate()
  • MySQLnow()
  • SQLitedatetime('now')

两个日期相差天数可通过DATEDIFF()函数计算。


类型转换

使用CAST将数据类型转换,例如:

CAST(grade AS CHAR)

做题步骤

  • 确定需要连接的表及其字段。
  • 分析查询条件,识别需要嵌套或外连接的部分。
  • 运用ANYALLEXISTS等谓词解决复杂查询。
  • 优化查询效率,使用聚合函数替代ANYALL
  • 通过以上方法,可以高效地完成复杂的数据库查询任务。

    转载地址:http://pghwk.baihongyu.com/

    你可能感兴趣的文章
    MySql 查询以逗号分隔的字符串的方法(正则)
    查看>>
    MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
    查看>>
    mysql 查询数据库所有表的字段信息
    查看>>
    【Java基础】什么是面向对象?
    查看>>
    mysql 查询,正数降序排序,负数升序排序
    查看>>
    MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
    查看>>
    mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
    查看>>
    mysql 死锁(先delete 后insert)日志分析
    查看>>
    MySQL 死锁了,怎么办?
    查看>>
    MySQL 深度分页性能急剧下降,该如何优化?
    查看>>
    MySQL 深度分页性能急剧下降,该如何优化?
    查看>>
    MySQL 添加列,修改列,删除列
    查看>>
    mysql 添加索引
    查看>>
    MySQL 添加索引,删除索引及其用法
    查看>>
    mysql 状态检查,备份,修复
    查看>>
    MySQL 用 limit 为什么会影响性能?
    查看>>
    MySQL 用 limit 为什么会影响性能?有什么优化方案?
    查看>>
    MySQL 用户权限管理:授权、撤销、密码更新和用户删除(图文解析)
    查看>>
    mysql 用户管理和权限设置
    查看>>
    MySQL 的 varchar 水真的太深了!
    查看>>