SQL多表连接技巧:内连接、外连接与子查询深度解析

创始人
2024-12-31 02:07:27
0 次浏览
0 评论

SQL多表链接查询、嵌入SELECT语句的子查询技术

连接查询

ANSI链接

连接方式有三种:内连接、外连接、交叉连接一个SELECT中可以连接多个表-语句链接通过扩展SELECT语句中的FROM子句添加JOIN和ON两个关键字

JOIN指定要连接的表

ON指定共同的字段这些表

SELECTtable_namecolumn_nametable_namecolumn_name……

FROM{table_name[join_type]JOINtable_nameONsearch_conditions}

:WHERE[search_conditions]

:INNER(内连接))连接结果集只包含满足条件的行连接。
它是SQLServer的默认连接方法。
INNERJOIN可简写为JOIN

SELECT学生表

FROM学生表JOIN选课表ON学生表学生号选课表学生号

SQLServer链接

SELECTtable_namecolumn_nametable_namecolumn_name……

FROM{table_nametable_name……}

【WHEREtable_namecolumn_namejoin_operatortable_namecolumn_name

【SELECTDISTINCT学生表*

【FROM学生表选课表

【子查询

子查询必须用括号括起来

只能使用一个值或一系列值来用子查询替换表达式

数据类型不能子查询中询问带有文本或图像的字段

子查询还可以包含子查询,嵌套最多可以为多层

使用子查询作为派生表

<.p>例如,内查询使用子查询生成派生表。
外层查询会使用内层查询的结果集推导出表本身,功能上相当于全量查询。

SELECT*

FROMselect学号姓名年龄fromStudenttable

【Whereclass='GZplan'asa

使用子查询作为表达式

例如询问GZ班学生的平均年龄,每个同学的年龄差异平均年龄

SELECTavg(age)FROMStudent表作为平均年龄

Age(SELECTavg(age)FROMStudent表)作为年龄差

相关子查询

从学生列表中选择学生编号和姓名

WHERE<=(从课程选择列表中选择分数

WHEREStudents表学生号=选课表学生号AND课程号=)

使用EXISTS和NOTEXISTS运算符

外层查询测试子查询返回的记录是否存在

子查询根据返回TRUE或FALSE根据查询指定的条件

子查询不产生任何数据

SELECT学号、姓名、班级

FROMStudent表

哪里存在(选择CT*FROM选课表

WHERE学号=学生表号AND课程号=)

ANDEXISTS(SELECT*FROM选课表

WHERE学号=学生表学号AND课程号=)

①查找外表“学生表”中的行,根据“学号”的值处理内查询

③处理行在外表“学生表”中依次获取每门选修课的几位学生的信息

SELECT*FROMStudenttableWHERE

【NOTFOUND(SELECT*FROMcoursechoicetable

​WHERE学生表学号=选课表学号ANDND成绩<)

ANDEXIST(SELECT*FROM选课表

WHERE学生表号=选课表学号)

使用TOP限制结果集

当使用SELECT语句查询时,我们有时希望显示第一条结果而不是全部结果。
例如,在比赛中我们只能得到结果。
此时,表现最好的前三名必须使用TOP关键字来选择输出结果

SELECTTOPn[percent][withties]查询列表

n为非负整数

TOPn表示取搜索的前n行result

TOPnpercent表示取搜索结果中的前n行%行

Withties表示包含并列结果

SELECTTOPWITHTIES学号SUM(分数)AS总计分数

FROM科目选择列表

GROUPBY学号

ORDERBY总分DESC

使用TOP时要小心最好使用它与ORDERBY子句一起使用,因为第一个字符是有意义的,但是当使用WITTIES时,必须使用ORDERBY子句

联接多个结果集

UNION

UNION[ALL]

……

SELECT语句n

所有查询语句中的列数和列顺序必须相同

所有查询语句中对应列的数据类型必须兼容

如果UNION子句中包含ORDERBY,则整个结果集必须排序

>

结果集中的列名来自SELECT子句

SELECT*FROM学生表WHEREclass='GZplan'

UNION

lishixinzhi/Article/program/MySQL/201311/29530

SQL三表关联查询

选择器既可以使用nerjoinb.d=b.d括号内的部分查询表数据,又可以使用表A=表B,保存这个结果集和innerjoincona。
d=c.d

表B=d中的f值与表C中的值相对应。

扩展信息:

SQL语句LEFTJOIN三表

SELECT

intro_web_page.id,

web_id,

web_name,

template_id,

template_name,

fromintro_web_pageleftjoinintro_webon(web_id=intro_web.id)

leftjointro_templateon(intro_web_page.template_id=intro_template.id)

注意:这里的主要目标是查看两者何时当表和给定表相关时,如何编写左连接?

更新语句

更新issueINNERJOINuserON`issue`.insert_uidand`user`.idINNERJOIN

(SELECTissues.idasid,issue.insert_uidasuid,`user`.school_idasschool_id,school.areaasarea1fromissue,用户,学校

whereissue.insert_uid=`user`.idand`user`.school_id=school.id)AST1

ONissue.insert_uid=T1.uid

SETissue.area=T1.area1

SQLJOIN如何将多个表的行进行组合?

SQLJoin连接是数据库查询中不可或缺的工具,它允许我们根据不同表共享的字段组合来自不同表的行。
简单来说,就是选择一个主表作为结果的起点,然后根据具体情况将其他表的数据添加到该主表中,形成一套比较完整的结果。
最常见的SQLJOIN类型包括INNERJOIN,它仅返回满足连接条件的行。
我们以“Orders”表和“Customers”表为例。
它们通过“CustomerID”字段连接。
当我们执行以下SQL语句(使用INNERJOIN)时:sqlSELECTOrders.OrderID,Customers.CustomerName,Orders.OrderDateFROMOrdersINNERJOINCustomersONOrders.CustomerID=Customers.CustomerID;结果将显示订单ID为10308的订单,对应的客户为AnaTrujilloEmparedadosyhelados,订单日期为09/18/1996。
除了INNERJOIN之外,还有LEFTJOIN、RIGHTJOIN、FULLJOIN、SELFJOIN和CARTESIANJOIN等不同类型的JOIN。
即使右表中没有匹配项,LEFTJOIN也会返回左表中的所有行,反之亦然,无论哪里有匹配项,RIGHTJOIN都会返回。
SELFJOIN用于将表与自身进行连接,等价;临时重命名表;CARTESIANJOIN返回所有可能的成对组合,形成笛卡尔积。
选择这些JOIN类型取决于您想要从数据中获取什么信息以及如何处理可能的不完整或重复数据。
理解并灵活使用SQLJOIN可以帮助我们更高效地处理和分析数据。
热门文章
1
Redisson分布式锁深度解析:Red... Redis实现分布式锁+Redisson源码解析在某些场景下,多个进程需要以互斥...

2
深度解析Docker:容器技术提升应用部... docker是什么Docker是一种强大的开源容器技术,它将应用程序及其所有依赖...

3
C语言实现:如何判断一个整数是否为质数? C语言输入一个整数,判断是否是质数?#include//头文件intmain()...

4
K8s弃用Docker背后的故事及Doc... K8s为什么要弃用Docker?在讨论K8s抛弃Docker的话题时,我们首先需...

5
C语言文本输入输出教程:安全高效处理字符... C语言怎么变成文字?如果你想用C语言输入输出文本,其实很简单。您必须首先定义一个...

6
深入解析Java:面向对象编程特性与实现... Java语言的特点,实现机制和体系结构。中的任何实体都可以被视为一个对象。对象通...

7
三款免费Docker管理工具,提升您的可... 3款免费又好用的Docker可视化管理工具在Docker的世界里,命令行工具无疑...

8
C语言期末编程题解析:完整程序代码分享 C语言期末考试编程代码函数题?按照题目要求编写的完整程序如下(见图,图中重复的部...

9
轻松掌握:Redis键值查看技巧,两种方... 如何读取redis中的key值中的结果我们希望它能帮助您使用它。怎么查看redi...

10
SQL DELETE语句:详解及不同删除... 请问Sql的DELETE语句怎么写delete表示删除表中的数据示例:delet...