高级数据操作--联合查询

一.联合查询

 1 -- 关键字: union
 2
 3 -- 语法
 4 select 语句1
 5 union[union 选项]
 6 select 语句2
 7 union[union 选项]
 8 ......
 9 union[union 选项]
10 select 语句n;

所谓的联合查询,就是将多个查询语句的结果进行纵向上的拼接,也就是将select语句2的查询结果放在select语句1的后面!很显然,总的记录数增加了,但是字段的数量并没有增加!

既然是多个查询记录的拼接,所以联合查询有一个最基本的语法,就是各个select语句查询结果的字段数应该是一样的,比如,不能一个3列,一个是4列!

这里的union选项跟以前学习的select选项是一样的,只是它们的默认值不一样:

1 -- 这里的union跟select的选项一样的,只是默认值不一样
2 -- all:显示全部记录
3 -- distinct : 去除重复数据(union默认选择的值)
4 select * from php_student
5 union all
6 select * from php_student;

当然,上面的查询结果毫无意义!

1.union的应用

表和数据

create table php_student(
    id int primary key auto_increment,
    name varchar(20),
    gender enum(‘male‘,‘female‘),
    class_id tinyint unsigned,
    age int unsigned,
    home varchar(40),
    score tinyint unsigned
);

insert into php_student values
    (null,‘孙悟空‘,‘male‘,17,600,‘花果山‘,98),
    (null,‘蜘蛛精‘,‘female‘,18,500,‘花果山‘,90),
    (null,‘猪悟能‘,‘male‘,17,700,‘高老庄‘,88),
    (null,‘沙悟净‘,‘male‘,17,750,‘流沙河‘,78),
    (null,‘唐僧‘,‘male‘,17,30,‘东土大唐‘,100),
    (null,‘高翠兰‘,‘female‘,16,18,‘高老庄‘,70),
    (null,‘皇后‘,‘female‘,16,18,‘东土大唐‘,73),
    (null,‘小龙女‘,‘female‘,17,30,‘流沙河‘,80),
    (null,‘小猴子‘,‘male‘,16,100,‘花果山‘,95),
    (null,‘皇帝‘,‘male‘,16,60,‘东土大唐‘,93),
    (null,‘高翠华‘,‘female‘,16,16,‘高老庄‘,80);
union主要应用在以下的几种情形:
第一.获得数据的条件,在同一个select语句中存在某种逻辑上的冲突,或者说很难在同一个逻辑内表示,此时,需要拆分成多个逻辑,也就是在多个select语句中分别实现再将最终的结果组合到一起!

 

/*
比如:现在要查询上面php_student中,高老庄的一个score最高分,和花果山中的一个最低分!
*/
-- 先查高老庄中的最高分
select * from php_student where home=‘高老庄‘ order by score desc limit 1;
-- 在查花果山中最低分
select * from php_student where home=‘花果山‘ order by score asc limit 1;

-- 把两个查询结果连接在一起
select * from php_student where home=‘高老庄‘ order by score desc limit 1
union
select * from php_student where home=‘花果山‘ order by score asc limit 1;  -- 运行出错

这里有几点需要注意的地方:

1,  联合查询中如果使用到了order by,那么就必须要对select子句加上一对小括号();

    

1 (select * from php_student where home=‘高老庄‘ order by score desc limit 1)
2  union
3 (select * from php_student where home=‘花果山‘ order by score asc limit 1); -- 运行ok

一个小测试:

1 -- (一个问题)把高老庄按score进行降序排序,并对花果山按score升序排序,并联合在一起
2 (select * from php_student where home=‘高老庄‘ order by score desc )
3  union
4 (select * from php_student where home=‘花果山‘ order by score asc ); -- 结果是混乱,不符合要求

2,  如果联合查询中出现了order by子句,就必须配合上limit子句才能生效,当然,如果确实想显示全部的数据,可以在limit的后面加上一个很大的数,比如999999;

1 (select * from php_student where home=‘高老庄‘ order by score desc limit 9999999)
2 union
3 (select * from php_student where home=‘花果山‘ order by score asc  limit 9999999); -- 执行ok

第二,   如果一张数据表的记录数特别大,往往会导致查询效率的低下,此时,我们可以采取某种方式或者规律对数据表进行“水平切割”,此时,每张数据表的结构都是一样的,只是里面存放的数据不一样!此时,在根据某些条件进行查询的时候,可能每一张表都需要查询,最后通过union语句联合到一起!

 

时间: 2024-11-08 16:45:14

高级数据操作--联合查询的相关文章

高级数据操作--子查询

一.子查询——标量子查询 子查询的概念 思考: 如何得到php_student表中成绩最高的学生的记录? 1 select * from php_student order by score desc limit 1; 但是,存在一个逻辑问题,如果最高分有很多人,怎么办! 1 insert into php_student values 2 (null,'观世音','female',17,5000,'南海',100), 3 (null,'如来','male',17,6000,'西天',100);

高级数据操作--连接查询

一.连接查询——交叉连接 概念 表与表之间是有联系的! 所谓的连接查询,就是指将两张表或者多张表按照某个指定的条件,进行横向上的连接并显示! 所以,从结果上看,字段数增加了! 分类 根据连接查询的性质不同,又可以分成交叉连接.内连接.外连接和自然连接! 交叉连接关键字:cross join  交叉连接含义: 交叉连接是最容易理解的,就是指从一张表中的每一条记录分别去连接另外一张表的所有的记录,并且保存所有的记录,其中也包括两张表的所有的字段! 所以说,交叉连接的本质就是两张数据表做笛卡尔积! 笛

oracle-2-sql数据操作和查询

主要内容: >oracle 数据类型 >sql建表和约束 >sql对数九的增删改 >sql查询 >oracle伪例 1.oracle的数据类型 oracle数据库的核心是表,表中常见的数据类型有: char(length):存储固定长度的字符串,length默认1,最长2000 varchar2(length):存储可变长度的字符串,length默认长度是1,最大4000 number(p,s)存储浮点数或者是整数,p表示的是最大位数(包含小数点),p默认是38,s表示小数位

mysql学习之路_高级数据操作

关系 将实体与实体的关系,反应到最终数据表的设计上来,将关系分为三种,一对多,多对多,多对多. 所有关系都是表与表之间的关系. 一对一: 一张表的一条记录一定只对应另外一张表的一条记录,反之亦然. 例 Id 姓名 性别 年龄 电话号码 1 张三 男 23 13320848263 一对多 一张表中有一条记录,对应另一张表多条记录但是反过来,另一张表的一条记录只能对应这张表的一条记录. 例母亲与孩子的关系 多对多 一张表中的一条记录对应另外一张表的多条记录,同时另一张表的一条记录对应另外一张表的多条

高级数据操作(上)

数据的操作也叫做CRUD C:Create R:Read U:Update D:Delete 一.插入数据 标准语法: 1 insert into 表名[字段列表] values(值列表): 思考: 1,如何以最快的速度向数据表中插入100万条数据? (1)蠕虫复制 含义:在已有的数据的基础之上,将原来的数据进行复制,插入到对应的表中(也可以插入到自己的表中): 1 -- 蠕虫复制 2 insert into 表名 select *|字段列表 from 表名; 3 4 create table

SQL中的高级数据操作

一.新增数据 1. 主键冲突:更新和替换 ① insert into 表名 [(字段列表)] values (值列表) on duplicate key update 字段 = 新值, 字段 = 值, ...; -- 更新 ② replace into 表名 [(字段列表)] values (值列表); -- 替换 2. 蠕虫复制 create table 表名A like 数据库.表名B; -- 从已有表中复制表结构(不复制数据), 如表B与表A在同一数据库,可活力数据库名; insert i

mysql 数据操作 子查询 带比较运算符的子查询

带比较运算符的子查询 #比较运算符:=.!=.>.>=.<.<=.<> #查询大于所有人平均年龄的员工名与年龄 思路 先拿到所有人的平均年龄然后 再用另外一条sql语句 进行比较 拿所有员工的年龄 > 所有人的平均年龄 做比较 mysql> select name,age from employee where age >(select avg(age) from employee) ; +------+------+ | name | age | +

对于多表联合查询的一点理解

操作数据库时多表联合查询很常见.也知道常见联合查询的集中类型,内连接.外连接.全连接.自连接,外连接又分为左连接和右连接. 这些概念我一直都知道,但对于感念的理解并不透彻.对于不同类型的联合查询的结果数据集合没有清晰的区分.前两天,工作中又遇到的这样的问题,才开始弄明白. 内连接:传统写法:select a.*,b.* from a,b where a.column=b.column; 新式写法:select a.* from a inner join b on a.column=b.colum

数据库 MySQL 之 数据操作

一.MySQL数据类型介绍 MySQL支持多种类型,大致可以分为四类:数值.字符串类型.日期/时间和其他类型. ①二进制类型 bit[(M)] 二进制位(101001),m表示二进制位的长度(1-64),默认m=1 ②整数类型:存储年龄,等级,id,各种号码等 tinyint[(m)] [unsigned] [zerofill] 小整数,数据类型用于保存一些范围的整数数值范围: 有符号:-128 - 127. 无符号:255 特别的: MySQL中无布尔值,使用tinyint(1)构造. int