SQL之select各种查询用法

数据大师
数据大师
数据大师
294
文章
0
评论
2021-08-1115:25:25 评论 1,534 2496字
摘要

相信有很多人,学习sql 就是记忆各种sql的语法,但是记了一大堆的语法,在遇到实际查询问题时又无从下手的感觉。本文主要是针对sql 中select用法的总结,用于帮助大家解决记了相关语法却不知如何应用的问题。

       首先对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;

 

二、连接查询

SQL之select各种查询用法

 

连接查询是将两个或两个以上的表按某些条件连接起来,从中选取需要的数据。可以分为内连接查询(通过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/

 

  • 我的微信公众号
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: