SQL多表链接查询、嵌入SELECT语句的子查询技术
高级查询技术【jì shù】🔳主要是涉及多【shè jí duō】个表的😓链接查👐询技术【jì shù】🔳、嵌入🌑SELECT语句的子查询🦄技术【jì shù】,把多个查询联【chá xún lián】合起来【hé qǐ lái】的联合【de lián hé】技术【jì shù】等。
1. 连接查询
需要同时从两【liǎng】🎓个或者【gè huò zhě】连个以上的【yǐ shàng de】表【biǎo】🎆中检索数据【shù jù】👛。链接就【liàn jiē jiù】🐁是允许🚌同时从两【liǎng】🎓个表【biǎo】或者两【liǎng】个以上的【yǐ shàng de】表【biǎo】🎆中检索数据【shù jù】👛,指定这些表【biǎo】中的某个或者【gè huò zhě】某些列作为连接【wéi lián jiē】🏣条件。在👣SQL Server中,可以使用两【liǎng】种🕺连接语法的形【fǎ de xíng】式🍈,一种是🙏ANSI链接语法形式🎤,这是连【zhè shì lián】接条件【jiē tiáo jiàn】出现在【chū xiàn zài】👣FROM子句中👰;另外一种🕺SQL Server链接语法形式🎤,这是连【zhè shì lián】接条件【jiē tiáo jiàn】出现在【chū xiàn zài】👣WHERE条件中。
1. ANSI链接
链接错做可以【zuò kě yǐ】同时查🗒询两个或者多个表【duō gè biǎo】中的数据【de shù jù】,所生成【suǒ shēng chéng】🚞的结果【de jié guǒ】🎶集包含多个表【duō gè biǎo】中的字【zhōng de zì】段,需要使🍪用连个表中共🔐同拥有🏾的字段以连接多个表【duō gè biǎo】。
进行连➡接操作【jiē cāo zuò】时🌒,SQL一行一【yī háng yī】🏈行地比😸较所指【jiào suǒ zhǐ】定的字【dìng de zì】段,然后把🐡比较后【bǐ jiào hòu】的结果和满足【hé mǎn zú】条件的数据合并,并生成🐏新的记录。
有三种【yǒu sān zhǒng】连接方式🐀:内连接、外连接和交叉【hé jiāo chā】🛷连接。在一个SELECT语句中【yǔ jù zhōng】,可以连接多个【jiē duō gè】表;链接通过扩展SELECT语句的【yǔ jù de】💥FROM字句,增加了两个关🔴键字【jiàn zì】🕓:JOIN和🧐ON
JOIN:指定要了链接的表
ON:指定这些表共同拥有的字段
在表的【zài biǎo de】🏉主键和外部键😛的基础上【shàng】🌁,指定连接条件【jiē tiáo jiàn】。
ANSI链接语法形式如下所示:
SELECT table_name.column_name, table_name.column_name,……
FROM { table_name[ join_type] JOIN table_name ON search_conditions}
WHERE[ search_conditions]
其中【qí zhōng】⛑[ join_type ]可以为如下三【rú xià sān】个关键📧字形式:
INNER(内连接【nèi lián jiē】📆):链接查询结果集中仅包含满【bāo hán mǎn】足条件🙃的行,内连接【nèi lián jiē】📆是SQL Server缺省的【quē shěng de】连接方🚑式,可以把【kě yǐ bǎ】🐲INNER JOIN简写成【jiǎn xiě chéng】🐻 JOIN;
OUTER(外连接【wài lián jiē】🥜):链接【jiē】🥜查询结果🤡集中既包含哪【bāo hán nǎ】🐆些满足🔈条件的【tiáo jiàn de】行,还包含🤔其中某个表的全部行,有三种【yǒu sān zhǒng】形式的【xíng shì de】😍外连接【wài lián jiē】🥜:左外连接【wài lián jiē】🥜、右外连接【wài lián jiē】🥜、全外连接【wài lián jiē】🥜。
例如🏦:已经选🐬修了😎4号课程【hào kè chéng】的同学信息的【xìn xī de】示例,该示例涉及到了学生【le xué shēng】🥅表和选【biǎo hé xuǎn】修课:
SELECT 学生表
FROM 学生表📻 JOIN 选课表【xuǎn kè biǎo】 ON 学生表📻.学号【xué hào】 选课表【xuǎn kè biǎo】.学号【xué hào】
WHERE 选课表 课程号【kè chéng hào】📚=4
2. SQL Server链接【liàn jiē】💴
多表连【duō biǎo lián】🗃接,可以在【kě yǐ zài】🎸FROM子句后🐅直接指定多个【dìng duō gè】表,语义上表示从【biǎo shì cóng】这几个✖表的笛卡尔积中检索数据,可以用【kě yǐ yòng】📗WHERE子句设【zǐ jù shè】🚬定过滤条件。
SQL Server链接语【liàn jiē yǔ】⤵法形式如下:
SELECT table_name.column_name,table_name.column_name,……
FROM { table_name,table_name,……}
WHERE table_name.column_name join_operator table_name.column_name
在此种【zài cǐ zhǒng】🏺语法形式中🗜,FROM子句列🎌出了连接时所【jiē shí suǒ】使用到的全部表名🐝,WHERE子句指定哪些【dìng nǎ xiē】行应该出现在【chū xiàn zài】⛵结果集【jié guǒ jí】🍳中,即用【jí yòng】🏳WHERE子句设定过滤【dìng guò lǜ】条件。在【zài】⛵WHERE子句中,在【zài】⛵两个连接的🕷列中使用链接运算符。
例如【lì rú】:检索出【jiǎn suǒ chū】至少已🈴经有一【jīng yǒu yī】门课程及格的同学的🌟信息示🤶例:
SELECT DISTINCT 学生表【xué shēng biǎo】🚵 *
FROM 学生表【xué shēng biǎo】💨 选课表
WHERE 学生表【xué shēng biǎo】👏.学号【xué hào】🛁=选课表.学号【xué hào】🛁 AND 选课表.成绩=60
3. 子查询
子查询【zǐ chá xún】🐔是一系列SELECT语句【yǔ jù】⬆。SELECT语句【yǔ jù】⬆可以嵌套🌪在其他【zài qí tā】⏩许多语🏴句中【jù zhōng】,例如🔞SELECT、INSERT、UPDATE、DELETE等,这些嵌【zhè xiē qiàn】套的SELECT语句【yǔ jù】⬆就称为【jiù chēng wéi】子查询【zǐ chá xún】🐔。子查询【zǐ chá xún】🐔可以把一个复🍦杂的查询分解成一系👉列的逻【liè de luó】辑步骤😨,这样就可以用【kě yǐ yòng】🕍一个单个的语【gè de yǔ】句【jù】⬆解决一个复🍦杂的查询问题【xún wèn tí】♒。当一个查询依🛴赖于另一个查询的结果时,子查询【zǐ chá xún】🐔会很有👡用【yòng】。
使用子查询时,应注意:
子查询要用括号起来
只需要一个值或一系列的值,就可以【jiù kě yǐ】🧝用子查询代替⚡一个表【yī gè biǎo】🔫达式【dá shì】
子查询【zǐ chá xún】中不能查询包含数据【hán shù jù】👲类型是text或【huò】🍙image的字段🖊
子查询【xún】🏣中也可【zhōng yě kě】以再包含子查【hán zǐ chá】询【xún】🏣,嵌套可以多至🎌32层🍀
1. 把子查询用作派生的表
可以用【kě yǐ yòng】🤯子查询【zǐ chá xún】😫产生一【chǎn shēng yī】个派生【gè pài shēng】的表📌,用于代替🐢FROM子句中🍳的表📌。派生表🔲示【shì】FROM子句中🍳子查询【zǐ chá xún】😫的一个【de yī gè】特殊用法,用一个别名或【bié míng huò】🤯用户自定义的【dìng yì de】💰名字来【míng zì lái】引用这个派生【gè pài shēng】表🔲。FROM子句中🍳的子查询【zǐ chá xún】😫将返回一个结果集🔵,这个结【zhè gè jié】果集🔵所形成的🦗表将被🚛外层【wài céng】SELECT语句使【yǔ jù shǐ】用。
例如:内层查【chá】🗻询用子👮查【chá】询产生了一个派生【gè pài shēng】的表🐛,外层查【chá】🚤询将使【xún jiāng shǐ】🏁用内层【yòng nèi céng】查【chá】🗻询的结果集【guǒ jí】🐮。在功能【zài gōng néng】上,派生表本身就等同于一个完【yī gè wán】整的查【chá】询
SLECT A *
FROM select 学号,姓名【xìng míng】,年龄【nián líng】💭 from 学生表♈
Where 班级🚊=‘GZ02计【jì】6’ as a
2. 把子查询用作表达式
在T-SQL中【zhōng】,所有使用表达🙅式【shì】📥的【de】🏰地方,都可以用子查【yòng zǐ chá】询来代🌂替【tì】🎺。此时子查询必须返回单个的【de】🕍值或某🥩一个字【yī gè zì】段的【de】🏰值。子查询可以返回一系【huí yī xì】列的【de】🏰值来代【zhí lái dài】替【tì】🏁出现在WHERE子句中【zhōng】的【de】🏰IN关键字【guān jiàn zì】的【de】表达🥁式【shì】📥。
例如:查询📼GZ02计【jì】7班同学的平均【de píng jun1】年龄🌒以及每个同学【gè tóng xué】年🤳龄与平均年龄【jun1 nián líng】🌒的差🥓
SELECT avg(年龄【nián líng】😬) FROM 学生表🥎 as 平均年【píng jun1 nián】龄😬
其计算结果作【jié guǒ zuò】🍨为选择【wéi xuǎn zé】列表中的一个【de yī gè】输出列,并作为💕算术表【suàn shù biǎo】🔐达式的🔂一部分输出:
年龄【nián líng】-(SELECT avg(年龄【nián líng】) FROM 学生表【xué shēng biǎo】📐) as 年龄【nián líng】差🚓
3. 相关子查询
相关子【xiàng guān zǐ】🥧查询可【chá xún kě】被用作动态表【dòng tài biǎo】🏺达式【dá shì】🚝,这个表达式的【dá shì de】🈸值相对🌝于外层查【céng chá】🦏询的每【xún de měi】🔥一行而变化。查询【xún】处理器为🎠外层查【céng chá】🦏询的每【xún de měi】🔥一个记录计算子查询【zǐ chá xún】的值【de zhí】,一次一行,而这个子查询【zǐ chá xún】每次都会被作【huì bèi zuò】为一个【wéi yī gè】表达式【dá shì】🚝而被计算并返📶回给外层查【céng chá】🦏询【xún】。相关子【xiàng guān zǐ】🥧查询【xún】是动态执【dòng tài zhí】行的子🚗查询和【chá xún hé】♈外层查【céng chá】🦏询【xún】间的一个非常有效的联合。
使用相关子查【guān zǐ chá】🗑询时🥓,内层子【nèi céng zǐ】查询被反复执【fǎn fù zhí】💖行,外层查🏧询有多少记录【shǎo jì lù】,内层查询就被齿形多【chǐ xíng duō】💇少次。
例如【lì rú】♌:查询已【chá xún yǐ】选修课程号的【chéng hào de】1且成绩在🚩90分以上💙的同学的学号及姓名:
SELECT 学号 姓名【xìng míng】🛤
FROM 学生表【xué shēng biǎo】🛀
WHERE 90 <=( SELECT 成绩【chéng jì】💐
FROM 选课表【xuǎn kè biǎo】🆒
WHERE 学生表【xué shēng biǎo】.学号【xué hào】🦗=选课表.学号【xué hào】🦗 AND 课程号=1)
4. 使用EXISTS和⏪NOT EXISTS操作符【cāo zuò fú】
在相关💪子查询中可以使用EXISTS和【hé】🍖NOT EXISTS操作符🍲判断某【pàn duàn mǒu】个值是【gè zhí shì】否在一🥄系列的【xì liè de】值中🏰。SQL Server处理带有【yǒu】EXISTS和【hé】🍖NOT EXISTS操作符🍲的子查【de zǐ chá】👤询时:
外层查询测试子查询返回的记录是否存在
基于查【jī yú chá】询所指【xún suǒ zhǐ】定的条件🚤,子查询⚽返回【fǎn huí】🛰TRUE或FALSE
子查询不产生任何数据
例如:同时选修了1号课程【hào kè chéng】和【hé】🌫2号课程【hào kè chéng】的同学【de tóng xué】🧝的信息🐩:
SELECT 学号,姓名【xìng míng】🍳,班级
FROM 学生表【xué shēng biǎo】🔳
WHERE EXISTS(SELECT * FROM 选课表【xuǎn kè biǎo】➡
WHERE 学号【xué hào】🌨=学生表【xué shēng biǎo】🥢.学号【xué hào】🌨 AND 课程号=1)
AND EXISTS(SELECT * FROM 选课表【xuǎn kè biǎo】📸
WHERE 学号【xué hào】😄=学生表【xué shēng biǎo】.学号【xué hào】😄 AND 课程号=2)
① 找外层表“学生表🕹”的第1行📉,根据其【gēn jù qí】“学号🗿”值处理内层查【nèi céng chá】询【xún】
② 用外层【yòng wài céng】的🔃“学号【xué hào】🏼”与内层表【biǎo】🎷“选课表【biǎo】🎷”的🔃“学号【xué hào】🏼”比较,由此决【yóu cǐ jué】😞定外层条件的🔃真🛬、假👙,如果为【rú guǒ wéi】真🛬,则此记【zé cǐ jì】录为符【lù wéi fú】合条件🎱的🔃结果,反之,则不输出【chū】。
③ 顺序处理外层【lǐ wài céng】表🦌“学生表🦌”中的第2、3、4、。。。行【háng】🆓
检索出每一门选修课都几个的同学信息
SELECT * FROM 学生表【xué shēng biǎo】🗄 WHERE
NOT EXISTS( SELECT * FROM 选课表【xuǎn kè biǎo】🔙
 
关键词【guān jiàn cí】😅:SQL
阅读本文后您有什么感想? 已有 人给出评价!
- 0
- 0
- 0
- 0
- 0
- 0