表准备
假设数据库有两张表 名为person
和city
表person
字段如下:
id | name | c_id |
---|---|---|
1 | 张三 | 1 |
2 | 李四 | 2 |
3 | 王五 | 5 |
表city
字段如下
id | city |
---|---|
1 | 北京 |
2 | 上海 |
3 | 广州 |
多表合一查询
- 第一种
1 | select xxx,xxx from 表1,表2 where 表1.xxx=表2.xxx |
示例:
1 | select name, city from person, city where name.c_id = city.id; |
查询结果:
city | name |
---|---|
北京 | 张三 |
上海 | 李四 |
- 第二种 使用
join
1 | select xxx,xxx from 表1 inner join 表2 on 表1.xxx=表2.xxx |
示例:
1 | select name, city from person inner join city on name.c_id = city.id; |
查询结果和第一种一致
根据一张表字段查询另外一张表
- 查询所属北京的都有哪些人
1 | # 嵌套查询方式 |
like
关键字查询姓张的有多少人
1 | select count(distinct(name)) |
in
嵌套查询 判断查询的表达式是否在多个值的列表中
1 | select name |
some
部分匹配查询 如果在一系列比较中,有些值为True,那么结果就为True
1 | select name |
all
全部匹配查询 如果一系列的比较都为true,那么结果才能为true
1 | #大于以下返回的所有id,此结果才为True,此结果才返回 |
exists
嵌套查询 如果子查询有结果集返回,那么就为True 一旦找到第一个匹配的记录后,就马上停止查找
1 | select * |
子查询必定返回true的三种情况:
1 | #第一种select 1 |
根据子查询结果充当临时表进行查询
- 子查询是一种嵌套查询,将一个查询用小括号包围起来,然后作为下一个查询的结果,子查询必须有别名 ,一般用于二次或多次筛查。
1 | SELECT nan.id FROM (SELECT name,c_id FROM person WHERE id=2) AS nan WHERE c_id = 1; |
关于join
的特殊用法
- JOIN: 如果表中有至少一个匹配,则返回行
- LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN: 只要其中一个表中存在匹配,就返回行
LEFT JOIN示例:
1 | select name, city from person left join city on name.c_id = city.id; |
返回结果:
city | name |
---|---|
北京 | 张三 |
上海 | 李四 |
王五 |
RIGHT JOIN示例:
1 | select name, city from person right join city on name.c_id = city.id; |
返回结果:
city | name |
---|---|
北京 | 张三 |
上海 | 李四 |
广州 |
FULL JOIN示例:
1 | select name, city from person full join city on name.c_id = city.id; |
返回结果:
city | name |
---|---|
北京 | 张三 |
上海 | 李四 |
广州 | |
王五 |
本文为作者原创 转载时请注明出处 谢谢