ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

MySQL夯实基础6: 使用SQL语句实现多表查询-连接查询,嵌套(子)查询,联合查询

MySQL夯实基础6: 使用SQL语句实现多表查询-连接查询,嵌套(子)查询,联合查询 接上一期使用SELECT语句针对一张表开展单表查询, 条件查询及聚合查询本节依然是使用到SELECT语句针对多张表开展连接查询, 嵌套(子)查询, 联合查询.下一期预告: 使用SQL语句定义、命名、更新完整性约束的操作方法及应用.连接查询两张表或多张表存在相同意义的字段时便可以通过这些字段对相关的表进行连接查询CROSS JOIN 交叉连接笛卡尔积把一张表的每一行与另一张表的每一行连接起来返回两张表的每一行相连接后所有可能的搭配结果结果集是两张表记录行数的乘积#语法格式SELECT * FROM table1CROSS JOIN table2;SELECT * FROM table1, table2;INNER JOIN 内连接在查询中通过ON设置连接条件来移除交叉连接查询结果集中某些数据行.#INNER JOIN 显式语法SELECT tb_emp.*, tb_dept.* FROM tb_emp INNER JOIN tb_dept ON tb_emp.empIDtb_dept.empID;#WHERE 隐式语法SELECT tb_emp.*, tb_dept.* FROM tb_emp, tb_dept WHERE tb_emp.empIDtb_dept.empID;自连接某张表与自身进行连接, 称为自表连接或自身连接一定要为表指定多个不同的别名且对所有查询字段的引用均必须使用表别名限定否则SELECT操作会失败.#查询与数据部(含)这部门楼层相同的其他部门信息.SELECT d1.* FROM tb_dept d1, tb_dept d2 WHERE d1.floord2.floor ANDd2.deptName数据部;#查询与数据部(不含)这部门楼层相同的其他部门信息.SELECT d1.* FROM tb_dept d1, tb_dept d2 WHEREd1.floord2.floor ANDd2.deptName数据部AND d1.deptName!数据部;OUTER JOIN 外连接返回查询结果集中不仅包含符合连接条件的行, 而且还包含两张连接表中不符合连接条件的行.外连接 基表 参考表LEFT [OUTER] JOIN 左外连接tb_emp: empNo, empName, sex, deptNo; tb_score: courseNo, score#使用左外连接查询所有员工及其选修课程的情况,包括没有选修课程的员工,要求显示员工号, 姓名, 性别, 部门号, 选修的课程号和成绩.SELECT a.empNo, empName, sex, deptNo, courseNo, score FROM tb_emp a LEFT OUTER JOIN tb_score b ON a.empNob.empNo;RIGHT [OUTER] JOIN 右外连接#使用右 外连接查询所有员工及其选修课程的情况,包括没有选修课程的员工,要求显示员工号, 姓名, 性别, 部门号, 选修的课程号和成绩.SELECT courseNo, score, b.empNo, empName, sex, deptNo FROM tb_score a RIGHT OUTER JOIN tb_emp b ON a.empNob.empNo;嵌套(子)查询子查询也称嵌套查询是将一条查询句嵌套在另一条查询语句的WHERE子句中。带IN关键字的子查询内层查询语句返回一个数据列#查询选修了课程的员工姓名SELECT empName FROM tb_emp WHERE tb_emp.empNo IN(SELECT DISTINCT tb_score.empNo From tb_score);#查询没有选修过课程的员工姓名SELECT empName FROM tb_emp WHERE tb_emp.empNo NOT IN(SELECT DISTINCT tb_score.emoNo FROM tb_score);带比较运算符的子查询指父查询与子查询之间用比较运算符进行连接当用户能确切指导内层查询返回的是单值时 可以用, , , , , , !等比较运算符构造子查询#查询部门‘市场部’所有学生的学号、姓名SELECT empNo, empName FROM tb_emp WHERE deptNo(SELECT deptNo FROM tb_dept WHEREdeptName市场部;比较运算符还可以与ALLSOME和ANY关键字一起构造子查询ALL - 指定表达式需要与子查询结果集中的每个值都进行比较SOME和ANY - 同义词表示表达式与子查询结果集中的某个值满足比较关系就返回TRUE#查询男生中比某名女生出生年份晚的员工姓名和出生年份SELECT empName, YEAR(birthday)FROM tb_emp WHEREsexmAND YEAR(birthday)ANY(SELECT YEAR(birthday)FROM tb_emp WHEREsexF);#查询男生中比所有女生出生年份晚的学生姓名和出生年份SELECT empName, YEAR(birthday)FROM tb_emp WHEREsexmAND YEAR(birthday)ALL(SELECT YEAR(birthday)FROM tb_emp WHEREsexF);带EXISTS关键字的子查询#查询选修了课程号为02的员工姓名SELECT empName FROM tb_emp e WHERE EXISTS(SELECT * FROM tb_score s WHEREe.empNos.empNo ANDcourseNo02);#查询没有选修了课程号为02的员工姓名SELECT empName FROM tb_emp e WHERE NOT EXISTS(SELECT * FROM tb_score s WHEREe.empNos.empNo ANDcourseNo02);#查询选修了全部课程的学生姓名#等价于 查询这样的学生没有一门课程是他没有选修的SELECT empName FROM tb_emp e WHERE NOT EXISTS(SELECT * FROM tb_course c WHERE NOT EXISTS(SELECT * FROM tb_score WHEREempNoe.empNo ANDcourseNOc.courseNo));UNION 联合查询又称为并运算使用UNION关键字把来自多条SELECT语句的结果组合到一个结果集中合并时多条SELECT子句中对应的字段数和数据类型必须相同UNION ALL不去掉重复纪录不对结果进行自动排序#使用UNION查询选修了管理学或计算机基础的员工学号SELECT empNo FROM tb_score WHEREcourseNo(SELECT courseNo FROM tb_course WHEREcourseName管理学)UNION SELECT empNo FROM tb_score WHEREcourseNo(SELECT courseNo FROM tb_course WHEREcourseName计算机基础)总结一下a. 连接查询笛卡尔积Cross Join, 内连接 Inner Join … ON … , 自表连接(表别名限制), 外连接(Left/Right Outer Join)b. 嵌套(子)查询 IN关键词比较运算符EXISTS关键词c. 联合查询UNION UNION ALL不查重不自动排序下期预告MYSQL夯实基础7之使用SQL语句定义、命名、更新完整性约束的操作方法及应用.
返回列表