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. ...
随机推荐
- 【LeetCode】027. Remove Element
题目: Given an array and a value, remove all instances of that value in place and return the new lengt ...
- 几个网络模型的示例代码(BlockingModel、OverlappedModel、WSAEventSelect、CompletionRoutine)..c++
作者的blog:猪)的网络编程世界 几个网络模型的示例代码代码包括了下面几个模型的示例:BlockingModel(阻塞模式).OverlappedModel(基于事件的重叠I/O).WSAEvent ...
- JAVA类型信息——Class对象(转载)
JAVA类型信息--Class对象 一.RTTI概要 1.类型信息RTTI :即对象和类的信息,例如类的名字.继承的基类.实现的接口等. 2.类型信息的作用:程序员可以在程序运行时发现和使用类型信息. ...
- 再学IHanlder 类----------------关于Asp.net与iis原理网上看博客收获写一个验证码用一般处理程序记的好长时间前就写过不过现在再看有点不一样的感觉
建一个web网站 新建一般处理程序直接贴代码: using System;using System.Collections.Generic;using System.Linq;using System ...
- Repeater 和 GridView 添加序列号
<tr><asp:Repeater ID="rptOfBrowerInfo" runat="server" > <Heade ...
- HDU-5979
Convex Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- minihttp安装配置ssl和c语言实现cgi
概述:参考了大牛们的方法,结合自己的环境做了修改,主要是讲:minihttp安装配置ssl和c语言实现cgi接收字符串并且保存系统环境:centos6.5 开发版 依赖软件包: mini_httpd- ...
- ARP欺骗(完全版)
在讲ARP欺骗之前先讲讲什么是ARP以及ARP欺骗的原理吧. 一. 什么是ARP? arp英文全称: address resolution protocol 中文:地址解析协议 它的作用:是根 ...
- CodeForces - 828C String Reconstruction 并查集(next跳)
String Reconstruction Ivan had string s consisting of small English letters. However, his friend Jul ...
- JQ 获取ul\ol 下面li的个数
使用 jQuery 获取 ul 下面 li 的个数,那么我们需要遍历我们的ul.如果你的ul有class .id 或两者都没,您可以使用 ul 标签来遍历. //遍历ul 获取li个数 $(" ...