对SELECT 1 FROM感到困惑

时间:2013-04-21 20:13:12

标签: mysql sql select

如果我执行以下查询:
SELECT 1 FROM emp;

我明白了:

mysql> SELECT 1 FROM emp;  
+---+  
| 1 |  
+---+  
| 1 |  
| 1 |  
| 1 |  
| 1 |  
| 1 |  
| 1 |  
| 1 |  
| 1 |  
| 1 |  
| 1 |  
| 1 |  
| 1 |  
| 1 |  
| 1 |  
| 1 |  
+---+  

如果我这样做:

SELECT 1 FROM emp e WHERE 20=e.deptno;我明白了:

mysql> SELECT 1 FROM emp e WHERE 20=e.deptno;  
+---+  
| 1 |   
+---+  
| 1 |  
| 1 |   
| 1 |   
| 1 |   
| 1 |   
| 1 |    
+---+  
6 rows in set (0.00 sec)   

如果我这样做:

mysql> SELECT deptno FROM emp;  
+--------+  
| deptno |  
+--------+  
|     10 |   
|     10 |   
|     10 |   
|     20 |   
|     20 |   
|     20 |   
|     20 |   
|     20 |   
|     20 |  
|     30 |  
|     30 |  
|     30 |  
|     30 |  
|     30 |  
|    100 |  
+--------+  
15 rows in set (0.00 sec)  

我看到前面有6行20和6行:SELECT 1 FROM emp e WHERE 20=e.deptno;

但这些查询是如何相关的?

3 个答案:

答案 0 :(得分:3)

SELECT 1 FROM emp e WHERE 20=e.deptno;

查询根据您的where条件选择行数,但您没有选择任何列值,而只选择1这就是为什么它显示6行1

答案 1 :(得分:3)

有六行20 = e.deptno,因此您在第二个查询中获得六个1(顶部的第七个1只是一个自动生成的列名称。)

答案 2 :(得分:3)

如果您选择deptno和文字值,请执行以下操作:

SELECT 1, deptno FROM emp

你得到:

1   10
1   10
1   10
1   20
1   20
1   20
1   20
1   20
1   20
1   30
1   30
1   30
1   30
1   30
1  100

如果您只过滤掉deptno 20,请执行以下操作:

SELECT 1, deptno FROM emp where deptno = 20

你得到了上一个查询的这个子集:

1   20
1   20
1   20
1   20
1   20
1   20

如果您忽略结果中的deptno

SELECT 1 FROM emp where deptno = 20

你只得到那些:

1
1
1
1
1
1