多表查询--内连接查询-- 外连接查询--子查询--多表查询练习
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | 1.多表查询 笛卡尔积:有两个集合A,B,取这两个集合的所有组成情况 要完成多表查询,需要消除无用的数据 内连接查询 隐式内连接 -- 查询所有员工信息和对应的部门信息 SELECT * FROM emp,dept WHERE emp. 'dept_id' = dept. 'id' ; -- 查询员工表的名称,性别,部门名称 SELECT emp. name ,emp.gender,dept. name FROM emp,dept WHERE emp. 'dept_id' = dept. 'id' ; SELECT t1. name , -- 员工表的姓名 t1.gender, -- 员工表的性别 t2. name -- 部门表的名称 FROM emp t1, dept t2 WHERE t1. 'dept_id' = t2. 'id' ; 显式内连接 语法: select 字段列表 from 表名1 inner join 表名2 on 条件 SELECT * FROM emp INNER JOIN dept ON emp. 'dept_id' = dept. 'id' ; SELECT * FROM emp JOIN dept ON emp. 'dept_id' = dept. 'id' ; 外连接查询 1.左外连接: 语法: select 字段列表 from 表1 left [ outer ] join 表2 on 条件; -- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称 SELECT t1.*,t2. 'name' FROM emp t1,dept t2 WHERE t1. 'dept_id' = t2. 'id' ; ------- 查询的是左表所有的数据以及其交集部分 SELECT t1.*,t2. 'name' FROM emp t1 LEFT JOIN dept t2 ON t1. 'dept_id' = t2. 'id' ; 1.右外连接: 2.2.13.1 子查询- 查询中嵌套查询,称嵌套查询为子查询 -- 查询工资最高的员工信息 -- 1.查询最高的工资是多少 9000 SELECT MAX (salary) FROM emp; -- 2.查询员工信息,并且工资等于9000的 SELECT * FROM emp WHERE emp. 'salary' = 9000; -- 一条sql就完成这个操作 SELECT * FROM emp WHERE emp. 'salary' = ( SELECT MAX (salary) FROM emp); 1.子查询的结果是单行单列的; --运算符:> >= < <= = 2.子查询的结果是多行单列的; 3.子查询的结果是多行多列的; -- 查询财务部和市场部所有的员工信息 SELECT id FROM dept WHERE NAME = '财务部' OR NAME = '市场部' ; SELECT * FROM emp WHERE dept_id = 3 OR dept = 2; SELECT * FROM emp WHERE dept_id IN (3,2); -- 多行单列的 使用运算符 IN SELECT * FROM emp WHERE dept_id IN ( SELECT id FROM dept WHERE NAME = '财务部' OR NAME = '市场部' ); -- 多行多列 子查询可以作为一张虚拟表 --查询员工入职日期是2011-11-11日之后的员工信息和部门信息 SELECT * FROM emp WHERE emp. 'join_date' > '2011-11-11' ; SELECT * FROM dept t1,( SELECT * FROM emp WHERE emp. 'join_date' > '2011-11-11' ) t2 WHERE t1.id = t2.dept_id -- 用普通的内连接实现 SELECT * FROM emp t1,dept t2 WHERE t1. 'dept_id' = t2. 'id' AND t1. 'join_data' > '2011-11-11' ; 2.2.14.8 多表查询练习 3.查询员工姓名,工资,工资等级 分析:1.员工姓名,工资emp 工资等级 salarygrade SELECT t1.ename, t1. 'salary' , t2.* FROM emp t1,salarygrade t2 WHERE t1. 'salary' BETWEEN t2. 'losalary' AND t2. 'hisalary' ; 4.查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级 分析:1.分别对应四张表 2.条件 emp.job_id = job.id and emp.dept_id = dept.id and emp.salary BETWEEN SELECT t1. 'ename' , t1. 'salary' , t2. 'jname' , t2. 'description' , t3. 'dname' , t3. 'loc' , t4. 'grade' FROM emp t1,job t2,dept t3,salarygrade t4 WHERE t1. 'job_id' = t2. 'id' AND t1. 'dept_id' = t3. 'id' AND t1. 'salary' BETWEEN t4. 'losalary' AND t4. 'hisalary' ; 5.查询出部门编号,部门名称,部门位置,部门人数 分析:1.dept 表 emp表 2.使用分组查询,按照emp.dept_id完成分组,查询 count (id) 3.使用子查询将第二步的查询结果和dept表进行关联查询 SELECT dept_id, COUNT (id) FROM emp GROUP BY dept_id ------------- SELECT t1. 'id' ,t1. 'dname' ,t1. 'loc' ,t2.total FROM dept t1, ( SELECT dept_id, COUNT (id) total FROM emp GROUP BY dept_id) t2 WHERE t1. 'id' = t2.dept_id; 6.查询所有员工的姓名及其直接上级的名称,没有领导的员工也需要查询 分析:1.姓名 emp ,直接上级的姓名 emp emp表的id和mgr是自关联 2.条件emp.id = emp.mgr 3.查询左表的所有数据,和交集数据-使用左外连接查询 SELECT t1.ename, t1.mgr, t2. 'id' , t2.ename FROM emp t1,emp t2 WHERE t1.mgr = t1. 'id' ---------------- SELECT t1.ename, t1.mgr, t2. 'id' , t2. 'ename' FROM emp t1 LEFT JOIN emp t2 ON t1. 'mgr' = t2. 'id' ; |
分类:
MySQL
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?