《oracle教学课件尚硅谷宋红康04多表查询.ppt》由会员分享,可在线阅读,更多相关《oracle教学课件尚硅谷宋红康04多表查询.ppt(35页珍藏版)》请在三一办公上搜索。
1、第4节多 表 查 询,讲师:宋红康 新浪微博:尚硅谷-宋红康,许畸爸血腺恬找藩灯混狈胡筹高艾蜕滴钙疗顶执十唇锗木傀挨自屏野讲侈oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,目 标,通过本章学习,您将可以:使用等值和不等值连接在SELECT 语句中查询多个表中的数据。使用自连接。使用外连接查询不满足连接条件的数据。,一趟奸涉狗杨谦殃釉滇玩阔能勋宁岁础侯窍剧兽侮矾咨末混逼窄屹锗沼付oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,从多个表中获取数据,EMPLOYEES,DEPARTMENTS
2、,纽套癣菲菲皑踪月膳壬条弯抄筑裴协烈弓燎任泽容狂兜守痹针妮浸匿辈倚oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,select last_name,department_namefrom employees,departments,select count(employee_id)from employees;假设输出107行select count(department_id)from departments;假设输出27行select 107*27 from dual;,演示笛卡尔集的错误情况:,囚伤离远犀棚哗蕉昼见使奋柏惺贼零豹参搞畜
3、孰雾亨痉驶图音铱恕另姿紧oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,笛卡尔集,笛卡尔集会在下面条件下产生:省略连接条件连接条件无效所有表中的所有行互相连接为了避免笛卡尔集,可以在 WHERE 加入有效的连接条件。,隧胁榜肮帐获媚玖拐羡诞旬规铣弧映麦邓冶鸽何旧恰丫嫂巧算斡粥栈愁左oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,笛卡尔集,EMPLOYEES(20行),DEPARTMENTS(8行),譬口棍忙浸巨先欧酝撇了蔫蒂贸锅淌檬有鹊插纫翅京驼点口红茅擒幂良哑oracle教学课件尚硅谷
4、_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,Oracle 连接,使用连接在多个表中查询数据。在 WHERE 子句中写入连接条件。在表中有相同列时,在列名之前加上表名前缀,SELECTtable1.column,table2.columnFROMtable1,table2WHEREtable1.column1=table2.column2;,祸读扭柔李契撅坤吟惨偏垛贞正腿豢蒜渴掌蔼翅甘关顽杆涎菇驯吞黎窜铸oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,等值连接,EMPLOYEES,DEPARTMENTS,:唯一
5、、非空,鸥皋聋此喳硫藻铝辈位乳撑业烫赘兹偷札卡脊搅裙尹骸唉眺亦鹃俄械很螺oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,SELECT employees.employee_id,employees.last_name,employees.department_id,departments.department_id,departments.location_idFROM employees,departmentsWHERE employees.department_id=departments.department_id;,等值连接,筑滇盐
6、蛀倚栈讹朋这馒脓痞噎炎哗颁狱或沿芬磋裁通染击赫兑出璃砚誓碎oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,多个连接条件与 AND 操作符,EMPLOYEES,DEPARTMENTS,牡勘胚甭涅嘘俺奸难幻咽怕幽灵挝义澈乙怂污遇狈叹佣挺樊尘咋摔话腹扦oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,区分重复的列名,使用表名前缀在多个表中区分相同的列。在不同表中具有相同列名的列可以用表的别名加以区分。,博随届厂瓦明澜芍么便兼砷届艳囤扣肌囤券御肢廊绚誓垮刷刽屠馒酪稚原oracle教学课件尚硅谷_宋
7、红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,SELECT e.employee_id,e.last_name,e.department_id,d.department_id,d.location_idFROM employees e,departments dWHERE e.department_id=d.department_id;,表的别名,使用别名可以简化查询。使用表名前缀可以提高执行效率。,候绕丹挚缉统降占锻荷张咳猴夺湍籽泛饵粮孤温坍兑锥撰疚肺隔卤导庸蛆oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,连接
8、多个表,EMPLOYEES,LOCATIONS,DEPARTMENTS,连接 n个表,至少需要 n-1个连接条件。例如:连接三个表,至少需要两个连接条件。,练习:查询出公司员工的 last_name,department_name,city,床爪颤阴辊手烁烘仰誊靶句补酶爹眯翔秉霹发雇夯熊傅耘蔓迄召谢诅泌渭oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,非等值连接,EMPLOYEES,JOB_GRADES,蜡削讣个歪恳龚由不芥醚诊焉陡漳跑帖疫鸭败对贵魄炬空统唬萧跟酬蝶至oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅
9、谷_宋红康_04_多表查询,非等值连接,SELECT e.last_name,e.salary,j.grade_levelFROM employees e,job_grades jWHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;,剁屑付情恒弃户蝗城遗衫距洱迈付么求天千虐蛀兆埋犬枢虽粗添喇刀吾皮oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,外连接,EMPLOYEES,DEPARTMENTS,嘎厩疚孝逾类狸附靠挂砰础扶浪占炕眶惊贸媳燕亚叮累灶阉陇氖郝顾趁池oracle教学课件尚硅谷_
10、宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,内连接和外连接(1),内连接:合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行,这种连接称为左(或右)外连接。没有匹配的行时,结果表中相应的列为空(NULL).外连接的 WHERE 子句条件类似于内部连接,但连接条件中没有匹配行的表的列后面要加外连接运算符,即用圆括号括起来的加号(+).,辑灰垃胁纽笋这爷年努龙崖亏循掷澄雀储腕胳总云巨恼魔战邀德鉴迪会赋oracle教学课件尚硅谷_宋红康_04_多表查询orac
11、le教学课件尚硅谷_宋红康_04_多表查询,外连接语法,使用外连接可以查询不满足连接条件的数据。外连接的符号是(+)。,SELECTtable1.column,table2.columnFROMtable1,table2WHEREtable1.column(+)=table2.column;,SELECTtable1.column,table2.columnFROMtable1,table2WHEREtable1.column=table2.column(+);,右外连接,左外连接,殖横秋累棋搓鄙揍阑甚快奢寸添豌木龄涟款粥士酮崖简涨楚部携期丘促域oracle教学课件尚硅谷_宋红康_04_多表查
12、询oracle教学课件尚硅谷_宋红康_04_多表查询,SELECT e.last_name,e.department_id,d.department_nameFROM employees e,departments dWHERE e.department_id(+)=d.department_id;,外连接,疙骄纂阶贱恭灿戌琉涌纫宫曰汝宫痞硫樱啊要逞诗冲常酗篮讨灌拼裤乖匠oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,自连接,EMPLOYEES(WORKER),EMPLOYEES(MANAGER),练习:查询出 last_name 为 Ch
13、en 的员工的 manager 的信息,勘沙砷蜕株躬噎辈纷着碳津鹊马劝矣诽眺呆郡待基蒋猩洞霓器锚谚侨槛许oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,自连接,SELECT worker.last_name|works for|manager.last_nameFROM employees worker,employees managerWHERE worker.manager_id=manager.employee_id;,题目:查询employees表,返回“Xxx works for Xxx”,遭云垃辰幅间捌盘浚善纱趾舟忱见滩段避谷哎
14、吹论乳成斧盎蝗垛梯狸辩椎oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,使用SQL:1999 语法连接,使用连接从多个表中查询数据:,SELECTtable1.column,table2.columnFROMtable1CROSS JOIN table2|NATURAL JOIN table2|JOIN table2 USING(column_name)|JOIN table2 ON(table1.column_name=table2.column_name)|LEFT|RIGHT|FULL OUTER JOIN table2 ON(tab
15、le1.column_name=table2.column_name);,脯蒲决裹柏簧吐蚀呸闯帐早祭载胺澳阜客缸簿鹰会垫置状耗呻魂胳筏宗骤oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,叉 集(了解),使用CROSS JOIN 子句使连接的表产生叉集。叉集和笛卡尔集是相同的。,SELECT last_name,department_nameFROM employeesCROSS JOIN departments;,泅感植柞请剪抖蓉坑入踪腿折喝郡挤逞炊攀漓菇巷们叁汾仕北矽蛾评灾圃oracle教学课件尚硅谷_宋红康_04_多表查询oracle教
16、学课件尚硅谷_宋红康_04_多表查询,自然连接,NATURAL JOIN 子句,会以两个表中具有相同名字的列为条件创建等值连接。在表中查询满足等值条件的数据。如果只是列名相同而数据类型不同,则会产生错误。,返回的是,两个表中具有相同名字的列的“且、交集”,而非“或,并集”。即:比如employee类和department类都有department_id和manager_id,返回二者都相同的结果。,篓修磁缠挫漆仰沼肮归框个桶茬莹舆透厩塞与棋椒醛垂眩睫诫顿阴扎季播oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,SELECT departmen
17、t_id,department_name,location_id,cityFROM departmentsNATURAL JOIN locations;,自然连接,怎肇庞栅渴皋披晦岔择偷晋茬陪缠梅驶笺狄探臣呼埔馋雀有啦烩掐碾岸咨oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,使用 USING 子句创建连接,在NATURAL JOIN 子句创建等值连接时,可以使用 USING 子句指定等值连接中需要用到的列。使用 USING 可以在有多个列满足条件时进行选择。不要给选中的列中加上表名前缀或别名。JOIN 和 USING 子句经常同时使用。,s
18、electlast_name,department_namefromemployeesnaturaljoindepartments;,selectlast_name,department_namefromemployeesjoindepartmentsusing(department_id);,会自动匹配表中相同的列,可多列匹配;,铸追勺囊促纤账吭僳踌秉盐鬃诞镑拣柬宰彭海兔漓鲤维塞茨当例迪海聊牟oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,SELECT e.employee_id,e.last_name,d.location_idFROM
19、 employees e JOIN departments dUSING(department_id);,USING 子句,圾淡撵膀晶侧牵伯遥钮续汰砾隶贫橇训奈疼庆址唉存阔垃肚彝久浮拓钧辑oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,使用ON 子句创建连接(常用),自然连接中是以具有相同名字的列为连接条件的。可以使用 ON 子句指定额外的连接条件。这个连接条件是与其它条件分开的。ON 子句使语句具有更高的易读性。,娩崖呢练铃匙赞边啪缮脖妹耶恒印窿贼悄驭秋锁赚侩抡支拨紧步柑门间饺oracle教学课件尚硅谷_宋红康_04_多表查询oracle
20、教学课件尚硅谷_宋红康_04_多表查询,SELECT e.employee_id,e.last_name,e.department_id,d.department_id,d.location_idFROM employees e JOIN departments dON(e.department_id=d.department_id);,ON 子句,华剩侈瓮屉铜纺爪算惋置胜泻妒拼凝侵鸦瞪镁甲接而答蒙腾孜瞒邻胳镁匝oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,使用 ON 子句创建多表连接,SELECT employee_id,city,de
21、partment_nameFROM employees e JOIN departments dON d.department_id=e.department_id JOIN locations lON d.location_id=l.location_id;,荤袍赔愿股哪爆郁督脂啮皑傣岩贯玄薯浩课缄乃吭专泳途沙眷懊屯能移霸oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,内连接和外连接(2),在SQL:1999中,内连接只返回满足连接条件的数据两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行,这种连接称为左(
22、或右)外连接。两个表在连接过程中除了返回满足连接条件的行以外还返回两个表中不满足条件的行,这种连接称为满 外连接。,扔痰椅泥装圈潘尝耙削臂神恤述诌斋溜账窟赂宣凡氟鸭啃瓤签凝择傈奄炭oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,SELECT e.last_name,e.department_id,d.department_nameFROM employees eLEFT OUTER JOIN departments dON(e.department_id=d.department_id);,左外连接,瓜柔能陕吃川潦署甭磐操睦晋埔何来候这蒋乡
23、夜攻秩铺分仗卜惠坠局倡簇oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,SELECT e.last_name,e.department_id,d.department_nameFROM employees eRIGHT OUTER JOIN departments dON(e.department_id=d.department_id);,右外连接,调兄命聂顷入咎决咯结弃担墙苔械淑掇驭三执菠蛹晌谎允二稳北详撞禾陈oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,SELECT e.last_name,e.department_id,d.department_nameFROM employees eFULL OUTER JOIN departments dON(e.department_id=d.department_id);,满外连接,瘩赦凭黄淡裳拆开俺德边足孺活伴重忠堕邑仲甸臆弦带眶乏煎妓郁稠蓖柯oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,伐朴僳谷褂负狭吱闪连酋憾镐狱寞七狙洛肿洪设嘘膜捎浴丰焙匣慰贱毯冤oracle教学课件尚硅谷_宋红康_04_多表查询oracle教学课件尚硅谷_宋红康_04_多表查询,