mysql 经典案例

MySQL多表联合查询是MySQL数据库的一种查询方式,下面就为您介绍MySQL多表联合查询的语法,供您参考学习之用。

MySQL多表联合查询语法:   

SELECT   *    FROM   插入表   LEFT JOIN   主表   ON   t1.lvid=t2.lv_id     select * from mytable,title where 表名1.name=表名2.writer ;  

 mysql版本大于4.0,使用UNION进行查询,示例如下:   

SELECT `id`, `name`, `date`, ‘’ AS `type` FROM table_A WHERE 条件语句…… 
   UNION  
SELECT `id`, `name`, `date`, ‘未完成’ AS `type` FROM table_B WHERE 条件语句……  
  ORDER BY `id` LIMIT num;  

 

mysql版本小于4.0,需要建立临时表,分为三步,示例如下:

   第一步:建立临时表tmp_table_name并插入table_A中的相关记录      

$sql = “CREATE TEMPORARY TABLE tmp_table_name SELECT `id`, `name`, `date`, ‘完成’ AS `type` FROM table_A WHERE 条件语句……”;                            

   第二步:从table_B中取得相关记录插入临时表tmp_table_name中

INSERT INTO tmp_table_name SELECT `id`, `name`, `date2` AS `date`, ‘未完成’ AS `type` FROM table_B WHERE 条件语句……

   第三步:从临时表tmp_table_name中取出记录

SELECT * FROM tmp_table_name ORDER BY id DESC

union和order by、limit区别分析   

代码示例:
CREATE TABLE `test1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `desc` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

1,以下查询会报错误:[Err] 1221 - Incorrect usage of UNION and ORDER BY

代码示例:
select * from test1 where name like 'A%' order by name
union
select * from test1 where name like 'B%' order by name

修改为:

代码示例:
select * from test1 where name like 'A%'
union
select * from test1 where name like 'B%' order by name

说明,在union中,不用括号的情况下,只能用一个order by(思考:union两边的order by的列名不一样时,会出现什么样的结果?),这会对union后的结果集进行排序。
修改为:

代码示例:
(select * from test1 where name like 'A%' order by name)
union
(select * from test1 where name like 'B%' order by name)
也是可以的,这两个order by在union前进行。

2,同样

代码示例:
select * from test1 where name like 'A%' limit 10
union
select * from test1 where name like 'B%' limit 20

相当于:

代码示例:
(select * from test1 where name like 'A%' limit 10)
union
(select * from test1 where name like 'B%') limit 20

即后一个limit作用于的是union后的结果集,而不是union后的select。
也可以用括号括起来,以得到预期的结果:

3,UNION和UNION ALL区别
union会过滤掉union两边的select结果集中的重复的行,而union all不会过滤掉重复的行。

代码示例:
(select * from test1 where name like 'A%' limit 10)
union
(select * from test1 where name like 'B%' limit 20)

  下面试一个年龄段分析的复杂sql语句

(
	SELECT
		'5~19' AS `age`,
		SUM(`impression`) AS impression,
		SUM(`click`) AS click,
		sum(`cost`) AS cost
	FROM
		`adgroup_age_report`
	WHERE
		(
			(
				(`age` <= 19)
				AND (`adgroup_id` = '61')
			)
			AND (`date` >= '2015-11-22')
		)
	AND (`date` <= '2017-02-20')
)
UNION
	(
		SELECT
			'20~29' AS `age`,
			SUM(`impression`) AS impression,
			SUM(`click`) AS click,
			sum(`cost`) AS cost
		FROM
			`adgroup_age_report`
		WHERE
			(
				(
					((`age` <= 29) AND(`age` >= 20))
					AND (`adgroup_id` = '61')
				)
				AND (`date` >= '2015-11-22')
			)
		AND (`date` <= '2017-02-20')
	)
UNION
	(
		SELECT
			'30~39' AS `age`,
			SUM(`impression`) AS impression,
			SUM(`click`) AS click,
			sum(`cost`) AS cost
		FROM
			`adgroup_age_report`
		WHERE
			(
				(
					((`age` <= 39) AND(`age` >= 30))
					AND (`adgroup_id` = '61')
				)
				AND (`date` >= '2015-11-22')
			)
		AND (`date` <= '2017-02-20')
	)
UNION
	(
		SELECT
			'40~49' AS `age`,
			SUM(`impression`) AS impression,
			SUM(`click`) AS click,
			sum(`cost`) AS cost
		FROM
			`adgroup_age_report`
		WHERE
			(
				(
					((`age` <= 49) AND(`age` >= 40))
					AND (`adgroup_id` = '61')
				)
				AND (`date` >= '2015-11-22')
			)
		AND (`date` <= '2017-02-20')
	)
UNION
	(
		SELECT
			'50~59' AS `age`,
			SUM(`impression`) AS impression,
			SUM(`click`) AS click,
			sum(`cost`) AS cost
		FROM
			`adgroup_age_report`
		WHERE
			(
				(
					((`age` <= 59) AND(`age` >= 50))
					AND (`adgroup_id` = '61')
				)
				AND (`date` >= '2015-11-22')
			)
		AND (`date` <= '2017-02-20')
	)

 

假设表

 

 

 需要得到以下结果

SELECT name,
  MAX(
  CASE
    WHEN subject='语文'
    THEN score
    ELSE 0
  END) AS "语文",
  MAX(
  CASE
    WHEN subject='数学'
    THEN score
    ELSE 0
  END) AS "数学",
  MAX(
  CASE
    WHEN subject='英语'
    THEN score
    ELSE 0
  END) AS "英语"
FROM student
GROUP BY name

  假设表

 

 需要得到以下结果

 

 

SELECT
    NAME,
    '语文' AS subject ,
    MAX("语文") AS score
FROM student1 GROUP BY NAME
UNION
SELECT
    NAME,
    '数学' AS subject ,
    MAX("数学") AS score
FROM student1 GROUP BY NAME
UNION
SELECT
    NAME,
    '英语' AS subject ,
    MAX("英语") AS score
FROM student1 GROUP BY NAME

  

统计表中出现次数大于1的数据

 select ewm_id,count(invoice_id) from y_ewm_invoice_relation GROUP BY ewm_id HAVING count(invoice_id) > 1

  

根据不同条件汇总

SELECT SUM(IF(state = 2,1,0)) AS `state`,
SUM(IF(state = 1,1,0)) AS `state`,
COUNT(`state`) AS `all` FROM individual_certify

 

 

 

  

posted @ 2014-07-08 11:03  雨落知音  阅读(2999)  评论(0编辑  收藏  举报