lyt经典版MySQL基础——进阶6:连接查询-sql99语法-内连接、外连接、交叉连接

  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 */

猜你喜欢

转载自www.cnblogs.com/yanwuliu/p/13373333.html