博客
关于我
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/

    你可能感兴趣的文章
    Plotly (Python) 子图:填充构面和共享图例
    查看>>
    Plotly 中的行悬停文本
    查看>>
    Plotly 停用 x 轴排序
    查看>>
    Plotly 域变量解释(多图)
    查看>>
    Plotly 绘制表面 3D 未显示
    查看>>
    Plotly-Dash 存在未知问题并创建“加载依赖项时出错“;通过使用 Python-pandas.date_range
    查看>>
    Plotly-Dash:如何过滤具有多个数据框列的仪表板?
    查看>>
    Plotly:如何为 x 轴上的时间序列设置主要刻度线/网格线的值?
    查看>>
    Plotly:如何从 x 轴删除空日期?
    查看>>
    Plotly:如何从单条迹线制作堆积条形图?
    查看>>
    Plotly:如何以 Root 样式绘制直方图,仅显示直方图的轮廓?
    查看>>
    Plotly:如何使用 Plotly Express 组合散点图和线图?
    查看>>
    Plotly:如何使用 plotly.graph_objects 和 plotly.express 定义图形中的颜色?
    查看>>
    Plotly:如何使用 Python 对绘图对象条形图进行颜色编码?
    查看>>
    Plotly:如何使用 updatemenus 更新一个特定的跟踪?
    查看>>
    Plotly:如何使用长格式或宽格式的 pandas 数据框制作线图?
    查看>>
    Plotly:如何向烛台图添加交易量
    查看>>
    Plotly:如何在 plotly express 中找到趋势线的系数?
    查看>>
    Plotly:如何在桑基图中设置节点位置?
    查看>>
    pm2 start命令中的json格式详解
    查看>>