SQL多表连接技巧:内连接、外连接与子查询深度解析
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/29530SQL三表关联查询
选择器既可以使用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可以帮助我们更高效地处理和分析数据。