MySQL怎样用一条写出创建三张数据表的sql语句句查询两张没有关联的表

mysql sql语句 两张表查询(a最新记录时间 查询b最新值) - ITeye问答
总体描述:根据交易记录表中的交易记录,得到汇率表中该交易记录时间后的第一条最新汇率
交易记录表 (sale_log):
&&& 主键&&&&& 币种&&&& 兑换金额&&&&& 交易时间&&&&&&& 交易日期
&&&&&&&&&&&& 1&&&&& USD&&&&& 100&&&&&&& 10:08:23&&&
&&&&&&&&&& 2&&&&& EUR&&&&&& 50&&&&&&& 10:10:01&&&
&&&&&&&&&& 3&&&&& USD&&&&&& 10&&&&&&& 20:21:19&&&
&&&&&&&&&& 4&&&&& USD&&&&& 100&&&&&&& 22:01:06&&&
&&&&&&&&&& 5&&&&& USD&&&&&& 20&&&&&&& 01:23:46&&&
&&&&&&&&&& 6&&&&& EUR&&&&&& 10&&&&&&& 12:07:06&&&
币种汇率表(rate):同一币种一天可能存在多个汇率,需要精确到秒
&&&& 币种&&&&&&&&&& 录入时间&&&&&&&&&&&&&&&&&&&&&&&&&&&& 汇率值&&
&&&&&&&&&& USD&&&&
08:00:05&&&&&&&&&&&&&&&& 6.8315
&&&&&&&&& USD&&&&
20:10:05&&&&&&&&&&&&&&&& 6.8310
&&&&&&&&& EUR&&&&
08:00:05&&&&&&&&&&&&&&& 10.1261
&&&&&&&&& USD&&&&
08:00:05&&&&&&&&&&&&&&&& 6.8286
&&&&&&&&& EUR&&&&
08:10:55&&&&&&&&&&&&&&& 10.1207
&&&&&&&&& USD&&&&
22:07:00&&&&&&&&&&&&&&&& 6.7789
&&&&&&&&& EUR&&&&
18:20:35&&&&&&&&&&&&&&& 10.1211&&&&&&&&&&
需要的结果是:以记录表为准,得到每条记录的汇率(得到& &=& 每条记录产生的时间 的第一条汇率)
表展现为:
&&& 主键&&&&& 币种&&&& 兑换金额&&&&& 交易时间&&&&&&& 交易日期&&&&&& 记录后最新汇率
&&&&&&&&&&&& 1&&&&& USD&&&&& 100&&&&&&& 10:08:23&&& &&&&&& 6.8310
&&&&&&&&&& 2&&&&& EUR&&&&&& 50&&&&&&& 10:10:01&&& &&&&& 10.1207
&&&&&&&&&& 3&&&&& USD&&&&&& 10&&&&&&& 20:21:19&&& &&&&&& 6.8286
&&&&&&&&&& 4&&&&& USD&&&&& 100&&&&&&& 22:01:06&&& &&&&&& 6.8286
&&&&&&&&&& 5&&&&& USD&&&&&& 20&&&&&&& 01:23:46&&& &&&&&& 6.8286
&&&&&&&&&& 6&&&&& EUR&&&&&& 10&&&&&&& 12:07:06&&& &&&&& 10.1211
问题补充:missoasis 写道交易时间,交易日期 ,录入时间 字段类型是什么?什么数据库?oracle?
交易时间---varchar
交易日期---date
录入时间---datetime
mysql数据库
问题补充:missoasis 写道我自己建的表,测试完全正确
你好,可以把你建表的SQL语句+ 运行的SQL语句发给我吗? 谢谢了
问题补充:missoasis 写道没问题记得给分,有问题再说
#
# Table structure for table a
#
DROP TABLE IF EXISTS `a`;
CREATE TABLE `a` (
& `id` int(11) NOT NULL,
& `bizhong` varchar(255) default NULL,
& `duihuan` int(11) default NULL,
& `shijian` varchar(255) NOT NULL,
& `riqi` date NOT NULL,
& PRIMARY KEY& (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=
#
# Dumping data for table a
#
/*!40101 SET NAMES gbk */;
INSERT INTO `a` VALUES (1,'1',100,'10:49:32','');
INSERT INTO `a` VALUES (2,'2',50,'11:55:19','');
INSERT INTO `a` VALUES (3,'2',100,'15:33:18','');
INSERT INTO `a` VALUES (4,'3',100,'20:12:09','');
DROP TABLE IF EXISTS `b`;
CREATE TABLE `b` (
& `id` int(11) NOT NULL auto_increment,
& `bizhong2` varchar(30) default NULL,
& `lurushijian` datetime NOT NULL,
& `huilv` double(12,2) default NULL,
& PRIMARY KEY& (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=
#
# Dumping data for table b
#
/*!40101 SET NAMES gbk */;
INSERT INTO `b` VALUES (1,'1',' 10:49:31',7.68);
INSERT INTO `b` VALUES (2,'2',' 10:49:33',11.56);
INSERT INTO `b` VALUES (3,'1',' 12:49:31',7.66);
INSERT INTO `b` VALUES (4,'1',' 22:49:31',7.61);
INSERT INTO `b` VALUES (5,'2',' 08:01:00',11.32);
INSERT INTO `b` VALUES (6,'3',' 21:01:01',123);
INSERT INTO `b` VALUES (7,'2',' 21:01:00',11.07);
INSERT INTO `b` VALUES (8,'2',' 20:00:07',11.44);
这是我的数据,测试时发现币种1的结果是取的正确的,但是币种2的汇率应该取 (2,'2',' 10:49:33',11.56);这条数据,却取的是15号的数据了,希望楼主能再帮忙看下,就差一点点了,再次谢谢了
问题补充:INSERT INTO `b` VALUES (2,'2',' 10:49:33',11.56);
11.56插入的时间是在交易后,而且是交易后的时间第一个,应该取这个数据,而不应该取
INSERT INTO `b` VALUES (8,'2',' 20:00:07',11.44);
这两个数据都是交易后的汇率,而且11.56比这条早
问题补充:missoasis 写道引用你交易时间是10:49:33,也就是说你插入在未交易前就插入了11.56这条数据说错了,你插入b的时间是10:49:33
之前的数据测试是对的,但是我后来调试的时候,把
INSERT INTO `a` VALUES (2,'2',50,'11:55:19','');
改为
INSERT INTO `a` VALUES (2,'2',50,'09:55:19','');
后,这条记录的汇率应该取'09:55:19'后的汇率对吧,也就是
INSERT INTO `b` VALUES (2,'2',' 10:49:33',11.56);
但是还是取的
INSERT INTO `b` VALUES (8,'2',' 20:00:07',11.44);
问题补充:missoasis 写道不好意思,有点麻烦了,又嵌套一层行了
select x.id , x.bizhong, x.duihuan, x.shijian, x.riqi, x.huilv from(select a.*,b.id as id2,b.bizhong2,b.huilv,b.lurushijian ,(replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat(a.riqi,a.shijian),'-',''),':','')) as cha
FROM
a
inner join b ON a.bizhong=b.bizhong2
where (replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat(a.riqi,a.shijian),'-',''),':',''))&0
order by a.id) x inner join (select id as id3 ,min(cha) as cha3 from(select a.*,b.id as id2,b.bizhong2,b.huilv,b.lurushijian ,(replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat(a.riqi,a.shijian),'-',''),':','')) as cha
FROM
a
left join b ON a.bizhong=b.bizhong2
where (replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat(a.riqi,a.shijian),'-',''),':',''))&0
order by a.id) c group by id) y on x.id=y.id3 and x.cha=y.cha3
天哪,我已经简化数据库表了,刚才的交易表已经是虚拟出来的中间表了(涉及3张表的查询),
如果拼SQL语句的话,再加上这。。。,真的没有其他办法了吗?
我已经被这问题困扰三天了,再整不出我估计要疯了
问题补充:missoasis 写道引用天哪,我已经简化数据库表了,刚才的交易表已经是虚拟出来的中间表了(涉及3张表的查询),
如果拼SQL语句的话,再加上这。。。,真的没有其他办法了吗?
我已经被这问题困扰三天了,再整不出我估计要疯了
要么写存数过程,要么程序里控制,一般不会直接这样处理的
做的是报表,17种币种,不能程序控制,要不访问数据库次数会成倍增加,存储过程不能用,只能自己拼接SQL
问题补充:missoasis 写道干嘛不给三张表,给两张表不一定就方便,老自己查自己多麻烦
现在方便的话我们在QQ中聊好吗
问题补充:xiaohuxiaoyu 写道不是只有两张表得吗,怎么又多出一张
另外张表是币种转换表,跟交易记录没关系,只起翻译币种,所以我就没列
采纳的答案
不好意思,有点麻烦了,又嵌套一层行了
select x.id , x.bizhong, x.duihuan, x.shijian, x.riqi, x.huilv from(select a.*,b.id as id2,b.bizhong2,b.huilv,b.lurushijian ,(replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat(a.riqi,a.shijian),'-',''),':','')) as cha
FROM
a
inner join b ON a.bizhong=b.bizhong2
where (replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat(a.riqi,a.shijian),'-',''),':',''))&0
order by a.id) x inner join (select id as id3 ,min(cha) as cha3 from(select a.*,b.id as id2,b.bizhong2,b.huilv,b.lurushijian ,(replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat(a.riqi,a.shijian),'-',''),':','')) as cha
FROM
a
left join b ON a.bizhong=b.bizhong2
where (replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat(a.riqi,a.shijian),'-',''),':',''))&0
order by a.id) c group by id) y on x.id=y.id3 and x.cha=y.cha3
select * ,(select 汇率值 from rate r where r.币种=s.币种 order by 汇率值 desc limit(0, 1)) from sale_
不是只有两张表得吗,怎么又多出一张
干嘛不给三张表,给两张表不一定就方便,老自己查自己多麻烦
引用天哪,我已经简化数据库表了,刚才的交易表已经是虚拟出来的中间表了(涉及3张表的查询),
如果拼SQL语句的话,再加上这。。。,真的没有其他办法了吗?
我已经被这问题困扰三天了,再整不出我估计要疯了
要么写存数过程,要么程序里控制,一般不会直接这样处理的
用我的数据自己测试一下,我只测试了一个
CREATE TABLE `rate` (
&& `bz` varchar(20) NOT NULL,
&& `lrsj` datetime NOT NULL,
&& `hlz` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `sale_log` (
&& `id` int(5) NOT NULL auto_increment,
&& `jysj` time default NULL,
&& `bz` varchar(20) default NULL,
&& `je` float default NULL,
&& `jyrq` date default NULL,
&& PRIMARY KEY& (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
你试一下:
SELECT s.bz,s.jysj,s.jyrq,s.je,r.hlz FROM rate r,(SELECT bz,jysj,jyrq,CONCAT(jyrq,' ',jysj) s_jytime,je FROM sale_log) s
WHERE s.s_jytime&(SELECT MAX(r.lrsj) lrsj FROM rate r,(SELECT bz,jysj,jyrq,CONCAT(jyrq,' ',jysj) s_jytime,je FROM sale_log) s
WHERE s.s_jytime&r.lrsj) AND r.bz=s.
引用你交易时间是10:49:33,也就是说你插入在未交易前就插入了11.56这条数据说错了,你插入b的时间是10:49:33
引用11.56插入的时间是在交易后,而且是交易后的时间第一个,应该取这个数据,而不应该取
INSERT INTO `b` VALUES (8,'2',' 20:00:07',11.44);
这两个数据都是交易后的汇率,而且11.56比这条早
我靠,你币种为2的这条数据交易时间是11:55:19,如下:
引用INSERT INTO `a` VALUES (2,'2',50,'11:55:19','');
你交易时间是10:49:33,也就是说你插入在未交易前就插入了11.56这条数据
select *, max(h.dt)& from (select id,rate.Currency,exchange, date,time, value,datetime as dt from rate right join sale_log on rate.currency=sale_log.currency and concat(date,' ',time) &rate.`DateTime`) as h group by id
我这个可以,至少我能得到你需要的结果,不过选出来的列较多,你需要自己剔出一下。
引用INSERT INTO `b` VALUES (2,'2',' 10:49:33',11.56); 引用INSERT INTO `b` VALUES (8,'2',' 20:00:07',11.44); 引用INSERT INTO `a` VALUES (2,'2',50,'11:55:19','');
我运行取得时11.44这条数据,不是15号的,另外交易后的数据,明显不能是11.56这条数据,这条数据在交易前插入的,难道我发错了语句?
select id ,bizhong,duihuan,shijian,riqi,huilv,min(cha) from(select a.*,b.id as id2,b.bizhong2,b.huilv,b.lurushijian ,(replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat(a.riqi,a.shijian),'-',''),':','')) as cha
FROM
a
left join b ON a.bizhong=b.bizhong2
where (replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat(a.riqi,a.shijian),'-',''),':',''))&0
order by a.id) c group by id
没问题记得给分,有问题再说
CREATE TABLE `a` (
& `id` int(11) NOT NULL,
& `bizhong` varchar(255) default NULL,
& `duihuan` double default NULL,
& `shijian` varchar(255) NOT NULL,
& `riqi` date NOT NULL,
& PRIMARY KEY& (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=
相当于你的交易记录表
CREATE TABLE `b` (
& `id` int(11) NOT NULL auto_increment,
& `bizhong2` varchar(30) default NULL,
& `lurushijian` datetime NOT NULL,
& `huilv` double NOT NULL,
& PRIMARY KEY& (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=
相当于你的币种汇率表
数据是你的数据,执行的是下面的语句
select id ,bizhong,duihuan,shijian,riqi,huilv,min(cha) from(select a.*,b.id as
id2,b.bizhong2,b.huilv,b.lurushijian ,(replace(replace(replace
(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat
(a.riqi,a.shijian),'-',''),':','')) as cha
left join b b ON a.bizhong=b.bizhong2
where (replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace
(concat(a.riqi,a.shijian),'-',''),':',''))&0
order by a.id) c group by id
我自己建的表,测试完全正确
看看下面这个,找个你的表的字段改改
select id ,bizhong,duihuan,shijian,riqi,huilv,min(cha) from(select a.*,b.id as
id2,b.bizhong2,b.huilv,b.lurushijian ,(replace(replace(replace
(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat
(a.riqi,a.shijian),'-',''),':','')) as cha
FROM
sale_log a
left join rate b ON a.bizhong=b.bizhong2
where (replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace
(concat(a.riqi,a.shijian),'-',''),':',''))&0
order by a.id) c group by id
交易时间,交易日期 ,录入时间 字段类型是什么?什么数据库?oracle?
已解决问题
未解决问题背景需求:用一条sql查询没有任何关联的两张表,并且查询中涉及到了聚合函数,查询结果需要作为一条数据(列转行)。
两张没有关联的表放到一个结果集中,此处考虑使用union all,
select count(1) bcrzc,0 bsjgj,opt_time from t_manual_entry_workload a where opt_type = 'CIQ入暂存' and is_delete = 0
select 0 bcrzc,count(1) bsjgj,op_date opt_time from til_inspection_rec where brand = '保时捷' and step = '港检' and
is_deleted = 1
结果如下:
简单的union all查出来是以不同数据行的形式显示,需要列转行,外边就加了一层查询
select sum(a.bcrzc) bcrzc, sum(a.bsjgj) bsjgj from(
select count(1) bcrzc,0 bsjgj,opt_time from t_manual_entry_workload a where opt_type = 'CIQ入暂存' and is_delete = 0
select 0 bcrzc,count(1) bsjgj,op_date opt_time from til_inspection_rec where brand = '保时捷' and step = '港检' and
is_deleted = 1) a
where a.opt_time &= '' and a.opt_time &= ''
第二种查询方法:
select (select count(1) from t_manual_entry_workload a where opt_type = 'CIQ入暂存' and opt_time &= '' and opt_time &= '') AAA
,(select count(1) from til_inspection_rec where brand = '保时捷' and step = '港检' and op_date &= '' and op_date &= '') BBB
虽然第二种查询看起来稍微简单容易理解一些,但是很明显效率没有第一种高,猜想是由于where后的时间条件重复校验导致的。
Mysql联合查询UNION和UNION ALL的使用介绍 可以查询出多张没有关联关系的表的数据
一、UNION和UNION ALL的作用和语法
UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。
UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必...
MySql同时查询三个不关联的表,同时获取到三个表的数据,并按照某一字段排序
select a.ALARM_ID as id,
a.ALARM_ID as alarmId,
a.EBIKE_ID as ebike...
mysql将两个表结果合并到一起
使用mysql中union all 将2个表中的数据查询结果合并到一个返回结果中。再针对结果统一排序操作等。(注:2个表返回的列名必须一致)
语句如下:
mysql中多表不关联查询
大家在使用mysql查询时正常是直接一个表的查询,要不然也就是多表的关联查询,使用到了左联结(left join)、右联结(right join)、内联结(inner join)、外联结(outer ...
mysql左连接右连接(查询两张表不同的数据)
有两张表:一张A表he一张B表
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 ;
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的...
一步一步学MySQL----15 多表数据记录查询之合并查询
在MySQL中通过关键字union来实现并操作,即可以通过union将多个select语句查询合并在一起组成新的关系。
下面的实例基于数据库company,有如下两张表:(1) 计算机系的学生表:cs...
mysql 查询一个表中没有存在在另一个表的数据
SELECT * FROM A
( SELECT id FROM B);或者
SELECT * FROM A
EXISTS ...
MySQL----union联合查询出二个表内容
合并查询的字段数量要一样,而且对应的字段类型要一样
select id,username from member
select student_id,sdudent_name from ...
mysql多条件关联查询
工作中遇到一些mysql问题,有的需要多条件多表查询等,现在整理出来。
问题(一)如下:
查询出今天办公室人员的订餐人员
qsyz_app_user用户表
userid role
mysql查询语句 和 多表关联查询 以及 子查询
mysql(三):mysql查询语句 和 多表关联查询 以及 子查询
1.查询一张表:
select * from 表名;
2.查询指定字段...
没有更多推荐了,&pre name="code" class="java"&一、UNION和UNION ALL的作用和语法
UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。
UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。
同时,每条 SELECT 语句中的列的顺序必须相同.
SQL UNION 语法:
复制代码 代码如下:SELECT column_name FROM table1
SELECT column_name FROM table2
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行
SQL UNION ALL 语法
复制代码 代码如下:SELECT column_name FROM table1
SELECT column_name FROM table2
注释:另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
注意:1、UNION 结果集中的列名总是等于第一个 SELECT 语句中的列名
2、UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同
二、union的用法及注意事项
union:联合的意思,即把两次或多次查询结果合并起来。
要求:两次查询的列数必须一致
推荐:列的类型可以不一样,但推荐查询的每一列,想对应的类型以一样
可以来自多张表的数据:多次sql语句取出的列名可以不一致,此时以第一个sql语句的列名为准。
如果不同的语句中取出的行,有完全相同(这里表示的是每个列的值都相同),那么union会将相同的行合并,最终只保留一行。也可以这样理解,union会去掉重复的行。
如果不想去掉重复的行,可以使用union all。
如果子句中有order by,limit,需用括号()包起来。推荐放到所有子句之后,即对最终合并的结果来排序或筛选。
复制代码 代码如下:(select * from a order by id) union (select * from b order id);
在子句中,order by 需要配合limit使用才有意义。如果不配合limit使用,会被语法分析器优化分析时去除。
三、学习例子
下面的例子中使用的原始表:
Employees_China:
复制代码 代码如下:E_ID E_Name
01 Zhang, Hua
02 Wang, Wei
03 Carter, Thomas
04 Yang, Ming
Employees_USA:
复制代码 代码如下:E_ID E_Name
01 Adams, John
02 Bush, George
03 Carter, Thomas
04 Gates, Bill
使用 UNION 命令实例
列出所有在中国和美国的不同的雇员名:
复制代码 代码如下:SELECT E_Name FROM Employees_China
SELECT E_Name FROM Employees_USA
复制代码 代码如下:E_Name
Zhang, Hua
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Gates, Bill
注释:这个命令无法列出在中国和美国的所有雇员。在上面的例子中,我们有两个名字相同的雇员,他们当中只有一个人被列出来了。UNION 命令只会选取不同的值。
使用 UNION ALL 命令实例
UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。
复制代码 代码如下:SQL Statement 1
SQL Statement 2
列出在中国和美国的所有的雇员:
复制代码 代码如下:SELECT E_Name FROM Employees_China
SELECT E_Name FROM Employees_USA
复制代码 代码如下:E_Name
Zhang, Hua
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Carter, Thomas
Gates, Bill
四、项目使用例子
web项目中经常会碰到整站搜索的问题,即客户希望在网站的搜索框中输入一个词语,然后在整个网站中只要包含这个词的页面都要出现在搜索结果中。由于一个web项目不可能用一张表就全部搞定的,所以这里一般都是要用union联合搜索来解决整个问题的。
下面列举一下本次使用的union联合搜索的sql语句:
复制代码 代码如下:
select * from
(SELECT `id`,`subject` FROM `article` WHERE `active`='1' AND `subject` LIKE '%调整图片%' ORDER BY `add_time` DESC)
select * from
(SELECT `id`,`class_name` AS `subject` FROM `web_class` WHERE `active`='1' AND `class_name` LIKE '%调整图片%' ORDER BY `class_id` DESC)
select * from
(SELECT `id`,`subject` FROM `article` WHERE `active`='1' AND (`subject` LIKE '%调整%' OR `subject` LIKE '%图片%') ORDER BY `add_time` DESC)
以上SQL语句的联合查询主要用到了union all和union,至于这两者的区别就是union all会列举所有符合条件的查询结果,而union会将所有符合条件的查询结果做一下去除重复结果的筛选。
对于以上SQL语句的解释就是由于article表和web_class表分属两个不同的表,所以这里不用去除重复结果。然而以上联合查询的第三个分支的sql查询语句是由分词然后组合出来的查询语句,这条sql语句查询的结果是肯定包含第一个分支sql语句的查询结果的,这里就显得没必要了,所以没有使用all而去掉重复的查询结果。
MySql同时查询三个不关联的表,同时获取到三个表的数据,并按照某一字段排序
select a.ALARM_ID as id,
a.ALARM_ID as alarmId,
a.EBIKE_ID as ebike...
Hibernate-没有外键关联的两个表做联合查询
有两个表Zsplcxxb(流程表)和Lcsplsb(流程审批历史表),两个表都有lcbh(流程编号),但是没有设置外键关联,做以下的查询:
from Zsplcxxb as a inner jo...
MySQL从无关联的两个或多个表中查询数据,列转行等
背景需求:用一条sql查询没有任何关联的两张表,并且查询中涉及到了聚合函数,查询结果需要作为一条数据(列转行)。
两张没有关联的表放到一个结果集中,此处考虑使用union all,
查询多个表放在一个集合中用union做连接
SELECT blood,BG,create_date,OGTT,flag FROM
(SELECT &空腹血糖& AS blood,t.`BG`,t.create_date,t.`OGTT`,...
最近在做一个关于数据库方面的任务,需要从相关联的几张表中查询需要读取的数据,再将这些数据合并到一起显示,通过查询资料,找到了处理方法,在此简单记录。
首先创建做测试需要使用的...
SELECT FULLNAME,PDT,BLCMT,CBCT from WK_SHEET_WAIT a WHERE
a.SHID = %SHID% and
(exists(sele...
今天项目中碰见多表查询,订单表,商品表(作业更新,商品-门店,每个门店有相同的商品,所有商品重复),门店表,现在要关联查询三个表,根据门店号查出所有商品,订货情况;
我的思路是新建对象,将要展示的数...
NewsCategoryInfo.NewsCategoryName as
新闻种类, NewsInfo.NewsTitle
as 新闻标题 F...
接触Sql语句时间挺长时间了,听他人说过sql语句的连接查询,但一直没有认真研究和使用过!!最近在公司实习,需要用到一些连接的语句,我也从中体会到连接查询带来的方便。
下面总结一下SQL连接查询...
没有更多推荐了,本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化,使千万级表关联查询第一页结果能在2秒内完成(真实业务告警系统优化结果)。
需要优化的查询:使用explain
&&&&&出现了Using temporary;
& & &有分页时出现了Using filesort则表示使用不了索引,需要根据下面的技巧来调整语句
&&&&&rows过多,或者几乎是全表的记录数;
&&&&&key 是 (NULL);
&&&&&possible_keys 出现过多(待选)索引。
1.使用explain语法,对SQL进行解释,根据其结果进行调优:
& & &MySQL 表关联的算法是 Nest Loop Join,是通过驱动表的结果集作为循环基础数据,然后一条一条地通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果:
& & & & & a.EXPLAIN 结果中,第一行出现的表就是驱动表
& & & & & b.对驱动表可以直接排序,对非驱动表(的字段排序)需要对循环查询的合并结果(临时表)进行排序(Important!),即
& & & & & c. [驱动表] 的定义为:1)指定了联接条件时,满足查询条件的记录行数少的表为[驱动表];2)未指定联接条件时,行数少的表为[驱动表](Important!)。
& & & & & d.优化的目标是尽可能减少JOIN中Nested Loop的循环次数,以此保证:永远用小结果集驱动大结果集(Important!)!:A JOIN B,A为驱动,A中每一行和B进行循环JOIN,看是否满足条件,所以当A为小结果集时,越快。
& & & & &&
& & & & & e.NestedLoopJoin实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。如果还有第三个参与Join,则再通过前两个表的Join结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复
2.两表JOIN优化:
& & &a.当无order by条件时,根据实际情况,使用left/right/inner join即可,根据explain优化 ;
& & &b.当有order by条件时,如select * from a inner join b where 1=1 and other condition order by a.col;使用explain解释语句;
& & &1)如果第一行的驱动表为a,则效率会非常高,无需优化;
& & &2)否则,因为只能对驱动表字段直接排序的缘故,会出现using temporary,所以此时需要使用STRAIGHT_JOIN明确a为驱动表,来达到使用a.col上index的优化目的;或者使用left join且Where条件中不含b的过滤条件,此时的结果集为a的全集,而STRAIGHT_JOIN为inner join且使用a作为驱动表
3.多表JOIN优化:
& & &a.无order by条件时,根据实际情况,使用left/right/inner join即可,根据explain优化;
& & &b.有order by a.col条件时,所有join必须为left join,且每个join字段都创建索引,同时where条件中只能有a表的条件,即将其它表的数据关联到a中形成一张大表,再对a的全集进行过滤;
& & & & & 如果不能全使用left join,则需灵活使用STRAIGHT_JOIN及其它技巧,以时间排序为例:
& & & & & & & &1)数据入库按照平台时间入库,自然a的数据都按时间有序;
SELECT c.*, r.HYPERVISOR_HOST_NAME hostname, r.HOST_IP FROM trust_monitor c&STRAIGHT_JOIN&res_node r ON c.res_node_id = r.ID&STRAIGHT_JOIN&am_assets a ON r.ASSET_ID = a.ID AND a.status = 58&STRAIGHT_JOIN&se_role s ON a.DEPT_FLAG = s.ROLE_ORG AND s.ROLE_ID IN (32,33,36,41) where c.STATUS = 58 and c.changed_type = 79 limit 1,10;
SELECT c.*, r.HYPERVISOR_HOST_NAME hostname, r.HOST_IP FROM trust_monitor c&inner JOIN&res_node r ON c.res_node_id = r.ID&INNER JOIN&am_assets a ON r.ASSET_ID = a.ID AND a.status = 58&INNER JOIN&se_role s ON a.DEPT_FLAG = s.ROLE_ORG AND s.ROLE_ID IN (32,33,36,41) where c.STATUS = 58 and c.changed_type = 79&order by c.changed_time&limit 1,10;
两者结果一致
& & &a.视图只是屏蔽或者高效集合多表数据的一种方法,视图与表JOIN,不会起到任何效果
http://www.cnblogs.com/uttu/p/6384541.html
阅读(...) 评论()

我要回帖

更多关于 写出创建三张数据表的sql语句 的文章

 

随机推荐