在Oracle 数据库中,SELECT 语句的基本语法为:

SELECT [ALL|DISTINCT] column_name [,expression...]
FROM table1_name [, table2_name, view_name, ...]
[ WHERE condition ]
[ GROUP BY column1_name [, column2_name , ...] ]
[ HAVING group_condition ]
[ ORDER BY column1_name [ ASC | DESC ] [, column2_name , ...]]

一、基本查询

  1、无条件查询

  [1] 查询所有列 :可以用“*”表示目标列;

  [2] 查询指定列;

  [3] 使用算是表达式:如 column1 * 8;

  [4] 使用字符常量:如 ' name ';

  [5] 使用函数:如 UPPER(column1);

  [6] 使用列名别名:在列名后加“ 空格 ”或者“ AS ”,再加别名;

  注意:在Oracle中as关键字不能用于指定表的别名,指定表的别名时只需在原有表名和别名之间用空格分隔即可,

  [7] 使用连接字符串:使用“ || ”来连接字符串;

  [8] 消除重复行:使用“ DISTINCT ”去除重复行记录。

  2、有条件查询

  2.1 关系运算:=、>、<、>=、<=、<>、!=

  2.1 确定范围:BETWEEN...AND... 和 NOT BETWEEN...AND...

  2.3 确定集合:IN 和 NOT IN

  2.4 字符匹配:LIKE 和 NOT LIKE,有 “ % ” 和 “ _ ”两个通配符。

  [1] %:代表0个或多个任意字符;

  [2] _:代表单个任意字符;

  2.5 控制判断:IS NULL 和 IS NOT NULL;

  2.6 逻辑操作:NOT、AND、OR,优先级 NOT > AND > OR

  3、查询排序

  3.1 单列升序、降序排序:ASC 或 DESC;

  3.2 多列排序:

  当按多个列或多个表达式排序时,先按第一列或表达式排序,当排序后第一列或表达式的数据向同时,相同的数据以第二列或表达式进行排序,以此类推。

  3.3 按表达式排序:如 column1 * 8;

  3.4 使用列明别名排序;

  3.5 使用列位置编号排序:位置编号为列名 或 表达式在SELECT子句中的位置编号(从1开始)。

  如果使用 UNION、INTERSECT、MINUS等集合查询,且目标列名不同,必须使用列位置排序。

  4、查询统计

  通常使用内置的聚集函数(又称分组函数,聚合函数)实现。

  常用聚集函数:

  COUNT(* [| num ]):返回结果集中所有记录个数(包括NULL);

  COUNT([DISTINCT | ALL] column):返回结果集中非空记录个数(不包括NULL);

  AVG([DISTINCT | ALL] column):返回列或表达式的平均值(忽略NULL);

  MAX([DISTINCT | ALL] column):返回列或表达式的最大值(忽略NULL);

  MIN([DISTINCT | ALL] column):返回列或表达式的最小值(忽略NULL);

  SUM([DISTINCT | ALL] column):返回列或表达式的总和(忽略NULL);

  STDDEV(column):返回列或表达式的标准差;

  VARIANCE(column):返回列或表达式的方差;

  使用聚集函数注意:

  [1] 除了COUNT(* [ | num ] )函数外,其他的统计函数都不考虑返回值或表达式为NULL的情况;

  [2] 聚集函数只能出现在 SELECT子句作为目标列表达式、ORDER BY 子句、HAVING 子句中,不能出现在WHERE子句和GROUP BY 子句中;

二、分组查询

  基本语法:

SELECT column,group_function, ...
FROM table
[ WHERE condition ]
[ GROUP BY [ ROLLUP | CUBE | GROUPING SETS] group_by_expression ]
[ HAVING group_condition ]
[ ORDER BY column [ ASC | DESC ] ]

  注意:

  [1] GROUP BY 子句 用于指定分组列或分组表达式。

  [2] HAVING 子句用于限制分组的返回结果。

  [3] WHERE 子句是对表中的记录进行过滤,而HAVING子句是对分组后形成的组进行过滤。

  [4] 在分组查询中,SELECT子句后面的所有目标列或目标表达式只能为:分组列、分组表达式、聚合函数。

  1、单列分组查询;

  2、多列分组查询;

  3、HAVING 子句限制返回组;

  4、 ROLLUP 和 CUBE 选项

  [1] ROLLUP :可以生成横向统计和不分组统计;

  如:查询各个部门中各个工种的平均工资、每个部门的平均工资和所有员工的平均工资。

  [2] CUBE:可以生成横向统计、纵向统计和不分组统计。

  如:查询各个部门中各个工种的平均工资、每个部门的平均工资、每个工种的平均工资和所有员工的平均工资。

  5、合并分组查询:讲几个单独的分组查询合并成一个分组查询。在GROUP BY 子句中使用 GROUPING SETS。

三、连接查询

  在Oracle数据库中,连接查询分为交叉连接、内连接、外连接三种。其中,交叉连接结果是所有其他连接结果的超集,而外连接结果又是内连接结果的超集。

  1、交叉连接

  交叉连接又称笛卡儿积链接,是两个或多个表之间的无条件连接。一个表中所有记录分别与其他表中所有记录进行连接。如:表1有n1条记录,表二有n2条记录,则结果集为n1×n2条记录。

  2、内连接

  根据指定的条件进行连接查询,只有满足条件的数据才被返回。

  [1] 标准SQL语句

SELECT table1.column,table2.column [, ...]
FROM table1 [ INNER ] JOIN table2 [JOIN...] ON condition

  [2] 扩展连接方式

SELECT table1.column,table2.column [, ...]
FROM table1 , table2 [, ...]
WHERE condition

  根据连接条件不同,内连接可以分为相等内连接、不相等内连接两类。如果是在同一个表或视图中进行连接查询,则称为自身连接。

  3、外连接

  外连接是指在内连接的基础上,将某个连接表不符合链接条件的记录加入到结果集中。根据结果集中包含不符合连接条件的记录来源的不同,外连接分为左外连接、右外连接,全外连接三种。

  (1)左外连接

  [1] 标准SQL语句

SELECT table1.column,table2.column [, ...]
FROM table1 LEFT [ OUTER] JOIN table2
ON table1.column <operator> table2.column [...]

  [2] Oracle扩展连接方式

SELECT table1.column,table2.column [, ...]
FROM table1 , table2 [, ...]
WHERE table1.column <operator> table2.column(+) [, ...]

  (2)右外连接

  [1] 标准SQL语句

SELECT table1.column,table2.column [, ...]
FROM table1 RIGHT [ OUTER] JOIN table2
ON table1.column <operator> table2.column [...]

  [2] Oracle扩展连接方式

SELECT table1.column,table2.column [, ...]
FROM table1 , table2 [, ...]
WHERE table1.column(+) <operator> table2.column [...]

  (3)全外连接

  [1] 标准SQL语句

SELECT table1.column,table2.column [, ...]
FROM table1 FULL [ OUTER] JOIN table2 [, ...]
ON table1.column <operator> table2.column [...]

四、子查询

  子查询是指嵌套在其他SQL 语句中的SELECT语句,也称为嵌套查询。在执行时,由里向外,先处理子查询,再将子查询的返回结果由于其父语句(外部语句)的执行。

  通常,子查询可以起到一下作用:

  [1] 在 INSERT 或 CREATE TABLE 语句中使用子查询,可以将子查询的结果写入到目标表中;

  [2] 在 UPDATE 语句中使用子查询可以修改一个或多个记录的数据;

  [3] 在 DELETE 语句中使用子查询可以删除一个或多个记录;

  [4] 在 WHERE 和 HAVING 子句中中使用子查询可以返回一个或多个值。

  注:

  在 DLL 语句中的子查询可以带有 ORDER BY 子句,而在 DML 语句和 DQL 语句中使用子查询时不能带有 ORDER BY 子句。

  1、单行单列子查询;

  2、多行单列子查询

  在 WHERE 子句中使用多行单列子查询时,必须使用多行比较运算符。

  多行比较运算符如下:

  [1] IN:与子查询返回结果中任何一个值相等;

  [2] NOT IN:与子查询返回结果中任何一个值都不相等;

  [3] >ANY:比子查询返回结果中某一个值大;

  [4] =ANY:与子查询返回结果中某一个值相等;

  [5] <ANY:比子查询返回结果中某一个值小;

  [6] >ALL:比子查询返回结果中所有值都大;

  [7] <ALL:比子查询返回结果中所有值都小;

  [8] EXISTS:子查询至少返回一行时条件为true;

  [9] NOT EXISTS:子查询不返回任何一行时条件为true;

  3、 单行多列子查询;

  4、多行多列子查询;

  5、 相关子查询

  子查询在执行时并不需要外部父查询的信息成为无关子查询。如果子查询执行时需要引用外部父查询的信息称为相关子查询。

  在相关子查询中经常使用 EXISTS 或 NOT EXISTS 为此来实现。

  6、在FROM子句中使用子查询

  当在 FROM 子句中使用子查询时,该子查询被作为视图对待,必须为该子查询指定别名(空格 或 AS 声明别名)。

  7、在 DDL 语句中使用子查询

  可以在 CREATE TABLE 和 CREATE VIEW 语句中使用子查询来创建表和视图。

五、合并查询

  在查询过程中,可以使用集合运算符 UNION、UNION ALL、INTERSECT、MINUS 将多个查询的结果合并。

  注:

  [1] 当要合并的几个查询的结果集时,待合并的结果集必须具有相同的列数和数据类型;

  [2] 如果要堆最终合并后的结果集排序,只能在最后一个查询之后用ORDER By子句指明排序列。

  1、UNION:重复的行记录只保留一个;如要保留所有的重复记录,则需要使用UNION ALL。

  2、INTERSECT:用于获取几个查询结果集的交集,只会返回同时存在于几个查询结果集中的记录。同时,返回的最终结果集默认是按第一列进行排序。

  3、MINUS:用于获取几个查询结果集的差集,即返回第一个结果集中存在,而在第二个结果集中不存在的记录。同时,返回的最终结果集默认是按第一列进行排序。

  

SQL语言 之 数据查询的更多相关文章

  1. 数据库系统学习(七)-SQL语言之复杂查询与视图

    第七讲 SQL语言之复杂查询与视图 基本内容 子查询 IN与NOT IN谓词子查询 判断某一表达式的值是否在子查询的结构中 非相关子查询 相关子查询 theta some /theta all谓词子查 ...

  2. SQL语言学习-数据定义语言

    Sql语言至今已经有6个版本.SQL查询语言包括了所有对数据的操作命令,这些操作可分为四类:数据定义语言(DDL).数据操纵语言(DML).数据控制语言(DCL)和嵌入式SQL语言. 数据定义语言(D ...

  3. 一、SQL系列之~使用SQL语言导出数据及实现定时导出数据任务

    一般情况下,SQL数据库中带有导入与导出数据的直接按键操作,点击数据表所在的数据库--任务--导出/导入数据,根据导入/导出向导直接将数据导出即可. 但导出的数据格式多为Excel格式,如果需要导出的 ...

  4. 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟表

    前言 接上一篇关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询,主要是关系型数据库基本数据查询.包括子查询.分组查询.聚合函数查询.模糊查询,本文是介绍一下关系型数据库几种高级数据查询SQL ...

  5. SQL SERVER之数据查询

     本篇主要解说查询语句,全部的演示样例都会依照以下这张表进行. stuID stuName age sex 11090241031 王小虎 21 男 11090241032 王小六 22 男 11 ...

  6. 数据库概论_3标准化的SQL语言_ 数据定义

    Student: Course: SC: 1.数据库的定义.删除 1.1数据库的定义(创建) CREATE DATABASE student; 1.2数据库的删除 DROP DATABASE stud ...

  7. sql多表数据查询

    有时候在sql遇到一次查询多张表的全部数据例如:创建一张虚拟表A ,表A中需要有表B和表C的全部数据(表B和表C并集,如图) 有两种方法一种是使用: 1):union,不过这种查询速度比较慢 /* B ...

  8. R中利用SQL语言读取数据框(sqldf库的使用)

    熟悉MySQL的朋友可以使用sqldf来操作数据框 # 引入sqldf库(sqldf) library(sqldf) # 释放RMySQL库的加载(针对sqldf报错) #detach("p ...

  9. sql server数据库数据查询成功

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

随机推荐

  1. 「学习笔记」wqs二分/dp凸优化

    [学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...

  2. 51nod1437 迈克步 单调栈

    考虑一个点作为最小值的区间$[L[i], R[i]]$ 那么这个区间的所有含$i$的子区间最小值都是$v[i]$ 因此,用单调栈求出$L[i], R[i]$后,对$R[i] - L[i] + 1$这个 ...

  3. 【带修改的主席树】BZOJ1901-Dynamic Rankings

    稍后整理笔记.这题数据范围好像有点问题? #include<iostream> #include<cstdio> #include<cstring> #includ ...

  4. 1.4(JavaScript学习笔记) window对象的属性及方法

    一.window对象 window对象代表当前窗口,所有全局对象都是windows的属性, 例如document是window的属性,window.document.writer("&quo ...

  5. bzoj 3784

    第三道点分治. 首先找到黄学长的题解,他叫我参考XXX的题解,但已经没有了,然后找到另一个博客的简略题解,没看懂,最后看了一个晚上黄学长代码,写出来然后,写暴力都拍了小数据,但居然超时,....然后改 ...

  6. bzoj 2002 LinkCutTree

    我的第一道LCT题(居然1A,O(∩_∩)O哈哈~) 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 大概题意: 给一颗有根树,维护每个 ...

  7. Unity随手机

    该文章持续更新! 协程的返回值必需是 IEnumerator 协程的参数不能加关键字 ref 或 out 在函数 Update 和 FixedUpdate 中不能使用 yield 语句,但可以启动协程 ...

  8. corosync

    前提: )本配置共有两个测试节点,分别node1.magedu.com和node2.magedu.com,相的IP地址分别为172.: )集群服务为apache的httpd服务: )提供web服务的地 ...

  9. JS 中对变量类型的判断

    总结:1. 一般简单的使用 typeof 或 instanceof 检测(这两种检测的不完全准确)          2. 完全准确的使用 原生js中的 Object.prototype.toStri ...

  10. HDU 4681 String(2013多校8 1006题 DP)

    String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Subm ...