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