MySQL多表关联查询+子查询_R

来源:互联网 发布:汇丰银行 软件 招聘 编辑:程序博客网 时间:2024/06/08 06:17
MySQL多表关联查询+子查询
  1. -- **************关联查询(多表查询)****************
  2. -- 多表查询规则:1)确定查询哪些表。 2)确定哪些字段。 3)表与表之间连接关系(规律:连接条件数量=表数量-1)。
  3. -- ***1.交叉连接查询(笛卡尔乘积,查询条数=表1数据条数*表2数据条数。基本不会用)=cross join
  4. SELECT empName AS '姓名', deptName AS '部门名称' FROM emp, dept;
  5. -- 需求:查询员工及其所在部门(显示员工姓名,部门名称)
  6. -- ***2.内连接查询(只有满足条件的结果才会显示。使用最频繁)
  7. -- 2.1语法一,隐式内连接
  8. SELECT empName AS '姓名', deptName AS '部门名称' -- 2)确定哪些字段
  9. FROM emp, dept -- 1) 先确定查询哪些表
  10. WHERE emp.deptId=dept.id;-- 3) 表与表之间连接关系
  11. -- 2.2语法二 显示内连接
  12. SELECT empName AS '姓名', deptName AS '部门名称'
  13. FROM emp
  14. INNER JOIN dept
  15. ON emp.deptId=dept.id; -- 注意这里用on
  16. -- 使用别名
  17. SELECT e.empName AS '姓名', d.deptName AS '部门名称'
  18. FROM emp e
  19. INNER JOIN dept d -- inner join 等价于 join
  20. ON e.deptId=d.id;
  21. -- 需求:查询每个部门的员工
  22. -- ***3.左(外)链接查询(使用左边表的数据去匹配右边表的数据,如果符合连接条件的结果则显示,如果不符合连接则显示null
  23. -- 注意:左外连接:左边的数据一定会完整显示。
  24. SELECT d.deptName "部门", e.empName "员工"
  25. FROM dept d
  26. LEFT OUTER JOIN emp e -- left outer join 等价于 left join
  27. ON d.id=e.deptId;
  28. -- ***4.右(外)链接查询(使用右边表的数据去匹配左边表的数据,如果符合连接条件的结果则显示,如果不符合连接则显示null
  29. SELECT d.deptName "部门", e.empName "员工"
  30. FROM emp e
  31. RIGHT OUTER JOIN dept d -- left outer join 等价于 left join
  32. ON d.id=e.deptId;
  33. -- *****************修改表数据*******************
  34. ALTER TABLE emp ADD bossId INT;
  35. UPDATE emp SET bossId=1 WHERE id = 2;
  36. UPDATE emp SET bossId=2 WHERE id = 3;
  37. UPDATE emp SET bossId=3 WHERE id = 4;
  38. UPDATE emp SET bossId=4 WHERE id = 5;
  39. -- ***5.自连接查询
  40. -- 需求:查询员工及其上司
  41. SELECT e.empName "员工", s.empName "上司"
  42. FROM emp e
  43. LEFT OUTER JOIN emp s
  44. ON e.bossId = s.id;
  45. -- ***6.子查询(嵌套查询)
  46. -- 需求:员工id=1所在部门的所有员工信息
  47. -- 1.查询员工id=1所在的部门
  48. SELECT deptId FROM emp WHERE emp.id=1;
  49. -- 2.查询该部门所有员工信息
  50. SELECT * FROM dept WHERE dept.id=(SELECT deptId FROM emp WHERE emp.id=1);

重点:子查询

  注意:
   1) 子查询作为中间表时,必须给中间表取一个别名。
    2)当子查询查询的结果有多个时,作为条件使用时用 in
    3)注意当子查询的结果作为中间表,当做条件使用时,最好用 in ,因为不确定中间表的结果数据条数,用in比较保险。
注意1证明:

 
注意2证明: 需求4:查询“html”课程考试成绩为60-80分的学生名单
①一个单表查询

 
②用①中查出的数据,作为子查询的条件数据。


③用②中查出的数据,作为子查询的中间表。


注意:上面子查询结果作为中间表使用,必须取别名,否则报错:错误码: 1248 Every derived table must have its own alias
 死
④用③中查出的数据,作为子查询的条件数据。完成查询
  1. SELECT *
  2. FROM student s
  3. WHERE s.sId IN (SELECT sId FROM(SELECT se.sId, se.score FROM studentExam se WHERE se.geId=(SELECT ge.geId FROM gradeExam ge WHERE ge.eName="html课程")) m WHERE score BETWEEN 60 AND 80);

 
0 0