📅  最后修改于: 2020-12-29 04:16:57             🧑  作者: Mango
SQL是一种全面的数据库语言。 SQL,发音为Sequel或简称为SQL,是一种计算机编程语言,用于按照非过程方法查询关系数据库。当您使用SQL从数据库中提取信息时,这称为查询数据库。
关系数据库是通过使用关系数据库管理系统(RDBMS)来实现的。 RDBMS执行上述DBMS软件的所有基本功能,以及使关系模型更易于理解和实现的众多其他功能。 RDBMS用户通过使用特殊的数据操作语言来操作数据。数据库结构是通过使用数据定义语言来定义的。系统用户为存储和检索数据而执行的命令可以通过键入命令在带有RDBMS界面的终端上输入,也可以通过使用某种类型的图形界面输入。然后,DBMS处理命令。
通过适当有效地使用SQL,可以从数据库中检索数据。关系理论中的三个概念包含SELECT语句的功能:投影,选择和连接。
投影:项目操作仅从表中选择某些列(字段)。结果表具有可用列的子集,并且可以包括从单个列到所有可用列的所有内容。
选择:选择操作选择满足选择条件的表(关系)中的行(记录)的子集。从完整结果集中选择行的能力称为“选择”。它涉及条件过滤和数据分段。该子集的范围可以从无行(如果没有行满足选择条件)到表中的所有行。
联接:联接操作基于一个或多个公共列值组合来自两个或多个表的数据。连接操作使信息系统用户可以处理表之间存在的关系。连接操作非常强大,因为它允许系统用户调查在设计数据库时可能无法预期的数据元素之间的关系。
考虑上面的表结构。从EMPLOYEES表中获取单个雇员的名字,部门ID和薪水是Projection。从EMPLOYEES表中提取薪水少于5000的员工详细信息为Selection。通过加入EMPLOYEES和DEPARTMENTS来获取员工的名字,部门名称就是Joining。
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语句中。适用于列的运算符取决于列的数据类型。例如,算术运算运算符将不适合字符字面量值。例如,
SELECT employee_id, sal * 12 ANNUAL_SAL
FROM employees;
以上查询包含算术表达式(sal * 12),用于计算每个员工的年薪。
运算符对列(称为操作数)进行操作以得出不同的结果。如果一个表达式中有多个运算符,则撤消顺序由运算符优先级决定。这是优先级的基本规则-
乘法和除法发生在加法和减法之前。
优先级相同的运算符从左到右进行评估。
使用paretheses覆盖运算符的默认行为。
下表显示了在这种情况下运算符的优先级。优先级运算符符号运算
Description Operator Precedence
Addition + Lowest
Subtraction - Lowest
Multiplication * Medium
Division / Medium
Brackets ( ) Highest
检查以下查询(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 first_name ||'earns'|| salary||' as of '|||sysdate
FROM employees
quote运算符用于指定您自己的引号定界符。您可以选择方便的定界符,对数据进行定界。
SELECT department_name|| ' Department' ||q'['s Manager Id: ]'|| manager_id
FROM departments;
如果列没有确定的值,则将其视为NULL。 NULL值表示未知或不可用。对于数字值,它不是零,对于字符值,它不是空格。
可以在SELECT查询中选择具有NULL值的列,并且可以将其作为算术表达式的一部分。任何使用NULL值的算术表达式都将导致NULL。因此,必须通过使用Oracle提供的函数(例如NVL或NULLIF)指定其备用值来对具有NULL值的列进行不同的处理。
SQL> SELECT NULL + 1000 NUM
FROM DUAL;
NUM
--------
如果期望数据具有重复结果,请使用DISTINCT关键字消除重复,并仅在查询输出中显示唯一结果。仅对选定的列进行重复验证,并且将在逻辑上从查询输出中删除行。需要注意的是,DISTINCT关键字必须出现在SELECT子句之后。
下面的简单查询演示了DISTINCT的使用,以显示EMPLOYEES表中的唯一部门ID。
SQL> SELECT DISTINCT DEPARTMENT_ID
FROM employees;
DEPARTMENT_ID
---------------
10
20
30
40
可以通过使用DESCRIBE命令在数据库中查询构成表的列的列表来获取表的结构元数据。它将列出使用的列名,它们的null属性和数据类型。
句法:
DESC[RIBE] [SCHEMA].object name
例如,
DESC EMPLOYEE
将显示EMPLOYEE表结构,即列,其数据类型,精度和可为空的属性。