数据库--SQL语言-2

本文介绍了如何在SQL查询中使用表达式进行计算,如对数字和字符串的运算,以及如何结合GROUPBY和HAVING进行分组统计,给出了多个实际操作的例子,包括电影销售总额、市场指数计算、特定条件下的电影筛选等。
摘要由CSDN通过智能技术生成

上一篇地址:数据库--SQL语言-1-CSDN博客

又要继续学习了,卑

在查询中使用表达式

其实在SQL中可以用col_name的地方,都可以用表达式 来指定对属性进行一定的计算或处理。

表达式可以对 数字运算,对字符串运算,也可以在表达式中只包含常量不包含col_name(如:SELECT 1+1)

#包含表达式的例子
SELECT  time-birth AS age 
FROM data
WHERE ABS(age ) * 10.0 <60
            (条件要求这个属性绝对值乘以10之后小于60);

其中:AS关键字, 来给表达式取一个别名.

实际上AS不仅用在表达式别名上,普通的属性列甚至是表(table)都可以取一个别名,

例题:

Table: Boxoffice (Read-Only)

Movie_idRatingDomestic_salesInternational_sales
58.2380843261555900000
147.4268492764475066843
88206445654417277164
126.4191452396368400000
37.9245852179239163000
68261441092370001000
98.5223808164297503696
118.4415004880648167031
18.3191796233170162503
77.2244082982217900167
108.3293004164438338580
48.1289916256272900000
27.2162798565200600000
137.2237283207301700000

Table: Movies (Read-Only)

IdTitleDirectorYearLength_minutes
1Toy StoryJohn Lasseter199581
2A Bug's LifeJohn Lasseter199895
3Toy Story 2John Lasseter199993
4Monsters, Inc.Pete Docter200192
5Finding NemoFinding Nemo2003107
6The IncrediblesBrad Bird2004116
7CarsJohn Lasseter2006117
8RatatouilleBrad Bird2007115
9WALL-EAndrew Stanton2008104
10UpPete Docter2009101
11Toy Story 3Lee Unkrich2010103
12Cars 2John Lasseter2011120
13BraveBrenda Chapman2012102
14Monsters UniversityDan Scanlon2013110
  1. 【计算】列出所有的电影ID,名字和销售总额(以百万美元为单位计算)
  2. 【计算】列出所有的电影ID,名字和市场指数(Rating的10倍为市场指数)
  3. 【计算】列出所有偶数年份的电影,需要电影ID,名字和年份
  4. 【难题】John Lasseter导演的每部电影每分钟值多少钱,告诉我最高的3个电影名和价值就可以
SELECT id,Title,(Domestic_sales+International_sales)/1000000
FROM movies
join Boxoffice on id=Movie_id
;#注意括号

SELECT id,Title,Rating*10
FROM movies
join Boxoffice on id=Movie_id
;

SELECT id,Title,year
FROM movies
join Boxoffice on id=Movie_id
where year%2=0
;
SELECT Title,(Domestic_sales+International_sales)/Length_minutes AS price
FROM movies
join Boxoffice on id=Movie_id
where Director="John Lasseter"
order by price DESC
limit 3
;

统计:

常见统计函数

FunctionDescription
COUNT(*)COUNT(column)

计数!COUNT(*) 统计数据行数,

COUNT(column) 统计column非NULL的行数.

MIN(column)找column最小的一行.
MAX(column)找column最大的一行.
AVG(column)对column所有行取平均值.
SUM(column)对column所有行求和.
分组统计:

GROUP BY 数据分组语法可以按某个col_name对数据进行分组,如:GROUP BY Year指对数据按年份分组, 相同年份的分到一个组里。如果把统计函数和GROUP BY结合,那统计结果就是对分组内的数据统计了.
GROUP BY 分组结果的数据条数,就是分组数量,比如:GROUP BY Year,全部数据里有几年,就返回几条数据, 不管是否应用了统计函数.

例题:

Table(表): Employees 

RoleNameBuildingYears_employed
EngineerBecky A.1e4
EngineerDan B.1e2
EngineerSharon F.1e6
EngineerDan M.1e4
EngineerMalcom S.1e1
  1. 【统计】找出就职年份最高的雇员(列出雇员名字+年份)
  2. 【分组】按角色(Role)统计一下每个角色的平均就职年份
  3. 【分组】按办公室名字总计一下就职年份总和
  4. 【难题】每栋办公室按人数排名,不要统计无办公室的雇员

1.
SELECT name,Years_employed
FROM employees
//group by  Years_employed (本句不写)
order by Years_employed DESC
limit 1
;#不可以直接对group降序排列

或者直接使用函数
SELECT name,max(Years_employed)
FROM employees
;

2.select role,avg(Years_employed)
from  Employees
group by role
;
3.
select Building,sum(Years_employed)
from  Employees
group by Building
;
4.
select Building,count(Name)
from  Employees
where Building is not null
group by Building
;

在 GROUP BY 分组语法中,数据库是先对数据做WHERE,然后对结果做分组.

如果我们要对分组完的数据再筛选出几条如何办?---》HAVING (Group by后的where)

用HAVING进行筛选
SELECT group_by_column, AGG_FUNC(column_expression) AS aggregate_result_alias, …
FROM mytable
WHERE condition
GROUP BY column
HAVING group_condition;

例题:

  1. 【统计】统计一下Artist角色的雇员数量
  2. 【分组】按角色统计一下每个角色的雇员数量
  3. 【分组】算出Engineer角色的就职年份总计

【难题】按角色分组算出每个角色按有办公室和没办公室的统计人数(列出角色,数量,有无办公室,注意一个角色如果部分有办公室,部分没有需分开统计)

1.
SELECT count(ROLE) 
FROM employees
where Role="Artist"
;
2.
SELECT ROLE,count(ROLE) 
FROM employees
group by ROLE
;
3.
SELECT sum(Years_employed) 
FROM employees
group by ROLE
having ROLE="Engineer"
;
4.
SELECT ROLE,count(Name),Building is not NUll AS have
FROM employees
group by ROLE,have
;

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值