之前我们在SQL中的出现col_name(属性名)的 地方,我们都只是写上col_name自身。其实在SQL中可以用col_name的地方,都可以用表达式来指定对属性进行一定的计算或处理。举个例子:假设有一个col_name是出生日期,现在要求SQL返回当前的年龄,这就可以用一个时间计算表达式对出生日期做计算得到年龄。表达式可以对数字运算,对字符串运算,也可以在表达式中只包含常量不包含col_name(如:SELECT 1+1)
包含表达式的例子
SELECT particle_speed / 2.0 AS half_particle_speed (对结果做了一个除2)
FROM physics_data
WHERE ABS(particle_position) * 10.0 >500 (条件要求这个属性绝对值乘以10大于500);
每一种数据库(mysql,sqlserver等)都有自己的一套函数,包含常用的数字,字符串,时间等处理过程.具体需要参看相关文档。
当我们用表达式对col属性计算时,很多事可以在SQL内完成,这让SQL更加灵活,但表达式如果长了则很难一下子读懂。所以SQL提供了AS
关键字, 来给表达式取一个别名.
AS使用别名
SELECT col_expression AS expr_description, … FROM mytable;
实际上AS不仅用在表达式别名上,普通的属性列甚至是表(table)都可以取一个别名,这让SQL更容易理解.
属性列和表取别名的例子
SELECT column AS better_column_name, …
FROM a_long_widgets_table_name AS mywidgets
INNER JOIN widget_sales ON mywidgets.id = widget_sales.widget_id;
我们来用表达式处理一些 BoxOffice标的数据,让一些数据更加的人性化而不是原始数据!
Table: Movies (Read-Only)
Id | Title | Director | Year | Length_minutes |
1 | Toy Story | John Lasseter | 1995 | 81 |
2 | A Bug's Life | John Lasseter | 1998 | 95 |
3 | Toy Story 2 | John Lasseter | 1999 | 93 |
4 | Monsters, Inc. | Pete Docter | 2001 | 92 |
5 | Finding Nemo | Finding Nemo | 2003 | 107 |
6 | The Incredibles | Brad Bird | 2004 | 116 |
7 | Cars | John Lasseter | 2006 | 117 |
8 | Ratatouille | Brad Bird | 2007 | 115 |
9 | WALL-E | Andrew Stanton | 2008 | 104 |
10 | Up | Pete Docter | 2009 | 101 |
11 | Toy Story 3 | Lee Unkrich | 2010 | 103 |
12 | Cars 2 | John Lasseter | 2011 | 120 |
13 | Brave | Brenda Chapman | 2012 | 102 |
14 | Monsters University | Dan Scanlon | 2013 | 110 |
Table: Boxoffice (Read-Only)
Movie_id | Rating | Domestic_sales | International_sales |
5 | 8.2 | 380843261 | 555900000 |
14 | 7.4 | 268492764 | 475066843 |
8 | 8 | 206445654 | 417277164 |
12 | 6.4 | 191452396 | 368400000 |
3 | 7.9 | 245852179 | 239163000 |
6 | 8 | 261441092 | 370001000 |
9 | 8.5 | 223808164 | 297503696 |
11 | 8.4 | 415004880 | 648167031 |
1 | 8.3 | 191796233 | 170162503 |
7 | 7.2 | 244082982 | 217900167 |
10 | 8.3 | 293004164 | 438338580 |
4 | 8.1 | 289916256 | 272900000 |
2 | 7.2 | 162798565 | 200600000 |
13 | 7.2 | 237283207 | 301700000 |
Table(表): Movies
Title | Price |
Toy Story | 361958736 |
A Bug's Life | 363398565 |
Toy Story 2 | 485015179 |
Monsters, Inc. | 562816256 |
Finding Nemo | 936743261 |
The Incredibles | 631442092 |
Cars | 461983149 |
Ratatouille | 623722818 |
WALL-E | 521311860 |
Up | 731342744 |
Toy Story 3 | 1063171911 |
Cars 2 | 559852396 |
Brave | 538983207 |
Monsters University | 743559607 |
练习 do it — 请完成如下任务
1.列出所有的电影ID,名字和销售总额(以百万美元为单位计算)
SELECT id,title,(Domestic_sales+International_sales)/1000000
FROM movies
left join Boxoffice on movies.id=Boxoffice.Movie_id
2.列出所有的电影ID,名字和市场指数(Rating
的10倍为市场指数)
SELECT id,title,rating*10
FROM movies
left join Boxoffice on movies.id=Boxoffice.Movie_id
3.列出所有偶数年份的电影,需要电影ID,名字和年份
SELECT id,title,year
FROM movies
left join Boxoffice on movies.id=Boxoffice.Movie_id
where year %2=0
4.John Lasseter导演的每部电影每分钟值多少钱,告诉我最高的3个电影名和价值就可以
SELECT title,(Domestic_sales+International_sales)/Length_minutes as price
FROM movies
left join Boxoffice on movies.id=Boxoffice.Movie_id
where Director like "John Lasseter"
order by price desc
limit 3
5.电影名最长的3部电影和他们的总销量是多少
SELECT title,(Domestic_sales+International_sales) as price
FROM movies
left join Boxoffice on movies.id=Boxoffice.Movie_id
order by len(title) desc
limit 3