基本SQL查询
当在数据库的表中存入数据后,就可以查询这些已经存入的数据。下面学习基本SQL查询
本节要点:
- l 如何使用select语句
- Select语句的语法
- SELECT语句中的运算
- 使用DISTINCT和UNIQUE删除重复列
- Oracle伪列
- l 聚合函数、分组和排序
- 聚合函数
- 分组函数
- HAVING子句
- ORDER BY字句
1 如何使用select语句
Select关键字表示数据的检索,它是由一系列的字句组成。
1.1 Select语句的语法
查询语句中SELECT、FROM、WHERE等是关键字,关键字开始的每一部份都称为一个子句。
语法:
SELECT [DISTINCT|UNIQUE](*,columnname[AS alias],…)
FROM tablename
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY columnname];
SELECT语句的要点以下几点:
- l SELECT语句必需的子句只有SELECT和FROM
- l 方括号表示可选部分
- l 可以在几行或一行上输入SQL语句。大多数SQL语句的输入方式都是一个子句占据单独的一行,以便提高可读性,并且使编辑变得更容易。
1) 选择表中的所有数据
SELECT * FROM customers;
2) 从表中选择一列
在Oracle中,可以只在结果中返回特定的列。SELECT语句中选择特定列被称为“投影(projection)”。可以选择表中的一列,也可以选择多个列或者是所有的列。比如要查看数据库中所有图书的名称,我们查询BOOKS表中的TITLE字段:
SELECT title FROM books;
3) 从表中选择多个列
SELECT子句中指定多个列时,应该使用逗号将列出的列分开,输出结果中的顺序,按SELECT子句中列出列的顺序。可以加入空格来提高可读性。
SELECT title, pubdate FROM books;
1.2 SELECT语句中的运算
- l 使用别名
使用“列别名”来代替在查询结果中显示的列名称。如果显示数据库中存储的所有图书的列表,那么你可能想要将列标题显示为“Title of Books”,可以在SELCECT子句中列名称的后面列出列别名。
SELECT title AS “Title of Books”,category FROM books;
注意:可选关键字AS,以便区分列名称和列别名。在使用别名时,须要记住:如果列名称包含空格、特殊符号、或者你不希望全部以大写字母显示它,那么必须将它包括在“”中。如果只包括一个单词,则不需要“” 。
- l 使用算数运算
SELECT子句中可以使用+,-,*,/这样的算术运算,Oracle中遵循以下算术运算:
-
- 在算术等式中从左向右计算,首先计算任何乘法和除法。
- 在进行乘法和除法之后才计算任何加法和减法,也是在等式中从左向右进行计算。
- 可以使用括号覆盖计算顺序
实例:希望获取每本书所产生的利润。Books表包含两个可以用来计算利润的字段:Cost和Retail。一本书的利润是书店为该书支付的金额(成本)与书的销售价格(零售价)之间的差值。我们为计算出的字段指定一个别名。
SELECT title,retail-cost profit FROM books;
1.3 使用DISTINCT和UNIQUE删除重复列
希望查看一下客户分布在那些地区:
SELECT DISTINCT state FROM customers;
或
SELECT UNIQUE state FROM customers;
1.4 Oracle伪列
Oracle 中伪列就像一个表列,但是它并没有存储在表中;伪列可以从表中查询,但不能插入、更新和删除它们的值;常用的伪列有ROWID和ROWNUM:
- ROWID 是表中行的存储地址,该地址可以唯一地标识数据库中的一行,可以使用 ROWID 伪列快速地定位表中的一行
- ROWNUM 是查询返回的结果集中行的序号,可以使用它来限制查询返回的行数
2 聚合函数、分组和排序
2.1 聚合函数
组函数也称为“聚合函数”,他们处理每一组行并返回一个结果 。如Oracle中常用的聚合函数:SUM 、AVG 、COUNT 、MIN 、MAX 。
1) SUM函数
用来计算存储在一组记录的某个数字字段中的总数量
SELECT SUM(retail-cost) 总利润FROM books WHERE category=‘Computer’;
2) AVG函数
计算指定列中的数值的平均值
SELECT AVG(retail-cost) "Average Profit" FROM books WHERE category ='COMPUTER';
3) COUNT函数
返回指定字段中包含一个值的行数。字段中包含NULL值的行不会包括在结果中。
要想计算包含NULL值的行,使用*而不是字段名称。
SELECT COUNT(*) FROM books;
或者
SELECT COUNT(shipdate) FROM orders;
查询图书不同种类的数量:
SELECT COUNT(DISTINCT category) FROM books;
注意:查询未发货的订单——打印发货日期是NULL值的所有订单列表:
SELECT COUNT(*) FROM orders WHERE shipdate IS NULL;
容易犯错的写法 :
SELECT COUNT(shipdate) FROM orders WHERE shipdate IS NULL;
4) MAX函数
返回在指定列中存储的最大值 。
返回一本书所产生的最大利润:
SELECT MAX(retail-cost) "Highest Profit" FROM books;
5) MIN函数
返回在指定列的最小值 。
查找BOOKS表中存储的所有图书中的出版日期最早的图书:
SELECT MIN(pubdate) FROM books;
2.2 分组函数
上面聚合函数是对于所有记录进行聚合的,有时候我们需要先对记录分组再进行聚合。对记录的分组是通过关键字GROUP BY实现的,如GROUP BY F1,F2,F3,则当且仅当两条记录在所有属性F1,F2,F3上达成一致,它们才是同一组的。
求每一类图书的平均利润
SELECT category,TO_CHAR(AVG(retail-cost), '999.99') profit
FROM books
GROUP BY category;
使用GROUP BY子句时要注意:
- l 如果在SELECT 子句中使用一个组函数,那么在SELECT子句中列出的任何单独的列必须在GROUP BY子句中列出。
- l 用来在GROUP BY子句中分组数据的列不必在SELECT子句中列出,在SELECT子句中包括它们只是为了在输出中指定组。
- l 不能在GROUP BY子句中使用列别名
- l 从包括GROUP BY子句的SELECT语句返回的结果将以在GROUP BY子句中列出的列的升序显示结果,要想以不同的顺序显示结果,可以使用ORDER BY子句
2.3 HAVING子句
用来限制一个查询返回的组。HAVING子句指定了那些组将显示在结果中。换句话说HAVING子句充当了组的WHERE子句。
显示平均利润超过15美元的图书的种类:
SELECT category,TO_CHAR(AVG(retail-cost), '999.99') Profit
FROM books
GROUP BY category
HAVING AVG(retail-cost)>15;
2.4 ORDER BY子句
用来按某个顺序显示查询结果
语法:
SELECT [DISTINCT|UNIQUE](*,column[AS alias],…)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column [asc|desc]];
查看按Name升序排序的所有的出版社的列表:
SELECT * FROM publisher ORDER BY name;
注:升序使用asc ,降序使用desc,默认是asc。
ORDER BY子句只指定一列时,我们称为“主排序”,如果主排序中的两行或更多行完全相同,那么次排序提供了另一个进行排序的字段。 查询按州降序排列的客户,有多个居住在某个特定州的客户时,将按城市的升序对客户排序:
SELECT lastname,firstname,city,state
FROM customers
ORDER BY state desc,city;