mysql查询中的复杂语句,当用左连接left join查询时,加上UNION查询就会出现错误!

这个问题我以前也遇到过,挺头疼的。
记得有一次,我在一个问答论坛上看到一个哥们儿提了类似的问题。
他也是在写SQL查询,结果发现报了错,原因就是联合查询(UNION)里的字段类型不一致。

我那时候一看,这事儿简单,就回复了他。
我说:“兄弟,你这问题啊,主要是因为UNION要求参与合并的查询结果集里的字段类型和顺序要完全一致。
你上面那个查询可能包含了不止int类型的字段,而下面的SELECT语句只指定了int类型,所以系统就报错了。

当时我还举了个例子,比如说: sql SELECT name FROM table1 UNION SELECT id FROM table2 ;
这里就报错,因为table1 和table2 的字段类型不一致。
要解决这个问题,要么把上面那个查询也改成只返回int类型的字段,要么把下面那个查询的返回类型调整过来。

不过说到底,SQL这东西有时候还挺“矫情”的,细节处理真的很重要。
我当时也没想明白为什么会有这种规定,可能就是为了保证合并后的结果集在类型上一致,方便后续的处理和显示吧。
这块儿数据我记得是X左右,但建议你核实一下具体的原因。

mysql中多条件查询例子 mysql复杂条件查询示例

记得去年冬天,我帮公司做报表,查销售部工资单,要求筛选出既在销售部又工资超过5 000的。
当时就用了AND条件,SELECT FROM employees WHERE department='Sales' AND salary>5 000; 简单明了。
后来老板又加了个要求,说市场部工资超过4 000的也得加上。
这下子得用OR和括号了,WHERE (department='Sales' AND salary>5 000) OR (department='Marketing' AND salary>4 000); 两个条件得分开写,不能混。
这时候我突然想到,如果部门特别多,条件再多起来,是不是会越来越复杂?要不要考虑用子查询?比如查工资高于同部门平均工资的,就用子查询,外面一层WHERE e.salary > (SELECT AVG(salary) FROM employees WHERE department=e.department); 这样一层套一层,逻辑清晰。
不过后来发现数据量大的时候,JOIN可能更快,比如查员工和部门表,JOIN比子查询跑得快。
最关键的是索引,department和salary字段加了索引,查询速度直接快了十倍不止。
但索引也不是越多越好,加多了更新数据反而慢了。
记得有一次加多了索引,老板半夜打电话来问报表怎么变慢了,真是哭笑不得。

【MySQL】MySQL查询锁表的SQL语句

说实话,MySQL里查表锁情况,得用点特殊命令。
你想看锁了没,可以试试这个:
sql SHOW ENGINE INNODB STATUS;
这个命令会给你一堆信息,挺乱的,你得自己扒拉里面对应锁的部分。
当时我也没看明白,后来才知道里面有个LATEST BLOCKING TRANSACTION,能看到谁在卡着。

要是想查具体哪个表被锁了,MySQL没直接命令。
得去INFORMATION_SCHEMA库里转转。
那儿有俩表,INNODB_LOCKS和INNODB_LOCK_WAITS,能看当前锁的详情。

比如你有个表叫table_name,想知道它锁没锁,可以这么干:
sql SELECT FROM INFORMATION_SCHEMA.INNODB_LOCKS WHERE OBJECT_NAME = 'table_name';
但说实话,这玩意儿得自己分析,挺麻烦的。

再一个法子,想查某条记录锁没锁,可以这么试:
sql SELECT FROM user WHERE id = 1 FOR UPDATE;
执行这个,如果它报错了说锁不到,说明这条记录被别人锁了。
当时我试的时候,得小心点,因为它真会去抢锁,可能会卡住别人。

从MySQL 5 .6 开始,有个叫PERFORMANCE_SCHEMA的东西,能看更细的锁信息。
那儿有data_locks和data_lock_waits表,挺有用。

sql SELECT FROM performance_schema.data_locks;
能查到谁在持锁,挺详细的。

不过说实话,干这事儿得有点经验,不然看不懂。
锁这东西,管得好不好,数据库跑得顺不顺畅,关系挺大的。
得先多试试,搞明白才动手。