0
点赞
收藏
分享

微信扫一扫

SQL学习笔记整理5(多表查询sql99 join on)

Spinach菠菜 2022-02-26 阅读 102
sql学习

#sql99语法

/*
语法:
     select 查询列表
     from 表1 别名1 【连接类型】
     join 表2 别名2
     on 连接条件
     【where 筛选条件】
     【group by 分组列表】
     【having 筛选条件】
     【order by 排序列表】
     
 分类
    内连接(*):【inner】:求两表中的相匹配的记录(交集)
    外连接
          左外(*):left 【outer】
          右外(*):right【outer】
          全外:full【outer】
    交叉连接:cross
*/
USE myemployees;
#一>、内连接

(两表相匹配的记录)和sql92结果相同;==求交值

#1、等值连接
#案例1:查询员工名、部门名
SELECT last_name,department_name FROM employees e INNER JOIN departments d ON e.`department_id`=d.`department_id`;

#加筛选
#案例2:查询名字中包含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%';

#添加分组和查询
#案例3:查询部门个数>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 
  department_name,
  COUNT(employee_id) 员工个数 
FROM
  employees e 
  INNER JOIN departments d 
    ON e.`department_id` = d.`department_id` 
GROUP BY department_name 
HAVING 员工个数 > 3 
ORDER BY 员工个数 DESC;

#案例5:查询员工名、部门名、工种名,并按部门名降序
SELECT 
  last_name,
  department_name,
  job_title 
FROM
  employees e 
  INNER JOIN departments d 
    ON e.`department_id` = d.`department_id` 
  INNER JOIN jobs j 
    ON e.`job_id` = j.`job_id` 
ORDER BY d.`department_name` DESC ;

#2、非等值连接
#案例1:查询员工的工资级别
SELECT 
  last_name,
  salary,
  grade_level 
FROM
  employees e 
  JOIN job_grades j 
    ON e.`salary` BETWEEN j.`lowest_sal` 
    AND j.`highest_sal` ORDER BY j.`grade_level`;
 
#案例2:查询每个工资级别的员工个数,按照个数降序排序
SELECT 
  COUNT(*) 员工个数,
  grade_level 
FROM
  employees e 
  JOIN job_grades j 
    ON e.`salary` BETWEEN j.`lowest_sal` 
    AND j.`highest_sal` 
GROUP BY grade_level 
HAVING 员工个数>20
ORDER BY 员工个数 DESC ;


#案例:查询员工名和上级名
SELECT e.last_name 员工名,m.last_name 上级名 FROM employees e INNER JOIN employees m ON e.`manager_id` = m.`employee_id`;


#二>、外连接
/*
应用场景:主表有的记录,附表没有与之匹配的

特点:
     左(右)外连接的查询结果为主表中的所有记录:
        如果在从表中有与它相匹配的,则显示匹配的值
        如果在从表中没有与它相匹配的,则显示为Null
        外连接结果= 内连接结果(匹配)+主表中有二从表中没有的记录

        
      判断主表:左外左边的,右外右边的
      
     
     全外连接=内连接+表1中有但表2中没有的记录+表2中有但表1中没有的记录
*/

#左(右)外连接

#案例1:查询没有男朋友的女神名
USE girls;

#比较下面显示结果体会外连接
SELECT g.*,b.* FROM boys b LEFT JOIN beauty g ON g.`boyfriend_id`=b.`id`;
SELECT g.*,b.* FROM beauty g LEFT JOIN boys b ON g.`boyfriend_id`=b.`id`;
SELECT g.*,b.* FROM beauty g LEFT JOIN boys b ON g.`boyfriend_id`=b.`id` WHERE b.id IS NULL;

#案例1:查询哪个部门没有员工(部门表有记录,但员工表没有相匹配的
USE myemployees;
SELECT 
  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 ;

#全外
USE girls;
SELECT g.*,b.* FROM beauty g FULL OUTER JOIN boys b ON g.`boyfriend_id` = b.id;


#交叉连接
SELECT g.*,b.* FROM beauty g CROSS JOIN boys b ;

#sql92和sql99

#练习1:查询编号>3的女神的男朋友信息,如果有则详细列出,没有用Null填充
SELECT g.id,b.* FROM beauty g LEFT JOIN boys b ON g.`boyfriend_id`=b.`id` WHERE g.`id`>3;

#练习2:查询哪个城市没有部门
USE myemployees;
SELECT l.city FROM locations l LEFT JOIN departments d ON l.`location_id`=d.`location_id` WHERE d.`department_id` IS NULL;

#练习3:查询部门名为sal或IT的员工信息
SELECT 
  e.*,
  d.`department_name` 
FROM
  employees e 
  INNER JOIN departments d 
    ON e.`department_id` = d.`department_id` 
WHERE d.`department_name` IN ('SAL', 'IT') ;

举报

相关推荐

0 条评论