多表查询的概述: 同时查询多张表获取到需要的数据
例如:我们想查询到开发部有多少人,需要将部门表和员工表同时进行查询
多表查询的分类:
内连接查询
显示内连接
隐式内连接
外连接查询
左外连接
右外连接
子查询
子查询的结果是一个值的
子查询的结果是单列多行的
子查询的结果是多列多行的
内连接的概述:用左边表的记录去匹配右边表的记录,如果符合条件的则显示
隐式内连接: 看不到JOIN关键字,条件使用WHERE指定
语法: select 查询的字段 from 左表,右表 where 条件;
多表查询步骤的结论:
1.确定需要查那几张表
2.确定关联条件(表的关联条件,其他条件)
3.确定需要查询的字段
4.确定是内连接,外连接,子查询
子查询的注意事项:子查询结果只要是多列,肯定在FROM后面作为表
SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件;子查询作为表需要取别名,否则这张表没用名称无法访问表中的字段。
-- 练习1:查询所有员工信息。显示员工编号,员工姓名,工资,职务名称,职务描述 2张表
-- 1.确定需要查那几张表: emp e,job j
-- 2.确定关联条件: e.job_id=j.id
-- 3.确定需要查询的字段: e.id,e.ename,e.salary,j.jname,j.description
-- 4.确定内连接
SELECT e.id,e.ename,e.salary,j.jname,j.description FROM emp e,job j WHERE e.job_id=j.id
-- 练习2:查询所有员工信息。显示员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置 3张表
-- 1.确定需要查那几张表: emp e,job j,dept d
-- 2.确定关联条件: e.job_id=j.id and e.dept_id=d.id
-- 3.确定需要查询的字段: e.id,e.ename,e.salary,j.jname,j.description,d.dname,d.loc
-- 4.确定内连接
SELECT e.id,e.ename,e.salary,j.jname,j.description,d.dname,d.loc FROM emp e,job j,dept d WHERE e.job_id=j.id AND e.dept_id=d.id
-- 练习3:查询所有员工信息。显示员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级 4张表
-- 1.确定需要查那几张表: emp e,job j,dept d,salarygrade s
-- 2.确定关联条件: e.job_id=j.id and e.dept_id=d.id and e.salary between s.losalary and s.hisalary
-- 3.确定需要查询的字段: e.ename,e.salary,j.jname,j.description,d.dname,d.loc,s.grade
-- 4.确定内连接
SELECT e.ename,e.salary,j.jname,j.description,d.dname,d.loc,s.grade FROM emp e,job j,dept d,salarygrade s WHERE e.job_id=j.id AND e.dept_id=d.id AND e.salary BETWEEN s.losalary AND s.hisalary
-- 练习4:查询经理的信息。显示员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
-- 1.确定需要查那几张表: emp e,job j,dept d,salarygrade s
-- 2.确定关联条件: e.job_id=j.id and e.dept_id=d.id and e.salary between s.losalary and s.hisalary and j.jname='经理'
-- 3.确定需要查询的字段: e.ename,e.salary,j.jname,j.description,d.dname,d.loc,s.grade
-- 4.确定内连接
SELECT e.ename,e.salary,j.jname,j.description,d.dname,d.loc,s.grade FROM emp e,job j,dept d,salarygrade s WHERE e.job_id=j.id AND e.dept_id=d.id AND e.salary BETWEEN s.losalary AND s.hisalary AND j.jname='经理'
-- 练习5:查询出部门编号、部门名称、部门位置、部门人数
-- 子查询:查询部门人数
SELECT dept_id,COUNT(*) total FROM emp GROUP BY dept_id
-- 练习8: 列出所有员工的姓名及其直接上级的姓名,没有领导的员工也需要显示
-- 1.确定需要查那几张表:emp e1,emp e2
-- 2.确定关联条件:e1.mgr = e2.id
-- 3.确定需要查询的字段:e1.ename,e2.ename
-- 4.确定左外连接
SELECT e1.ename,e2.ename FROM emp e1 LEFT OUTER JOIN emp e2 ON e1.mgr = e2.id
-- 练习9:查询入职期早于直接上级的所有员工编号、姓名、部门名称
-- 1.确定需要查那几张表:emp e1,emp e2,dept d
-- 2.确定关联条件:e1.mgr = e2.id and e1.dept_id=d.id and e1.joindate < e2.joindate
-- 3.确定需要查询的字段:e1.id,e1.ename,d.dname
-- 4.确定内连接
SELECT e1.id,e1.ename,d.dname FROM emp e1,emp e2,dept d WHERE e1.mgr = e2.id AND e1.dept_id=d.id AND e1.joindate < e2.joindate
-- 练习10:查询工资高于公司平均工资的所有员工信息。显示员工信息,部门名称,上级领导,工资等级
-- 查询公司的平均工资
SELECT AVG(salary) FROM emp -- 20732.1
-- 1.确定需要查那几张表:emp e1,emp e2,dept d,salarygrade s
-- 2.确定关联条件:e1.mgr = e2.id and e1.dept_id=d.id and e1.salary between s.losalary and s.hisalary and e1.salary > (SELECT AVG(salary) FROM emp )
-- 3.确定需要查询的字段:e1.*,d.dname,e2.ename,s.grade
-- 4.确定内连接
SELECT e1.*,d.dname,e2.ename,s.grade FROM emp e1,emp e2 , dept d , salarygrade s
WHERE e1.mgr = e2.id AND e1.dept_id=d.id AND e1.salary BETWEEN s.losalary AND s.hisalary AND e1.salary > (SELECT AVG(salary) FROM emp )
SELECT * FROM emp ORDER BY salary DESC
SELECT e1.*,d.dname,e2.ename,s.grade FROM emp e1 LEFT JOIN emp e2 ON e1.mgr = e2.id
LEFT JOIN dept d ON e1.dept_id=d.id
LEFT JOIN salarygrade s ON e1.salary BETWEEN s.losalary AND s.hisalary
WHERE e1.salary > (SELECT AVG(salary) FROM emp )
详细解决方案
MySQL多表查询几种不同示例
热度:68 发布时间:2024-01-25 02:33:48.0
相关解决方案
- mysql 简单化 or能否实现
- 请问registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister
- MySQL 5.5 Command Line Client 窗口1输密码就退出
- 在LINUX上配置 MySQL 开机自动 启动
- mysql 转 orocle java ssh项目一条 sql 句不通!
- 上了个 MySQL 5.5.25 但是安装时出错了
- JDBC MYSQL 驱动加载失败 JSP DAO ECLIPSE,该怎么解决
- tomcat 中抛异com.mysql.jdbc.exceptions.MySQLTransactionRollbackException,该如何处理
- struts+iBatis+mysql,该如何解决
- mysql 有外键的插入解决方案
- mysql,该如何处理
- MyBatis3.1.1 Insert 回到主键 long类型 MYSQL 数据库
- mysql:假若一个表中,有两个属性name和id,删除同名的保留id小的,问这样写有误吗
- java mysql where限制有关问题
- 救助。Mysql 的条件删除语句如何写,就是删除部门的时候,如果部门下有用户,就不能删除
- mysql 触发器 根据更新的这一列的数据来更新本行的另一列数据解决办法
- 数据库Sqlserver,Sybase,orcale,mysql 用jDBC 做分页操作的查询效率有什麽区别解决办法
- sql+mysql+chart+DataTable实现折线图分享!解决方案
- sql+mysql+chart+DataTable兑现折线图分享
- mysql diopdownlist连接数据库,该怎么解决
- MySQL 自动增长列的有关问题?求高手指导,小弟我是学生
- MySQL 主键和自增列的有关问题 新手在学 求指导
- Unable to connect to any of the specified MySQL hosts为什么连不上mysql?该如何解决
- mysql 的存储过程变量如何在 sql 中使用
- 在小公司怎么成长为高级 mysql dba
- Myeclipse+Jboss+mysql JNDI调用疏失
- Myeclipse+Jboss+mysql JNDI调用出错,该怎么解决
- mysql+weblogic连接池的有关问题
- Mysql 不明原因经常重启,造成无法访问,该怎么处理
- 数据库推选(oracle vs mysql)