mysql/mariadb学习记录——连接查询(JOIN)

//本文使用的数据表格//persons表中id_p为主键//orders表中id_o为主键,id_p为外键参考persons表中的id_p
mysql> select * from persons;select * from orders;
+------+----------+-----------+----------------+----------+
| id_p | lastname | firstname | address        | city     |
+------+----------+-----------+----------------+----------+
|    1 | Adams    | John      | Oxford Street  | London   |
|    2 | Bush     | George    | Fifth Avenue   | New York |
|    3 | Carter   | Thomas    | Changan Street | Beijing  |
+------+----------+-----------+----------------+----------+
3 rows in set (0.05 sec)

+------+---------+------+
| id_o | orderNo | id_p |
+------+---------+------+
|    1 | 77895   |    3 |
|    2 | 44678   |    3 |
|    3 | 22456   |    1 |
|    4 | 24562   |    1 |
|    5 | 34764   |   65 |
+------+---------+------+
5 rows in set (0.05 sec)

1.内连接 [inner] join:

  内连接也叫连接,或者自然连接:

//inner可删
mysql> select lastname,firstname,orderNo from persons inner join orders on persons.id_p=orders.id_p order by lastname;
+----------+-----------+---------+
| lastname | firstname | orderNo |
+----------+-----------+---------+
| Adams    | John      | 24562   |
| Adams    | John      | 22456   |
| Carter   | Thomas    | 77895   |
| Carter   | Thomas    | 44678   |
+----------+-----------+---------+

//使用where达到同样的效果
mysql> select lastname,firstname,orderNo from persons,orders where persons.id_p=orders.id_p;
+----------+-----------+---------+
| lastname | firstname | orderNo |
+----------+-----------+---------+
| Carter   | Thomas    | 77895   |
| Carter   | Thomas    | 44678   |
| Adams    | John      | 22456   |
| Adams    | John      | 24562   |
+----------+-----------+---------+

2.左连接 left [outer] join:

  先看左连接的语句与查询结果

//outer可删去
mysql> select lastname,firstname,orderNo from persons left join orders on persons.id_p=orders.id_p order by lastname;
+----------+-----------+---------+
| lastname | firstname | orderNo |
+----------+-----------+---------+
| Adams    | John      | 24562   |
| Adams    | John      | 22456   |
| Bush     | George    | NULL    |
| Carter   | Thomas    | 77895   |
| Carter   | Thomas    | 44678   |
+----------+-----------+---------+

  通过这个结果我们可以发现lastname为Bush没有orderNo,而lastname,firstname属性是来自persons表,orderNo属性是来自orders表可见左连接的作用时把在left join 左边persons表格的所有信息都显示出来,即使是没有和left join右边的表 orders中字段相匹配的信息也显示出来,并且给orderNo的值填为NULL。

  如果把left join两侧的 persons和 orders位置互换那么结果显示的就是left join 左边表orders表的所有信息,同时把未匹配到的left join右边表persons中的lastname与firstname值置为NULL,这个结果与未交换join两个表名位置的右连接的结果一致。

//将left join两侧的 persons和 orders位置互换
mysql> select lastname,firstname,orderNo from orders left join persons on persons.id_p=orders.id_p order by lastname;
+----------+-----------+---------+
| lastname | firstname | orderNo |
+----------+-----------+---------+
| NULL     | NULL      | 34764   |
| Adams    | John      | 24562   |
| Adams    | John      | 22456   |
| Carter   | Thomas    | 44678   |
| Carter   | Thomas    | 77895   |
+----------+-----------+---------+

3.右连接 right [outer] join:

//outer可删去
mysql> select lastname,firstname,orderNo from persons right outer join orders on persons.id_p=orders.id_p order by lastname;
+----------+-----------+---------+
| lastname | firstname | orderNo |
+----------+-----------+---------+
| NULL     | NULL      | 34764   |
| Adams    | John      | 22456   |
| Adams    | John      | 24562   |
| Carter   | Thomas    | 77895   |
| Carter   | Thomas    | 44678   |
+----------+-----------+---------+

  同理与左连接,结果显示的就是right join 左边表persons表的所有信息,同时把未匹配到的right join右边表orders中的orderNo值置为NULL。

4.全连接full join(不过mysql/mariadb不支持)

  全连接则是把两个表的信息全部显示出来,无论两个表的信息匹配与否,未匹配上的信息都置为NULL。

原文地址:https://www.cnblogs.com/joy9707/p/8983339.html

时间: 2024-08-25 12:51:11

mysql/mariadb学习记录——连接查询(JOIN)的相关文章

mysql/mariadb学习记录——查询2

Alias--使用一个列名别名AS 关键字: mysql> select sno as studentId,sname as studentName from student; +-----------+-------------+ | studentId | studentName | +-----------+-------------+ | 12001 | bgg | | 96001 | 刘军 | | 95002 | 刘晨 | | 94001 | 山寨 | | 95005 | 张三 | |

mysql/mariadb学习记录——查询3

AVG() 求平均数函数: //求emp表中的sal属性的平均值 mysql> select avg(sal) as salAverage from emp; +-------------+ | salAverage | +-------------+ | 2073.214286 | +-------------+ 1 row in set (0.11 sec) //emp表数据 mysql> select * from emp; +-------+--------+-----------+-

MySQL基础学习之数据查询

一般查询 SELECT * FROM 表名 SELECT 属性名  FROM  表名 条件查询 SELECT 属性名 FROM 表名  WHERE 条件表达式 查询数据值1,数据值2的表单 SELECT *  FROM  表名  WHERE  属性名 [NOT] IN(数据值1,数据值2....) 查询数值1,数据2的表单 SELECT *  FROM  表名  WHERE  属性=值  AND 属性1=值1 查询数值1到数值2之间的表单 SELECT *  FROM  表名  WHERE  属

我的mysql的学习记录

---恢复内容开始--- MySQL 概念:是表的集合,是一个大的分类 安装 安装文件下载路径:(老宁博客) http://www.cnblogs.com/SmartNing/p/5178616.html 1.配置视频 第一步:下载绿色软件包,不用安装,放在指定目录下(假如放在C盘的server目录下). 1.把mysql-5.5.22.rar解压到C盘server目录,如果要解压到其它目录则需要修改(修改ini文件) C:\server\mysql-5.5.22\my.ini中的 basedi

Oracle多表连接查询Join

Left join 和right join 为外部连接,inner join 为内部连接 Left join 左侧为主表,右侧为从表,主表会显示出所有数据,从表则只显示关联到的数据,不满足连接条件 的行数据用NULL补全 right join 右侧为主表,左侧为从表,主表会显示出所有数据,从表则只显示关联到的数据,不满足连接条件 的行数据用NULL补全 inner join 则只显示2张表关联条件相匹配的数据 (1)dept(部门表) (2)emp(雇员表) 1.inner join 语法:se

Python学习记录-连接mysql

1 安装python的mysql驱动 $ conda install  mysql-connector-python 2 测试mysql驱动是否安装成功 import不报错,即说明安装成功 >>> import mysql.connector 3 查询数据 # 导入MySQL驱动: import mysql.connector # 连接本地mysql conn = mysql.connector.connect(user='userName', password='passWord',

mysql的学习记录

1 MySQL -h localhost -u UserName -p Password-h不写,默认为localhost注意:最好先MySQL -h localhost -u UserName -p 然后按enter建 2查看有哪些数据库 show databases; 3创建数据库create database php;(再通过show databases就可以查看了) 4.选中数据库user php(可以不用加分号,) 5.查看多少表show tables: 6.删除php数据库drop

mysql使用学习记录

sudo /etc/init.d/mysql start启动mysql netstat -lntup|grep 3306查看端口3306 grant all privileges on *.* to [email protected]'localhost' identified by 'xxx' with grant option;创建新的用户并赋予所有权限xxx密码 flush privileges;刷新权限 mysql -u root -pxxx登录mysql 查看mysql数据库里操作命令

mysql 三个表连接查询

权限表(permission)10 字段名称 类型 约束 描述 authorityid integer Pk not null 权限流水号id    PK userNameId int not null 用户名id   FK functionid integer Not null 功能 id    FK lookPermission int not null 浏览 addPermission int not null 添加 editPermission int not null 编辑 delet