1 #二、sql99语法 2 /* 3 语法: 4 select 查询列表 5 from 表1 别名 【连接类型】 6 join 表2 别名 7 on 连接条件 8 【where 筛选条件】 9 【group by分组】 10 【having 筛选条件】 11 【order by 排序列表】 12 13 14 内连接(√):inner 15 外连接 16 左外(√):left 【outer】 17 右外(√):right【outer】 18 全外:full【outer】 19 交叉连接:cross 20 */ 21 22 #(一)内连接 23 /* 24 语法: 25 26 select 查询列表 27 from 表1 别名 28 inner join 表2 别名 29 on 连接条件; 30 31 分类: 32 等值 33 非等值 34 自连接 35 36 特点: 37 (1)添加排序、分组、筛选 38 (2)inner可以省略 39 (3)筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读 40 (4)inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集 41 */ 42 43 #1.等值连接 44 #案例1:查询员工名、部门名 45 SELECT last_name,department_name 46 FROM employees e 47 INNER JOIN departments d 48 ON e.department_id=d.department_id; 49 #案例2:查询名字中包含e的员工名和工种名(添加筛选) 50 SELECT last_name,job_title 51 FROM employees e 52 INNER JOIN jobs j 53 ON e.job_id=j.job_id 54 WHERE last_name LIKE '%e%'; 55 #案例3:查询部门个数>3的城市名和部门个数(分组+筛选) 56 #(1)查询每个城市的部门个数 57 #(2)在(1)结果上筛选满足条件的 58 SELECT city,COUNT(*) '部门个数' 59 FROM locations l 60 INNER JOIN departments d 61 ON l.location_id=d.location_id 62 GROUP BY city 63 HAVING 部门个数>3; 64 #案例4:查询哪个部门的部门员工个数>3的部门名和员工个数, 65 #并按个数降序(添加排序) 66 SELECT department_name,COUNT(*) '员工个数' 67 FROM departments d 68 INNER JOIN employees e 69 ON d.department_id=e.department_id 70 GROUP BY e.department_id 71 HAVING 员工个数>3 72 ORDER BY 员工个数 DESC; 73 #案例5:查询员工名、部门名、工种名,并按部门名降序 74 SELECT last_name,department_name,job_title 75 FROM employees e 76 INNER JOIN departments d ON e.department_id=d.department_id 77 INNER JOIN jobs j ON e.job_id=j.job_id 78 ORDER BY job_title DESC; 79 80 #2.非等值连接 81 #查询员工的工资级别 82 SELECT salary,grade_level 83 FROM employees 84 JOIN job_grades 85 ON salary BETWEEN lowest_sal AND highest_sal; 86 #查询工资级别的个数>2的个数,并且按工资级别降序 87 SELECT grade_level,COUNT(*) '个数' 88 FROM employees 89 JOIN job_grades 90 ON salary BETWEEN lowest_sal AND highest_sal 91 GROUP BY grade_level 92 HAVING 个数>2 93 ORDER BY grade_level DESC; 94 95 #3.自连接 96 #查询员工的名字、上级的名字 97 SELECT e.last_name,m.last_name 98 FROM employees e 99 JOIN employees m ON e.manager_id=m.employee_id; 100 #查询姓名中包含字符k的员工的名字、上级的名字 101 SELECT e.last_name,m.last_name 102 FROM employees e 103 JOIN employees m ON e.manager_id=m.employee_id 104 WHERE e.last_name LIKE '%k%'; 105 106 #(二)外连接 107 /* 108 应用场景:用于查询一个表中有,另一个表没有的记录 109 110 特点: 111 1、外连接的查询结果为主表中的所有记录 112 如果从表中有和它匹配的,则显示匹配的值 113 如果从表中没有和它匹配的,则显示null 114 外连接查询结果=内连接结果+主表中有二从表没有的记录 115 2、左外连接,left join左边的是主表 116 右外连接,right join右边的是主表 117 3、左外和右外交换两个表的顺序,可以实现同样的效果 118 4、全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的 119 */ 120 #引入:查询男朋友不在男神表的女神名 121 SELECT * FROM beauty; 122 SELECT * FROM boys; 123 #左外连接 124 SELECT b.name,bo.* 125 FROM beauty b 126 LEFT OUTER JOIN boys bo 127 ON b.boyfriend_id=bo.id 128 WHERE bo.id IS NULL; 129 #右外连接 130 SELECT b.name,bo.* 131 FROM boys bo 132 RIGHT OUTER JOIN beauty b 133 ON b.boyfriend_id=bo.id 134 WHERE bo.id IS NULL; 135 136 #案例1:查询哪个部门没有员工 137 #左外 138 SELECT d.*,e.employee_id 139 FROM departments d 140 LEFT OUTER JOIN employees e 141 ON d.department_id=e.department_id 142 WHERE employee_id IS NULL; 143 #右外 144 SELECT d.*,e.employee_id 145 FROM employees e 146 RIGHT OUTER JOIN departments d 147 ON d.department_id=e.department_id 148 WHERE employee_id IS NULL; 149 150 #全外 151 USE girls; 152 SELECT b.*,bo.* 153 FROM bauty b 154 FULL OUTER JOIN boys bo 155 ON b.boyfriend_id=bo.id; 156 157 #交叉连接 158 SELECT b.*,bo.* 159 FROM beauty b 160 CROSS JOIN boys bo; 161 162 #sql92 和 sql99 PK 163 /* 164 功能:sql99支持的较多 165 可读性:sql99实现连接条件和筛选条件的分离,可读性较高 166 */