MySQL多表联合查询语句的编写及效率分析、优化(2)

一般用法:
a. LEFT [OUTER] JOIN:
除了返回符合连接条件的结果之外,还需要显示左表中不符合连接条件的数据列,相对应使用NULL对应

SELECT column_name FROM table1 LEFT [OUTER] JOIN table2 ON table1.column=table2.column

b. RIGHT [OUTER] JOIN:
RIGHT与LEFT JOIN相似不同的仅仅是除了显示符合连接条件的结果之外,还需要显示右表中不符合连接条件的数据列,相应使用NULL对应

SELECT column_name FROM table1 RIGHT [OUTER] JOIN table2 ON table1.column=table2.column

Tips:

on a.c1 = b.c1 等同于 using(c1)

INNER JOIN 和 , (逗号) 在语义上是等同的

当 MySQL 在从一个表中检索信息时,你可以提示它选择了哪一个索引。
如果 EXPLAIN 显示 MySQL 使用了可能的索引列表中错误的索引,这个特性将是很有用的。
通过指定 USE INDEX (key_list),你可以告诉 MySQL 使用可能的索引中最合适的一个索引在表中查找记录行。
可选的二选一句法 IGNORE INDEX (key_list) 可被用于告诉 MySQL 不使用特定的索引。如:

mysql> SELECT * FROM table1 USE INDEX (key1,key2) WHERE key1=1 AND key2=2 AND key3=3; mysql> SELECT * FROM table1 IGNORE INDEX (key3) WHERE key1=1 AND key2=2 AND key3=3; 二、表连接的约束条件

添加显示条件WHERE, ON, USING

1. WHERE子句

SELECT * FROM table1,table2 WHERE table1.id=table2.id; SELECT * FROM users, userinfos WHERE users.id=userinfos.user_id;

2. ON

SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id; SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id LEFT JOIN table3 ON table2.id=table3.id; SELECT * FROM users LEFT JOIN articles ON users.id = articles.user_id; SELECT * FROM users LEFT JOIN userinfos ON users.id = userinfos.user_id LEFT JOIN articles ON users.id = articles.user_id;

3. USING子句,如果连接的两个表连接条件的两个列具有相同的名字的话可以使用USING

例如:

SELECT FROM LEFT JOIN USING ()

连接多于两个表的情况举例:

SELECT users.username, userinfos.name, articles.title FROM users LEFT JOIN userinfos ON users.id = userinfos.user_id LEFT JOIN articles ON users.id = articles.user_id;

执行结果:

mysql> SELECT users.username, userinfos.name, articles.title FROM users LEFT JOIN userinfos ON users.id = userinfos.user_id LEFT JOIN articles ON users.id = articles.user_id; +----------+-------+------------+ | username | name | title | +----------+-------+------------+ | junxi | 君惜 | 中国有嘻哈 | | tangtang | 糖糖 | 星光大道 | | ceshi3 | 测试3 | 平凡的真谛 | | junxi | 君惜 | Python进阶 | | ceshi3 | NULL | NULL | | ceshi3 | NULL | NULL |

或者

SELECT users.username, userinfos.name, articles.title FROM users LEFT JOIN userinfos ON users.id = userinfos.user_id LEFT JOIN articles ON users.id = articles.user_id WHERE (articles.user_id IS NOT NULL AND userinfos.user_id IS NOT NULL);

执行结果:

mysql> SELECT users.username, userinfos.name, articles.title FROM users LEFT JOIN userinfos ON users.id = userinfos.user_id LEFT JOIN articles ON users.id = articles.user_id WHERE (articles.user_id IS NOT NULL AND userinfos.user_ id IS NOT NULL); +----------+-------+------------+ | username | name | title | +----------+-------+------------+ | junxi | 君惜 | 中国有嘻哈 | | tangtang | 糖糖 | 星光大道 | | ceshi3 | 测试3 | 平凡的真谛 | | junxi | 君惜 | python进阶 | +----------+-------+------------+

或者

SELECT users.username, userinfos.name, articles.title FROM users LEFT JOIN userinfos ON users.id = userinfos.user_id LEFT JOIN articles ON users.id = articles.user_id WHERE (userinfos.name = '君惜');

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5e49f4fa2758659cb0a8f067824e2a0f.html