select * from a,b
今天代码中写脚本用了select * from a,b where a.id = b.id.然后同事说让我写内连接,我说这就是内连接啊。结果同事说这怎么会是内连接,这是笛卡尔乘积。我当时有点惊呆了,在原来公司都是这样写啊,难道这不是内连接,后来百度一下,发现:
单纯的select * from a,b是笛卡尔乘积。
但是如果对两个表进行关联:select * from a,b where a.id = b.id 意思就变了,此时就等价于:
select * from a inner join b on a.id = b.id。即就是内连接。
原来是这样。
但是据说这种写法并不符合规范,可能只对某些数据库管用,如sqlserver。推荐最好不要这样写。最好写成inner join的写法
用EXISTS替换DISTINCT ,提高效率
用EXISTS替换DISTINCT: 当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换, EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.尽量使用exists而不是distinct,因为distinct在禁止重复行之前要排序检索到的行。
例子:
(低效):
SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E WHERE D.DEPT_NO = E.DEPT_NO
(高效):
SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X' FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);
用EXISTS的确可以替代DISTINCT,不过以上方案仅适合DEPT_NO为唯一主键的情况。 如果要去掉重复记录,需参照以下方法:
SELECT * FROM EMP WHERE DEPT_NO EXISTS(select Max(DEPT_NO) FROM DEPT D , EMP E WHERE E.DEPT_NO = D.DEPT_NO GROUP BY D.DEPT_NO)
得到重复记录数
SELECT * FROM EMP WHERE DEPT_NO NOT EXISTS(select Max(DEPT_NO) FROM DEPT D , EMP E WHERE E.DEPT_NO = D.DEPT_NO GROUP BY D.DEPT_NO)