SQL SELECT语句

使用SQL Select语句检索数据

SQL是一种全面的数据库语言. SQL,发音为Sequel或简称为S-Q-L,是一种计算机编程语言,用于按照非过程方法查询关系数据库.当您使用SQL从数据库中提取信息时,这称为查询数据库.

关系数据库是通过使用关系数据库管理系统(RDBMS)实现的. RDBMS执行上述DBMS软件的所有基本功能以及许多其他功能,使关系模型更易于理解和实现. RDBMS用户通过使用特殊的数据操作语言来操纵数据.通过使用数据定义语言来定义数据库结构.系统用户为了存储和检索数据而执行的命令可以通过键入命令在具有RDBMS接口的终端输入,或者通过使用某种类型的图形界面输入.然后DBMS处理命令.

SELECT语句的功能


从数据库中检索数据是通过适当有效地使用SQL来完成的.关系理论中的三个概念包含SELECT语句的功能:投影,选择和连接.

  • 投影:项目操作仅从表中选择某些列(字段).结果表包含可用列的子集,可以包含从单个列到所有可用列的任何内容.

  • 选择:选择操作选择满足选择条件的表(关系)中的行(记录)子集.从完整结果集中选择行的能力称为选择.它涉及条件过滤和数据分段.如果没有行满足选择条件,则子集可以从没有行到表中的所有行.

  • 连接:连接操作根据一个或多个公共列值组合来自两个或多个表的数据.连接操作使信息系统用户能够处理表之间存在的关系.连接操作非常强大,因为它允许系统用户调查在设计数据库时可能无法预料的数据元素之间的关系.

EMPLOYEES的加入方案和DEPARTMENTS表

考虑上面的表格结构.从EMPLOYEES表中获取单个员工的first_name name,department_id和salary是Projection.从EMPLOYEES表中获取薪水小于5000的员工详细信息是选择.通过加入EMPLOYEES和DEPARTMENTS来获取员工的名字,部门名称是加入.

基本SELECT语句

SELECT语句的基本语法如下所示.

SELECT  [DISTINCT | ALL] {* | select_list}
FROM {table_name [alias] | view_name} 
    [{table_name [alias]  | view_name}]...  
[WHERE  condition]
[GROUP BY  condition_list]
[HAVING  condition]
[ORDER BY  {column_name | column_#  [ ASC | DESC ] } ...

SELECT子句是必需的,它执行关系项目操作.

FROM子句也是强制性的.它标识一个或多个表和/或视图,从中检索结果表中显示的列数据.

WHERE子句是可选的,并执行关系选择操作.它指定要选择的行.

GROUP BY子句是可选的.它通过SELECT子句中列出的一个或多个列名将数据组织到组中.

可选的HAVING子句设置有关在结果表中包含哪些组的条件.这些组由GROUP BY子句指定.

ORDER BY子句是可选的.它按一个或多个列按升序或降序对查询结果进行排序.

SELECT语句中的算术表达式和NULL值

算术表达式可以使用列名,运算符和常量值创建,以在SELECT语句中嵌入表达式.适用于列的运算符取决于列的数据类型.例如,算术运算符不适合字符文字值.例如,

SELECT employee_id, sal * 12 ANNUAL_SAL
FROM employees;

上述查询包含用于计算每位员工年薪的算术表达式(sal * 12).

算术运算符

运算符对列(称为操作数)进行操作以产生不同的结果.如果表达式中有多个运算符,则评估顺序由运算符优先级决定.以下是优先的基本规则 -

  • 在加法和减法之前进行乘法和除法.

  • 从左到右评估具有相同优先级的运算符.

  • 使用paretheses覆盖默认行为运营商.

下表显示了在这种情况下运算符的优先级.优先级操作符符操作

    
加法+最低
减法 - 最低
乘法*中等
分部/中等
括号()最高

检查以下查询(a),(b)和(c)

  •  SQL> SELECT 2 * 35 FROM DUAL;

  •  SQL> SELECT salary + 1500 FROM employees;

  •  SQL> SELECT first_name,salary,salary +(commission_pct * salary)FROM employees;

查询(a)乘以两个数字,而(b)显示所有雇员的工资增加1500美元.查询(c)显示佣金成分添加到员工的工资中.根据优先顺序,第一个佣金将根据工资计算,然后加到工资中.

列别名

别名用于在显示期间重命名列或表达式.列或表达式的别名显示为查询输出中的标题.它在为SELECT查询中的长表达式提供有意义的标题时很有用.默认情况下,别名在查询输出中以大写形式显示,不带空格.要覆盖此行为,别名必须用双引号括起来以保留别名中的大小写和空格.

SELECT price * 2 as DOUBLE_PRICE, price * 10 "Double Price"
FROM products;

DOUBLE_PRICE	Double Price
------------	------------
39.9			39.9
60			60
51.98			51.98

连接运算符

连接运算符可用于连接两个字符串值或表达式在SELECT查询中.双竖线符号用作字符串连接运算符.它仅适用于导致新字符表达式的字符和字符串列值.示例

SQL> SELECT'ORACLE'||'CERTIFICATION'from dual;

以上查询显示两个字符文字值的连接.

字面值

SELECT子句中未存储在数据库中的任何硬编码值都是已知的文字.它可以是数字,字符或日期值.字符和日期值必须用引号括起来.请考虑以下SQL查询.在SQL查询中使用不同数据类型的文字的示例.

下面的查询使用两个字符文字将它们连接在一起.

SQL> SELECT'ORACLE'||'CERTIFICATION'from DUAL

下面的查询使用字符文字来打印员工的工资.

SQL> SELECT 'ORACLE'||' CERTIFICATION' FROM DUAL

报价运营商

报价operator用于指定自己的引号分隔符.您可以选择方便的分隔符,对数据进行处理.

SELECT 	department_name|| ' Department' ||q'['s Manager Id: ]'|| manager_id
FROM departments;

NULL

如果列没有确定值,则认为它为NULL. NULL值表示未知或不可用.数值不是零,而不是字符值的空格.

可以在SELECT查询中选择具有NULL值的列,它们可以是算术表达式的一部分.使用NULL值的任何算术表达式都会导致NULL.因此,必须通过使用Oracle提供的函数(如NVL或NULLIF)指定其备用值来以不同方式处理具有NULL值的列.

SQL> SELECT NULL + 1000 NUM 
FROM DUAL;

NUM
--------

DISTINCT关键字

如果预计数据具有重复结果,请使用DISTINCT关键字消除重复项,并仅在查询输出中显示唯一结果.仅验证所选列的复制,并从查询输出中逻辑删除行.需要注意的是,DISTINCT关键字必须出现在SELECT子句之后.

下面的简单查询演示了如何使用DISTINCT从EMPLOYEES表中显示唯一的部门ID.

SQL> SELECT DISTINCT DEPARTMENT_ID 
FROM employees;

DEPARTMENT_ID
---------------
10
20
30
40

DESCRIBE命令

可以通过查询数据库中包含它的列的列表来获取表的结构元数据使用DESCRIBE命令.它将列出使用的列名,它们的null属性和数据类型.

语法:

 
 DESC [RIBE] [SCHEMA] .object name

例如,

 
 DESC EMPLOYEE

将显示EMPLOYEE表结构,即列,它们的数据类型,精度和可空属性.