1.子查询和联合查询的区别有几点?
2.子查询改写成联合查询后的SQL语句是否错误?
3.在实际的操作过程中,我们如何写健壮的SQL语句?
1.两者的区别主要是在效率上,INNER JOIN通常效率比IN高许多
一般应当避免用IN
当两张表的关系是1:1的时候,可以直接将IN逻辑改写成为INNER JOIN
当两张表的关系是1:N的时候,直接改写为INNER JOIN就会导致迪卡尔积
从而得到重复记录
这时候应当采用以下形式
Sql代码
SELECT
雇员.雇员ID,
雇员.姓氏,
雇员.名字,
雇员.邮政编码,
雇员.城市,
雇员.地址,
雇员.家庭电话,
X.CNT
FROM 雇员
INNER JOIN (
SELECT
订单.雇员ID,
COUNT(*) AS CNT
FROM 订单
GROUP BY 订单.雇员ID
HAVING COUNT(*) > 100
) X ON
雇员.雇员ID = X.雇员ID
当然,当订单表中数据很多的时候,上面的这个SQL语句可能仍然有效率问题
最简单的解决办法是在雇员加一个“订单数”的字段
每次订单插入/删除的时候修改这个字段即可
3.在实际写联合查询语句的时候,为了写出正确的SQL语句
最要紧的就是理清表与表之间的关系,
在处理1:N,N:M关系的时候,注意避免迪卡尔积
自己的一些语句的区别:
--笛卡尔积
1,
select * from doc_CollectDoc d ,doc_DocInceptPerson p
where d.docId = p.doc_SendDoc_id
and p.department = '1'
2,
select * from doc_CollectDoc d INNER JOIN (
select DISTINCT p.doc_SendDoc_id from doc_DocInceptPerson p where p.department = '1'
) x on
d.docId = x.doc_SendDoc_id
3,
select * from doc_CollectDoc d where d.docId in (
select p.doc_SendDoc_id from doc_DocInceptPerson p where p.department = '1'
)
2.子查询改写成联合查询后的SQL语句是否错误?
3.在实际的操作过程中,我们如何写健壮的SQL语句?
1.两者的区别主要是在效率上,INNER JOIN通常效率比IN高许多
一般应当避免用IN
当两张表的关系是1:1的时候,可以直接将IN逻辑改写成为INNER JOIN
当两张表的关系是1:N的时候,直接改写为INNER JOIN就会导致迪卡尔积
从而得到重复记录
这时候应当采用以下形式
Sql代码
SELECT
雇员.雇员ID,
雇员.姓氏,
雇员.名字,
雇员.邮政编码,
雇员.城市,
雇员.地址,
雇员.家庭电话,
X.CNT
FROM 雇员
INNER JOIN (
SELECT
订单.雇员ID,
COUNT(*) AS CNT
FROM 订单
GROUP BY 订单.雇员ID
HAVING COUNT(*) > 100
) X ON
雇员.雇员ID = X.雇员ID
当然,当订单表中数据很多的时候,上面的这个SQL语句可能仍然有效率问题
最简单的解决办法是在雇员加一个“订单数”的字段
每次订单插入/删除的时候修改这个字段即可
3.在实际写联合查询语句的时候,为了写出正确的SQL语句
最要紧的就是理清表与表之间的关系,
在处理1:N,N:M关系的时候,注意避免迪卡尔积
自己的一些语句的区别:
--笛卡尔积
1,
select * from doc_CollectDoc d ,doc_DocInceptPerson p
where d.docId = p.doc_SendDoc_id
and p.department = '1'
2,
select * from doc_CollectDoc d INNER JOIN (
select DISTINCT p.doc_SendDoc_id from doc_DocInceptPerson p where p.department = '1'
) x on
d.docId = x.doc_SendDoc_id
3,
select * from doc_CollectDoc d where d.docId in (
select p.doc_SendDoc_id from doc_DocInceptPerson p where p.department = '1'
)