如果只把记录存入数据库,而不对它们进行检索或是好好利用,那就没意义了。这正是SELECT语句的意义所在:帮你找到所需要的数据。
SELECT语句的基本语法,如下所示:
SELECT select_list #所选择的的列
FROM table_list #要查询的那些表
WHERE row_constraint #行必须满足的条件
GROUP BY grouping_columns #结果如何分组
ORDER BY sorting_columns #结果如何排序
HAVING group_constraint #分组必须满足的条件
LIMIT count; #限制结果里的行数
除了单词select和用于指定想要输出的那些内容的select_list部分之外,这个语法中的所有内容都是可选的。
有些数据库要求from子句也必不可少。但mysql并没有,因为这样可以实现在没有引用任何表的情况下对表达式进行求值
select sort(pow(3,2)+pow(4,2));
假如有以下两张表:
Table t1: Table t2:
+------+------+ +------+------+
| i1 | c1 | | i2 | c2 |
+------+------+ +------+------+
| 1 | a | | 2 | c |
| 2 | b | | 3 | b |
| 3 | c | | 4 | a |
+------+------+ +------+------+
内连接:像下面这样所示,t1里的每一行将于t2里的每一行进行组合
mysql> select * from t1 inner join t2;
+------+------+------+------+
| i1 | c1 | i2 | c2 |
+------+------+------+------+
| 1 | a | 2 | c |
| 2 | b | 2 | c |
| 3 | c | 2 | c |
| 1 | a | 3 | b |
| 2 | b | 3 | b |
| 3 | c | 3 | b |
| 1 | a | 4 | a |
| 2 | b | 4 | a |
| 3 | c | 4 | a |
+------+------+------+------+
select* 的含义是“从From子句列出的每个表里选取每个列”,也可以写成如下形式
select t1.*,t2.* from t1 inner join t2;
根据某个表里的每一行与另一个表里的每一行得到全部可能组合的连接操作,叫做生成笛卡尔积(cartesian product)。
限制笛卡尔积,使用where子句
mysql> select * from t1 inner join t2 where t1.i1=t2.i2;
+------+------+------+------+
| i1 | c1 | i2 | c2 |
+------+------+------+------+
| 2 | b | 2 | c |
| 3 | c | 3 | b |
+------+------+------+------+
2 rows in set (0.00 sec)
连接类型cross join和join都等同于inner join
内连接只会显示在两个表里都匹配上的行。外连接除了显示同样的匹配结果,还可以吧其中一个表在另一个表里没有匹配的行业显示出来。外链接分为左连接和右连接两种。
左连接
工作方式:先指定用于对两个表里的行进行匹配的列;接着,当左表的某行与右表的某行相匹配时,两行的内容会被选取为一个输出行;当左表的某行在右表里无匹配时,它扔会被选取为一个输出行,只是与他连接的是右表的一个“假”行,其中的每一列都包含null。
换句话说,对于左表查询出的每一行,不管它在右表里是否有匹配,left join都会强制结果集包含一行记录。在结果集里,对于在右表里没有匹配的结果行,它们会有一个特征,即来自右表的所有列都为null。
mysql> select * from t1 inner join t2 where t1.i1=t2.i2;
+------+------+------+------+
| i1 | c1 | i2 | c2 |
+------+------+------+------+
| 2 | b | 2 | c |
| 3 | c | 3 | b |
+------+------+------+------+
2 rows in set (0.00 sec)
mysql> select * from t1 left join t2 on t1.i1=t2.i2;
+------+------+------+------+
| i1 | c1 | i2 | c2 |
+------+------+------+------+
| 2 | b | 2 | c |
| 3 | c | 3 | b |
| 1 | a | NULL | NULL |
+------+------+------+------+
3 rows in set (0.00 sec)
特别注意,当使用left join时,右表中的数据全部定义为not null,不然没法区分。
当只想将左表里的那些在右表里无匹配的行找出来,left join非常有用。通常情况下,在编写这样的查询指令时,真正让人感兴趣的内容是左表里未被匹配到的值。例如
mysql> select * from t1 left join t2 on t1.i1=t2.i2 where t2.i2 is null;
+------+------+------+------+
| i1 | c1 | i2 | c2 |
+------+------+------+------+
| 1 | a | NULL | NULL |
+------+------+------+------+
1 row in set (0.00 sec)
mysql> select t1.* from t1 left join t2 on t1.i1=t2.i2 where t2.i2 is null;
+------+------+
| i1 | c1 |
+------+------+
| 1 | a |
+------+------+
1 row in set (0.00 sec)