sql 左连接查询条件and与where
2015-12-27 00:00
711 查看
摘要: sql 左连接查询条件and与where
用一条SQL查询一张表中不同级别的字段(字段名称相同)。
需求:用一条SQL同时查出城市id、城市name、省份id和省份name。
版本一如下
SELECT
tlUp.LOCATION_ID as cityId,
tlUp.LOCATION_NAME as cityName,
tlDown.LOCATION_ID as provinceId,
tlDown.LOCATION_NAME as provinceName
FROM
(SELECT
tl.LOCATION_ID,
tl.LOCATION_NAME,
tl.SUPER_LOCATION_ID
FROM
t_location tl) tlUp,t_location tlDown
WHERE
tlUp.SUPER_LOCATION_ID = tlDown.LOCATION_ID
版本二
SELECT
tlOne.LOCATION_ID as cityId,
tlOne.LOCATION_NAME as cityName,
tlTwo.LOCATION_ID as provinceId,
tlTwo.LOCATION_NAME as provinceName
FROM
t_location tlOne
LEFT JOIN
t_location tlTwo
ON
tlOne.SUPER_LOCATION_ID = tlTwo.LOCATION_ID
版本二查询出来的结果
SQL版本三
SELECT
tlOne.LOCATION_ID as cityId,
tlOne.LOCATION_NAME as cityName,
tlTwo.LOCATION_ID as provinceId,
tlTwo.LOCATION_NAME as provinceName
FROM
t_location tlOne
LEFT JOIN
t_location tlTwo
ON
tlOne.SUPER_LOCATION_ID = tlTwo.LOCATION_ID
AND
tlOne.LOCATION_LEVEL = '2'
查询出的结果同版本二一样
别人写的SQL版本一如下
SELECT
tlOne.LOCATION_ID as cityId,
tlOne.LOCATION_NAME as cityName,
tlTwo.LOCATION_ID as provinceId,
tlTwo.LOCATION_NAME as provinceName
FROM
t_location tlOne
LEFT JOIN
t_location tlTwo
ON
tlOne.SUPER_LOCATION_ID = tlTwo.LOCATION_ID
WHERE
tlOne.LOCATION_LEVEL = '2'
查询出的结果同版本一 一样
别人写的SQL版本二如下
SELECT
tlUp.LOCATION_ID as cityId,
tlUp.LOCATION_NAME as cityName,
tlDown.LOCATION_ID as provinceId,
tlDown.LOCATION_NAME as provinceName
FROM t_location tlUp,t_location tlDown
WHERE
tlUp.SUPER_LOCATION_ID = tlDown.LOCATION_ID
仔细观察上述SQL会发现
我写的版本三和别人写的版本一唯一的区别在于on后面的条件连接关键词,我用的是ON,别人用的是where。这里延伸出一个问题:
left join on后面跟and和where的区别
1.on后面and 条件表示先过滤之后,再连接
2.on后面where条件表示先关联之后,再过滤 相当内连了。。
用一条SQL查询一张表中不同级别的字段(字段名称相同)。
需求:用一条SQL同时查出城市id、城市name、省份id和省份name。
版本一如下
SELECT
tlUp.LOCATION_ID as cityId,
tlUp.LOCATION_NAME as cityName,
tlDown.LOCATION_ID as provinceId,
tlDown.LOCATION_NAME as provinceName
FROM
(SELECT
tl.LOCATION_ID,
tl.LOCATION_NAME,
tl.SUPER_LOCATION_ID
FROM
t_location tl) tlUp,t_location tlDown
WHERE
tlUp.SUPER_LOCATION_ID = tlDown.LOCATION_ID
版本二
SELECT
tlOne.LOCATION_ID as cityId,
tlOne.LOCATION_NAME as cityName,
tlTwo.LOCATION_ID as provinceId,
tlTwo.LOCATION_NAME as provinceName
FROM
t_location tlOne
LEFT JOIN
t_location tlTwo
ON
tlOne.SUPER_LOCATION_ID = tlTwo.LOCATION_ID
版本二查询出来的结果
SQL版本三
SELECT
tlOne.LOCATION_ID as cityId,
tlOne.LOCATION_NAME as cityName,
tlTwo.LOCATION_ID as provinceId,
tlTwo.LOCATION_NAME as provinceName
FROM
t_location tlOne
LEFT JOIN
t_location tlTwo
ON
tlOne.SUPER_LOCATION_ID = tlTwo.LOCATION_ID
AND
tlOne.LOCATION_LEVEL = '2'
查询出的结果同版本二一样
别人写的SQL版本一如下
SELECT
tlOne.LOCATION_ID as cityId,
tlOne.LOCATION_NAME as cityName,
tlTwo.LOCATION_ID as provinceId,
tlTwo.LOCATION_NAME as provinceName
FROM
t_location tlOne
LEFT JOIN
t_location tlTwo
ON
tlOne.SUPER_LOCATION_ID = tlTwo.LOCATION_ID
WHERE
tlOne.LOCATION_LEVEL = '2'
查询出的结果同版本一 一样
别人写的SQL版本二如下
SELECT
tlUp.LOCATION_ID as cityId,
tlUp.LOCATION_NAME as cityName,
tlDown.LOCATION_ID as provinceId,
tlDown.LOCATION_NAME as provinceName
FROM t_location tlUp,t_location tlDown
WHERE
tlUp.SUPER_LOCATION_ID = tlDown.LOCATION_ID
仔细观察上述SQL会发现
我写的版本三和别人写的版本一唯一的区别在于on后面的条件连接关键词,我用的是ON,别人用的是where。这里延伸出一个问题:
left join on后面跟and和where的区别
1.on后面and 条件表示先过滤之后,再连接
2.on后面where条件表示先关联之后,再过滤 相当内连了。。
相关文章推荐
- mysql优化总结。。
- SQL:DATAADD() 日期中添加或减去指定的时间间隔
- SQL:GETDATE() 获取当前时间
- SQL:DISTINCT 去除重复
- JDBC_使用 Statement 执行更新操作(基于oracle数据库)
- mysql如何添加用户 删除用户 修改用户密码
- Mysql AB复制
- grant 权限 on 数据库对象 to 用户@'IP'
- MySQL常用字符集
- Oracle 设定允许访问的IP地址
- 编译安装mysql
- Oracle-SQL Plus学习总结
- MySql5.7.10初始化
- MySQL事务处理
- 迁移到MariaDB galera
- mysql5.7 zip windows下安装
- Sql使用日常总结
- 进军服务器了,转点mysql操作命令
- MariaDB Galera Cluster 部署(如何快速部署 MariaDB 集群)
- 安装MongoDB(做成Windows服务)并加载C#驱动程序