3、IN 和 EXISTS 区别
SELECT * FROM A_table WHERE id IN ( SELECT id FROM B_table)
SELECT * FROM A_table EXISTS( SELECT * FROM B_table WHERE B_table.id = A_table.id)
in/exists区别在于驱动顺序的改变in:先执行子查询,适合外表(A_table)大而内表(B_table)小的情况
exists:以外层表为驱动表,先被访问,适合外表小(A_table)而内表(B_table)大的情况
2、一条SQL查询/更新多条数据
UPDATE member SET
name = CASE id
WHEN 1 THEN 'NewName1'
WHEN 2 THEN 'NewName2'
WHEN 3 THEN 'NewName3'
END,
title = CASE id
WHEN 1 THEN 'NewTitle1'
WHEN 2 THEN 'NewTitle2'
WHEN 3 THEN 'NewTitle3'
END
WHERE id IN (1,2,3);
SELECT CASE country
WHEN '中国' THEN '亚洲'
WHEN '印度' THEN '亚洲'
WHEN '日本' THEN '亚洲'
WHEN '美国' THEN '北美洲'
WHEN '加拿大' THEN '北美洲'
WHEN '墨西哥' THEN '北美洲'
ELSE '其他' END as '洲' , SUM(population) as '人口'
FROM test
GROUP BY CASE country
WHEN '中国' THEN '亚洲'
WHEN '印度' THEN '亚洲'
WHEN '日本' THEN '亚洲'
WHEN '美国' THEN '北美洲'
WHEN '加拿大' THEN '北美洲'
WHEN '墨西哥' THEN '北美洲'
ELSE '其他' END;
$display_order = array(
1 => 4,
2 => 1,
3 => 2,
4 => 3,
5 => 9,
6 => 5,
7 => 8,
8 => 9
);
$ids = implode(',', array_keys($display_order));
$sql = "UPDATE categories SET display_order = CASE id ";
foreach ($display_order as $id => $ordinal) {
$sql .= sprintf("WHEN %d THEN %d ", $id, $ordinal);
}
$sql .= "END WHERE id IN ($ids)";
echo $sql;
1、SQL索引失效情况【模型数空运最快】
- 模:模糊查询,使用LIKE关键字,%开头(在左侧),索引失效
- 型:数据类型,INT,CHAT,VARCHAT 数据类型要对应
- 数:函数,对索引的字段使用内部函数会导致索引失效,该情况应使用基于函数的索引
- 空:NULL,索引不存储NULL值,要限制索引列NOT NULL,否则也无效
- 运:运算,对索引列进行加减乘除运算会导致索引失效
- 最:最左原则,在复合索引中,按照最左原则查找索引
- 快:全表扫瞄,数据库预计使用全表扫描更快则不走索引
发表评论 取消回复