mysql 连接查询/SQL99语法 练习4

导入这三个sql文件,就能跟着操作啦
https://cloud.189.cn/t/NFF7NzyyEZNv (访问码:rtu8)
里面有3张表。分别一次性执行就能创建成功啦。
在这里插入图片描述

#连接查询、

#4.1.1连接查询/SQL99语法
#一、内连接
语法:

SELECT 查询列表
FROM 表名1 别名
【INNERJOIN  表名2 别名
ON 连接条件
WHERE 筛选条件
GROUP BY 分组列表
HAVING 分组后筛选
ORDER BY 排序列表;


SQL92和SQL99的区别:

	SQL99,使用JOIN关键字代替了之前的逗号,并且将连接条件和筛选条件进行了分离,提高阅读性!!!
	
#一)等值连接
-- ①简单连接
-- 1.查询员工名和部门名	
SELECT last_name,department_name
FROM departments d 
 JOIN  employees e 
ON e.department_id =d.department_id;


#②添加筛选条件
-- 2.查询部门编号>100的部门名和所在的城市名
SELECT department_name, city
from departments d
JOIN locations l
on d.location_id = l.location_id
WHERE d.department_id>100

SELECT * FROM departments		
SELECT * FROM locations			


#③添加分组+筛选
-- 3.查询每个城市的部门个数
SELECT COUNT(*) 部门个数, l.city
FROM departments d 
JOIN locations l 
ON d.location_id = l.location_id
GROUP BY l.city;


#④添加分组+筛选+排序
#案例1:查询部门中员工个数>10的部门名,并按员工个数降序
SELECT d.department_name,COUNT(*) 员工个数
FROM employees e
JOIN departments d
on e.department_id = d.department_id
GROUP BY d.department_id
HAVING 员工个数> 10
ORDER BY 员工个数 DESC;



#二)非等值连接

#案例:查询部门编号在10-90之间的员工的工资级别,并按级别进行分组
SELECT * FROM sal_grade;
SELECT * FROM employees;

SELECT s.grade, COUNT(*) 个数
FROM employees e
JOIN sal_grade s
ON e.salary BETWEEN s.min_salary AND s.max_salary
WHERE e.department_id BETWEEN 10 AND 90
GROUP BY s.grade;


#三)自连接

#案例:查询员工名和对应的领导名
SELECT e.`last_name`,m.`last_name`
FROM employees e
JOIN employees m
ON e.`manager_id`=m.`employee_id`;




#二、外连接

/*

说明:查询结果为主表中所有的记录,如果从表有匹配项,则显示匹配项;如果从表没有匹配项,则显示null

应用场景:一般用于查询主表中有但从表没有的记录

特点:

1、外连接分主从表,两表的顺序不能任意调换
2、左连接的话,left join左边为主表
   右连接的话,right join右边为主表
   

语法:

select 查询列表
from 表1 别名
left|right|full 【outer】 join 表2 别名
on 连接条件
where 筛选条件;

*/

USE girls;
-- 1.查询所有女神记录,以及对应的男神名,如果没有对应的男神,则显示为null
SELECT * FROM boys;
SELECT * FROM beauty;

#左连接
SELECT b.*,bo.*
FROM beauty b
LEFT JOIN boys bo ON b.`boyfriend_id` = bo.`id`;

#右连接
SELECT b.*,bo.*
FROM boys bo
RIGHT JOIN beauty b ON b.boyfriend_id=bo.id;

-- 2.查询哪个女神没有男朋友
#左连接
SELECT b.`name`
FROM beauty b
LEFT JOIN boys bo ON b.boyfriend_id = bo.id
WHERE bo.id is NULL;

#右连接
SELECT b.*,bo.*
FROM boys bo
RIGHT JOIN  beauty b ON b.`boyfriend_id` = bo.`id`
WHERE bo.`id`  IS NULL;

-- 3.查询哪个部门没有员工,并显示其部门编号和部门名
SELECT COUNT(*) 部门个数, d.department_id, d.department_name
FROM departments d
LEFT JOIN employees e ON d.`department_id` = e.`department_id`
WHERE e.`employee_id` IS NULL;


#连接查询案例练习
-- 1.显示所有员工的姓名,部门号和部门名称。
SELECT * FROM departments;
SELECT e.last_name,d.department_id,d.department_name
FROM employees e
JOIN departments d ON e.`department_id`=d.`department_id`;

-- 2.查询 90 号部门员工的 job_id 和 90 号部门的 location_id
SELECT * FROM departments;
SELECT * FROM employees;

SELECT e.`job_id`,d.`location_id`
FROM employees e
JOIN departments d ON e.`department_id`=d.`department_id`
WHERE e.`department_id`=90;

-- 3.选择所有有奖金的员工的last_name , department_name , location_id , city
SELECT e.last_name, d.department_name, d.location_id, l.city
FROM employees e 
LEFT JOIN departments d ON e.department_id= d.department_id
LEFT JOIN locations l ON d.location_id = l.location_id
WHERE e.commission_pct is NOT NULL;

-- 4.选择city在Toronto工作的员工的
#last_name , job_id , department_id , department_name
SELECT e.last_name, e.job_id, d.department_id, d.department_name, l.city
FROM employees e
LEFT JOIN departments d on e.department_id = d.department_id
LEFT JOIN locations l ON d.location_id = l.location_id
WHERE l.city = 'Toronto'


-- 5.查询每个工种、每个部门的部门名、工种名和最低工资
SELECT j.job_title, d.department_name,  MIN(e.salary) 最低工资
FROM employees e 
LEFT JOIN departments d on e.department_id = d.department_id
LEFT JOIN jobs j on e.job_id = j.job_id
GROUP BY j.job_title, d.department_id;


-- 6.查询每个国家下的部门个数大于 2 的国家编号
SELECT l.country_id, COUNT(*) 部门个数 
FROM locations l 
LEFT JOIN departments d on l.location_id = d.location_id
GROUP BY l.country_id
HAVING 部门个数>2;

SELECT * FROM locations
SELECT * FROM departments
SELECT * FROM employees
SELECT * FROM jobs;
#sql99语法下的外连接案例
-- 1.查询哪个城市没有部门
SELECT l.city, d.department_id
FROM locations l 
LEFT JOIN departments d on l.location_id = d.location_id
WHERE d.department_id is NULL
GROUP BY l.city;

SELECT l.city,d.department_id
FROM departments d
RIGHT JOIN locations l ON l.location_id = d.location_id
WHERE d.`department_id` IS NULL
GROUP BY l.city;

-- 2.查询部门名为 SAL 或 IT 的员工信息
SELECT * FROM employees e
LEFT JOIN departments d on e.department_id = d.department_id
WHERE d.department_name ='SAL' or d.department_name = 'IT'





猜你喜欢

转载自blog.csdn.net/Anna_Liqi/article/details/110305343