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. ...
随机推荐
- codevs 2144 砝码称重2
传送门 2144 砝码称重 2 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 有n个砝码,现在要称一个质量为m ...
- The Tomcat server configuration at \Servers\Tomcat v8.0 Server at localhost-config is missing. Check the server for erro
解决方案 1.选择Eclipse工具栏中的Windows→Perferences 2.remove已经创建的server 3.选择Add重新添加,选择create anew local server ...
- Repeater 和 GridView 添加序列号
<tr><asp:Repeater ID="rptOfBrowerInfo" runat="server" > <Heade ...
- linux正则表达式基础
linux中awk,sed,grep等 命令使用区别正则表达式基础 在最简单的情况下,一个正则表达式看上去就是一个普通的查找串.例如,正则表达式"testing"中没有包含任何元字 ...
- linux下安装Drcom
环境:台式机物理机,centos7 因为要下载依赖包,物理机一开始没有网络,所以我先使用的是实验室的公用ip,然后完成以下操作(网上有大神说,可以现在其他机器上下载依赖包,copy过来也可以,但我没有 ...
- 第3章 编写ROS程序-2
1.发布者程序 在本节中,我们将看到如何发送随机生成的速度指令到一个turtlesim海龟,使它漫无目的地巡游.这个程序的源文件称为pubvel,这个程序展示了从代码中发布消息涉及的所有要素. 其代码 ...
- 10天彻底搞定-webpack4.0
本机存放的路径: F:\教程\10天彻底搞定-webpack4.0 联想电脑代码存放的路径: D:\MyDemos\webpack4 10天彻底搞定-webpack4.0 1.webpack课程介绍 ...
- Java线程安全与多线程开发
互联网上充斥着对Java多线程编程的介绍,每篇文章都从不同的角度介绍并总结了该领域的内容.但大部分文章都没有说明多线程的实现本质,没能让开发者真正“过瘾”. 从Java的线程安全鼻祖内置锁介绍开始,让 ...
- Redis在windows实现将数据缓存起来定时更新读取
实现接口的读取存放在内存中,实现了Web网站直接读取内存数据,大大的减少了访问接口带来的等待时间,这个功能是比较实用的 需要下载一下‘类库’及‘Redis-x64-3.2.100程序包’ 百度云材料下 ...
- opencv多版本安装
使用命令查看当前的opencv版本: pkg-config --modversion opencv 自带的是opencv-2.4.9 安装opencv3.1 安装opencv的依赖项 sudo apt ...