Mysql中where与on的区别及何时使用详析
之前在写连表查询的时候,老是分不清楚where和on的区别,导致有时写的SQL会出现一点小的问题,这里专门写篇文章做下记录,如果你也分不清,那么请参考
二者的区别及什么时候使用
说明:区分on和where首先我们将连接分为内部连接和非内部连接,内部连接时on和where的作用是一样的,通常我们分不清它们的区别说的是非内部连接
一般on用来连接两个表,只的是连接的条件,在内部连接时,可以省略on,此时它表示的是两个表的笛卡尔积;使用on连接后,mysql会生成一张临时表,而where就是在临时表的基础上,根据where子句来筛选出符合条件的记录,因此where是用来筛选的
内部连接(inner join)
说明:join默认为inner join,当为内部连接时,on和where的作用你可以看做是一样的
非内部连接(left join、right join、full join等)
一般分不清区别就是在使用非内部连接时,
实例说明
下面我们建两张表(每个表中插入4条数据,两个表通过trade_id来关联),来说明它们的区别,此文章的最下面附有SQL脚本,然后我们通过连表查询来说明on和where的区别
1、inner join 连接两个表(无on和where)
select * from hopegaming_main.test_1234 join hopegaming_main.test_1235
等价于
select * from hopegaming_main.test_1234,hopegaming_main.test_1235
结果集是两个表的笛卡尔积
2、inner join 连接两个表(有on)
select * from hopegaming_main.test_1234 t1 join hopegaming_main.test_1235 t2 on t1.trade_id = t2.trade_id
3、inner join 连接两个表(有where)
select * from hopegaming_main.test_1234 t1 join hopegaming_main.test_1235 t2 where t1.trade_id = t2.trade_id
从2和3的结果中我们可以看出,在使用inner join连接时,on和where的作用相等
4、left join(下面以left join为例来连接两个表) 连接两个表
select * from hopegaming_main.test_1234 t1 left join hopegaming_main.test_1235 t2 on t1.trade_id = t2.trade_id
5、left join(下面以left join为例来连接两个表) 连接两个表,连接条件中有常量等式
select * from hopegaming_main.test_1234 t1 left join hopegaming_main.test_1235 t2 on t1.trade_id = t2.trade_id and t2.nick_name = 'wangwu'
6、left join(下面以left join为例来连接两个表) 连接两个表,将常量表达式放入where子句中
select * from hopegaming_main.test_1234 t1 left join hopegaming_main.test_1235 t2 on t1.trade_id = t2.trade_id where t2.nick_name = 'wangwu''
建表和插入数据的脚本:
CREATE TABLE `hopegaming_main`.`test_1234` ( `id` varchar(30) NOT NULL COMMENT '身份证号', `name` varchar(100) DEFAULT NULL COMMENT '姓名', `trade_id` varchar(100) DEFAULT NULL COMMENT '交易id', `gender` tinyint(4) DEFAULT NULL COMMENT '性别', `birthday` timestamp(6) NOT NULL COMMENT '出生日期', PRIMARY KEY (`id`) USING BTREE, KEY `idx_trade_id` (`trade_id`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;INSERT INTO hopegaming_main.test_1234(id, name, trade_id, gender, birthday)VALUES('1', 'zhangsan', '123', 0, CURRENT_TIMESTAMP(6)),('2', 'zhaosi', '124', 0, CURRENT_TIMESTAMP(6)),('3', 'wangwu', '125', 0, CURRENT_TIMESTAMP(6)),('4', 'maqi', '126', 0, CURRENT_TIMESTAMP(6));CREATE TABLE `hopegaming_main`.`test_1235` ( `id` varchar(30) NOT NULL COMMENT '身份证号', `nick_name` varchar(100) DEFAULT NULL COMMENT '别名', `trade_id` varchar(100) DEFAULT NULL COMMENT '交易id', `address` varchar(100) DEFAULT NULL COMMENT '地址', `email` varchar(6) NOT NULL COMMENT '出生日期', PRIMARY KEY (`id`) USING BTREE, KEY `idx_trade_id` (`trade_id`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;INSERT INTO hopegaming_main.test_1235(id, nick_name, trade_id, address, email)VALUES('1', 'zhangsan', '123', 'beijing', '0000'),('2', 'wangwu', '123', 'tianjin', '1111'),('3', 'maqi', '124', 'shanghai', '2222'),('4', 'yangliu', '127', 'shanxi', '3333');
更多相关文章
- MySQL系列多表连接查询92及99语法示例详解教程
- Linux下MYSQL 5.7 找回root密码的问题(亲测可用)
- MySQL 什么时候使用INNER JOIN 或 LEFT JOIN
- android上一些方法的区别和用法的注意事项
- Android中的FILL_PARENT与WRAP_CONTENT的区别
- [Android] ACTION_GET_CONTENT与ACTION_PICK的区别
- android上一些方法的区别和用法的注意事项
- linearLayout 和 relativeLayout的属性区别
- android从服务器下载文件(php+apache+win7+MySql)