SQL的数据查询功能之三---多表连接查询
- 格式:doc
- 大小:24.50 KB
- 文档页数:2
join在sql中的用法join在SQL中的用法在SQL中,join是一种常用的操作,用于将多个表中的数据连接在一起。
通过join操作,可以从多个表中检索数据并根据指定的条件将它们组合在一起。
本文将详细介绍join的用法,包括不同类型的join操作以及它们的应用场景。
一、什么是join操作在数据库中,数据通常存储在多个表中,这些表之间通过关系进行连接。
而join操作就是通过某种条件连接多个表,并返回满足条件的数据。
join 操作可以根据连接条件的不同分为多种类型,如内连接、外连接和交叉连接等。
二、内连接内连接是最常用的join操作之一。
当执行内连接时,只有满足连接条件(即两个表中对应列的值相等)的行才会被返回。
内连接可以使用关键字INNER JOIN或简单地使用JOIN来实现。
下面是一个示例,假设我们有两个表- "顾客"表和"订单"表:表:顾客顾客ID 姓名地址1 张三北京市2 李四上海市3 王五广州市表:订单订单ID 顾客ID 订单日期1 1 2022-01-012 2 2022-01-023 1 2022-01-03我们可以使用以下SQL语句来执行内连接操作:SELECT *FROM 顾客INNER JOIN 订单ON 顾客.顾客ID = 订单.顾客ID;将上述SQL语句执行后,将返回一个新的表,包含了"顾客"表和"订单"表中符合连接条件的行。
结果如下:顾客ID 姓名地址订单ID 顾客ID 订单日期1 张三北京市 1 1 2022-01-011 张三北京市 3 1 2022-01-032 李四上海市 2 2 2022-01-02三、外连接外连接也是一种常用的join操作。
与内连接不同的是,外连接会返回连接表中的所有行,即使没有满足连接条件的行。
外连接可以分为左外连接、右外连接和全外连接等几种类型。
1.左外连接左外连接即包含左表中的所有行,以及右表中与左表连接条件匹配的行。
sql操作数据库(3)--外键约束、数据库表之间的关系、三⼤范式、多表查询、事务外键约束在新表中添加外键约束语法: constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)在已有表中添加外键约束:alter table 从表表名 add constraints 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)删除外键语法: alter table 从表表名 drop foreign key 外键名称;级联操作:注意:在从表中,修改关联主表中不存在的数据,是不合法的在主表中,删除从表中已经存在的主表信息,是不合法的。
直接删除主表(从表中有记录数据关联) 会包删除失败。
概念:在修改或者删除主表的主键时,同时它会更新或者删除从表中的外键值,这种动作我们称之为级联操作。
语法:更新级联 on update cascade 级联更新只能是创建表的时候创建级联关系。
当更新主表中的主键,从表中的外键字段会同步更新。
删除级联 on delete cascade 级联删除当删除主表中的主键时,从表中的含有该字段的记录值会同步删除。
操作:-- 给从表student添加级联操作create table student(s_id int PRIMARY key ,s_name VARCHAR(10) not null,s_c_id int,-- constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)CONSTRAINT stu_cour_id FOREIGN key(s_c_id) REFERENCES course(c_id) -- 给s_c_id 添加外键约束ON UPDATE CASCADE ON DELETE CASCADE)insert into student VALUE(1,'⼩孙',1),(2,'⼩王',2),(3,'⼩刘',4);insert into student VALUE(4,'⼩司马',1),(5,'⼩赵',1),(6,'⼩钱',1);-- 查询学⽣表中的记录select * from student;-- 级联操作。
一、简单查询:基本语法:SELECT*FROMtb_name;查询全部SELECTfield1,field2FROMtb_name;投影SELECT[DISTINCT]*FROMtb_nameWHEREqualification;选择说明:FROM子句:要查询的关系表、多个表、其它SELECT语句WHERE子句:布尔关系表达式,主要包含如下这几类表达式:比较:=、>、>=、<=、<逻辑关系:ANDORNOTBETWEEN...AND...:在两个值之间LIKE‘’%:任意长度任意字符_:任意单个字符REGEXP,RLIKE:正则表达式,此时索引无效INISNULLISNOTNULL如下查询本博客的wp-links和wp_posts表:mysql>select*fromwp_links;查询全部mysql>selectlink_name,link_urlfromwp_links;投影+-------------------+--------------------------------------+|link_name|link_url|+-------------------+--------------------------------------+|腾讯微博|/toxingwang||新浪微博|/gz100ww||51CTO技术博客|/|+-------------------+--------------------------------------+10rowsinset(0.00sec)mysql>selectID,post_title,post_datefromwp_posts where ID>1290andpost_status='publish';选择+------+----------------------------------------------------------------+----------------------+|ID|post_title|post_date|+------+----------------------------------------------------------------+----------------------+|1291|【转】HP3PAR存储概念之三|2013-08-2917:21:27||1298|【转】HP3PAR存储概念之四|2013-08-2917:22:33||1351|【转】XenDesktop5.5+vSphere5创建虚拟机报错|2013-09-0417:41:26||1357|linux下强大的网络工具Netcat|2013-09-0922:26:45||1360|MySQL常用命令、技巧和注意事项|2013-09-2011:04:15||1369|【转】数据库设计原理知识--B树、B-树、B+树、B*树都是什么|2013-09-2112:30:18||1379|MySQL基本SQL语句之常用管理SQL|2013-09-2112:39:23|+------+----------------------------------------------------------------+---------------------+7rowsinset(0.01sec)对查询结果排序:ORDERBYfield_name{ASC|DESC}如下:mysql>selectID,post_title,post_datefromwp_postswhereID>1290andpost_status='publish'ORDERby ID;##升序,ID是排序的字段mysql>selectID,post_title,post_datefromwp_postswhereID>1290andpost_status='publish'ORDERby ID DES C;##降序字段别名:ASselectcol_name AS COL_Aliases…:对字段使用别名selectcol_name,…fromtb_nameAStb_Aliases…:对表使用别名如下:mysql>selectpost_title AS文章标题fromwp_postswhereID>1290andpost_status='publish';+----------------------------------------------------------------+|文章标题|+----------------------------------------------------------------+|【转】HP3PAR存储概念之三||【转】HP3PAR存储概念之四||【转】XenDesktop5.5+vSphere5创建虚拟机报错||linux下强大的网络工具Netcat||MySQL常用命令、技巧和注意事项||【转】数据库设计原理知识--B树、B-树、B+树、B*树都是什么||MySQL基本SQL语句之常用管理SQL|+----------------------------------------------------------------+7rowsinset(0.02sec)##还可以这样:mysql>select3+2ASSUM;+-----+|SUM|+-----+|5|+-----+1rowinset(0.00sec)LIMIT子句:LIMIT[offset,]Count如下:mysql>selectID,post_title,post_datefromwp_postswhereID>1290andpost_status='publish'limit5;+------+--------------------------------------------------+---------------------+|ID|post_title|post_date|+------+--------------------------------------------------+---------------------+|1291|【转】HP3PAR存储概念之三|2013-08-2917:21:27||1298|【转】HP3PAR存储概念之四|2013-08-2917:22:33||1351|【转】XenDesktop5.5+vSphere5创建虚拟机报错|2013-09-0417:41:26||1357|linux下强大的网络工具Netcat|2013-09-0922:26:45||1360|MySQL常用命令、技巧和注意事项|2013-09-2011:04:15|+------+--------------------------------------------------+---------------------+5rowsinset(0.01sec)mysql>selectID,post_title,post_datefromwp_postswhereID>1290andpost_status='publish'limit2,3;##红色部分(逗号前的数字)表示偏移量+------+--------------------------------------------------+---------------------+|ID|post_title|post_date|+------+--------------------------------------------------+---------------------+|1351|【转】XenDesktop5.5+vSphere5创建虚拟机报错|2013-09-0417:41:26||1357|linux下强大的网络工具Netcat|2013-09-0922:26:45||1360|MySQL常用命令、技巧和注意事项|2013-09-2011:04:15|+------+--------------------------------------------------+---------------------+3rowsinset(0.00sec)聚合:SUM(),MIN(),MAX(),AVG(),COUNT(),括号中为字段名mysql>select sum(ID)fromwp_posts;计算和mysql>select min(ID)fromwp_posts;查早最小的mysql>select max(ID)fromwp_posts;查找最大的mysql>select avg(ID)fromwp_posts;平均值mysql>select count(ID)fromwp_posts;计数分组:GROUPBY,一般配合聚合运算使用如下:mysql>select count(post_status)AS各状态数量,post_statusAS状态名称fromwp_posts groupby post_status;+-----------------+--------------+|各状态数量|状态名称|+-----------------+--------------+|1|auto-draft||9|draft||251|inherit||238|publish||2|trash|+-----------------+--------------+5rowsinset(0.01sec)注意:可以使用HAVING qualification将GROUPBY的结果再次过滤,用法同where二、多表查询连接:交叉连接:笛卡尔乘积自然连接:将两张表某字段中相等连接起来,如下mysql>,students.Age,ame,students.GenderFROMstudents,coursesWHER Estudents.CID1=courses.CID;+--------------+------+------------------+--------+|Name|Age|Cname|Gender|+--------------+------+------------------+--------+|GuoJing|19|TaiJiquan|M||YangGuo|17|TaiJiquan|M||DingDian|25|Qishangquan|M||HuFei|31|Wanliduxing|M||HuangRong|16|Qianzhuwandushou|F||YueLingshang|18|Wanliduxing|F||ZhangWuji|20|Hamagong|M||Xuzhu|26|TaiJiquan|M|+--------------+------+------------------+--------+8rowsinset(0.00sec)外连接:左外连接:left_tbLEFTJOINright_tbON...:以左表为标准mysql>,ameFROMstudentsASs LEFTJOIN coursesASc ON s.CID1=c.CID; +--------------+--------------------+|Name|Cname|+--------------+--------------------+|GuoJing|TaiJiquan||YangGuo|TaiJiquan||DingDian|Qishangquan||HuFei|Wanliduxing||HuangRong|Qianzhuwandushou||YueLingshang|Wanliduxing||ZhangWuji|Hamagong||Xuzhu|TaiJiquan||LingHuchong|NULL||YiLin|NULL|+--------------+--------------------+10rowsinset(0.00sec)右外连接:left_tbRIGHTJOINright_tbON...:以右表为标准mysql>,ameFROMstudentsASs RIGHTJOIN coursesASc ON s.CID1=c.CID; +--------------+--------------------+|Name|Cname|+--------------+--------------------+|GuoJing|TaiJiquan||YangGuo|TaiJiquan||DingDian|Qishangquan||HuFei|Wanliduxing||HuangRong|Qianzhuwandushou||YueLingshang|Wanliduxing||ZhangWuji|Hamagong||Xuzhu|TaiJiquan||NULL|Yiyangzhi||NULL|Jinshejianfa||NULL|Qiankundanuoyi||NULL|Pixiejianfa||NULL|Jiuyinbaiguzhua|+--------------+--------------------+13rowsinset(0.01sec)自连接:本表中不同字段间进行连接mysql>ASstudent,ASteacherFROMstudentsASc,studentsASsWHEREc.TID=s.SID; +-----------+-------------+|student|teacher|+-----------+-------------+|GuoJing|DingDian||YangGuo|GuoJing||DingDian|ZhangWuji||HuFei|HuangRong||HuangRong|LingHuchong|+-----------+-------------+5rowsinset(0.02sec)注意:使用了别名三、子查询:一个查询中嵌套另外一个查询如下:在students表中查询年龄大于平均年龄的学生mysql>SELECTName,AgeFROMstudentsWHEREAge>(SELECTAVG(Age)FROMstudents);+-------------+------+|Name|Age|+-------------+------+|DingDian|25||HuFei|31||Xuzhu|26||LingHuchong|22|+-------------+------+4rowsinset(0.08sec)子查询注意事项:•比较操作中使用子查询:子查询只能返回单个值;•IN():使用子查询;•在FROM中使用子查询;联合查询:UNION,将两个查询的结果合并mysql>(SELECTName,AgeFROMstudents)UNION(SELECTTname,AgeFROMtutors); +--------------+------+|Name|Age|+--------------+------+|GuoJing|19||YangGuo|17||DingDian|25||HuFei|31||HuangRong|16||YueLingshang|18||ZhangWuji|20||HuYidao|42||NingZhongze|49|+--------------+------+19rowsinset(0.00sec)。
数据库查询字段拼接-概述说明以及解释1.引言1.1 概述概述部分的内容可以包括数据库查询字段拼接的基本定义、作用和现实意义等方面的介绍。
引言部分是文章中的开篇段落,旨在给读者一个对数据库查询字段拼接的整体认识。
数据库查询字段拼接是指在数据库查询语句中将多个字段拼接成一个字段的操作。
在许多实际应用中,我们常常需要将多个字段的值合并为一个字段,以满足特定的需求或查询条件。
这种操作可以在查询结果中生成一个新的字段,使得数据的处理和分析更加灵活和高效。
数据库查询字段拼接的方法多种多样,可以使用不同的数据库查询语句、函数或脚本来实现。
常见的数据库查询字段拼接方法包括使用字符串连接函数、联接查询、嵌套查询等。
不同的数据库管理系统可能会提供不同的语法和函数,因此在具体实施中需要根据所采用的数据库系统进行相应的调整和优化。
数据库查询字段拼接在实际应用中具有广泛的应用场景。
例如,在分析系统日志时,我们可能需要将多个字段的信息合并为一个完整的日志内容;在生成报表或导出数据时,我们可能需要将多个字段的值拼接为一个字段,以满足特定的导出格式要求;在进行数据清洗、处理和分析时,我们可能需要将多个字段的值合并为一个字段,以方便后续的数据操作和计算等。
综上所述,数据库查询字段拼接是一种重要的数据库操作技术,它能够提高数据处理的灵活性和效率。
在实际应用中,了解和掌握不同的数据库查询字段拼接方法,能够帮助我们更好地处理和分析数据,提升数据处理的能力和效果。
在接下来的正文部分,我们将详细介绍数据库查询字段拼接的具体方法和应用场景,以帮助读者更好地理解和运用这一技术。
1.2 文章结构本文主要探讨数据库查询字段拼接的相关概念、方法以及应用场景,并对其重要性进行了思考,并展望了未来数据库查询字段拼接的发展趋势。
文章将按照以下结构展开讨论:引言部分将概述数据库查询字段拼接的背景和意义,并说明文章的目的和意义。
正文部分将详细介绍数据库查询字段拼接的概念,即其定义和原理。
SQL(Structured Query Language)是一种用于管理关系型数据库的标准化语言,使用SQL可以进行数据的查询、插入、更新和删除等操作,同时也支持数据表的创建、修改和删除操作。
在SQL中,有许多常用的模板指令,这些指令可以帮助用户更加高效地进行数据库操作。
本文将针对这些模板指令进行详细介绍,希望对使用SQL的读者有所帮助。
一、查询数据在SQL中,查询数据是最常见的操作之一,可以使用SELECT语句来实现。
以下是一些常用的模板指令:1. 查询所有数据```SELECT * FROM 表名;```使用这条指令可以查询指定表中的所有数据,并以表格的形式返回结果。
2. 查询指定列数据```SELECT 列名1, 列名2, 列名3 FROM 表名;```使用这条指令可以查询指定表中指定列的数据,并以表格的形式返回结果。
3. 查询满足条件的数据```SELECT * FROM 表名 WHERE 条件;```使用这条指令可以查询指定表中满足条件的数据,并以表格的形式返回结果。
二、插入数据除了查询数据,插入数据也是SQL中常用的操作之一,可以使用INSERT INTO语句来实现。
以下是一些常用的模板指令:1. 插入单条数据```INSERT INTO 表名 (列1, 列2, 列3) VALUES (值1, 值2, 值3);```使用这条指令可以向指定表中插入单条数据。
2. 插入多条数据```INSERT INTO 表名 (列1, 列2, 列3) VALUES (值1, 值2, 值3), (值4, 值5, 值6), ...;```使用这条指令可以向指定表中插入多条数据。
三、更新数据如果需要更新已有的数据,可以使用UPDATE语句来实现。
以下是一些常用的模板指令:1. 更新单条数据```UPDATE 表名 SET 列名1=新值1, 列名2=新值2 WHERE 条件;```使用这条指令可以更新指定表中满足条件的单条数据。
深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接1、内联接(典型的联接运算,使用像=或<> 之类的比较运算符)。
包括相等联接和自然联接。
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。
例如,检索students和courses表中学生标识号相同的所有行。
2、外联接。
外联接可以是左向外联接、右向外联接或完整外部联接。
在FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:1)LEFT JOIN 或LEFT OUTER JOIN左向外联接的结果集包括LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。
如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
2)RIGHT JOIN 或RIGHT OUTER JOIN右向外联接是左向外联接的反向联接。
将返回右表的所有行。
如果右表的某行在左表中没有匹配行,则将为左表返回空值。
3) FULL JOIN 或FULL OUTER JOIN完整外部联接返回左表和右表中的所有行。
当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。
如果表之间有匹配行,则整个结果集行包含基表的数据值。
3、交叉联接交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。
交叉联接也称作笛卡尔积。
FROM子句中的表或视图可通过内联接或完整外部联接按任意顺序指定;但是,用左或右向外联接指定表或视图时,表或视图的顺序很重要。
有关使用左或右向外联接排列表的更多信息,请参见使用外联接。
例子:a 表id nameb 表id job parent_id1 张3 1 23 12 李四 2 34 23 王武 3 34 4a.id同parent_id 存在关系1)内连接select a.*,b.* from a inner join b on a.id=b.p arent_id结果是1 张3 1 23 12 李四 2 34 22)左连接select a.*,b.* from a left join b on ent_id结果是1 张3 1 23 12李四2 34 23王武null3)右连接select a.*,b.* from a right join b on arent_id 结果是1张3 1 23 12李四 2 34 2null 3 34 4 a.id=b.par a.id=b.pent_id结果是1张3 2李四 null 3王武 一、交叉连接(CROSS JOIN )交叉连接(CROSS JOIN ):有两种,显式的和隐式的,不带ON 子句,返回的是两表的乘积,也叫笛卡尔积。
sql表连接查询使⽤⽅法(sql多表连接查询)实际的项⽬,存在多张表的关联关系。
不可能在⼀张表⾥⾯就能检索出所有数据。
如果没有表连接的话,那么我们就需要⾮常多的操作。
⽐如需要从A表找出限制性的条件来从B表中检索数据。
不但需要分多表来操作,⽽且效率也不⾼。
⽐如书中的例⼦:复制代码代码如下:SELECT FIdFROM T_CustomerWHERE FName='MIKE'这个SQL语句返回2,也就是姓名为MIKE 的客户的FId值为2,这样就可以到T_Order中检索FCustomerId等于2 的记录:复制代码代码如下:SELECT FNumber,FPriceFROM T_OrderWHERE FCustomerId=2下⾯我们详细来看看表连接。
表连接有多种不同的类型,有交叉连接(CROSS JOIN)、内连接(INNER JOIN)、外连接(OUTTER JOIN)。
(1)内连接(INNER JOIN):内连接组合两张表,并且只获取满⾜两表连接条件的数据。
复制代码代码如下:SELECT o.FId,o.FNumber,o.FPrice,c.FId,c.FName,c .FAgeFROM T_Order o JOIN T_Customer cON o.FCustomerId= c.FId注:在⼤多数数据库系统中,INNER JOIN中的INNER是可选的,INNER JOIN 是默认的连接⽅式。
在使⽤表连接的时候可以不局限于只连接两张表,因为有很多情况下需要联系许多表。
例如,T_Order表同时还需要连接T_Customer和T_OrderType两张表才能检索到所需要的信息,编写如下SQL语句即可:复制代码代码如下:SELECT o.FId,o.FNumber,o.FPrice,c.FId,c.FName,c .FAgeFROM T_Order o JOIN T_Customer cON o.FCustomerId= c.FIdINNER JOIN T_OrderTypeON T_Order.FTypeId= T_OrderType.FId(2)交叉连接(CROSS JOIN):交叉连接所有涉及的表中的所有记录都包含在结果集中。
神通数据库sql语句的使用全文共四篇示例,供读者参考第一篇示例:神通数据库是一个功能强大的关系型数据库管理系统,它提供了丰富的SQL语句来实现数据的查询、更新、删除等操作。
SQL (Structured Query Language)是用于与数据库通信的标准化语言,是数据库管理系统的核心。
在神通数据库中,SQL语句的使用是非常重要的,它可以帮助用户实现对数据库中数据的高效管理。
下面我们来详细介绍一些常用的SQL语句及其用法。
1. 查询数据:SELECT语句是SQL中最常用的语句之一,它用于从数据库中检索数据。
可以使用以下语句查询表中所有数据:```sqlSELECT * FROM table_name;```这条语句会返回指定表中的所有数据,其中"*"表示所有列。
如果想查询特定列的数据,可以将列名替换成具体列名。
2. 更新数据:UPDATE语句用于更新数据库中的数据。
可以使用以下语句更新表中指定条件的数据:```sqlUPDATE table_name SET column_name = new_value WHERE condition;```这条语句会将符合条件的数据的指定列更新为新的值。
5. 排序数据:ORDER BY语句用于对数据进行排序。
可以使用以下语句按照指定列对数据进行降序排序:这条语句会按照指定列的值,对数据进行降序排序。
8. 连接表:JOIN语句用于将多个表连接在一起。
可以使用以下语句连接两个表:9. 聚合数据:聚合函数如SUM、AVG、COUNT等用于对数据进行聚合计算。
可以使用以下语句计算表中某列的总和:SQL语句在神通数据库中是非常重要的,它提供了丰富的功能,可以帮助用户对数据库中的数据进行高效的管理。
通过熟练掌握SQL 语句的使用,用户可以更加方便地进行数据库操作,提高工作效率。
神通数据库提供了完善的SQL语句支持,用户可以根据自己的需求灵活地进行数据查询、更新、删除等操作,实现数据库管理的自动化和高效。
sql连接2张表_SQL:多表查询⼀,表的加法在原有school数据库⾥再创建⼀张跟course结构相同的表course1,可以【右击course】,【点复制表】-【选结构和顺序】,然后把course1⾥按照要求修改数据完成操作后发现course和course1 结构是⼀样的,列和列的数据类型是⼀致的,不同的是红⾊框的数据union将两张表的查询语句结合⼀起练习:将course和course1相加,⽤union⽂⽒图:加法(Union)图⼀表的加法会把表⾥重复的数据删除,只保留⼀个(图⼀);若想要保留2张表⾥重复的⾏,在Union后加all保留2张表⾥重复的⾏,在Union后加all 即可(图⼆)表的加法会把表⾥重复的数据删除,只保留⼀个图⼆⼆,表的连接School数据库⾥4张表学⽣表和成绩表之间有什么关系呢?学号关联起来,学号0001的成绩,可以通过成绩表⾥查学号0001的⾏,⼀共发现3⾏,对应是找到了学号student和score这两张表通过学号0001三门课程的成绩。
School数据库⾥四张表之间的关系4张表联结关系图交叉联结cross join:(将⼀个表的每⼀⾏ 与 另⼀表中的每⼀⾏ 合并在⼀起)交叉联结cross join表1 三⾏数据;表2 两⾏数据 交叉联结=3*2 六⾏数据典型的交叉联结 :扑克牌⽣活中典型的交叉联结13张牌(A,1,2,3,4,5,6,7,8,9,10,J,Q,K)和 四种花⾊(♠,)交叉联结 13*4=52张牌【注】:交叉联结实际业务⽤的⽐较少(耗时成本;没有实际价值),交叉联结是所有联结的基础交叉联结是所有联结的基础内联结inner join:(查找出同时存在于两张表的数据)内联结inner join左联结left join: (将左侧的表作为主表,将左表数据全部取出,右边表只选出和左边表相同列名的⾏)左联结left join右联结right join右联结right join:(将右侧表的数据全部取出,将左侧表中与右侧表相同列名的⾏取出)全联结 full join (查询结果返回左表和右表中的所有⾏。
一个数据库中的多个表之间一般都存在某种内在联系,它们共同提供有用的信息。
前面的查询都是针对一个表进行的。
若一个查询同时涉及两个以上的表,则称之为连接查询。
连接查询主要包括内连接、外连接和交叉连接。
1.内连接
内连接是一种最常用的连接类型,使用内连接是,如果两个表的相关字段满足连接条件则从这两个表中提取数据并组合成新的记录。
当连接运算符为=时,称为等值连接。
使用其它运算符称为非等值连接。
连接谓词中的列名称为连接字段。
连接条件中的各连接字段类型必须是可比的,但不必是相同的。
例如,可以都是字符型,或都是日期型;也可以一个是整型,另一个是实型,整型和实型都是数值型,因此是可比的。
但若一个是字符型,另一个是整数型就不允许了,因为它们是不可比的类型。
从概念上讲DBMS执行连接操作的过程是,首先在表1中找到第一个元组,然后从头开始顺序扫描或按索引扫描表2,查找满足连接条件的元组,每找到一个元组, 就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。
表2全部扫描完毕后,再到表1中找第二个元组,然后再从头开始顺序扫描或按索引扫描表2,查找满足连接条件的元组,每找到一个元组, 就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。
重复上述操作,直到表1全部元组都处理完毕为止。
例38 查询每个学生及其选修课程的情况
学生情况存放在Student表中,学生选课情况存放在SC表中,所以本查询实际上同时涉及Student与SC 两个表中的数据。
这两个表之间的联系是通过两个表都具有的属性Sno实现的。
要查询学生及其选修课程的情况,就必须将这两个表中学号相同的元组连接起来。
这是一个等值连接。
完成本查询的SQL语句为: SELECT * FROM Student JOIN SC ON Student.Sno=SC.Sno;
如果是按照两个表中的相同属性进行等值连接,且目标列中去掉了重复的属性列,但保留了所有不重复的属性列,则称之为自然连接
例39 自然连接Student和SC表
SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM Student INNER JOIN SC ON Student.Sno=SC.Sno;
在本查询中,由于Sname、 Ssex、 Sage、Sdept、Cno和Grade属性列在Student与SC表中是唯一的,因此引用时可以去掉表名前缀。
而Sno在两个表都出现了,因此引用时必须加上表名前缀。
该查询的执行结果不再出现SC.Sno列。
例40 查询选修2号课程且成绩在90分以上的所有学生
SELECT Student.Sno, Sname FROM Student INNER JOIN SC ON Student.Sno=SC.Sno
WHERE o='2' AND SC.Grade>90;
例41 查询每个学生及其选修的课程名其及成绩
SELECT Student.Sno, Sname, ame, SC.Grade
FROM Student S INNER JOIN ON S.Sno=SC.Sno
JOIN Course C ON o=o;
2.自身连接
连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,这种连接称为表的自身连接。
例42 查询与刘晨在同一个系学习的学生的姓名和所在系
为清楚起见,我们可以为Student表取两个别名,一个是S1,另一个是S2,也可以在考虑问题时就把Course
表想成是两个完全一样表,一个是S1表,另一个是S2表。
如下所示:
完成该查询的SQL语句为:
SELECT S2.Sname, S2.Sdept
FROM Student as S1 JOIN Student as S2 ON S1.Sdept=S2.Sdept
WHERE S1.Sname=‘刘晨’AND S2.Sname!=‘刘晨’;
3.外连接
在通常的连接操作中,只有满足连接条件的元组才能作为结果输出,如在例35和例36的结果表中没有关于95003和95004两个学生的信息,原因在于他们没有选课,在SC表中没有相应的元组。
但是有时我们想以Student表为主体列出每个学生的基本情况及其选课情况,若某个学生没有选课,则只输出其基本情况信息,其选课信息为空值即可,这时就需要使用外连接(Outer Join)。
SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM Student LEFT OUTER JOIN SC ON Student.Sno=SC.Sno;
Student.Sno Sname Ssex Sage Sdept Cno Grade
----------- ------- ------ ------ ------- ------ -------
95002 刘晨女 19 信息系 3 80
95003 王名女 18 数学系 NULL NULL
95004 张立男 18 信息系 NULL NULL
右连接同理。