sql多表查询有没有详细点的解释和实例...

SELECTMMT.Transaction_Date交易日期、MMT.SUBINVENTORY_CODE子库、MT.TRANSACTION_TYPE_NAME交易类型、MTS.TRANSACTION_SOURCE_TYPE_NAME账户别名、MMT.TRANSACTION_REFERENCE参考编号、MI.SEGMENT1物料代码、MI.DESCRIPTION物料描述明、MMT.PRIMARY_QUANTITY主数量、Cic.Item_成本标准cost,mmt.distribution_account_id,mmt.transaction_source_id,mmt.transaction_source_name,mgd.segment1FROMINV.MTL_MATERIAL_TRANSACTIONSMMT,--事务处理表INV。
MTL_TRANSACTION_TYPESMT,--事物类型表INV.MTL_TXN_SOURCE_TYPESMTS,--事物来源类型表INV.MTL_SYSTEM_ITEMS_BMI,--系统主物料表BOM.Cst_Item_CostsCic,--物料成本项目inv.mtl_generic_dispositionsmgd,bom.cst_cost_typesWHEREMMT.TRANSACTION_TYPE_ID=MT.TRANSACTION_TYPE_ID--与事物类型表关联ANDMMT.TRANSACTION_SOURCE_TYPE_ID=MTS.TRANSACTION_SOURCE_TYPE_ID--与物料类型表关联ANDMMT.INVENTORY_ITEM_ID=MI.INVENTORY_ITEM_ID--与系统物料表ANDM关联MT.Inventory_Item_Id=Cic.Inventory_Item_Id--与物料成本表关联ANDCic.COST_TYPE_ID=1--成本类型被冻结ANDmmt.transaction_source_type_id=6--来源类型为账户别名ANDMI.SEGMENT1LIKE'100%'--物料代码为100以ANDmi.organization_id=m开头mt.organization_idANDmi.organization_id=cic.organization_idANDmi.organization_id=82ANDmi.segment1='100EV050P'ANDmi.organization_id=mgd.organization_idANDmmt.transaction_source_id=mgd.disposition_idANDMMT.Transaction_Date>=to_date('2011-01-01','yyyy-mm-dd')ANDMMT.Transaction_Date

SQL多表连接查询实例分析(详细图文)

新建两张表:表一:学生截图如下:表二:截图当然如下:(此时这样创建表只是为了演示连接SQL语句,当然,我们实际开发中不会这样建表。
实际开发中这两个表会是不同的主键。
)1.外连接可分为:左连接、右连接。
1、左连接leftjoin或leftouterjoinSQL语句:select*fromstudentleftjoincourseonstudent.ID=course.ID执行结果:左外连接包含leftjoin中左表中的所有行如果左表中的一行与右表中对应的行不匹配结果将在右表中。
当然,这里查询结果的行数等于左表数据的行数,因为此时左表和右表是一一对应的关系。
2、右连接rightjoin或rightouterjoinSQL语句:select*fromstudentrightjoincourseonstudent.ID=course.ID执行结果:右外连接包含右表中的所有行进行rightjoin如果左表中的一行与右表不匹配则结果对应到桌子的左边。
所有部分均为NULL。
注意:此时我们不能说结果中的行数等于右表中的行数。
当然,这里查询结果的行数等于左表数据的行数,因为此时左表和右表是一一对应的关系。
3、完成外连接fulljoin或fullouterjoinSQL语句:select*fromstudentfulljoincourseonstudent.ID=course.ID执行结果:全外连接包含fulljoin中左表和右表的所有行如果右表中有一行不匹配左表,结果。
右表中对应的行全部为空(NULL)。
2、内联join或innerjoinSQL语句:select*fromstudentinnerjoincourseonstudent.ID=course.ID执行结果:innerjoin是比较运算符,只返回满足条件的行。
此时它相当于:select*fromstudent,coursewherestudent.ID=course.ID3.交叉联接crossjoin1概念:不带WHERE子句的交叉联接将产生联接所涉及的表的笛卡尔积。
第一个表中的行数乘以第二个表中的行数等于笛卡尔积结果集的大小。
SQL语句:select*fromstudentcrossjoincourse执行结果:此时如果在这条SQL中添加一个WHERE子句,例如SQL:select*fromstudentcrossjoincoursewherestudent.ID=course.ID,则会返回一个符合条件的结果集,与inner相同加入。
显示的执行结果是一样的。
4、两个表之间的关系是一对多、多对一或多对多时的Join语句当然上面的两个表是一对一的关系,所以如果表A和表B是a-一对多、多对一或多对多的时候,我们应该怎么写连接SQL语句呢?事实上,两张表的一对多SQL语句和一对一SQL语句的写法是一样的,只是查询结果不同。
当然,这两个表也需要稍微改变一下。
例如表1中的列可以改为:SnoNameCno,表2中的列可以改为:CnoCName这样就可以在两个表中编写一对多和多对一的SQL语句写法与上面的-to-aSQL语句相同。
下面介绍当两个表是多对多时我们如何建表以及一些SQL语句。
新建三个表:表A:学生截图如下:表B:课程截图如下:表C:student_course截图如下:A学生可以选择多门课程,并且一门课程可以由多个学生选择,因此学生表student和课程计划之间是多对多的关系。
当两个表存在多对多关系时,我们需要创建一个中间表student_course。
中间表至少要有两个表的主键,当然也可以有其他内容。
SQL语句:selects.Name,C.Cnamefromstudent_courseasscleftjoinstudentassons.Sno=sc.Snoleftjoincourseasconc.Cno=sc.Cno执行结果:这条SQL执行的结果就是学生的课程选择。