sql常用操作(三)多表查询
1 连接查询
1.1连接就是指两个或2个以上的表(数据源)“连接起来成为一个数据源”。
实际上,两个表的完全的连接是这样的一个过程:
左边的表的每一行,跟右边的表的每一行,两两互相“横向对接”后所得到的所有数据行的结果。
注意:连接之后,并非形成了一个新的数据表,而只是一种“内存形态”。
1.2连接语法的基本形式
from 表1 [连接方式] join 表2 [on 连接条件];
连接的结果可以当作一个“表”来使用。常用有以下几种连接方式:
1.3交叉连接
实际上,交叉连接是将两个表不设定任何条件的连接结果。
交叉连接通常也被叫做“笛卡尔积”——数学上可能比较多。(最后结果是:表1条数*表2条数)
语法:
from 表1 [cross] join 表2 ; //可见交叉连接只是没有on条件而已。
(cross这个词也可以省略,还可以使用inner这个词代替)
例:
select * from emp;

select * from dept;

select * from emp join dept; 或 select * from emp cross join dept;

1.4内连接(用的较多)
语法:
from 表1 [inner] join 表2 on 表1.字段1=表2.字段2;
含义:
找出(过滤)在交叉连接的结果表中的表1的字段1的值等于表2的字段2的值的那些行。
例:上面那个例子改一下:
select * from emp join dept where deptid=id;

比较正规的写法是:select * from emp join dept on emp.deptid=dept.id;
结果相同:

1.5左[外]连接
形式:
from 表1 left [outer] join 表2 on 连接条件。
说明:
1,这里,left是关键字。
2,连接条件跟内连接一样。
3,含义是:内连接的结果基础上,加上左边表中所有不符合连接条件的数据,相应放右边表的字段的位置就自动补为“null”值。
例:(内连接)
select * from product join product_type on product.protype_id =product_type.protype_id;

/*左外连接*/
select * from product_type left join product
on product.protype_id =product_type.protype_id;

1.6右[外]连接
右连接跟左连接恰恰相反:
形式:
from 表1 right [outer] join 表2 on 连接条件。
说明:
1,这里,right是关键字。
2,连接条件跟内连接一样。
3,含义是:在内连接的结果基础上,加上右边表中所有不符合连接条件的数据,相应本应放左边表的字段的位置就自动补为“null”值。
例:
/*右外连接*/
select * from product right join product_type
on product.protype_id =product_type.protype_id;

1.7全[外]连接 (和交叉连接不同)
形式:
from 表1 full [outer] join 表2 on 连接条件;
说明:
1,含义:其实是左右连接的“并集”(消除重复项),即内连接的结果,加上左表中不满足条件的所有行(右边对应补null),再加上,右表中不满足条件的所有行(左边对应补null)。
2,mysql中其实不认识全[外]连接语法,即mysql这个软件本身不支持全连接的语法。
3,此概念在其他数据库有的存在,了解就可以。
1.8 练习:


1)找出索尼4g手机所属类别名称
select protype_name from product join product_type
on product.protype_id=product_type.protype_id
where pro_name like '%索尼%4g手机%';

2)找出所有属于手机数码的产品
select * from product join product_type
on product.protype_id=product_type.protype_id
where protype_name='手机数码';

2 子查询
2.1子查询就是把一个查询的结果当作另一个查询的条件。
例1:
/*找出索尼4g手机所属类别名称*/
第一步,找条件:
select protype_id from product where pro_name like '%索尼%4g手机%';

第二步,找结果:
select * from product_type where protype_id=?;
第三步,连接:
select protype_name from product_type where protype_id=(select protype_id from product where pro_name like '%索尼%4g手机%');

例2:
/*找出所有属于手机数码的产品*/
select * from product where protype_id=(select protype_id from product_type where protype_name='手机数码');

表连接和子查询可以实现同样的效果,实际应用中自行选择用哪种方式。
2.2 使用in子查询(常用)
in的基本语法形式为:
where 操作数 in (值1,值2, ....)
则in子查询就是:
where 操作数 in ( 列子查询 );
含义:
表示该操作数(字段值) 等于 该子查询的其中任意一个只,就算满足条件。
例:
/*找出属于手机数码或电脑办公的产品*/
select * from product where protype_id in (select protype_id from product_type where protype_name='手机数码' or protype_name='电脑办公');

3 联合查询
联合查询的关键字是: union。
3.1定义
联合查询就是将两个select语句的查询结果“层叠”到一起成为一个“大结果”。
两个查询结果的能够进行“联合”的先觉条件是:结果字段数相等。
3.2语法形式
select 语句1
union [all | distinct]
select 语句2;
例:
select aname,adesc from app1 union select bname,bdesc from bpp1;

select aid,adesc from app1 union select bname,bdesc from bpp1;(没意义)

3.3说明:
1)两个select语句的输出段(结果字段)数目一样,应用中通常类型一样才有意义。
2)结果集中的字段以第一个select语句的字段为准。
3)第一个select语句的字段可以做别名,但如果做别名,则后续的where,group,order等子句应该用该别名。
4)联合查询默认是会消除重复项的(distinct),要想不消除,则必须明确些“all”。
5)如果要对整个联合结果进行排序或limit,则应该对各自的select语句加括号:
(select 语句1)
union
(select 语句2)
order by ..... limit ....;
sql常用操作(三)多表查询的更多相关文章
- SQL总结(三)其他查询
SQL总结(三)其他查询 其他常用的SQL,在这里集合. 1.SELECT INTO 从一个表中选取数据,然后把数据插入另一个表中.常用于创建表的备份或者用于对记录进行存档. 语法: SELECT c ...
- 07-查询操作(DQL)-多表查询
一. 综述 查询操作主要从两个方面来说:单表查询和多表查询. 多表查询包括:笛卡尔积.外键约束.内连接查询.外链接查询.自连接查询. 二 . 案例设计 1. 设计产品表(product). ...
- mysql第四篇:数据操作之多表查询
mysql第四篇:数据操作之多表查询 一.多表联合查询 #创建部门 CREATE TABLE IF NOT EXISTS dept ( did int not null auto_increment ...
- Mysql基础(四):库、表、记录的详细操作、单表查询
目录 数据库03 /库.表.记录的详细操作.单表查询 1. 库的详细操作 3. 表的详细操作 4. 行(记录)的详细操作 5. 单表查询 数据库03 /库.表.记录的详细操作.单表查询 1. 库的详细 ...
- 06-查询操作(DQL)-单表查询
一. 综述 查询操作主要从两个方面来说:单表查询和多表查询. 单表查询包括:简单查询.过滤查询.结果排序.分页查询.聚集函数. 二 . 案例设计 1. 设计产品表(product).包括:主键 ...
- 百万年薪python之路 -- MySQL数据库之 MySQL行(记录)的操作(二) -- 多表查询
MySQL行(记录)的操作(二) -- 多表查询 数据的准备 #建表 create table department( id int, name varchar(20) ); create table ...
- 数据库常用SQL语句(一):常用的数据库、表操作及单表查询语句
以MySql数据库为例进行说明 1.数据库操作语句 2.表的操作语句 3.表中的字段操作语句 4.MYSQL支持的完整性约束 数据库管理系统提供了一致机制来检查数据库表中的数据是否满足规定的条件,以保 ...
- 九.django模型基础(三)之关联对象操作及多表查询
Ⅰ.关系表的数据操作 1.正向 正向:如果一个模型有外键字段,通过这个模型对外键进行操作叫做正向. 1)更新(增) a.通过属性复制 b.通过主键的方式 总结: ForeignKey 字段的更新,跟普 ...
- sql常用操作(一)
sql(structured query language,结构化查询语言)语言:和数据库交互的语言,进行数据库管理的语言. 1.1 sql语句的作用:说白了就是增删改查 管理数据库 管理表 管理数据 ...
- SQL Server温故系列(2):SQL 数据操作 CRUD 之简单查询
1.查询语句 SELECT 1.1.查询语句的 SELECT 子句 1.2.查询语句的 FROM 子句 1.2.1.内连接查询 INNER JOIN 1.2.2.外连接查询 OUTER JOIN 1. ...
随机推荐
- VirtualBox下安装MacOS11
8.键盘选中 “简体中文” -- > "拼音模式".VirtualBox安装Mac OS 10.11 ,安装日期:2016 / 5 / 14 用虚拟机装黑苹果本人也装了不下3 ...
- 用linqpad来插入多条数据
其中Customers为数据库的某个表名, Custom自动被默认为单条记录的对象, 利用构造,InsertOnSubmit, 以及SubmitChanges实现插入数据. 注意:linqpad的la ...
- jQuery 防止相同的事件快速重复触发
重复触发就是防止用户重复点击提交数据了,我们一般都是点击之后没反应会再次点击了,这个不但要从用户体验上来做好,还在要js或php程序脚本上做好,让用户知道点击是己提交服务器正在处理,下面我就整理从脚本 ...
- PowerDesigner 导出 Excel
http://www.cnblogs.com/hggc/archive/2013/10/15/3369857.html
- fastIO模板
freadIO整理 namespace fastIO{ #define BUF_SIZE 100000 ; inline char nc() { static char buf[BUF_SIZE],* ...
- RequestsLibrary库入门介绍
Robot framework也可以进行接口测试,只需要导入相应的RequestsLibrary库即可. 一.准备工作: 首先需要安装好Robot framework基础环境,前面已做说明,本文就不做 ...
- sgu 321 The Spy Network (dfs+贪心)
321. The Spy Network Time limit per test: 0.5 second(s)Memory limit: 65536 kilobytes input: standard ...
- Spring Boot实现学生信息增删改查
上一篇博客写了如何初始化一个简单的Spring Boot项目,这次详细记录一下如何连接数据库并实现增删改查基本操作. 我使用的是MySQL 5.5+Navicat,MySQL量级比较轻,当然微软的SQ ...
- 2019计蒜之道初赛4 B. 腾讯益智小游戏—矩形面积交(简单)(矩形交集)
B. 腾讯益智小游戏—矩形面积交(简单) 1000ms 262144K 腾讯游戏开发了一款全新的编程类益智小游戏,最新推出的一个小游戏题目是关于矩形面积交的.聪明的你能解出来吗?看下面的题目接招吧 ...
- E20190419-hm
diagram n. 图表; 示意图; 图解; [数] 线图; contingency n. 意外事故,偶发事件; 可能性,偶然性; [审计] 意外开支; crash v. 碰撞; 使发出巨响; 暴跌 ...