运维开发网

韩国女运动员不堪欺凌自杀,发生了什么事

运维开发网 https://www.qedev.com 2022-08-11 21:43 出处:网络
这篇文章主要介绍了MySQL多表查询的案例说明,包括多表查询的分类及umion的使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 多表查询案列说明

这篇文章主要介绍了MySQL多表查询的案例说明,包括多表查询的分类及umion的使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 多表查询案列说明

对笛卡尔乘积的理解

select id,department_namefrom employees,departments;#错的select id,department_id,department_namefrom employees CROSS JOIN departments;#错的

每个雇员都与每个*部门匹配(找到的条目数= ID数*部门数)

错误:缺少连接条件。

笛卡尔积的解决

书写条件:表1。列=表2。列(如果连接了多个表,至少应该使用n-1个连接条件)

select id,employees.name,department_name from employees,departmentsWHERE employees.name = departments.name;

注意:如果要显示的列与要查询的表同名,请指明它来自哪个表,例如:employees.name

建议在查询多个表时指明显示哪个表信息(优化)。

优化:可以在FROM之后使用表的别名,但是一旦使用了别名,以后就必须使用别名。

多表查询的分类等值连接和非等值连接等值连接:上述的带有=的非等值连接:没有=的select t1.id,t1.name,t2.gradefrom employees t1,departments t2WHERE ti.salary BETWEEN t2.lowest_salary AND t2.highest_salary ;#非等值自连接和非自连接非自链接:表1和表2连接自链接:表1和自己连接#显示员工(t1)和其管理者(t2)的基本信息select t1.id,t1.name,t2.id,t2.namefrom employees t1,employees t2#一个表看作两个表WHERE t1.manage_id = t2.id ;#自连接内连接和外连接内连接:合并含有同一列的表,结果不包括一个表与另一个表不匹配打的行外连接:合并含有同一列的表,结果除了内连接的结果还查询不匹配的行

外接分类:左外接(左表多,右表多),右join(右表多,左表多),全外接。

SQL92:使用(+)创建连接

内部连接:见上文。

外部连接:左表数据不匹配,右表加(+);反之,左表加(+),但MySQL不支持。

WHERE t1.department_id = t2.department_id(+)#左连接SQL99:使用JOIN...ON的方式内连接select t1.id,t1.name,t2.department_name,t3.environmentfrom employees t1 JOIN departments t2ON t1.department_id = t2.department_idJOIN locations t3#加入第二个人表ON t2.department_location = t3.department_location;外连接

使用外部联接...安大略...

左外连接:LEFT OUTER JOIN右外连接:RIGHT OUTER JOIN满外连接:FULL OUTER JOIN(MySQL不支持)select t1.name,t2.department_name#左外连接from employees t1 LEFT OUTER(可省略) JOIN departments t2ON t1.department_id = t2.department_id;UMION的使用

合并查询结果

SELECT colum... FROM table1UNION (ALL)SELECT colum... FROM table2 UNION操作符

两个查询结果的联合,重复数据删除(低效率)

UNION ALL操作符(推荐)

两个查询结果的联合,无重复(高效率)

七种SQL连接的实现


中间图片(内部连接):

select t1.name,t2.department_namefrom employees t1 JOIN departments t2ON t1.department_id = t2.department_id;

左上侧(左侧外部连接):

select t1.name,t2.department_namefrom employees t1 LEFT JOIN departments t2ON t1.department_id = t2.department_id;

右上(右连接):

select t1.name,t2.department_namefrom employees t1 RIGHT JOIN departments t2ON t1.department_id = t2.department_id;

中间图片:

select t1.name,t2.department_namefrom employees t1 LEFT JOIN departments t2ON t1.department_id = t2.department_idWHERE t2.department_id IS NULL;

中间图片:

select t1.name,t2.department_namefrom employees t1 RIGHT JOIN departments t2ON t1.department_id = t2.department_idWHERE t1.department_id IS NULL;

左下方(完全外部连接):

#方式一:左上图 UNION ALL 右中图select t1.name,t2.department_namefrom employees t1 LEFT JOIN departments t2ON t1.department_id = t2.department_idUNION ALL select t1.name,t2.department_namefrom employees t1 RIGHT JOIN departments t2ON t1.department_id = t2.department_idWHERE t1.department_id IS NULL;#方式二:左中图 UNION ALL 右上图select t1.name,t2.department_namefrom employees t1 LEFT JOIN departments t2ON t1.department_id = t2.department_idWHERE t2.department_id IS NULLUNION ALLselect t1.name,t2.department_namefrom employees t1 RIGHT JOIN departments t2ON t1.department_id = t2.department_id;

右下角:

#左中图 UNION ALL 右中图select t1.name,t2.department_namefrom employees t1 LEFT JOIN departments t2ON t1.department_id = t2.department_idWHERE t2.department_id IS NULLUNION ALLselect t1.name,t2.department_namefrom employees t1 RIGHT JOIN departments t2ON t1.department_id = t2.department_idWHERE t1.department_id IS NULL;SQL语法新特性自然连接

使用关键字:NATURAL JOIN(flexible)自动查询表中所有相同的字段,然后执行equijoin。

USING连接(不适用于自连接)

使用关键字:使用(同名字段)自动等联接表中的同名字段。

select t1.name,t2.department_namefrom employees t1 JOIN departments t2ON t1.department_id = t2.department_id;等价于select t1.name,t2.department_namefrom employees t1 JOIN departments t2USING(department_id);

关于MySQL多表查询的这篇文章到此为止。关于MySQL多表查询的更多信息

0

精彩评论

暂无评论...
验证码 换一张
取 消