当前位置:Gxlcms >
数据库问题 >
lyt经典版MySQL基础——进阶6:连接查询-sql99语法-内连接、外连接、交叉连接
lyt经典版MySQL基础——进阶6:连接查询-sql99语法-内连接、外连接、交叉连接
时间:2021-07-01 10:21:17
帮助过:6人阅读
#二、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 */
lyt经典版MySQL基础——进阶6:连接查询-sql99语法-内连接、外连接、交叉连接
标签:ros esc 工资 类型 并且 案例 order by between 自连接