连接查询:

是将两个查询(或表)的每一行,以“两两横同对接”的方式,所得到的所有行的结果,即一个表中的某行,跟另一个表中的某行。进行“横向对接”,得到一个新行。

连接查询包括以下这些不同形式,连接方式:

交叉连接、内连接、外连接(分:左外连接,右外连接)

连接查询语法:

select * from 表名 [连接方式] join 表名 [on 连接条件] where ...;

测试数据:

mysql> select * from test;+----+--------+------+------+| id | name | sex | age |+----+--------+------+------+| 1 | name1 | 女 | 15 || 2 | name1 | 女 | 15 || 4 | name2 | 男 | 30 || 5 | name50 | 男 | 12 |+----+--------+------+------+mysql> select * from user;+----+-------+------+| id | name | age |+----+-------+------+| 1 | name1 | 18 || 2 | name2 | 15 || 3 | name3 | 20 || 4 | name4 | 30 |+----+-------+------+

1、交叉连接其实可以认为是连接查询的“完全版本”, 即所有行都无条件地都连接起来。

2、关键字 “cross” 可以省略;

3、交叉连接又称为“笛卡尔积”,通常应用价值不大

语法形式:

select * from 表名, 表名;
select * from 表名 join 表名;
select * from 表名 cross join 表名;

规范的交叉连接写法

mysql> select * from test cross join user;+----+--------+------+------+----+-------+------+| id | name | sex | age | id | name | age |+----+--------+------+------+----+-------+------+| 1 | name1 | 女 | 15 | 1 | name1 | 18 || 2 | name1 | 女 | 15 | 1 | name1 | 18 || 4 | name2 | 男 | 30 | 1 | name1 | 18 || 5 | name50 | 男 | 12 | 1 | name1 | 18 || 1 | name1 | 女 | 15 | 2 | name2 | 15 || 2 | name1 | 女 | 15 | 2 | name2 | 15 || 4 | name2 | 男 | 30 | 2 | name2 | 15 || 5 | name50 | 男 | 12 | 2 | name2 | 15 || 1 | name1 | 女 | 15 | 3 | name3 | 20 || 2 | name1 | 女 | 15 | 3 | name3 | 20 || 4 | name2 | 男 | 30 | 3 | name3 | 20 || 5 | name50 | 男 | 12 | 3 | name3 | 20 || 1 | name1 | 女 | 15 | 4 | name4 | 30 || 2 | name1 | 女 | 15 | 4 | name4 | 30 || 4 | name2 | 男 | 30 | 4 | name4 | 30 || 5 | name50 | 男 | 12 | 4 | name4 | 30 |+----+--------+------+------+----+-------+------+
mysql> select * from test join user;

还可以直接 from 表,表... 也相当于是交叉连接

mysql> select * from test, user;

内连接 (inner join)

1、内连接其实是交叉连接的基础上,再通过 on 条件而筛选出来的部分数据。

2、关键字 "inner" 可以省略,但建议写上,真正有意义的是 on 连接条件。

3、内连接是应用最广泛的一种连接查询,其本质是根据条件筛选出“有意义的数据”。

语法形式:

select * from 表名 join 表名 on 连接条件;
select * from 表名 inner join 表名 on 连接条件;

查出两个表中 name 字段相等的数据

mysql> select * from test inner join user on test.name=user.name;+----+-------+------+------+----+-------+------+| id | name | sex | age | id | name | age |+----+-------+------+------+----+-------+------+| 1 | name1 | 女 | 15 | 1 | name1 | 18 || 2 | name1 | 女 | 15 | 1 | name1 | 18 || 4 | name2 | 男 | 30 | 2 | name2 | 15 |+----+-------+------+------+----+-------+------+
mysql> select * from test as t inner join user as u on t.name=u.name;

查出两个表中 name 字段相等,test 表中 age>15,user 表中 age>10 的数据

如果使用表中有重复的字段,那么就需要通过 [表名.字段名] 来使用,例如 age :

mysql> select * from test inner join user on test.name=user.name where test.age>15 and user.age>10;+----+-------+------+------+----+-------+------+| id | name | sex | age | id | name | age |+----+-------+------+------+----+-------+------+| 4 | name2 | 男 | 30 | 2 | name2 | 15 |+----+-------+------+------+----+-------+------+

如果使用表中没有重复的字段,那么可以通过 [表名.字段名] 或者直接使用 [字段名] 使用,例如 sex :

mysql> select * from test as t inner join user as u on t.name=u.name where t.sex='男';mysql> select * from test as t inner join user as u on t.name=u.name where sex='男';+----+-------+------+------+----+-------+------+| id | name | sex | age | id | name | age |+----+-------+------+------+----+-------+------+| 4 | name2 | 男 | 30 | 2 | name2 | 15 |+----+-------+------+------+----+-------+------+

1、左外连接其实是保证左边表的数据都能够取出的一种连接 。

2、左外连接其实是在内连接的基础上,再加上左边表中所有不能满足条件的数据

3、关键字 “outer" 可以省略。

语法形式:

select * from 表名 left [outer] join on 连接条件 where ...;

以左边的表为基准,保证左边表的数据全部显示,匹配不到的数据为 NULL

mysql> select * from test left join user on test.name=user.name;+----+--------+------+------+------+-------+------+| id | name | sex | age | id | name | age |+----+--------+------+------+------+-------+------+| 1 | name1 | 女 | 15 | 1 | name1 | 18 || 2 | name1 | 女 | 15 | 1 | name1 | 18 || 4 | name2 | 男 | 30 | 2 | name2 | 15 || 5 | name50 | 男 | 12 | NULL | NULL | NULL |+----+--------+------+------+------+-------+------+

1、右外连接其实是保证右边表的数据都能够取出的一种连接 。

2、右外连接其实是在内连接的基础上,再加上右边表中所有不能满足条件的数据

3、关键字 “outer" 可以省略。

语法形式:

select * from 表名 right [outer] join on 连接条件 where ...;

以右边的表为基准,保证右边表的数据全部显示,匹配不到的数据为 NULL

mysql> select * from test right join user on test.name=user.name;+------+-------+------+------+----+-------+------+| id | name | sex | age | id | name | age |+------+-------+------+------+----+-------+------+| 1 | name1 | 女 | 15 | 1 | name1 | 18 || 2 | name1 | 女 | 15 | 1 | name1 | 18 || 4 | name2 | 男 | 30 | 2 | name2 | 15 || NULL | NULL | NULL | NULL | 3 | name3 | 20 || NULL | NULL | NULL | NULL | 4 | name4 | 30 |+------+-------+------+------+----+-------+------+

更多相关文章

  1. MySQL系列多表连接查询92及99语法示例详解教程
  2. vue 基础语法及购物车小案例
  3. Andorid Dialog 示例【慢慢更新】
  4. Android(安卓)PureMVC
  5. Ubunu下搭建android NDK环境
  6. 自定义SeekBar主题
  7. android SQLite数据库基本操作示例
  8. android draw bitmap 示例代码
  9. Android启动时启动Activity 的定义的位置

随机推荐

  1. Android 图片侧滑展示RecyclerView简单实
  2. android的TableLayout布局界面元素填满整
  3. [转]Android EditView属性
  4. android 笔记 --- Android应用程序的权限
  5. 手动更新 Android SDK
  6. android adb命令 抓取系统各种 log
  7. android字体加粗的方法
  8. android studio ndk 开发以及问题
  9. Your CPU does not support required fea
  10. Android ProgressBar 各种样式大全