笛卡尔积现象
笛卡尔乘积现象:如果两张表进行连接查询,在没有任何条件限制的情况下,最终查询的结果条数是两张表的记录条数乘积
(1)为了方便举例,我们可以在如下第024章节中的company数据库中创建一张新的数据表depart(部门表),depart(部门表)和第024章节的salary(薪资表)的部门关联起来
第024章节:https://blog.youkuaiyun.com/weixin_43184774/article/details/115487875
salary薪资表如下:
创建depart(部门表):
CREATE TABLE depart(
departno INT(8) NOT NULL,
departname VARCHAR(255) NOT NULL,
location VARCHAR(255) NOT NULL
);
(2)往这个新创建的depart(部门表)中插入数据
INSERT INTO depart VALUES
(10,'研发部','NEW YORK'),
(20,'项目部','DALLAS'),
(30,'财务部','BOSTON');
depart部门表如下:
例:查询出每个员工的部门名称,要求显示员工姓名和部门名称
分析:
(1)先从salary(薪资表)中查询出员工的姓名和部门编号
SELECT name,departno FROM salary;
(2)再从depart(部门表)中查询部门的所有信息
SELECT * FROM depart;
(3)笛卡尔乘积结果:
SELECT name,departname FROM salary,depart;
//salary(薪资表)15条记录 * depart(部门表)3条记录,共45条记录
(4)关于表的别名
上面第(3)步可以采用别名的形式进行查询,写法如下:
SELECT n.name,d.departname FROM salary n,depart d;
(5)如何避免笛卡尔积现象?
因为在salary(薪资表)和depart(部门表)有一个共同的字段,即部门编号departno,所以我们的WHERE查询可以根据这个部门编号(departno)来查询,即可避免笛卡尔积现象
所以针对上面的例子,正确写法如下:
SELECT
n.name,d.departname
FROM
salary n,depart d
WHERE
n.departno = d.departno;
注意:
以上第(5)步的SQL语句是SQL92式的写法,这种已经很少在用了
思考:
如果避免了笛卡尔积现象,会减少记录的匹配次数吗?
答案:
不会!!!,底层原理中匹配次数是不会变的,只不过显示的是有效记录