内容简介:多表查询中,如果没有连接条件,则会产生笛卡尔积数学中的定义:假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}
多表查询:
select listname from tablename1,tablename2;
笛卡尔积
多表查询中,如果没有连接条件,则会产生笛卡尔积
数学中的定义:假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为
{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}
实际运行环境下,应避免使用笛卡尔积;
解决方案:
在where加入有效的连接条件-----> 等值连接(连接n张表,需要n-1个连接条件)
select * from employee,department where employee.deptno = department.deptno
主键约束
约束当前表中,指定列的值非空且唯一
外键约束
表A中的外键列的值必须参照表B中的某一列的值
MySQL中, InnoDB支持外键和事务,MyISAM不支持外键和事务
/* 修改表的存储引擎 */ alter table [tablename] engine='InnoDB'; alter table [tablename] engine='MyISAM';
添加外键后:
一般情况下,如果列要使用外键列,可以这样命名: 引用表名_引用列名
我们要引用productdir表中的id列
在开发中,为了提高性能,会故意删除外键约束,通过代码来控制数据的合理性。
隐式连接
隐式內连接(看不到连接):仅选出两张表中互相匹配的记录
隐式连接缺点:
- 需要在where条件中加入连接条件,如果忘了写,代码不会报错,但是会产生笛卡尔积
- 只能做内连接
显示连接
内连接查询:查询效果和隐式内连接相同
select [table.list],[table.list] from [table] join [table] on(连接关系); select e.empno,e.name,d.dname from emp e join dept d on(e.deptno = d.deptno); /* 连接关系列名相同可以用using */ select e.empno,e.name,d.dname from emp e join dept d using(deptno);
外连接:
- 左连接:将join左边表全部数据都查询处理啊,join右边表不匹配的数据NULL填充
/* 将左边表所有数据都显示 */ select * from emp left join dept using(deptno);
- 右连接
- 全外连接:MySQL暂时不支持
自连接:把一张表看成两张表来做查询
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Mybatis关联查询(嵌套查询)
- MySQL高级查询---连接查询实例
- Oracle子查询相关内容(包含TOP-N查询和分页查询)
- Laravel Query Builder 复杂查询案例:子查询实现分区查询 partition by
- 打造出色查询:如何优化SQL查询?
- SQL优化-慢查询+explain查询
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。