部门表dept和员工表empMySQL练习
建表
1 | /* |
练习
1 | -- 1.更新名称为'SALES'部门下的所有员工薪水上涨20% |
EXISTS和IN
效率差
1 | SELECT |
效率高
1 | SELECT |
例如
1 | -- 例如:表A(小表),表B(大表) |
总结
in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的。如果查询的两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists(大表),子查询表小的用in(小表);
跟显示字段的多少没有太大区别。
MySQL树结构
根据某节点ID查询所有父节点(包含该节点)
1
2
3
4
5
6
7
8
9
10
11
12
13SELECT T2.id,
T2.pid,
T1.lvl
FROM (
SELECT @r AS _id,
(SELECT @r := pid FROM tb_p_resources WHERE id = _id) AS pid,
@l := @l + 1 AS lvl
FROM (SELECT @r := 14, @l := 0) vars,
tb_p_resources h
WHERE @r != 0
) T1
JOIN tb_p_resources T2 ON T1._id = T2.id
ORDER BY T1.lvl DESC根据某节点查询所有子节点(不包含该节点)
1 | SELECT |
行转列
1 | SELECT |
A表中的字段,模糊匹配B中字段
查询B表中的name字段包含A表中的city字段
1 | select A.city,B.`name`,B.id from ( |
根据某字段删除重复记录,只保留最小ID值的那一条数据
1 | delete from tb_p_dealer where id in |
对单张表进行匹配更新数据
期望数据
根据value
字段分组,并更新enum_type
字段值为每组第一条数据中的的enum_type
值。
1 | update t1 left join (SELECT * FROM tpt WHERE GROUP BY value) t2 on t1.`value`=t2.`value` set t1.enum_type = t2.enum_type |