语句格式以下只是我所做的一些简单的测试验证所得的结果,若有不对请指正。
select 显示的列
from 表1
where exists (
select * from 表2 where 条件表达式
)
伪代码
可以看到,表1在外循环,表2在内循环,只要在内循环中至少有一次满足条件表达式,就输出表1的该行
rst = [] # 存放select结果的列表,原为空
for i in 表1: # i是表1的每一行
flag = False
for j in 表2: # j是表2的每一行
if 条件表达式: # 条件表达式是由i、j作比较组成的
flag = True; # 只要有一个条件满足就那么flag被设置为True
break;
# 只要有一个条件满足,那么这个表1的行记录就会被加入结果列表
if flag:
rst.push_back(i);
MySQL语句举例
例如以下的MySQL语句:
select *
from tb_a
where exists (
select * from tb_b where tb_a.id = tb_b.id
);
它的伪代码如下:
rst = []
for i in 表1:
flag = False
for j in 表2:
if i.id == j.id:
flag = True;
break;
if flag:
rst.push_back(i);
验证过程
我在测试中使用了下面两张表:
tb_a| empid | name | age |
|---|---|---|
| A101 | 张三 | 40 |
| A102 | 李四 | 28 |
| A103 | 王五 | 20 |
| A104 | 赵六 | 19 |
| A105 | 杨甲 | 19 |
| A106 | 张三 | 17 |
| A108 | 张B | 31 |
| A107 | 杨A | 19 |
| empid | sales | month |
|---|---|---|
| A103 | 101 | 4 |
| A102 | 54 | 5 |
| A104 | 181 | 4 |
| A101 | 184 | 4 |
| A103 | 17 | 5 |
| A101 | 300 | 5 |
| A102 | 205 | 6 |
| A104 | 93 | 5 |
| A103 | 12 | 6 |
| A107 | 87 | 6 |
| A100 | 305 | 3 |
我使用了四个测试用例,它们的mysql代码如下(它们仅仅是条件表达式不同):
select * from tb_a
where exists (
select * from tb_b where tb_a.empid = tb_b.empid
);
select * from tb_a
where exists (
select * from tb_b where tb_a.empid = 'A101'
);
select * from tb_a
where exists (
select * from tb_b where tb_b.sales > 305
);
select * from tb_a
where exists (
select * from tb_b where tb_b.sales > 304
);
下面是我用来做测试写的python代码,而上面四个实例的对象条件表达式就在代码的注释中:
import pandas as pd
# 仅仅用于整齐输出
def show_table(lst, table):
tmp = pd.Dataframe(lst, columns=table.columns);
if not tmp.empty:
print(tmp);
else:
print("No data");
# 模仿select-exists运作的伪代码
def select_exists(table1, table2):
rst = []
for _, i in table1.iterrows():
flag = False;
for _, j in table2.iterrows():
# 条件表达式
if i['empid'] == j['empid']: # tb_a.empid = tb_b.empid
# if i['empid'] == 'A101': # tb_a.empid = 'A101'
# if j['sales'] > 304: # tb_b.sales > 305
# if j['sales'] > 305: # tb_b.sales > 304
flag = True;
break;
# 只要有一个条件满足,那么这个表1的行记录就会被加入结果列表
if flag:
rst.append(tuple(i));
show_table(rst, table1);
if __name__ == "__main__":
# 表1
tb_a = pd.Dataframe(
columns = [ 'empid', 'name', 'age'],
data = [
[ 'A101', '张三', 40],
[ 'A102', '李四', 28],
[ 'A103', '王五', 20],
[ 'A104', '赵六', 19],
[ 'A105', '杨甲', 19],
[ 'A106', '张三', 17],
[ 'A108', '张B', 31],
[ 'A107', '杨A', 19]
]
);
# 表2
tb_b = pd.Dataframe(
columns=['empid', 'sales', 'month'],
data = [
[ 'A103', 101, 4 ],
[ 'A102', 54, 5 ],
[ 'A104', 181, 4 ],
[ 'A101', 184, 4 ],
[ 'A103', 17, 5 ],
[ 'A101', 300, 5 ],
[ 'A102', 205, 6 ],
[ 'A104', 93, 5 ],
[ 'A103', 12, 6 ],
[ 'A107', 87, 6 ],
[ 'A100', 305, 3 ]
]
);
select_exists(tb_a, tb_b);



