首页 > 数据库技术 > 详细

Mysql学习笔记(009)-sql99语法及相关连接查询

时间:2020-02-03 18:45:11      阅读:69      评论:0      收藏:0      [点我收藏+]

sql9语法

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

 

练习

练习
#一、查询员工编号>3的女神男朋友信息,如果有则列出详细,如果没有,则用null填充

SELECT b.id,b.name,bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.boyfriend_id = bo.id
WHERE b.id >3
#二、查询哪个城市没有部门
SELECT city,d.*
FROM departments d 
RIGHT OUTER JOIN locations l
ON d.location_id=l.location_id
WHERE d.department_id IS NULL

#三、查询部门名为sal或it的员工信息
SELECT e.*,d.department_name FROM departments d
LEFT JOIN employees e
ON d.department_id = e.department_id;
WHERE d.department_name IN(‘SAL‘,‘IT‘);

  

小结

Mysql学习笔记(009)-sql99语法及相关连接查询

原文:https://www.cnblogs.com/landerhu/p/12256517.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!