每天一点数据库之-----Day 9 表连接

----转载请注明出处:coder-pig

本节引言:

前面我们学习的都是针对一个表来进行操作的,上一节虽然学了UNION这个可以操作多个表

的关键字,但是又有两个限制(查询字段数目与数据类型要相同),本节就来学习通过表连接

来操作多个表!而表连接又有四种:

内连接,外连接,交叉连接与自连接,那么接下来开始本节学习!

数据准备:

在开始学习前,我们先准备一些数据,建三个表:T_Stu,T_Class,T_Dorm

建T_Stu表:

CREATE TABLE T_Stu
(SId INTEGER,SName VARCHAR(20),Cl_id INTEGER,Do_id INTEGER,
)

建T_Class表

CREATE TABLE T_Class
(Cl_id INTEGER,Cl_name VARCHAR(10)
)

建立T_Drom表:

CREATE TABLE T_Drom
(Do_id INTEGER,Do_name VARCHAR(10)
)

好了,表就建立好了,这里是为了演示多表连接,并没有为表设置主键,大家

平时要养成为每个表设置主键的习惯,好了,接下来就录入一些数据吧!


插入T_Stu:

INSERT INTO T_Stu(SId,SName,Cl_id,Do_id)VALUES(1,'洪磊',1,1);
INSERT INTO T_Stu(SId,SName,Cl_id,Do_id)VALUES(2,'兴堂',3,1);
INSERT INTO T_Stu(SId,SName,Cl_id,Do_id)VALUES(3,'兴湘',2,2);
INSERT INTO T_Stu(SId,SName,Cl_id,Do_id)VALUES(4,'孑帆',2,1);
INSERT INTO T_Stu(SId,SName,Cl_id,Do_id)VALUES(5,'兴华',1,1);
INSERT INTO T_Stu(SId,SName,Cl_id,Do_id)VALUES(6,'维瑞',1,2);
INSERT INTO T_Stu(SId,SName,Cl_id,Do_id)VALUES(7,'俐杰',2,2);
INSERT INTO T_Stu(SId,SName,Cl_id,Do_id)VALUES(8,'刘洋',3,2);
INSERT INTO T_Stu(SId,SName,Cl_id,Do_id)VALUES(9,'安泰',1,1);
INSERT INTO T_Stu(SId,SName,Cl_id,Do_id)VALUES(10,'月岑',1,1);

接着到T_Class表:

INSERT INTO T_Class(Cl_id,Cl_name)VALUES(1,'初一(2)班');
INSERT INTO T_Class(Cl_id,Cl_name)VALUES(2,'初二(1)班');
INSERT INTO T_Class(Cl_id,Cl_name)VALUES(3,'初三(4)班');

最后到T_Drom表:

INSERT INTO T_Drom(Do_id,Do_name)VALUES(1,'4栋');
INSERT INTO T_Drom(Do_id,Do_name)VALUES(2,'6栋');

1.内连接(INNER JOIN)

①等值连接:

连接条件中使用等于号(=)运算符来比较连接的列值,但是查询结果会列出

被连接表中的所有列,包括重复列,这也是和②自然连接的不同!

例子:

SELECT * FROM T_Stu INNER JOIN T_Class
ON T_Stu.Cl_id = T_Class.Cl_id

运行SQL:

②自然连接:

和等值连接类似,不过可以选择需要显示的列

例子:

SELECT SId AS '学生编号',SName AS '学生姓名',Cl_name AS '所在班级' FROM T_Stu INNER JOIN T_Class
ON T_Stu.Cl_id = T_Class.Cl_id

运行SQL:

③不等连接:

就是不用(=)号,而是用其他的比较运算符: <,>,<=.>=,!>,!<,<>(不等于)

就是修改下=号而已,这里不讲解!

接着演示下连接多个表的写法:

SELECT SId AS '学生编号',SName AS '学生姓名',
Cl_name AS '所在班级',Do_name AS '所在宿舍' FROM T_Stu
INNER JOIN T_Class ON T_Stu.Cl_id = T_Class.Cl_id
INNER JOIN T_Drom ON T_Stu.Do_id = T_Drom.Do_id

运行SQL:

上面就把三个表连接起来了,每增加一个表,只需:

添加INNER JOIN 表名 ON(匹配条件)即可!

表名太长,写起来麻烦,那么就使用别名:

SELECT s.SId AS '学生编号',s.SName AS '学生姓名',
c.Cl_name AS '所在班级',d.Do_name AS '所在宿舍' FROM T_Stu s INNER JOIN T_Class c
ON s.Cl_id = c.Cl_id INNER JOIN T_Drom d
ON s.Do_id = d.Do_id

运行的效果也是一样的!

2.外连接:

外连接的语法与内连接几乎是一样的,主要区别是:对于空值的处理!

外连接不需要两个表都具有匹配记录,这样可以指定某个表中的记录总是放到结果集中!

简单点就是说:返回到结果集中的不仅包含符合条件的行,还包括左表(左外连接)、右表

(右外连接)或者两个连接表(完全连接)中的所有数据行!

①左外连接:

先插入两条数据:

INSERT INTO T_Stu(SId,SName,Cl_id,Do_id)VALUES(11,'小明',null,null);
INSERT INTO T_Stu(SId,SName,Cl_id,Do_id)VALUES(12,'小红',null,null);

接下来我们使用左外连接:

SELECT s.SId AS '学生编号',s.SName AS '学生姓名',
c.Cl_id AS '班级编号',c.Cl_Name '所在班级'
FROM T_Stu AS s LEFT OUTER JOIN T_Class AS c ON
s.Cl_id = c.Cl_id

运行SQL:

②右外连接:

右外连接与左外连接相对,以右边为主表,左边为从表,其他一样!

先往T_Class表中插入两条记录:

INSERT INTO T_Class(Cl_id,Cl_name)VALUES(4,'高一(2)班');
INSERT INTO T_Class(Cl_id,Cl_name)VALUES(5,'高三(1)班');

接下来把左外连接中的 LEFT OUTER JOIN改成RIGHT OUT JOIN即可!

SELECT s.SId AS '学生编号',s.SName AS '学生姓名',
c.Cl_id AS '班级编号',c.Cl_Name '所在班级'
FROM T_Stu AS s RIGHT OUTER JOIN T_Class AS c ON
s.Cl_id = c.Cl_id

运行SQL:

③完全连接:

这个就是除了匹配的值外,左右两个表都会全部显示

把上面的RIGHT OUTER JOIN该成:FULL OUTER JOIN即可!

SELECT s.SId AS '学生编号',s.SName AS '学生姓名',
c.Cl_id AS '班级编号',c.Cl_Name '所在班级'
FROM T_Stu AS s FULL OUTER JOIN T_Class AS c ON
s.Cl_id = c.Cl_id

运行SQL:

3.交叉连接:

如果没有 WHERE 子句的交叉联接将产生连接所涉及的表的笛卡尔积

第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小

又分为两种,隐式与显式!

隐式的超简单,直接select ... From后直接加上交叉连接的表名列即可!

比如:

SELECT * FROM T_Stu,T_Class

显式的:

SELECT * FROM T_Stu cross join T_Class

大部分的DBMS都支持CROSS JOIN显式的交叉连接,而隐式的所有DBMS都支持!

4.自连接:

这个自连接和前面我们学的三种连接可不一样,自连接是自己对自己的!

连接关键字的两边都是同一个表!

一个形象的例子就是地区表!

创建一个简单的地区表,接着录几条数据!

建表SQL:

CREATE TABLE T_City
(CId INTEGER,CName VARCHAR(10),CBelong VARCHAR(10),PRIMARY KEY (CId)
)

插入几条数据:

INSERT INTO T_City(CId,CName,BId)VALUES(1,'北京',NULL);
INSERT INTO T_City(CId,CName,BId)VALUES(2,'上海',NULL);
INSERT INTO T_City(CId,CName,BId)VALUES(3,'天津',NULL);
INSERT INTO T_City(CId,CName,BId)VALUES(4,'重庆',NULL);
INSERT INTO T_City(CId,CName,BId)VALUES(5,'南京',6);
INSERT INTO T_City(CId,CName,BId)VALUES(6,'江苏',NULL);
INSERT INTO T_City(CId,CName,BId)VALUES(7,'苏州',6);
INSERT INTO T_City(CId,CName,BId)VALUES(8,'无锡',6);
INSERT INTO T_City(CId,CName,BId)VALUES(9,'广东',NULL);
INSERT INTO T_City(CId,CName,BId)VALUES(10,'揭阳',9);

接下来就到自连接了:

SELECT a.CName,b.CName
FROM T_City as a INNER JOIN T_City as b
ON a.CId = b.Bid

运行自连接的SQL:

你也可以统计辖区数:

SELECT a.CName,COUNT(b.CId) as '辖区数'
FROM T_City as a INNER JOIN T_City as b
ON a.CId = b.Bid
GROUP BY a.CName

运行上述SQL:

最后说几句:

以上就是关于SQL中表连接的内容,在这里祝大家新年快乐哈~

每天一点数据库之-----Day 9 表连接相关推荐

  1. oracle 表名拼接_Oracle之3种表连接方式(排序合并连接、嵌套循环、哈希连接)...

    排序合并连接 1.2.4.2.1  排序合并连接 排序合并连接(Sort Merge Join)是一种两个表在做表连接时用排序操作(Sort)和合并操作(Merge)来得到连接结果集的表连接方法. 如 ...

  2. SQL表连接,排序输出

    数据库练习题: SQL表连接 区别on和where: 1.on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录. 2.where条件是在临时表生成好后,再对临时表进行 ...

  3. 关于数据库、数据源、表、脚本语句的创建、连接与使用的个人学习随笔

    创建数据库创建表的工具有很多,看起来似乎很不一样,但其实里面的知识是通用的,理解了数据库相关的知识和相应操作,就算换个工具,也最多是趁不趁手的问题,所以,如果你是准备自学数据库的话,下面的这些基础知识 ...

  4. mysql select符合查询_数据库select group by 和having语句 多表连接查询 复合查询

    1.SELECT --group by 子句 group by子句按照指定的列column_name对表数据进行分组 group by 后面跟的列也叫分组特性列 使用group by后,能选择的列   ...

  5. 数据库学习笔记6--MySQL多表查询之外键、表连接、子查询、索引

    本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...

  6. mysql不同服务器数据库查询_不同服务器不同数据库两张表连接查询使用经验

    使用SQL语句连接查询位于两个不同的服务器不同的数据库中的两张表,最初将SQL语句写成以下形式select*fromProduct pinnerjoin opendatasource('SQLOLED ...

  7. 6.(Mysql数据管理相关)连接MYSQL,修改密码,增加新用户,数据库相关命令,表操作相关命令,数据相关命令,数据库sql导入和导出,备份数据库,查看不到mysql数据库的解决办法

     mysql安装完之后,登陆后发现只有两个数据库:mysql>show databases; +--------------------+ | Database           | +- ...

  8. Hibernate连接mysql数据库并自动创建表

    天才第一步,雀氏纸尿裤,Hibernate第一步,连接数据库. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个 ...

  9. Java案例:连接SQL Server数据库,显示学生表记录

    Java案例:连接SQL Server数据库,显示学生表记录 演示利用JDBC连接SQL Server数据库,在Java GUI窗口里显示表记录. 一.运行效果 二.实现步骤 1.项目结构图

最新文章

  1. Java中的数组怎么弄随机数_Java – 如何从值数组中创建随机数
  2. 各种测序基础知识汇总
  3. 【资源】《动手学数据分析》开源教程完整发布!
  4. arthas命令列表查阅文档地址
  5. magento更新产品状态报错
  6. Python为什么这么厉害? 不想成为专业码农? 来学习Python吧!
  7. Linux——网络地址临时配置(详细步骤+问题解决)
  8. php如何检查对象的类型,如何在PHP中检查对象的特定类型
  9. MVC中controller有什么作用
  10. C++语言函数重载详解和示例
  11. 【问题解决】线程间操作无效:从不是创建控件“textBox1”的线程访问它
  12. 免费python编程自学网站-免费学习Python编程的3个优秀的网站资源
  13. PCB中 D-Subminiature(DB接口) 连接器系列分类及带有3D封装绘制
  14. Github爆款!Aura v2.0.0正式版来了…
  15. 解决“虚拟机使用的是此版本 VMware Workstation 不支持的硬件版本”
  16. HTTP Live Streaming基础知识
  17. 加州ucla 计算机学校,美国加州大学洛杉矶分校UCLA计算机硕士CS录取
  18. idea 一次启动多服务配置
  19. 计算菜价python
  20. gos-log高性能大日志检索中台

热门文章

  1. 优质网站分享,无需下载
  2. springboot动态添加log4j2的Appender
  3. 智能门锁触控中应用的电容式触摸芯片
  4. 拉普拉斯算子——matlab
  5. 微信公众号开发——关键词自动回复
  6. error lnk1123:转换到coff期间失败
  7. 高通平台开发系列讲解(外设篇)TDM配置
  8. 【机器学习】如何理解vias和bias?
  9. maven deploy
  10. 有哪些值得推荐的 Python 开发工具