达梦两个表模糊查询_彻底弄懂sqlselect各种查询⽤法
相信很多⼈和我⼀样,学习sql 就是记忆各种sql的语法,但是记了⼀⼤堆的语法,在遇到实际查询问题时⼜⽆从下⼿的感觉。本⽂主要是针对sql 中select⽤法的总结,⽤于帮助⼤家解决记了相关语法却不知如何应⽤的问题。
⾸先对select查询⽤法有⼀个⼤概的了解:分组查询(group by), 连接查询(join), 聚合查询(使⽤到sum,avg等函数)。遇到具体查询问题,⼼⾥有⼀个⽅向,要使⽤哪种查询⽅式。
在MySql中,查询格式为:
select
eg1: 现有⼀张商品销售表sales_info, 有四列属性分别为商品编号id, ⽇期date,对应⽇期价格price, 销售量sales_num; 这张表记录了不同商品在不同⽇期以各种价格对应的销售量。
⼀、分组查询(group by)
group by 关键字可以将查询结果按某个字段或多个字段进⾏分组,字段中值相等的为⼀组。
group by 关键字可以将查询结果按某个字段或多个字段进⾏分组,字段中值相等的为⼀组
语法规则;
group by 属性名 [having 条件表达式] [with rollup]
1.单独使⽤group by 时,只能查询出每个分组的第⼀条记录,⼀般在使⽤集合函数时才使⽤。
2. group_concat()函数可以将每个分组中指定字段值都显⽰出来。
3. having 条件表达式,作⽤于分组后的记录,⽤于选择满⾜条件的组。
4. 多个字段分组,先按照第⼀个字段分组,若第⼀个字段相等,再按第⼆个,以此类推。
5.with rollup 将会在所有记录的最后⼀条加上⼀条记录:上⾯所有记录的总和。
以eg1为例,现需要统计不同商品最⼤的售价:
select id , max(price) as max_price from sales_info
group by id with ollup
现需查询不同商品的销售总量⼩于100的商品以及销售总量:
select
⼆、连接查询
连接查询是将两个或两个以上的表按某些条件连接起来,从中选取需要的数据。可以分为内连接查询(通过where实现)和外连接查询(join)。
内连接查询:只有不同表中有相同意义的字段时才能进⾏连接,⽽且内连接查询只查询出指定字段取值相同的记录。
⼀般语法:
select a.* , b.*
from table_a as a, table_b as b
where a.id = b.id;
外连接查询:需要通过指定字段来进⾏连接。当该字段取值相等时,可以查询出该记录;⽽且当该字段不等时,也可以查询出来。包括左连接,右连接查询。
⼀般语法:
select 属性名列表
from 表1
left | right join 表2
on 表1.属性名 = 表2.属性名;
1.进⾏left join 时,可以查询出表1中所有的记录;只能查询出表2匹配的记录。
2. 与1相反。
3.使⽤外连接查询时,可以加上各种条件进⾏筛选。
lumn1, lumn1
from table1
join table2
lumn2 = lumn3;
lumn1, lumn1
from table1,table2
lumn2 = lumn3;
三、⼦查询
⼦查询时将⼀个查询语句嵌套在另⼀个查询语句中,内层查询语句的查询结果,可以为外层查询语句提供查询条件
⼦查询时将⼀个查询语句嵌套在另⼀个查询语句中,内层查询语句的查询结果,可以为外层查询语句提供查询条件。在特定情况下:⼀个查询语句的条件需要另⼀个查询语句来获取。
⼦查询,⼜叫内部查询,相对于内部查询,包含内部查询的就称为外部查询。
⼦查询可以包含普通select可以包括的任何⼦句,⽐如:distinct、 group by、order by、limit、join和union等;但是对应的外部查询必须是以下语句之⼀:select、insert、update、delete、set或 者do。
注:⼀个查询语句只能有⼀个order by ,在⼦查询中只能位于外部查询后⾯.
1.分类
⼦查询分为如下⼏类:
1). 标量⼦查询:返回单⼀值的标量,最简单的形式。
2). 列⼦查询:返回的结果集是 N ⾏⼀列。
3). ⾏⼦查询:返回的结果集是⼀⾏ N 列。
4). 表⼦查询:返回的结果集是 N ⾏ N 列。
可以使⽤的操作符:= > < >= <= <> ANY IN SOME ALL EXISTS
释义:⼀个⼦查询会返回⼀个标量(就⼀个值)、⼀个⾏、⼀个列或⼀个表,这些⼦查询称之为标量、⾏、列和表⼦查询。
2.带有any关键字的⼦查询
any关键字表⽰满⾜其中任⼀条件,使⽤any关键字时,只要满⾜内层查询语句返回的结果中的任何⼀个,就可以通过该条件来执⾏外层查询语句。
从computer表中查询哪些⼈分数⾼于任何⼀个奖学⾦的最低分。
exists的用法select * from computer_stu
where score >= ANY
(select score From scholarship);
3. 带有all关键字的⼦查询
表⽰需要满⾜所有的条件。只有满⾜内层查询语句返回的所有结果,才可以执⾏外层查询语句。
4.带有exists关键字的⼦查询
exists关键字表⽰存在,内层查询语句不返回查询的记录,⽽是返回⼀个真假值,如果内层查询语句查询到满⾜条件的记录,就返回⼀个true,外层查询语句将进⾏查询。
select * from employee
where exists (select d_name from department where d_id = 1003);
//如果department存在d_id为1003,则查询employee表。
还可以分为相关⼦查询,独⽴⼦查询
还可以分为相关⼦查询,独⽴⼦查询。以上⼦查询与外层查询没有关联,称为独⽴⼦查询,如果⼦查询有⽤到外层查询的字段,则称相关⼦查询,相关⼦查询容易产⽣性能问题。
最后来做个⼩练习吧,考考你掌握的如何。
eg1: 现有⼀张商品销售表sales_info, 有四列属性分别为商品编号id, ⽇期date,对应⽇期价格price, 销售量sales_num; 这张表记录了不同商品在不同⽇期以各种价格对应的销售量。
部分数据如下:
id date price sales_num
10_1004717 20170701 5900 0
10_1004717 20170702 5900 0
10_1004717 20170703 5900 0
10_1004717 20170704 5900 0
10_1004717 20170705 5900 10
10_1004717 20170706 5900 30
10_1004717 20170707 5900 0
10_1004717 20170708 5900 0
10_1004717 20170709 5900 0
10_1004717 20170710 5900 0
10_1004717 20170711 5900 4
10_1004717 20170712 5900 0
10_1004717 20170713 5900 0
10_1004717 20170714 5900 0
10_1004717 20170715 5900 0
10_1004717 20170716 5900 0
10_1004717 20170717 5900 0
10_1004718 20170701 6300 0
10_1004718 20170702 6300 0
10_1004718 20170703 6300 0
那么问题来了:要查询7⽉1⽇到7⽉15⽇期间,总销量最⼤的500种商品,以及每种商品单⽇销量最⼤那天的⽇期、价格、销量。(这三种数据并⾮⼀⼀对应)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论