例1:查出person表前25%的数据,参考了下网上的资料,在此只是做个记录
SET @number = (SELECT ROUND(count(*)*0.25) FROM person);
SET @sql = CONCAT('SELECT * FROM person LIMIT 0,',@number);
PREPARE stmt FROM @sql;
EXECUTE stmt;
例2:
语文 |
数学 |
外语 |
70 |
99 |
15 |
100 |
25 |
99 |
55 |
60 |
60 |
通过下面的语句(必有更好的写法,只是提供一种方法参考而已):
SELECT
(
IF (t.语文<60,'不及格',IF(t.语文<80,'及格','优秀'))
)AS '语文',
(
IF (t.数学<60,'不及格',IF(t.数学<80,'及格','优秀'))
)AS '数学',
(
IF (t.外语<60,'不及格',IF(t.外语<80,'及格','优秀'))
)AS '外语'
FROM test t
可查出如下形式:
语文 |
数学 |
外语 |
及格 |
优秀 |
不及格 |
优秀 |
不及格 |
优秀 |
不及格 |
及格 |
及格 |
例3:
Date |
Result |
2014-05-14 |
胜 |
2014-05-14 |
胜 |
2014-05-14 |
负 |
2014-05-14 |
胜 |
2014-05-31 |
胜 |
2014-05-31 |
胜 |
2014-05-31 |
负 |
通过下面的语句(必有更好的写法,只是提供一种方法参考而已):
SELECT t.Date,
COUNT(CASE WHEN t.Result = '胜' THEN '' END) AS '胜',
COUNT(CASE WHEN t.Result = '负' THEN '' END) AS '负'
FROM test t
GROUP BY t.Date
可查出如下形式:
Date |
胜 |
负 |
2014-05-14 |
3 |
1 |
2014-05-31 |
2 |
1 |
例4:分组
SELECT content 姓名,
TRUNCATE(SUM(age)/COUNT(age),1) 平均数
FROM a GROUP BY content
注:TRUNCATE表示精度,1表示精确到小数点后一位
id |
rolename |
modulename |
authority |
1 |
系统管理员 |
知识库系统 |
0 |
2 |
系统管理员 |
组织管理 |
1 |
3 |
系统管理员 |
流程管理 |
1 |
4 |
系统管理员 |
日程管理 |
0 |
5 |
系统管理员 |
稼动管理 |
1 |
6 |
部长 |
知识库系统 |
1 |
7 |
部长 |
组织管理 |
1 |
8 |
部长 |
流程管理 |
0 |
9 |
部长 |
日程管理 |
1 |
10 |
部长 |
稼动管理 |
1 |
11 |
科长 |
知识库系统 |
0 |
12 |
科长 |
组织管理 |
0 |
13 |
科长 |
流程管理 |
0 |
14 |
科长 |
日程管理 |
1 |
15 |
科长 |
稼动管理 |
0 |
16 |
码农 |
知识库系统 |
0 |
17 |
码农 |
组织管理 |
0 |
18 |
码农 |
流程管理 |
0 |
19 |
码农 |
日程管理 |
0 |
20 |
码农 |
稼动管理 |
0 |
想变成如下最终输出形式:
角色\\模块 |
知识库系统 |
组织管理 |
流程管理 |
日程管理 |
稼动管理 |
系统管理员 |
0 |
1 |
1 |
0 |
1 |
部长 |
1 |
1 |
0 |
1 |
1 |
科长 |
0 |
0 |
0 |
1 |
0 |
码农 |
0 |
0 |
0 |
0 |
0 |
可以变通的查询语句为:
SELECT rolename,
GROUP_CONCAT(modulename),
GROUP_CONCAT(cast(authority AS CHAR(1)))
FROM test
GROUP BY rolename
ORDER BY id ASC
例5:行转换列
id |
name |
age |
1 |
张三 |
19 |
2 |
李四 |
20 |
3 |
王五 |
21 |
想转化为:
可以变通的查询语句为:
SELECT cast(id AS CHAR(1)) FROM test
UNION ALL
SELECT name FROM test
UNION ALL
SELECT cast(age AS CHAR(3)) FROM test
然后根据之前的行数(假如有5行),每5行换行一次
例6:既分页又统计总数
SELECT SQL_CALC_FOUND_ROWS id,name from product WHERE id>1000 LIMIT 0,10;
SELECT FOUND_ROWS() as total;
例7:定时执行数据迁移任务
set GLOBAL event_scheduler = ON;-- 或=1
SHOW VARIABLES LIKE 'event_scheduler';
drop event if exists event_test;
DELIMITER $$-- 将语句结束符改为$$
create event event_test
on schedule every 1 day starts timestamp '2015-01-01 00:00:00'
do
begin
INSERT into category_bak(SELECT * from category where id<10);
delete from category where id<10;
end $$
DELIMITER ;-- 将语句结束符换回分号
例8:触发器
create trigger triggerForProductInsert
before INSERT on yzl_product for each row
begin
INSERT INTO yzl_product_trigger(create_date,kind) VALUES(now(),'INSERT');
end;
create trigger triggerForProductUpdate
before UPDATE on yzl_product for each row
begin
if old.image is null AND new.image is not null
then INSERT INTO yzl_product_trigger(create_date,kind) VALUES(now(),'UPDATE image');
ELSEIF new.image!=old.image
then INSERT INTO yzl_product_trigger(create_date,kind) VALUES(now(),'UPDATE image');
ELSE
INSERT INTO yzl_product_trigger(create_date,kind) VALUES(now(),'UPDATE other');
end if;
end;
create trigger triggerForProductDelete
before DELETE on yzl_product for each row
begin
INSERT INTO yzl_product_trigger(create_date,kind) VALUES(now(),CONCAT('DELETE id=',old.id));
end;
SHOW TRIGGERS;
drop trigger triggerForProductInsert;
drop trigger triggerForProductUpdate;
drop trigger triggerForProductDelete;
例9:
统计快递员(postman_id)各个评分(stars)的数量
postman_id |
stars |
1 |
3 |
1 |
2 |
1 |
3 |
1 |
4 |
1 |
1 |
1 |
5 |
2 |
3 |
2 |
2 |
2 |
3 |
2 |
4 |
2 |
1 |
2 |
1 |
SELECT mid.postman_id,GROUP_CONCAT(mid.stars),GROUP_CONCAT(mid.total)
from
(SELECT postman_id,stars,count(*) as total
from table
GROUP BY postman_id,stars) as mid
GROUP BY postman_id
例10:
统计各表的容量
SELECT sum(DATA_LENGTH+INDEX_LENGTH)/(1024*1024)
FROM TABLES
WHERE TABLE_SCHEMA='yzlshoptest'
AND TABLE_NAME='yzl_product'
例11:
查询表a的id在表b中不存在
select * from A a
where (select count(1) as num from B b where a.id = b.id) = 0
例12:
查出结果自增但又不使用自增策略
set @x=0;
select @x:=ifnull(@x,0)+1 as rownum,name
from yzl_product