38.笔记 MySQL学习——使用连接实现多表连接
与SQL语言中其他语句相比,SELECT语句时最常用,也是最不容易掌握的。
MYSQL的SELECT语句基本语法如下:
SELECT select_list
FROM table_list
WHERE row_contraint
GROUP BY grouping_columns
ORDER BY sorting_columns
HAVING group_constraint
LIMIT count;
MYSQL 不要求必须有FROM 子句。
1. 内连接使用INNER JOIN来隔开多个表的名字,就进行了内连接
例如:
SELECT * FROM T1 INNER JOIN T2;
这样得到的是笛卡尔积
可以通过WHERE子句进行限定,如下
SELECT T1.*,T2.* FROM T1 INNER JOIN T2WHERE T1.I1=T2.I2;
此外CROSS JOIN 和JOIN 以及逗号都等同于INNER JOIN。
2. 对列进行限定当一个表中出现相同的列名的时候,需要通过表名来解决可能产生的歧义。
如果需要进行自连接的话,需要使用别名来解决问题。
3. 左连接内连接只会显示在两个表里都匹配上的行。
外连接可以把其中一个表在另一个表里没有匹配的行也显示出来。
左连接的话,当左表的某行在右表里无匹配时,仍然会被选取为一个输出行。
右连接相反。
创建两个表如下:
mysql> create table t1 (i1 int,c1 varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> create table t2 (i2 int,c2 varchar(10));
Query OK, 0 rows affected (0.01 sec)
插入数据如下:
mysql> insert into t1 values ( 1, 'a');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1 values ( 2, 'b');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1 values ( 3, 'c');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t2 values ( 2, 'c');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t2 values ( 3, 'b');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t2 values ( 4, 'a');
Query OK, 1 row affected (0.01 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
内连接如下:
mysql> select t1.*,t2.* from t1 inner join t2 ont1.i1=t2.i2;
+------+------+------+------+
| i1 | c1 | i2 | c2 |
+------+------+------+------+
| 2 | b | 2 | c |
| 3 | c | 3 | b |
+------+------+------+------+
2 rows in set (0.01 sec)
左连接如下:
mysql> select t1.*,t2.* from t1 left join t2 ont1.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非常有用。
如下:
mysql> select t1.*,t2.* from t1 left join t2 ont1.i1=t2.i2 where t2.i2 is null;
+------+------+------+------+
| i1 | c1 | i2 | c2 |
+------+------+------+------+
| 1 | a | NULL | NULL |
+------+------+------+------+
1 row in set (0.00 sec)
可以通过ON子句或USING()子句指定匹配条件。USING子句要求被连接的列必须有相同的名字。
NATURAL LEFT JOIN类似于LEFT JOIN。会按照LEFT JOIN规则对左右两个表所有同名的列进行匹配。