SQL简单表连接查询.docx
文本预览下载声明
简单表连接------------------------------------------------------------------------------?--创建测试数据:??--中国城市表:#C??字段:序号(ID),城市编号(C_ID),城市名称(C_NAME)?if?object_id(tempdb.dbo.#C)?is?not?null?drop?table?#C??create?table?#C(ID?int,C_ID?varchar(5),C_NAME?varchar(20))??insert?into?#C??select?1,10001,北京?union?all?select?2,20002,上海?union?all?select?3,30003,武汉?union?all?select?4,30004,长沙?union?all?select?5,40005,广州?union?all?select?6,40006,南宁?union?all?select?7,20007,南京??--中国高校表:#U??字段:序号(ID),高校编号(U_ID),高校名称(U_NAME),所属城市编号(LOC_ID)?if?object_id(tempdb.dbo.#U)?is?not?null?drop?table?#U??create?table?#U(ID?int,U_ID?varchar(7),U_NAME?varchar(20),LOC_ID?varchar(5))??insert?into?#U??select?1,1000101,北京大学,10001?union?all?select?2,1000102,清华大学,10001?union?all?select?3,1000103,北京交通大学,10001?union?all?select?4,2000201,上海交通大学,20002?union?all?select?5,2000202,复旦大学,20002?union?all?select?6,3000301,华中科技大学,30003?union?all?select?7,3000302,中国地质大学,30003?union?all?select?8,3000303,中南财经政法大学,30003?union?all?select?9,4000501,中山大学,40005?union?all?select?10,1000901,哈尔滨工业大学,10009?union?all?select?11,5001101,兰州大学,50011??--------------------------------------------------------------------------------?--开始查询?--?简化联接查询?select?C_ID,?C_NAME,?U_ID,?U_NAME?from?#C,#U?where?#C.C_ID?=?#U.LOC_ID;???--?左连接?(左为基表)?select?C_ID,?C_NAME,?U_ID,?U_NAME?from?#C?left?join?#U?on?#C.C_ID?=?#U.LOC_ID;???--?右连接?(右为基表)?select?C_ID,?C_NAME,?U_ID,?U_NAME?from?#C?right?join?#U?on?#C.C_ID?=?#U.LOC_ID;???--?内连接?(等值联合)?select?C_ID,?C_NAME,?U_ID,?U_NAME?from?#C?inner?join?#U?on?#C.C_ID?=?#U.LOC_ID;???--?交叉联接查询,结果是一个笛卡儿乘积?select?C_ID,?C_NAME,?U_ID,?U_NAME?from?#C?,#U??查询结果对比:使用where与inner join 查询结果一致,且连接的两表中无法对应的数据予以剔除,即高校表中没有高校位于长沙、南宁和南京,故剔除这3个城市,而城市表中没有城市对应哈尔滨工业大学与兰州大学,同样予以剔除。使用左连接时,左表为基表,返回结果会列出基表的所有记录,右表中无数据与基表的记录相对应的,显示为空。该例子中城市表为基表,长沙、南宁及南京这三个城市的高校在高校表中并无记录,但依然列出,只是高校ID及高校名称列为空;右连接同理。没有任何连接条件的交叉连接则返回一个笛卡尔乘积,记录条数是两表记录条数的乘积(7*11=77),左右两表的记录全部一一对应而不考虑实际意义,只考虑左表一条记录与右表一条记录组合的所有可能性。如该例子中,上海与北京大学并不对应。
显示全部