SQL连接查询的方式
一、概述
通过连💎接运算符可以实现多个表【duō gè biǎo】查❕询【xún】。连接是🍷关系数【guān xì shù】据库模型的主要特点😉,也是它区别于【qū bié yú】其它类【qí tā lèi】型🕯数据库【shù jù kù】管理系【guǎn lǐ xì】统的一个标志。多表连【duō biǎo lián】🛄接查询【jiē chá xún】是使用Sql的基本【de jī běn】操作,但连接⛽的方式【de fāng shì】却有多【què yǒu duō】种【zhǒng】🤳,熟练使【shú liàn shǐ】用这些连接方💳式能够🕔简化Sql语句【yǔ jù】,提高数👆据库运【jù kù yùn】行效率【háng xiào lǜ】。
在关系🚰数据库【shù jù kù】管理系【guǎn lǐ xì】统中,表🛹建立🚕时各数🐹据之间【jù zhī jiān】🚢的关系不必确定,常把一个实体的所有信息存【xìn xī cún】放在【fàng zài】🌦一个表【yī gè biǎo】🛹中。当检索数据时🔦,通过连💎接操作【jiē cāo zuò】😀查询【xún】出存放在【fàng zài】🌦多个表【duō gè biǎo】🛹中的不同实体【tóng shí tǐ】的信息。连接操作【jiē cāo zuò】😀给用户带来【dài lái】🎆很大的灵活性【líng huó xìng】,他们可以在🌱任何时候🚌增加新🍏的数据【de shù jù】类型🕯。为不同【wéi bú tóng】实体创【shí tǐ chuàng】建新的表🛹,然后通过连💎接进行【jiē jìn háng】查🦋询【xún】。
连接可【lián jiē kě】以在🌱SELECT 语句【yǔ jù】的🐍FROM子句或🐆WHERE子句中【zǐ jù zhōng】🔐建立🚕,似是而非在🌦FROM子句中【zǐ jù zhōng】🔐指出连接时有📵助于将🔫连接操作【jiē cāo zuò】😀与【yǔ】WHERE子句中【zǐ jù zhōng】🔐的搜索条件区【tiáo jiàn qū】分开来🦇。所以👜,在🌦Transact-SQL中推荐使用这【shǐ yòng zhè】种【zhǒng】方法🐶。
二【èr】🏾、基本语【jī běn yǔ】法【fǎ】与方💇法【fǎ】🎇
SQL-92标准所定义的FROM子句的连接语法【fǎ】🎇格式为:
FROM join_table join_type join_table [ON (join_condition)]
其中【zhōng】join_table指出参⛱与连接【lián jiē】🥋操作【cāo zuò】的😊表【biǎo】名,连接【lián jiē】🛡可以对【duì】同一个表【gè biǎo】😄操作【cāo zuò】💷,也可以🐛对多表【duì duō biǎo】🍴操作【cāo zuò】💷,对【duì】同一个表【gè biǎo】😄操作【cāo zuò】的😊连接【lián jiē】又称🚟做自连接【lián jiē】🛡。
join_type 指出连接【lián jiē】类型🤰,可分为【kě fèn wéi】三种【sān zhǒng】:内连接【lián jiē】🛡、外连接【wài lián jiē】🛡和交叉👧连接【lián jiē】🛡。内连接【lián jiē】🛡(INNER JOIN)使用比较运算符【fú】🕹进行🌙表【biǎo】间某(些)列数据🥞的比较操作【cāo zuò】💷,并列出这些表【biǎo】中与连【zhōng yǔ lián】接【jiē】🥋条件【tiáo jiàn】相匹配【pǐ pèi】🍧的数据【de shù jù】行🌙。根据所【gēn jù suǒ】使用的【shǐ yòng de】比较方式不同。
1、内连接【lián jiē】🛡又分为🆕等值连【děng zhí lián】接【jiē】🛡、自然连接【lián jiē】🛡和不等连接【lián jiē】🛡三种【sān zhǒng】。
2、外连接【wài lián jiē】🛡分为左外连【zuǒ wài lián】接【jiē】🛡(LEFT OUTER JOIN或【huò】🐾LEFT JOIN)、右外连🥦接【jiē】🛡(RIGHT OUTER JOIN或【huò】🐾RIGHT JOIN)和全外🍡连接【lián jiē】🛡(FULL OUTER JOIN或【huò】🐾FULL JOIN)三种【sān zhǒng】。与内连🕯接【jiē】🛡不同的【bú tóng de】是【shì】,外连接【wài lián jiē】🛡不只列【bú zhī liè】出与连🥤接【jiē】条件【tiáo jiàn】🐮相匹配【pǐ pèi】🍧的行【de háng】🌙,而是列【ér shì liè】出左表【biǎo】(左外连【zuǒ wài lián】接【jiē】🛡时【shí】)、右表【biǎo】🏐(右外连🥦接【jiē】🛡时【shí】)或【huò】🐾两个表【gè biǎo】(全外连【quán wài lián】接【jiē】🛡时【shí】)中【zhōng】所有🔶符【fú】合搜索条件【suǒ tiáo jiàn】📽的数据【de shù jù】行🌙。
3、交叉连接【lián jiē】🛡(CROSS JOIN)没有🖥WHERE 子句,它返回😇连接表【lián jiē biǎo】📈中【zhōng】所有🔶数据行🌙的笛卡📽尔积⛪,其结果集合中的【zhōng de】数据行数等🥨于第一个表【gè biǎo】😄中【zhōng】符【fú】合查询条件【tiáo jiàn】🤲的数据【de shù jù】行数🦌乘以第【chéng yǐ dì】二个表【gè biǎo】中【zhōng】⛩符【fú】合查询条件【tiáo jiàn】🤲的数据【de shù jù】行数🦌。
连接【lián jiē】🛡操作【cāo zuò】💷中的【zhōng de】ON (join_condition) 子句指【zǐ jù zhǐ】出连接【lián jiē】条件【tiáo jiàn】🐮,它由被连接表【lián jiē biǎo】📈中的列【zhōng de liè】和比较运算符【fú】🕹、逻辑运算符【fú】🕹等构成🐲。
无论哪【wú lùn nǎ】种连接【lián jiē】🛡都不能【dōu bú néng】🎶对【duì】text、ntext和image数据类型列进【xíng liè jìn】行🌙直接【jiē】🛡连接【lián jiē】🛡,但可以🤘对【duì】这三种【sān zhǒng】列进行🌙间接【jiān jiē】🛡连接【lián jiē】🛡。例如🚤:
SELECT p1.pub_id,p2.pub_id,p1.pr_info FROM pub_info AS p1 INNER JOIN pub_info AS p2 ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)
(一【yī】)内连接【nèi lián jiē】✋
内连接【nèi lián jiē】✋查询操💠作列出【zuò liè chū】与连接【yǔ lián jiē】🥌条件匹【tiáo jiàn pǐ】配的数🦑据行🐣,它使用比较运算【jiào yùn suàn】符🌠比较被【bǐ jiào bèi】连【lián】🏡接【jiē】列的📘列值。内连接【nèi lián jiē】✋分三种:
1、等值连接【lián jiē】🗽:在连接【zài lián jiē】⛷条件中【tiáo jiàn zhōng】使用等于号(=)运算符【yùn suàn fú】🌠比较被【bǐ jiào bèi】连【lián】🏡接【jiē】列的📘列值,其查询结果中列出被【liè chū bèi】连接【lián jiē】🗽表中的所😭有列【yǒu liè】,包括其【bāo kuò qí】🍇中的重【zhōng de chóng】📸复列【fù liè】。
2、不等连【lián】🌪接【jiē】🗽: 在连接【zài lián jiē】⛷条件使用除等于运算符【yùn suàn fú】🌠以外的其它比较运算【jiào yùn suàn】符🌠比较被【bǐ jiào bèi】连【lián】🏡接【jiē】的列【de liè】🥢的列【de liè】值⏱。这些运🌧算符包括【bāo kuò】🙅>、>=、<=、<、!>、!<和【hé】🤪<>。
3、自然连接【lián jiē】🗽:在连接【zài lián jiē】⛷条件中【tiáo jiàn zhōng】使用等于(=)运算符【yùn suàn fú】🌠比较被【bǐ jiào bèi】连【lián】🏡接【jiē】列的📘列值,但它使用选择列表指【liè biǎo zhǐ】🆕出查询结果集合中所包括【bāo kuò】🙅的列【de liè】,并删除【bìng shān chú】连接【lián jiē】🗽表中的重【zhōng de chóng】📸复列【fù liè】。
例【lì】,下面使用等值连接【lián jiē】列🤢出authors和【hé】🤪publishers表中位🎒于同一【yī】城市的🍛作者和【zuò zhě hé】🤪出版社【chū bǎn shè】🐵:
SELECT * FROM authors AS a INNER JOIN publishers AS p ON a.city=p.city SELECT a.*,p.pub_id,p.pub_name,p.country FROM authors AS a INNER JOIN publishers AS p ON a.city=p.city
又如使用自然连接【lián jiē】😡,在选择✳列表【biǎo】🔚中删除【zhōng shān chú】🆚authors 和🍈publishers 表【biǎo】🔚中重复【zhōng chóng fù】列(city和🍈state):
(二【èr】)外连接【wài lián jiē】⬆
内连接【lián jiē】😡时【shí】,返回查🚇询结果集【jié guǒ jí】合中💃的仅是符合查【fú hé chá】👶询条件【xún tiáo jiàn】( WHERE 搜索条【sōu suǒ tiáo】件或🍩 HAVING 条件【tiáo jiàn】)和🍈连接条【lián jiē tiáo】📸件的行【háng】🈴。而采用🌙外连接【wài lián jiē】⬆时【shí】,它返回💚到查询结果集【jié guǒ jí】合中💃的不仅【de bú jǐn】包含符合连接条【lián jiē tiáo】📸件的行【háng】🈴,而且还包括左表【biǎo】🔚(左外连【zuǒ wài lián】接【jiē】⬆时【shí】)、右表【biǎo】🔚(右外连接【wài lián jiē】⬆时【shí】)或两个【huò liǎng gè】边接【jiē】😡表【biǎo】🔚(全外连👝接【jiē】😡)中的所🈚有数据行【háng】。
1、left join或left outer join(左外连【zuǒ wài lián】接【jiē】⬆)
左外连【zuǒ wài lián】接【jiē】⬆:(也叫左【yě jiào zuǒ】外连接【wài lián jiē】⬆,给出两个【gè】表【biǎo】🔚的配匹【de pèi pǐ】行【háng】,并且以⏳左边的表【biǎo】🔚为准,如果左【rú guǒ zuǒ】〽边表【biǎo】有⭐而右边【ér yòu biān】表【biǎo】🔚没有的行【háng】🈴,则在右🙍边表【biǎo】的🥀相应行【háng】选择的列显示【liè xiǎn shì】🌅为NULL,允许左边的基【biān de jī】准表【biǎo】🔚对应右边🙍表【biǎo】🔚多条满足条【zú tiáo】🎙件的记【jiàn de jì】录【lù】🛶)左连接【lián jiē】😡就是返回左边的匹配🎏行【háng】,不考虑【bú kǎo lǜ】♟右边的表【biǎo】🔚是否有相应的行【háng】🈴
双击代码全选🖐
1
select field1,field2 from table1 left join table2 on field1=field2(基准字段,可以多【kě yǐ duō】个【gè】) where table1.field3=table2.field3
2、right join或right outer join(右外连【yòu wài lián】🌯接)
右连接:(也叫右🔣外连接【wài lián jiē】,给出两【gěi chū liǎng】个表的配匹行【pèi pǐ háng】,并且以右边的🏺表为🥅准,如果右【rú guǒ yòu】🥞边表有【biān biǎo yǒu】而【ér】💸左边表【zuǒ biān biǎo】没有的【méi yǒu de】行❌,则在右边表的相应行选择的【xuǎn zé de】列显示🔢为🥅NULL,允许右【yǔn xǔ yòu】🤯边的基准表对应左边【yīng zuǒ biān】表多条【biǎo duō tiáo】满足条【mǎn zú tiáo】件的【jiàn de】🎲记录)
语法与✂做链接差不多♑!
(三)交叉连接
交叉连接不带WHERE 子句,它返回被连接的两个【de liǎng gè】表所有【biǎo suǒ yǒu】数🗣据行的笛卡尔积【jī】,返回到结果集合中的数🗣据行数【jù háng shù】等于【děng yú】🌵第一个🔓表中符合查询条件的【jiàn de】🎲数🗣据行数【jù háng shù】🗣乘以第二个【èr gè】💺表中符合查询条件的【jiàn de】🎲数🗣据行数【jù háng shù】🗣。
例,titles表中有🤔6类图书【lèi tú shū】,而【ér】💸publishers表中有🤔8家出版⚫社【shè】,则下列🆚交叉连接检索🍭到的记【dào de jì】🗺录数将🐌等于【děng yú】6*8=48行。
SELECT type,pub_name FROM titles CROSS JOIN publishers ORDER
关键词【guān jiàn cí】🌂:SQL
阅读本文后您有什么感想? 已有 人给出评价!
- 1
- 1
- 0
- 0
- 0
- 0