lyt经典版MySQL基础——进阶6:连接查询sql99语法内连接、外连接、交叉连接 [数据库教程]

database

  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

回到顶部