Mysql#进阶6 连接查询--学习笔记

#进阶6 连接查询

/*
分类
		按年代分类
		sql92标准:仅仅支持内连接
		sq99标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接
		
		按功能分类:
					内连接:
							等值连接
							非等值连接
							自连接
					外连接:
							左外连接右外连接
							全外连接
					交叉连接
*/
#一 sql99标准
#1.等值连接
/*
1.多表等值连接的结果为多表的交集部分
2.n表连接,至少需要n-1个连接条件
多表的顺序没有要求
4.一般需要为表起别名
5.可以搭配前面介绍的所有子句使用,比如排序、分组、筛选

*/
#案例1:查询女神名和对应的男神名
SELECT NAME,boyname 
FROM beauty,boys
WHERE beauty.boyfriend_id=boys.id;

#案例2:查询员工名和对应的部门名
SELECT last_name,department_name
FROM employees,departments
WHERE employees.department_id=departments.department_id;

#2.为表起别名--1.提高简洁度2.区分多个重名的字段
#注意:如果为表起了别名,则查询的字段就不能使用原来的表明去限定
#查询工种号、员工名、工种名
SELECT last_name,e.job_id,job_title
FROM employees e,jobs j
WHERE e.job_id=j.job_id;

#4、可以加筛选?
#查询有奖金的员工名,部门名
SELECT last_name,department_name,commission_pct
FROM employees e,departments d
WHERE e. department_id=d.department_id
and e.commission_pct IS NOT NULL

#案例2 :查询第二个字符为o的部门名和城市名
SELECT department_name,city
FROM departments d,locations l
WHERE d.location_id=l.location_id
AND city LIKE "_o%";

#5.可以加分组?

#案例 查询每个城市的部门个数
SELECT COUNT(*) 个数,city
FROM departments d,locations l
WHERE d.location_id=l.location_id
GROUP BY city;

#案例2:查询出有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资
SELECT d.department_name,d.manager_id,MIN(salary)
FROM departments d,employees e
WHERE e.manager_id=d.manager_id
AND e.commission_pct IS NOT null
GROUP BY d.department_name,manager_id;

#6.可以加排序?

#案例 查询每个工种的工种名和员工的个数,并且按员工个数降序
SELECT job_title,COUNT(*)
FROM employees e,jobs j
WHERE e.job_id=j.job_id
GROUP BY job_title
ORDER BY COUNT(*);

#7.三表连接?
#案例 查询员工名、部门名和所在城市
SELECT last_name,department_name,city
FROM departments d,employees e,locations l
WHERE e.department_id=d.department_id
AND d.location_id=l.location_id;


#2. 非等值连接


CREATE TABLE job_grades
(grade_level VARCHAR(3),
 lowest_sal  int,
 highest_sal int);

INSERT INTO job_grades
VALUES ('A', 1000, 2999);

INSERT INTO job_grades
VALUES ('B', 3000, 5999);

INSERT INTO job_grades
VALUES('C', 6000, 9999);

INSERT INTO job_grades
VALUES('D', 10000, 14999);

INSERT INTO job_grades
VALUES('E', 15000, 24999);

INSERT INTO job_grades
VALUES('F', 25000, 40000);


#查询员工的工资和工资的级别
SELECT salary,grade_level
FROM employees e,job_grades g 
WHERE salary BETWEEN g.lowest_sal AND g.highest_sal;

#3.自连接
#案例 查询员工名和上级的名称
SELECT e.last_name,e.manager_id,m.employee_id,m.last_name
FROM employees e,employees m
WHERE e.manager_id=m.employee_id;



#二sql99语法
/*
语法:
		select 查询列表
		from 表1 别名【连接类型】
		join 表2 别名
		on 连接条件
		【where 筛选条件】
		【group by 分组】
		【having 筛选条件】
		【order by 排序列表】
分类:
内连接:inner
外连接
		左外:left[outer]
		右外:right[outer]
		全外:full[outer]
交叉连接:cross
*/

#一)内连接
#1.等值连接

seLECT last_name,department_name
FROM employees e
INNER JOIN departments d 
ON e.department_id=d.department_id;
#案例 查询名字中包含e的员工名和工种名(添加筛选)
SELECT last_name,job_title
FROM employees e
INNER JOIN jobs j
ON e.job_id=j.job_id
WHERE e.last_name LIKE '%e%';
#33.查询部门个数>3的城市名和部门个数(添加筛选+分组)
SELECT city ,COUNT(*) 部门个数
FROM departments d
INNER JOIN locations l
ON d.location_id=l.location_id
GROUP BY city
HAVING 部门个数>3;
#案例4 查询哪个部门的员工个数>3的部门名和员工个数,并按个数降序
SELECT COUNT(*) 个数,department_name
FROM employees e
INNER JOIN departments d
ON e.department_id=d.department_id
GROUP BY department_name
HAVING 个数>3
ORDER BY 个数 DESC;

#二,非等值连接
#查询员工等级
SELECT salary,grade_level
FROM employees e
JOIN job_grades g
ON  e.salary BETWEEN g.lowest_sal AND g.highest_sal;

#3.自连接
#案例 查询姓名中包含字符k员工名和上级的名称   
SELECT e.last_name,e.manager_id,m.employee_id,m.last_name
FROM employees e
join employees m
on e.manager_id=m.employee_id
WHERE e.last_name LIKE '%k%';

#二、外连接
/*
特点:
1.外连接的查询结果为主表中的所有记录
	如果从表中有和它匹配的,则显示匹配的值
	如果从表中没有和他匹配的,则显示null
	外连接查询结果=内连接结果+主表中有而从表没有的记录
2.左外连接,left左边的是主表
	忧外链接,right join 右边的是主表
3.左外和右外交换两个表的顺序,可以实现同样的效果
4.全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的
*/
#引入 查询男朋友不在男神表的女神表
SELECT b.name,bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.boyfriend_id=bo.id
WHERE bo.id IS NULL;

#全外连接
USE girls
#交叉连接
SELECT b.*,bo.*
FROM beauty b
CROSS JOIN boys bo;```

你可能感兴趣的:(MySQL,mysql)