浅谈sql之连接查询
SQL之连接查询
一、连接查询的分类
sql中将连接查询分成四类:
- 内链接
- 外连接
- 左外连接
- 右外连接
- 自然连接
- 交叉连接
二、连接查询的分类
数据库表如下:
1.学生表

2.老师表

3.班级表

表用于连接查询教学,不要纠结表的设计~
三、连接查询之内连接
概念
内链接[inner]join,从左表中取出每一条记录,去右表中与所有记录进行匹配;
是某个条件在左表中与右表中相同最终才会有保留结果,否则不保留。
基本语法
左表[inner] join 右表 on 左表.字段=右表.字段;on表示连接条件;条件字段就是代表相同的业务含义
例子
查询sql语句如下:
SELECT
student.s_name,
student.c_id,
class.id,
class.c_name
FROM
student
INNER JOIN class ON student.c_id = class.id;
查询结果:

分析:从查询结果不难看出,student的c_id和class的id是连接条件,以左表student为主表,以student表中每一条记录的c_id作为右表class的id主键的查询条件去匹配相关的信息。
扩展:内连接还可以使用where 代替on关键字,或者如下写法代替:
SELECT
student.s_name,
student.c_id,
class.id,
class.c_name
FROM
student,
class
where student.c_id = class.id;
四、连接查询之外连接
概念
外连接:outer join,以某张表为主,取出里面所有的记录,每条与另外一张表进行连接,不管能不能匹配上条件,最终都会保留;能匹配正确保留,不能匹配,其他标的字段都是空null
外连接分为两种;是以某张表为主表;
left join:左连接,已左表为主表;
right join:右链接 ,以左表为主表。
基本语法
左表left/right join 右表 on 左表.字段=右表.字段
例子
(1)左连接
sql语句:
SELECT
student.s_name,
student.c_id,
class.id,
class.c_name
FROM
student
left JOIN class ON student.c_id = class.id;
查询结果:

分析:左连接,以左表student为主表,每条与另外一张表进行连接,多余同学的c_id在class匹配不上,并没有这个班级,但是依旧保留下来,其他字段显示NULL。
(2)右连接
sql语句:
SELECT
student.s_name,
student.c_id,
class.id,
class.c_name
FROM
student
right JOIN class ON student.c_id = class.id;
查询结果:

这里我就不再分析啦~都很好理解,不懂的看看上面的左连接自己推导一下~
五、连接查询之自然连接
概念
自然连接;natural join,自然连接,就是自动匹配连接条件;系统以字段名字作为匹配模式(同名字段就作为条件,多个同名字段都作为条件)
ps: 自然连接很没有用!!!实际开发中并不会用到所以了解就好了!!!
内链接和外连接都可以模拟自然连接;
使用同名字段,合并字段
左表 left/right/inner join 左表 using(字段名);
六、连接查询之交叉连接
概念
交叉连接; cross join,从一张表中循环取出每一条记录,每条记录都去另外一张表进行匹配,匹配一定保留(没有条件匹配),而连接本身字段就会增加(保留),最终形成的结果叫做笛卡尔积。
基本语法
左表 cross join右表;也可以携程 from 左表,右表。
例子
sql语句:
SELECT
*
FROM
student,
class ;
查询结果:

分析:简单来说就是,左表中的每一条记录都与由表中的每一条记录匹配一遍。
ps: 交叉连接没什么用,只是保证连接这种结构的完整性!!!
笔记就到这了,但是上面说到的都是两个表的连接查询,那么,是否可以多个表进行连接查询呢?当然是可以的。
多表连接查询
sql语句如下:
SELECT
student.s_name,
student.c_id,
class.id,
class.c_name,
class.t_id,
teacher.id as tid,
teacher.t_name
FROM
student
left JOIN class ON student.c_id = class.id
left JOIN teacher ON class.t_id = teacher.id;
查询结果:

分析:多表连接查询,其实就是两个表连接查询组成一个新的表,这个新的表再与第三个表进行连接查询,以此类推,不懂的,思考一下?
浅谈sql之连接查询的更多相关文章
- 浅谈sql 、linq、lambda 查询语句的区别
浅谈sql .linq.lambda 查询语句的区别 LINQ的书写格式如下: from 临时变量 in 集合对象或数据库对象 where 条件表达式 [order by条件] select 临时变量 ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
- 转【】浅谈sql中的in与not in,exists与not exists的区别_
浅谈sql中的in与not in,exists与not exists的区别 1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...
- 浅谈sql中的in与not in,exists与not exists的区别
转 浅谈sql中的in与not in,exists与not exists的区别 12月12日北京OSC源创会 —— 开源技术的年终盛典 » sql exists in 1.in和exists ...
- 浅谈SQL优化入门:3、利用索引
0.写在前面的话 关于索引的内容本来是想写的,大概收集了下资料,发现并没有想象中的简单,又不想总结了,纠结了一下,决定就大概写点浅显的,好吧,就是懒,先挖个浅坑,以后再挖深一点.最基本的使用很简单,直 ...
- 浅谈SQL Server内部运行机制
对于已经很熟悉T-SQL的读者,或者对于较专业的DBA来说,逻辑的增删改查,或者较复杂的SQL语句,都是非常简单的,不存在任何挑战,不值得一提,那么,SQL的哪些方面是他们的挑战 或者软肋呢? 那就是 ...
- 浅谈SQL Server---2
浅谈SQL Server内部运行机制 https://www.cnblogs.com/wangjiming/p/10098061.html 对于已经很熟悉T-SQL的读者,或者对于较专业的DBA来说, ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 浅谈SQL注入风险 - 一个Login拿下Server(转)
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
随机推荐
- [android] 切换界面的问题
1. 界面重复创建的问题 2. 中间容器每次切换,都会清空容器中的子对象问题 3. 点击返回键的处理 解决重复创建的问题: 传递Class字节码对象,利用泛型来规定对象 判断界面是否存在,如果存在重复 ...
- json转化的时候如何忽略某些属性字段值
一.有时候在将对象或list对象转化为json的时候,我们可能不需要所有的属性值,这就需要我们去过滤掉这些属性了 我下面说两种比较流行的json包如何来忽略某些属性值 二. 使用jaskson包 1. ...
- form表单在发送到服务器时候编码方式
enctype(编码方式):规定了form表单在发送到服务器时候编码方式.有如下的三个值可选: 1.application/x-www-form-urlencoded.默认的编码方式.但是在用文本的传 ...
- Oracle 数据库字典 sys.col$ 表中关于type#的解释
sys.col$ 表是oracle基础数据字典表中的列表,表中描述了数据库中各列信息,其中type#是列的数据类型.以下表格说明了各个数值的含义,以供参考. 值 说明 1 如果列 charsetfor ...
- 利用setTimeoutc处理javascript ajax请求超时
用过jquery的人都知道里面的$.ajax能设置超时处理及各种错误的抛出,确实好用.原生的js没有对应的方法,还得写各种兼容.在实际运用中,不管请求是否成功都应该做容错处理, 不然用户不知道到底发生 ...
- [国家集训队2012]middle(陈立杰)
我是萌萌的传送门 我是另一个萌萌的传送门 脑残错误毁一下午…… 其实题解早就烂大街了,然而很久之前我只知道是二分答案+主席树却想不出来这俩玩意儿怎么一块儿用的……今天又翻了几篇题解才恍然大悟,是把权值 ...
- CentOS 7运维管理笔记(3)----Linux路由器配置
当正在配置的Linux主机需要作为路由器使用时,通过以下步骤配置后,子网上的计算机就可以访问外网了: 1. 编辑 /etc/sysctl.conf 文件,添加 net.ipv4_ip_forward ...
- Spring @Value SpEl 知识点小记
在JavaBean文件中使用Spring的@Value注解获取配置文件.yml或资源文件.properties中 key - value 键值信息 @Value("${stu.number} ...
- redis 在linux安装
转自:http://futeng.iteye.com/blog/2071867 下载 官网下载 安装 tar zxvf redis-2.8.9.tar.gz cd redis-2.8.9 #直接mak ...
- idea智能提示 不管用 问题
今天碰到个问题,idea的智能提示 死活不能使用了.同一个包下的类竟然还没有智能提示,无语了... 搜了好多篇文章,虽然知道 重装可以解决... 这样设置就可以了: