首先对select查询用法有一个大概的了解:分组查询(group by), 连接查询(join), 聚合查询(使用到sum,avg等函数)。遇到具体查询问题,心里有一个方向,要使用哪种查询方式。
在MySql中,查询格式为:
select column[s] from table[,table1] [, view [,view1][join tableon 条件表达式][where 条件表达式][group by column[s]] [having 条件表达式][order by column[s] asc|desc][limit m [,n]];
eg1: 现有一张商品销售表sales_info, 有四列属性分别为商品编号id, 日期date,对应日期价格price, 销售量sales_num; 这张表记录了不同商品在不同日期以各种价格对应的销售量。
一、分组查询(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_infogroup by id with ollup
现需查询不同商品的销售总量小于100的商品以及销售总量:
select id, sum(sales_num) as total_num from sales_infogroup by idhaving total_num < 100;
二、连接查询
连接查询是将两个或两个以上的表按某些条件连接起来,从中选取需要的数据。可以分为内连接查询(通过where实现)和外连接查询(join)。
内连接查询:只有不同表中有相同意义的字段时才能进行连接,而且内连接查询只查询出指定字段取值相同的记录。
一般语法:select a.* , b.*from table_a as a, table_b as bwhere a.id = b.id;
外连接查询:需要通过指定字段来进行连接。当该字段取值相等时,可以查询出该记录;而且当该字段不等时,也可以查询出来。包括左连接,右连接查询。
一般语法:select 属性名列表from 表1left | right join 表2on 表1.属性名 = 表2.属性名;
1.进行left join 时,可以查询出表1中所有的记录;只能查询出表2匹配的记录。
2. 与1相反。
3.使用外连接查询时,可以加上各种条件进行筛选。
select table1.column1, table2.column1 from table1join table2on table1.column2 = table2.column3;select table1.column1, table2.column1from table1,table2where table1.column2 = table2.column3;
三、子查询
子查询时将一个查询语句嵌套在另一个查询语句中,内层查询语句的查询结果,可以为外层查询语句提供查询条件。在特定情况下:一个查询语句的条件需要另一个查询语句来获取。
子查询,又叫内部查询,相对于内部查询,包含内部查询的就称为外部查询。
子查询可以包含普通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表中查询哪些人分数高于任何一个奖学金的最低分。
select * from computer_stuwhere 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表。
还可以分为相关子查询,独立子查询。以上子查询与外层查询没有关联,称为独立子查询,如果子查询有用到外层查询的字段,则称相关子查询,相关子查询容易产生性能问题。
End.
作者:蓝天
本文为转载分享,如果涉及作品、版权和其他问题,请联系我们第一时间删除(微信号:lovedata0520)
更多文章前往首页浏览http://www.itongji.cn/
- 我的微信公众号
- 微信扫一扫
- 我的微信公众号
- 微信扫一扫
评论