MYSQL简单语句示例

例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

想转化为:
1 2 3
张三 李四 王五
19 20 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

你可能感兴趣的:(java,sql,mysql)