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
26select 查询列表
27from 表1 别名
28inner join 表2 别名
29on 连接条件;
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:查询员工名、部门名
45SELECT last_name,department_name
46FROM employees e
47INNERJOIN departments d
48ON e.department_id=d.department_id;
49#案例2:查询名字中包含e的员工名和工种名(添加筛选)
50SELECT last_name,job_title
51FROM employees e
52INNERJOIN jobs j
53ON e.job_id=j.job_id
54WHERE last_name LIKE‘%e%‘;
55 #案例3:查询部门个数>3的城市名和部门个数(分组+筛选)
56 #(1)查询每个城市的部门个数
57 #(2)在(1)结果上筛选满足条件的
58SELECT city,COUNT(*) ‘部门个数‘
59FROM locations l
60INNERJOIN departments d
61ON l.location_id=d.location_id
62GROUPBY city
63HAVING 部门个数>3;
64 #案例4:查询哪个部门的部门员工个数>3的部门名和员工个数,
65#并按个数降序(添加排序)
66SELECT department_name,COUNT(*) ‘员工个数‘
67FROM departments d
68INNERJOIN employees e
69ON d.department_id=e.department_id
70GROUPBY e.department_id
71HAVING 员工个数>3
72ORDERBY 员工个数 DESC;
73#案例5:查询员工名、部门名、工种名,并按部门名降序
74SELECT last_name,department_name,job_title
75FROM employees e
76INNERJOIN departments d ON e.department_id=d.department_id
77INNERJOIN jobs j ON e.job_id=j.job_id
78ORDERBY job_title DESC;
79
80 #2.非等值连接
81#查询员工的工资级别
82SELECT salary,grade_level
83FROM employees
84JOIN job_grades
85ON salary BETWEEN lowest_sal AND highest_sal;
86 #查询工资级别的个数>2的个数,并且按工资级别降序
87SELECT grade_level,COUNT(*) ‘个数‘
88FROM employees
89JOIN job_grades
90ON salary BETWEEN lowest_sal AND highest_sal
91GROUPBY grade_level
92HAVING 个数>2
93ORDERBY grade_level DESC;
94
95 #3.自连接
96#查询员工的名字、上级的名字
97SELECT e.last_name,m.last_name
98FROM employees e
99JOIN employees m ON e.manager_id=m.employee_id;
100#查询姓名中包含字符k的员工的名字、上级的名字
101SELECT e.last_name,m.last_name
102FROM employees e
103JOIN employees m ON e.manager_id=m.employee_id
104WHERE e.last_name LIKE‘%k%‘;
105
106#(二)外连接
107/*
108应用场景:用于查询一个表中有,另一个表没有的记录
109
110特点:
1111、外连接的查询结果为主表中的所有记录
112 如果从表中有和它匹配的,则显示匹配的值
113 如果从表中没有和它匹配的,则显示null
114 外连接查询结果=内连接结果+主表中有二从表没有的记录
1152、左外连接,left join左边的是主表
116 右外连接,right join右边的是主表
1173、左外和右外交换两个表的顺序,可以实现同样的效果
1184、全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的
119*/
120#引入:查询男朋友不在男神表的女神名
121SELECT*FROM beauty;
122SELECT*FROM boys;
123#左外连接
124SELECT b.name,bo.*
125FROM beauty b
126LEFTOUTERJOIN boys bo
127ON b.boyfriend_id=bo.id
128WHERE bo.id ISNULL;
129#右外连接
130SELECT b.name,bo.*
131FROM boys bo
132RIGHTOUTERJOIN beauty b
133ON b.boyfriend_id=bo.id
134WHERE bo.id ISNULL;
135
136#案例1:查询哪个部门没有员工
137#左外
138SELECT d.*,e.employee_id
139FROM departments d
140LEFTOUTERJOIN employees e
141ON d.department_id=e.department_id
142WHERE employee_id ISNULL;
143#右外
144SELECT d.*,e.employee_id
145FROM employees e
146RIGHTOUTERJOIN departments d
147ON d.department_id=e.department_id
148WHERE employee_id ISNULL;
149
150#全外
151USE girls;
152SELECT b.*,bo.*
153FROM bauty b
154FULLOUTERJOIN boys bo
155ON b.boyfriend_id=bo.id;
156
157#交叉连接
158SELECT b.*,bo.*
159FROM beauty b
160CROSSJOIN boys bo;
161
162#sql92 和 sql99 PK
163/*
164功能:sql99支持的较多
165可读性:sql99实现连接条件和筛选条件的分离,可读性较高
166*/
lyt经典版MySQL基础——进阶6:连接查询-sql99语法-内连接、外连接、交叉连接
以上是 lyt经典版MySQL基础——进阶6:连接查询sql99语法内连接、外连接、交叉连接 [数据库教程] 的全部内容, 来源链接: utcz.com/z/534820.html