1 #进阶6:连接查询 2 /* 3 含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询 4 5 笛卡尔乘积现象:表1 有m行,表2有n行,结果=m*n行 6 7 发生原因:没有有效的连接条件 8 如何避免:添加有效的连接条件 9 10 分类: 11 按年代分类: 12 sql92标准:仅仅支持内连接 13 sql99标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接 14 15 按功能分类: 16 内连接: 17 等值连接 18 非等值连接 19 自连接 20 外连接: 21 左外连接 22 右外连接 23 全外连接 24 交叉连接 25 */ 26 27 SELECT * FROM beauty; 28 SELECT * FROM boys; 29 30 SELECT NAME,boyName FROM boys,beauty 31 WHERE beauty.boyfriend_id=boys.id; 32 33 #一、sql92标准 34 #1.等值连接 35 /* 36 (1)多表等值连接的结果为多表的交集部分 37 (2)n表连接,至少需要n-1个链接条件 38 (3)多表的顺序没有要求 39 (4)一般需要为表起别名 40 (5)可以搭配前面介绍的所有子句使用,比如排序、分组、筛选 41 */ 42 43 #案例1:查询女神名和对应的男神名 44 SELECT NAME,boyName FROM boys,beauty 45 WHERE beauty.boyfriend_id=boys.id; 46 #案例2:查询员工名和对应的部门名 47 SELECT last_name,department_name 48 FROM employees,departments 49 WHERE departments.department_id=employees.department_id; 50 51 #2.为表起别名 52 /* 53 (1)提高语句的简洁度 54 (2)区分多个重名的字段 55 56 注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定 57 因为执行顺序是 from --> where --> select 58 */ 59 #查询员工名、工种号、工种名 60 SELECT last_name,e.job_id,job_title 61 FROM employees AS e,jobs 62 WHERE e.job_id=jobs.job_id; 63 64 #3.两个表的顺序可以调换 65 #查询员工名、工种号、工种名 66 SELECT last_name,e.job_id,job_title 67 FROM jobs,employees AS e 68 WHERE e.job_id=jobs.job_id; 69 70 #4.可以加筛选 71 #案例:查询有奖金的员工名、部门名 72 SELECT last_name,department_name 73 FROM departments,employees AS e 74 WHERE departments.department_id=e.department_id 75 AND e.commission_pct IS NOT NULL; 76 #案例2:查询城市名中第二个字符为o的部门名和城市名 77 SELECT department_name,city 78 FROM departments,locations l 79 WHERE departments.location_id=l.location_id 80 AND city LIKE '_o%'; 81 82 #5.可以加分组 83 #案例1:查询每个城市的部门个数 84 SELECT city,COUNT(department_name) 个数 85 FROM locations l,departments d 86 WHERE l.location_id=d.location_id 87 GROUP BY city; 88 #案例2:查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资 89 SELECT department_name,d.manager_id,MIN(salary) 90 FROM departments d, employees e 91 WHERE d.department_id=e.department_id 92 AND e.commission_pct IS NOT NULL 93 GROUP BY d.department_id; 94 95 #6.可以加排序 96 #案例:查询每个工种的工种名和员工的个数,并且按员工个数降序 97 SELECT j.job_title,COUNT(*) FROM employees e,jobs j 98 WHERE j.job_id=e.job_id 99 GROUP BY j.job_title 100 ORDER BY COUNT(*) DESC; 101 102 #7.可以实现三表连接 103 #案例:查询员工名、部门名和所在的城市 104 SELECT last_name,department_name,city 105 FROM employees e,departments d,locations l 106 WHERE d.department_id=e.department_id 107 AND d.location_id=l.location_id; 108 109 110 #2.非等值连接 111 #案例1:查询员工的工资和工资级别 112 SELECT salary,grade_level 113 FROM employees e,job_grades g 114 WHERE salary BETWEEN lowest_sal AND highest_sal; 115 116 #3.自连接 117 #案例:查询员工名和上级的名称 118 SELECT e.employee_id '员工id',e.last_name '员工名', 119 m.employee_id '上级id',m.last_name '上级名' 120 FROM employees e,employees m 121 WHERE e.manager_id=m.employee_id;