为了从数据库中查询数据,你需要用SQL语言中使用最多的SELECT语句。我们分别介绍SELECT语句的基础语法、子查询、从多表中查询数据,然后再进行实例解析。
一、SELECT语句的基础语法
SELECT语句就像叠加在数据库表上的过滤器,即选择查询用于定位数据库特定的列和行。下面是SELECT语句的基础语法。
SELECT [ALL|DISTINCT SELECT_LIST FROM {table_name|view_name} [WHERE search_condition] [GROUP BY group_by_expression] [HAVING search_condition] [ORDER BY order_by_expression [ASC|DESC]]
用中括号[]括起来的表示可选的,用大括号{}括起来的表示必须从中选择其中的一个。下面我们对SELECT语句的每个子句进行详细的解析。
1.SELECT子句
(1)SELECT子句:指定由查询返回的列,可以一次返回多个列,用“,”分开即可。可用空格或关键字AS定义列别名。
(2)SELECT子句中,应避免使用通配符 *,尽可能查询符合某条件的数据,以提高查询效率。
(3)关键字DISTINCT的作用为去重,默认为ALL,既显示所有数据。
2.FROM子句
(1)FROM子句:用于指定所要查询的表或视图,用“,”分隔不同的表或视图,空格或关键字AS定义列别名。
(2)FROM子句完整格式:FROM user_name.table.name;(用户名.表名)
3.WHERE子句
(1)WHERE子句:指定被检索表中返回行的搜索条件,若无此子句,则默认所有行都满足条件。
(2)比较运算符:>、<、>=、<=、=、<>、!=、BETWEEN...AND...
(3)逻辑运算符:AND、OR、NOT
(4)多行运算符:IN(set)、ANY(condition)、ALL(conditon)
(4)除了上述运算符,还有IS NULL/IS NOT NULL 条件,LIKE条件(% 通配所有字符,_ 配一个字符)
4.GROUP BY子句
(1)GROUP BY子句:把表中的行划分为组,然后你可以用组函数返回每一组的摘要信息。
(2)GROUP BY子句中可以包含多个列,不能使用列别名,不能使用WHERE来约束分组结果。
(3)组函数:AVG、SUM、MAX、MIN、COUNT、STDDEV(标准差)、VARIANCE(方差)。
5.HAVING子句
(1)HAVING子句:指定组或聚合的筛选条件,通常与GROUP BY子句混合使用。
(2)HAVING筛选器可以使用和WHERE相同的运算符,用于约束GROUP BY创建的分组。
6.ORDER BY子句
(1)ORDER BY子句:指定排序显示返回的行,ASC以升序排序(默认),DESC以降序排序。
(2)除非使用FOR UPDATE子句,ORDER BY子句应该放最后。
(3)ORDER BY子句可以指定一个表达式,一个别名作为排序条件,也可进行多列排序。
二、子查询
子查询是一个SELECT语句,它是嵌在另一个SELECT语句中的子句。使用子查询你可以用简单的语句构建功能强大的语句。当你需要从表中用依赖于表本身的数据选择行时它们是非常有用的。
你可以将子查询放在许多的SQL子句中,包括:WHERE子句、HAVING子句、FROM子句、CREATE VIEW语句、CREATE TABLE语句、UPDATE语句、INSERT语句的INTO子句和UPDATA语句的SET子句中。
一个子查询必须放在圆括号中。将子查询放在比较条件的右边以增加可读性。子查询根据查询结果可分为:单行子查询、多行子查询、多列子查询。
三、从多表中查询数据(多表连接)
从多表中查询数据也被称为多表连接,通过连接,可以从两个或多个表中根据各个表之间的逻辑关系来检索数据。ORACLE SQL 的连接类型有:内连接、外连接、自连接。内连接分为:等值连接、非等值连接。外连接分为:左外连接、右外连接、全外连接。除此之外,我们还会介绍下SQL99标准的连接语法。
在进行多表连接的过程中,使用表别名能加速数据库的访问,有助于保存SQL代码较小,并节省储存器。
1.内连接
当两个表中至少有一个行符合连接条件时,内部连接才能返回行,内连接消除了与另外一个表中不匹配的行。内连接分为等值连接和非等值连接。
(1)等值连接
等值连接是使用最多的一种连接方式,可以把等值连接想象成本来是一个大表,将其拆分为两个子表,并且两个子表都包含大表的某一列(也可能是多列),而等值连接就是将两个子表重新组合为一个大表。
主要语法:... WHERE table1.column=table2.column。
(2)非等值连接
一种非等值连接是一种不同于等值操作(=)的连接条件,如;...WHERE table1.column BETWEEN table2.min(column) AND table2.max(column)。
2.外连接
外连接会返回FROM子句中提到的至少一个表或视图中的所有行,只要这些行符合任何WHERE或HAVING搜索条件。将检索通过左外连接引用左表中的所有行,以及通过右外连接引用的右表中的所有行,在完全外连接中,将放回两个表的所有行。
(1)左外连接
数据列表包括了满足查询条件的左边表的所有行。为了显示table1中不满足条件的行,可用如下两种语句:
#第一种方式
SELECT table1.column1,table2.column2
FROM table1,table2
WHERE table1.column1=table2.column2(+)
#第二种方式
SELECT table1.column1,table2.column2
FROM table1 LEFT OUTER JOIN table2
ON (table1.column1=table2.column2)