select t1.orderid,t1.userinfo,t2.total from
(select o.orderid,c.customername+c.address as userinfo from ordertable o,customertable c where c.customerid=o.customerid) as T1
,
(select orderid,sum(goodprice*[count]) as total from goodtable,ordergood where goodtable.goodid=ordergood.goodid group by orderid) as T2
where t1.orderid=t2.orderid
(3 行受影响)
表 'CustomerTable'。扫描计数 3,逻辑读取 6 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'OrderTable'。扫描计数 3,逻辑读取 6 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'GoodTable'。扫描计数 0,逻辑读取 24 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'OrderGood'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。------------
select o.orderid,c.customername+c.address as userinfo, sum(goodprice*[count]) as total
from ordertable o
left join customertable c on c.customerid=o.customerid
left join ordergood d on d.orderid=o.orderid
left join goodtable e on d.goodid=e.goodid
group by o.orderid,c.customername+c.address(3 行受影响)
表 'GoodTable'。扫描计数 1,逻辑读取 13 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'OrderGood'。扫描计数 1,逻辑读取 7 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'CustomerTable'。扫描计数 1,逻辑读取 7 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'OrderTable'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--------------------------数据库中的表
订单表orderTable
id:主键,订单流水id
customerId:下订单的客户id,客户表Id的外键 订单商品表ordergoods
id:主键
orderId:订单表id的外键
goodsId:商品表id的外键
count:商品数量 商品表goods:
id:主键
name:商品名
price:单价 客户表customer:
id:主键
name:客户名
address:客户地址 诸表建表语句
create table customer(
id int(10) primary key not null,
name VARCHAR(255),
address VARCHAR(255)
) create table goods(
id int(10) primary key not null,
name VARCHAR(255),
price DOUBLE(10,2)
) create table orderTable(
id int(10) primary key not null,
customerid int(10) not null,
foreign key(customerid) references customer(id)
) create table ordergoods(
id int(10) primary key not null,
orderid int(10) not null,
goodsid int(10) not null,
count int(10),
foreign key(orderid) references orderTable(id),
foreign key(goodsid) references goods(id)
)
插值语句
insert into customer ( id, name, address ) values ( '1', '张三', '北京' )
insert into customer ( id, name, address ) values ( '2', '李四', '大连' )
insert into customer ( id, name, address ) values ( '3', '王五', '上海' ) insert into goods ( id, name, price ) values ( '11', '上衣', '240' )
insert into goods ( id, name, price ) values ( '12', '裤子', '300' )
insert into goods ( id, name, price ) values ( '13', '鞋子', '350' ) insert into ordertable ( id, customerid ) values ( '111', '1' )
insert into ordertable ( id, customerid ) values ( '112', '2' )
insert into ordertable ( id, customerid ) values ( '113', '3' ) insert into ordergoods ( id, orderid, goodsid, count ) values ( '1111', '111', '11', '20' )
insert into ordergoods ( id, orderid, goodsid, count ) values ( '1112', '112', '11', '10' )
insert into ordergoods ( id, orderid, goodsid, count ) values ( '1113', '112', '12', '15' )
insert into ordergoods ( id, orderid, goodsid, count ) values ( '1114', '113', '11', '30' )
insert into ordergoods ( id, orderid, goodsid, count ) values ( '1115', '113', '12', '45' )
insert into ordergoods ( id, orderid, goodsid, count ) values ( '1116', '113', '13', '60' ) ==================================================== 网上说join的效率非常低,为什么比我原现的SQL语句效率要高呢?针对这个查询还有更效的SQL语句吗?
(select o.orderid,c.customername+c.address as userinfo from ordertable o,customertable c where c.customerid=o.customerid) as T1
,
(select orderid,sum(goodprice*[count]) as total from goodtable,ordergood where goodtable.goodid=ordergood.goodid group by orderid) as T2
where t1.orderid=t2.orderid
(3 行受影响)
表 'CustomerTable'。扫描计数 3,逻辑读取 6 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'OrderTable'。扫描计数 3,逻辑读取 6 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'GoodTable'。扫描计数 0,逻辑读取 24 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'OrderGood'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。------------
select o.orderid,c.customername+c.address as userinfo, sum(goodprice*[count]) as total
from ordertable o
left join customertable c on c.customerid=o.customerid
left join ordergood d on d.orderid=o.orderid
left join goodtable e on d.goodid=e.goodid
group by o.orderid,c.customername+c.address(3 行受影响)
表 'GoodTable'。扫描计数 1,逻辑读取 13 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'OrderGood'。扫描计数 1,逻辑读取 7 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'CustomerTable'。扫描计数 1,逻辑读取 7 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'OrderTable'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--------------------------数据库中的表
订单表orderTable
id:主键,订单流水id
customerId:下订单的客户id,客户表Id的外键 订单商品表ordergoods
id:主键
orderId:订单表id的外键
goodsId:商品表id的外键
count:商品数量 商品表goods:
id:主键
name:商品名
price:单价 客户表customer:
id:主键
name:客户名
address:客户地址 诸表建表语句
create table customer(
id int(10) primary key not null,
name VARCHAR(255),
address VARCHAR(255)
) create table goods(
id int(10) primary key not null,
name VARCHAR(255),
price DOUBLE(10,2)
) create table orderTable(
id int(10) primary key not null,
customerid int(10) not null,
foreign key(customerid) references customer(id)
) create table ordergoods(
id int(10) primary key not null,
orderid int(10) not null,
goodsid int(10) not null,
count int(10),
foreign key(orderid) references orderTable(id),
foreign key(goodsid) references goods(id)
)
插值语句
insert into customer ( id, name, address ) values ( '1', '张三', '北京' )
insert into customer ( id, name, address ) values ( '2', '李四', '大连' )
insert into customer ( id, name, address ) values ( '3', '王五', '上海' ) insert into goods ( id, name, price ) values ( '11', '上衣', '240' )
insert into goods ( id, name, price ) values ( '12', '裤子', '300' )
insert into goods ( id, name, price ) values ( '13', '鞋子', '350' ) insert into ordertable ( id, customerid ) values ( '111', '1' )
insert into ordertable ( id, customerid ) values ( '112', '2' )
insert into ordertable ( id, customerid ) values ( '113', '3' ) insert into ordergoods ( id, orderid, goodsid, count ) values ( '1111', '111', '11', '20' )
insert into ordergoods ( id, orderid, goodsid, count ) values ( '1112', '112', '11', '10' )
insert into ordergoods ( id, orderid, goodsid, count ) values ( '1113', '112', '12', '15' )
insert into ordergoods ( id, orderid, goodsid, count ) values ( '1114', '113', '11', '30' )
insert into ordergoods ( id, orderid, goodsid, count ) values ( '1115', '113', '12', '45' )
insert into ordergoods ( id, orderid, goodsid, count ) values ( '1116', '113', '13', '60' ) ==================================================== 网上说join的效率非常低,为什么比我原现的SQL语句效率要高呢?针对这个查询还有更效的SQL语句吗?
http://topic.csdn.net/u/20090430/13/e83a8c85-d5e3-4f69-9cb1-48b97614ffcf.html
加快使用 LEFT JOIN 的查询速度的一项技术涉及创建一个 TABLE 数据类型,插入第一个表(LEFT JOIN 左侧的表)中的所有行,然后使用第二个表中的值更新 TABLE 数据类型。此技术是一个两步的过程,但与标准的 LEFT JOIN 相比,可以节省大量时间。一个很好的规则是尝试各种不同的技术并记录每种技术所需的时间,直到获得用于您的应用程序的执行性能最佳的查询。
----------
网上说的join缺点
2.只要对列进行计算,该列的索引将不起作用,如:aa+10=20
3.某些情况下的LIKE操作,该列的索引将不起作用,如:aa LIKE '%10%'
4.某些情况使用反向操作,该列的索引将不起作用,如:aa <>2
5.在WHERE中使用OR时,有一个列没有索引,那么其它列的索引将不起作用