SQL基础-连接表
一、连接表
1、SQL JOIN
忘记在哪保存的某位网友的图,先明白SQL JOIN,

2、关于笛卡尔积
笛卡尔积:
两个集合的乘积 重新建student表和teacher表: student表:
CREATE TABLE `student` (
`student_id` varchar(50) NOT NULL COMMENT '学生编号',
`student_name` varchar(100) NOT NULL DEFAULT '' COMMENT '学生姓名',
`teacher_id` varchar(20) DEFAULT NULL COMMENT '老师编号'
) ENGINE=MyISAM DEFAULT CHARSET=gbk COMMENT='学生'; INSERT INTO `student` VALUES ('S20180001','方东美','T0003'),('S20180013','陈顺军','T0004'),('S20170001','陈慧','T0008'); teacher表:
CREATE TABLE `teacher` (
`teacher_id` varchar(255) DEFAULT NULL COMMENT '老师编号',
`teacher_name` varchar(255) DEFAULT NULL COMMENT '老师姓名'
) ENGINE=MyISAM DEFAULT CHARSET=gbk COMMENT='老师'; INSERT INTO `teacher` VALUES ('T0001','高齐妍'),('T0002','李红'),('T0003','李一萱'),('T0004','刘金霞');

交叉连接CROSS JOIN,实现两个集合的笛卡尔积
SELECT * FROM student CROSS JOIN teacher;
3、内连接INNER JOIN
比如:
如何同时查询出学生编号、学生姓名对应的 老师编号、老师姓名? select * from student a INNER JOIN teacher b ON a.teacher_id = b.teacher_id; 相反的,如何返回这两张表里,老师编号不相同的记录? select * from student s inner join teacher t on s.teacher_id <> t.teacher_id;
4、全外连接FULL OUTER JOIN
比如:
如何同时查询出学生编号、学生姓名、老师编号、老师姓名? select * from student a FULL OUTER JOIN teacher b ON a.teacher_id = b.teacher_id; MySQL不支持FULL OUTER JOIN;
5、左外连接FULL OUTER JOIN
有时候只想要左表字段不为NULL的数据,而不需左表字段为NULL的数据; 比如:
如何同时查询出学生编号、学生姓名、老师编号、老师姓名? select * from student a LEFT OUTER JOIN teacher b ON a.teacher_id = b.teacher_id;
6、右外连接FULL OUTER JOIN
有时候只想要右表字段不为NULL的数据,而不需右表字段为NULL的数据; 比如:
如何同时查询出学生编号、学生姓名、老师编号、老师姓名? select * from student a RIGHT OUTER JOIN teacher b ON a.teacher_id = b.teacher_id;
二、复杂的连接表
1、建表、插入数据
##student表
CREATE TABLE `student` (
`student_id` varchar(50) NOT NULL COMMENT '学生编号',
`student_name` varchar(100) NOT NULL DEFAULT '' COMMENT '学生姓名',
`teacher_id` varchar(20) DEFAULT NULL COMMENT '老师编号',
`score` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '数学成绩'
) ENGINE=MyISAM DEFAULT CHARSET=gbk COMMENT='学生'; INSERT INTO `student` VALUES ('S20180001','方东美','T0003',80.65),('S20180013','陈顺军','T0004',91.13),('S20170001','陈慧','T0004',94.99); ##teacher表
CREATE TABLE `teacher` (
`teacher_id` varchar(255) DEFAULT NULL COMMENT '老师编号',
`teacher_name` varchar(255) DEFAULT NULL COMMENT '老师姓名'
) ENGINE=MyISAM DEFAULT CHARSET=gbk COMMENT='老师'; INSERT INTO `teacher` VALUES ('T0001','高齐妍'),('T0002','李红'),('T0003','李一萱'),('T0004','刘金霞');
2、连接表的执行步骤
第一步:参与连接的两个表做笛卡尔积; 第二步:根据ON后的连接条件筛选笛卡尔积的结果; 第三步:补充左表(LEFT JOIN)或右表(RIGHT JOIN)不满足连接条件的数据(INNER JOIN内关联时无此步骤) ; 第四步:根据WHERE后的过滤条件筛选第三步的结果; SELECT *
FROM student a
LEFT JOIN teacher b
ON a.teacher_id = b.teacher_id
WHERE a.score > 90;
第一步:参与连接的两个表做笛卡尔积:

第二步:根据ON后的连接条件筛选笛卡尔积的结果:

第三步:补充左表(LEFT JOIN)或右表(RIGHT JOIN)不满足连接条件的数据(INNER JOIN内关联时无此步骤)

第四步:根据WHERE后的过滤条件筛选第三步的结果

3、LEFT JOIN与INNER JOIN

4、WHERE与ON
###
看两个SQL:
SELECT *
FROM student a
INNER JOIN teacher b
ON a.teacher_id = b.teacher_id
AND a.score>90; SELECT *
FROM student a
INNER JOIN teacher b
ON a.teacher_id = b.teacher_id
WHERE a.score>90; 根据步骤,inner join时不走第三步,所以只返回一条记录:
S20180013 陈顺军 T0004 91.13 T0004 刘金霞 ###
看两个SQL:
SELECT *
FROM student a
LEFT JOIN teacher b
ON a.teacher_id = b.teacher_id
AND a.score>90; SELECT *
FROM student a
LEFT JOIN teacher b
ON a.teacher_id = b.teacher_id
WHERE a.score>90; 根据步骤,第一条SQL left join时,要走第三步,AND是属于ON后面的,所以过滤后,又要补全left join不满住连接条件的数据:
第一条SQL的结果:
S20180013 陈顺军 T0004 91.13 T0004 刘金霞
S20180001 方东美 T0003 80.65
S20170001 陈慧 T0008 94.99 第二条SQL,执行完第三步,还要走第四步where
第二条SQL的结果:
S20180013 陈顺军 T0004 91.13 T0004 刘金霞
S20170001 陈慧 T0008 94.99
5、多表连接
##
第一步:a表与b表做LEFT JOIN;
第二步:a表与b表LEFT JOIN的结果,再与c表做LEFT JOIN;
...... 多表连接,就是第一张表与后面的表依次连接,重复执行表连接的步骤; 此时可以给student表加一个class_id列,数据如下:
S20180001 方东美 T0003 80.65 G0101
S20180013 陈顺军 T0004 91.13 G0102
S20170001 陈慧 T0008 94.99 G0201 如:
同时查看学生编号、学生姓名、老师编号、老师姓名、班级编号、班级名称: SELECT a.student_id,a.student_name,
a.teacher_id,b.teacher_name,
a.class_id,c.class_name
FROM student a
LEFT JOIN teacher b
ON a.teacher_id = b.teacher_id
LEFT JOIN class c
ON a.class_id = c.class_id;
6、非唯一键连接
表关联时,首先需要确认的一点,就是关联条件字段在关联表中是不是唯一。 在绝大多数的情况下,关联条件字段都是关联表中的主键或能唯一确定一条记录的字段。 如果不是,很可能是SQL的关联条件有问题,需要仔细确认是否与需求相符。
SQL基础-连接表的更多相关文章
- SQL基础-建表
一.建表 1.创建表的两种方式 *客户端工具 *SQL语句 2.使用SQL语句创建表 表名和字段名不能使用中文:(一般为字母开头,字母.数字.下划线组成的字符串): CREATE TABLE关键字后跟 ...
- Sql的连接表补充
连接条件可在FROM或WHERE子句中指定,建议在FROM子句中指定连接条件.WHERE和HAVING子句也可以包含搜索条件,以进一步筛选连接条件所选的行. 连接可分为 ...
- SQL基础-操纵表及插入、查询
一.操纵表 1.表的关键信息 2.更新表名 更新表名:使用RENAME TABLE关键字.语法如下: RENAME TABLE 旧表名 TO 新表名; 比如,生产环境投产前备份teacher表,使用如 ...
- (二十)sql基础
sql基础 --单表查询 select * from student; select * from score; --投影查询 select * from student; --条件查询 select ...
- mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化
先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...
- SQL的多表连接查询
SQL的多表连接查询 多表连接查询具有两种规范,SQL92和SQL99规范. SQL92规范支持下列多表连接查询: (1)等值连接: (2)非等值连接: (3)外连接: (4)广义笛卡尔积: SQL9 ...
- [SQL]SQL Server数据表的基础知识与增查删改
SQL Server数据表的基础知识与增查删改 由张晨辉(学生) 于19天 前发表 | 阅读94次 一.常用数据类型 .整型:bigint.int.smallint.tinyint .小数:decim ...
- 章节2:SQL之多表连接
原文:章节2:SQL之多表连接 Sql的多表连接关系有:内连接.外连接和交叉连接. 先建立两个用于演示的表: TB_Characters: Id Character 1 内向 2 外向 3 中性性格 ...
- [SQL基础教程] 1-5 表的删除和更新
[SQL基础教程] 1-5 表的删除和更新 表的删除 语法 DROP TABLE <表名>; 法则 1-12 删除的表无法恢复 表定义的更新 语法 ALTER TABLE<表名> ...
随机推荐
- 应用中有多个Spring Property PlaceHolder导致@Value只能获取到默认值
背景 工作中负责的一套计费系统需要开发一个新通知功能,在扣费等事件触发后发送MQ,然后消费MQ发送邮件或短信通知给客户.因为有多套环境,测试时需要知道是从哪套环境发出的邮件,又不想维护多套通知模板,因 ...
- 转:Windows下交换CapsLock和左ctrl
Windows下交换CapsLock和左ctrlHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout中添加Scanco ...
- 阿里巴巴 Java 开发手册(一):命名风格
命名风格 1. [强制] 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束. 反例: _name / __name / $Object / name_ / name$ / Obj ...
- 2019 多益网络java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.多益网络等公司offer,岗位是Java后端开发,因为发展原因最终选择去了多益网络,入职一年时间了,也成为了面 ...
- 2019 易车java面试笔试题 (含面试题解析)
本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.易车等公司offer,岗位是Java后端开发,最终选择去了易车. 面试了很多家公司,感觉大部分公司考察的点都差不多 ...
- RHEL6搭建网络yum源软件仓库
RHEL的更新包只对注册用户生效,所以需要自己手动改成Centos的更新包 一.查看rhel本身的yum安装包 rpm -qa | grep yum 二.卸载这些软件包 rpm -qa | grep ...
- git恢复已删的分支
git恢复已经删除的分支 执行git命令, 找回之前提交的commit git log -g 执行效果 commit 80fd3a3e1abeab52030ee9f6ec32b5c815de20a9 ...
- 【MFC】在CHtmlView中在同一窗口显示新打开页面
使用MFC的单文档,用IE核心做的简单浏览器.当打开一个新的链接时,IE核心会使用IE来打开一个新窗口显示打开的新页面.为了让新页面在本程序中显示,我试了如下方法,其中的问题一并列出: 方法1.重载C ...
- mysql配置临时日志(无需重启服务)
use mysql; //指定日志的存储方式 SET GLOBAL log_output = 'TABLE'; //查询日志开启 SET GLOBAL general_log = 'ON'; sele ...
- SpringBoot 传入JSON对象参数
1.请求参数格式必须是正确的JSON. 2.在入参中使用注解@RequestBody,用于接收JSON参数,使其自动转对象 3.关于lombok在此产生的一点小坑,@Builder对@RequestB ...