MySQL (五)--连接查询简介、 交叉连接、 内连接、外连接、自然连接、温馨小提示
1 连接查询简介
- 将多张表(可以大于2)进行记录的连接(按照某个指定的条件进行数据拼接)。
- 最终结果:记录数可能会有变化,字段书一定会增加(至少两张表的合并)。
- 连接查询:join,使用方式:左表 join 右表
- 左表:join关键字左边的表
- 右表:join关键字右边的表
- 连接查询的意义:在用户查看数据的时候,需要显示的数据来自多张表。
- 连接查询的分类:
- 交叉连接
- 内连接
- 外连接
- 自然连接
2 交叉连接
- 交叉连接:cross join,从一张表中循环取出每一条记录,每条记录都去另外一张表进行匹配,无条件匹配,而连接本身字段就会增加,最终形成的结果叫做笛卡尔积。
- 基本语法:左表 cross join右表;====from 左表,右表。
select * from 左表,右表;
select * from 左表 cross join 右表;
- my_class表
CREATE TABLE my_class(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME ),
room )
);
- my_student表
CREATE TABLE my_student(
id INT PRIMARY KEY AUTO_INCREMENT,
),
sex ),
NAME ),
age INT,
height INT,
cid INT,
CONSTRAINT fk_id FOREIGN KEY (cid) REFERENCES my_class(id)
);
- 插入数据
-- 插入班级 INSERT INTO my_class VALUES (NULL,'java001班','A05'); INSERT INTO my_class VALUES (NULL,'Linux班','B26'); INSERT INTO my_class VALUES (NULL,'C班','D11'); -- 插入学生 ,,); ,,); ,,); ,,); ,,); ,,);
- 交叉连接
SELECT * FROM my_student CROSS JOIN my_class;

- 笛卡尔积没有意义:应该尽量避免(交叉连接没有用)。
- 交叉连接存在的价值:保证连接这种结构的完整性。
3 内连接
- 内连接:[inner] join,从左表中取出每一条记录,去右表中与所有的记录进行匹配,匹配必须在某个条件在左表中和右表中相同最终才会保留结果,否则不保留。
- 基本语法:
select * from 左表 [inner] join 右表 on 左表.字段 = 右表.字段;
- on 表示连接条件:条件字段都是代表相同的业务含义(如my_student.cid和my_class.id)
- 内连接
SELECT * FROM my_student INNER JOIN my_class ON my_student.`cid` = my_class.`id`;

- 字段别名以及表别名的使用:在查询数据的时候,不同表有同名字段,这个时候需要加上表名才能区分,而表名太长,通常可以使用别名。
SELECT c.`id` 班级id,c.`name` 班级名字,c.`room` 班级教室,s.`id` 学生id,s.`name` 学生姓名,s.`sex` 学生性别,s.`number` 学号,s.`age` 学生年龄,s.`height` 学生身高 FROM my_student s INNER JOIN my_class c ON s.`cid` = c.`id`;

- 设置id=5的cid=null
;
SELECT c.`id` 班级id,c.`name` 班级名字,c.`room` 班级教室,s.`id` 学生id,s.`name` 学生姓名,s.`sex` 学生性别,s.`number` 学号,s.`age` 学生年龄,s.`height` 学生身高 FROM my_student s INNER JOIN my_class c ON s.`cid` = c.`id`;


- 内连接还可以使用where代替on关键字(where没有on的效率高)
SELECT c.`id` 班级id,c.`name` 班级名字,c.`room` 班级教室,s.`id` 学生id,s.`name` 学生姓名,s.`sex` 学生性别,s.`number` 学号,s.`age` 学生年龄,s.`height` 学生身高 FROM my_student s INNER JOIN my_class c WHERE s.`cid` = c.`id`;

4 外连接
- 外连接:outer join,以某张表为主,取出里面的所有记录,然后每条记录去另外一张表进行连接,不管能不能匹配上条件,最终都会保留,能匹配,正确保留,不能匹配,其他表的字段都置空。
- 外连接分为两种:是以某张表位置:有主表
- left outer join:左外连接,以左表为主表。
- right outer join:右外连接,以右表为主表。
- 基本方法:左表 left/right join 右表 on 左表.字段 = 右表.字段;
- 左外连接--左表为主表:最终记录数至少不小于左表已有的记录数
SELECT s.*,c.name ,c.room FROM my_student s LEFT OUTER JOIN my_class c ON s.`cid` = c.`id`;

- 右外连接--与左外连接,相反。

5 自然连接
- 自然连接:natural join,自然连接,就是自动匹配连接条件:系统以字段名字作为匹配模式(同名字段就作为条件,多个同名字段都作为条件)
- 自然连接:自然内连接和自然外链接。
- 自然内连接:自动使用同名字段作为连接条件,连接之后会合并同名字段
SELECT * FROM my_student NATURAL JOIN my_class;

- 自然外连接:左表 natural left/right join 右表;
SELECT * FROM my_student NATURAL LEFT JOIN my_class;

6 温馨小提示
- 平常中,我们使用最多的还是内连接和外链接哦,交叉连接和自然连接没什么卵用。
MySQL (五)--连接查询简介、 交叉连接、 内连接、外连接、自然连接、温馨小提示的更多相关文章
- 转 SQL连接查询语句(内、外、交叉和合并查询)
转 http://blog.csdn.net/u010011371/article/details/50596535 1.内连接 (INNER JOIN) 内连接也称自然连接,它是根据两个或多个表中的 ...
- MySQL(五) —— 子查询
子查询(SubQuery)是指出现在其他SQL语句内的SELECT语句. 如: SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2); 其中 SELE ...
- mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化
先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...
- 细说MySQL连接查询:内连、左连和右连
转: 细说MySQL连接查询:内连.左连和右连 简介: MySQL 的连接查询,通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接.首先,要确定一个主表作为结果集,然后将 ...
- Linq连接查询之左连接、右连接、内连接、全连接、交叉连接、Union合并、Concat连接、Intersect相交、Except与非查询
内连接查询 内连接与SqL中inner join一样,即找出两个序列的交集 Model1Container model = new Model1Container(); //内连接 var query ...
- MYSQL初级学习笔记五:连接查询!(视频序号:初级_37-41)
知识点七:连接查询(37-41) 什么是连接查询: 连接查询是将两个或两个以上的表按某个条件连接起来,从中选取需要的数据.连接查询是同时查询两个或两个以上的表时使用的.当不同的表中存在相同意义的字段时 ...
- Mysql表连接查询
原文地址: https://www.cnblogs.com/qiuqiuqiu/p/6442791.html 1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等 ...
- Mysql的查询语句(联合查询、连接查询、子查询等)
Mysql的各个查询语句(联合查询.连接查询.子查询等) 一.联合查询 关键字:union 语法形式 select语句1 union[union选项] select 语句2 union[union选项 ...
- mysql 连接查询 join
本文用到的表 CREATE TABLE `cls` ( `cls_id` ) NOT NULL AUTO_INCREMENT, `name` ) NOT NULL, PRIMARY KEY (`cls ...
随机推荐
- centos7修改网卡名称
[root@localhost ~]# cd /etc/sysconfig/network-scripts/[root@localhost network-scripts]# mv ifcfg-eno ...
- Mybatis 调用存储过程,使用Map进行输入输出参数的传递
做个记录,以备后用 java代码: public String texuChange() throws Exception { try { ...
- 发布内网网站服务器让公网可以访问,无需NAT
有些时候,我们的测试网站搭建在我们的测试环境中,网站正式上线前,需要先测试下我们的测试网站是否正常,就可以用下面的方式将其内网网站服务器放至公网上,用器提供的外网地址就可以直接访问我们的内网网站服务器 ...
- PyCharm中光标变粗的解决方法
pycharm中光标变粗,如下: 原因:光标进入了改写状态. 解决方法:按一下键盘中的Insert键就好了.
- 编写一个简单的TCP服务端和客户端
下面的实验环境是linux系统. 效果如下: 1.启动服务端程序,监听在6666端口上 2.启动客户端,与服务端建立TCP连接 3.建立完TCP连接,在客户端上向服务端发送消息 4.断开连接 实现 ...
- LinkStack
//Node.h template<typename ElemType> struct Node { ElemType data; Node<ElemType> *next; ...
- ECMAScript6-let与const命令详解
前言 <ECMAScript入门>是一本开源的JavaScript语言教程,全面介绍ECMAScript6新引入的语法特性. let和const命令,是第一章开始介绍,也是比较基础的知识. ...
- Jdbc模版式写法与Spring-JdbcTemplate的比较
一.Jdbc模版式写法: [流程] 加载驱动 获取数据库链接 创建Statement对象(用于发送sql语句) 向数据库发送sql语句,获取数据库返回的结果集 从结果集中获取数据 释放资源 上述部分用 ...
- hadoop生态圈列式存储系统--kudu
介绍 Kudu 是一个针对 Apache Hadoop 平台而开发的列式存储管理器.Kudu 共享 Hadoop 生态系统应用的常见技术特性: 它在 commodity hardware(商品硬件)上 ...
- C#使用Xamarin开发可移植移动应用(3.进阶篇MVVM双向绑定和命令绑定)附源码
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 嗯..前面 ...