SQL是structured query language(结构化查询语言)的简称,是用户与数据库交流所需要的标准语言。
1. SQL语言分类
数据查询语言(DQL):用于检索数据库中的数据,主要是SELECT语句。 数据操纵语言(DML):用于改变数据库中的数据,包括INSERT、UPDATE和DELETE。 事务控制语言(TCL):用于维护数据的一致性,包括COMMIT、ROLLBACK和SAVEPOINT。 数据定义语言(DDL):用于建立、修改和删除数据库对象。 数据控制语言(DCL):用于执行权限授予和权限收回操作,包括GRANT和REVOKE。
2. SQL语言的编写规则
SQL关键字不区分大小写,既可以使用小写格式,也可以使用大写格式,或者大小写格式混用。 对象名和列名不区分大小写,既可以使用大写格式,也可以使用小写格式,或者大小写格式混用。 字符值区分大小写。当在SQL语句中引用字符值时,必须给出正确的大小写数据,否则不能得到正确的查询结果。
3. 用户模式
在Oracle数据库中,为了便于管理用户创建的数据库对象(如数据表、索引、视图等),引入了模式的概念,某个用户创建的数据库对象都属于该用户模式。
在一个模式内部不可以直接访问其他模式的数据库对象,即使在具有访问权限的情况下,也需要指定模式名称才可以访问其他模式的数据库对象。
比如在scott账号下创建的表dept,查询这个表时使用下面的语句:
SELECT * FROM dept;
当在其他用户账号下,比如system账号下,访问dept表时,需要在表名前面加上该表的所属账号scott;
SELECT * FROM scott.dept;
4. 检索数据
用户对表或视图最常进行的操作就是检索数据。检索数据通过SELECT语句来实现,该语句由多个子句组成,通过这些子句可以完成筛选、投影和连接等各种数据操作,最终得到用户想要的查询结果。SELECT语句的基本语法格式如下:
SELECT {[ DISTINCT | ALL ] columns | *}
[INTO table_name]
FROM {tables | views | other select}
[WHERE conditions]
[GROUP BY columns]
[HAVING conditions]
[ORDER BY columns]
SELECT子句:用于选择数据表、视图中的列。 INTO子句:用于将原表的结构和数据插入新表中。 FROM子句:用于指定数据来源,包括表、视图和其他SELECT语句。 WHERE子句:用于对检索的数据进行筛选。 GROUP BY子句:用于对检索结果进行分组显示。 HAVING子句:用于从使用GROUP BY子句分组后的查询结果中筛选数据行。 ORDER BY子句:用于对结果集进行排序(包括升序和降序)。
5. 简单查询
只包含SELECT子句和FROM子句的查询就是简单查询。SELECT子句和FROM子句是SELECT语句的必选项,即每个SELECT语句都必须包含这两个子句。
5.1. 检索所有列
--SELECT后跟星号 * 检索所有列
SELECT * FROM 表名
FROM子句的后面还可以指定多张数据表,每张数据表名之间使用逗号(,)分隔:
SELECT * FROM 表名1,表名2,表名3,...,表名n
5.2. 检索指定的列
可以指定查询表中的某些列(也称为投影操作),而不是全部列,并且被指定列的顺序不受限制。
SELECT 列名1,列名2,列名3,...,列名n FROM 表名
在Oracle数据库中,有一个标识行中唯一特性的行标识符ROWID。ROWID是Oracle数据库内部使用的隐藏列,由于该列实际上并不是定义在表中,因此也被称为伪列。伪列ROWID长度为18位字符,包含该行数据在Oracle数据库中的物理地址。
--查询emp表中的rowid,job,ename三列数据
select rowid,job,ename from emp;

5.3. 查询日期列
日期列是指数据类型为DATE的列。查询日期列与查询其他列没有任何区别,但日期列的默认显示格式为DD-MON-RR。

可以指定查询数据中日期的显式格式,如下:
以简体中文格式显示日期结果
--将sql*plus的nls_date_language参数设置为中文格式
alter session set nls_date_language = 'SIMPLIFIED CHINESE';
--查询emp表
select ename,hiredate from emp;

以美式英语格式显示日期结果
--将sql*plus的nls_date_language参数设置为美式英语格式
alter session set nls_date_language = 'AMERICAN';
--查询emp表
select ename,hiredate from emp;

以特定格式显示日期结果
--将sql*plus的nls_date_format参数设置为××××年××月××日格式
alter session set nls_date_format = 'YYYY"年"MM"月"DD"日"';
--查询emp表
select ename,hiredate from emp;

5.4. 带有表达式的SELECT子句
在SELECT语句中,数字和日期数据可以使用( + )、减( - )、乘( * )、除( )和括号等算术运算符;
--将emp表的sal列的数值显式为原值的1.1倍后的值
select sal*(1+0.1),sal from emp;

5.5. 为列指定别名
在Oracle系统中,为列指定别名既可以使用AS关键字,也可以不使用任何关键字而直接指定。
--使用as指定列别名
select empno as "员工编号",ename as "员工名称",job as "职务" from emp;
--不使用任何关键字直接指定列别名
select empno "员工编号",ename "员工名称",job "职务" from emp;

5.6. 显示不重复记录
在SELECT语句中,可以使用DISTINCT关键字来限制显示重复的数据,该关键字用在SELECT子句的列表前面。
--查询emp表中的job列,可以看到有重复值
select job from emp;
--使用DISTINCT来去除重复值
select distinct job from emp;

5.7. 处理NULL值
NULL表示未知值,它既不是空格,也不是0。插入数据时,如果没有为特定列提供数据,并且该列没有默认值,那么其结果为NULL。
当算术表达式中包含NULL时,如果不处理NULL,显示结果将为空。
--comm列值为NULL的,计算sal+comm的值也为NULL
select ename,sal,comm,sal+comm from emp;

为了避免出现上面这种情况,可以使用NVL函数处理NULL;
--使用NVL函数处理comm列,如果值为数值,返回原数值,如果值为NULL转换成0
select ename,sal,comm,sal+nvl(comm,0) from emp;

5.8. 连接字符串
连接字符串可以使用“||”操作符或者CONCAT函数。当连接字符串时,如果是在字符串中加入数字值,可以直接指定数字值;而如果是在字符串中加入字符值或者日期值,那么必须将值放在单引号中。
--使用||将ename列与job列进行连接
select ename||''''||'s job is '||job from emp;
在字符串中使用单引号,需要使用两个连续的单引号来表示一个单引号字符。

--使用concat连接ename列和sal列
select concat(concat(ename, '''s salary is '),sal) from emp;

今天的文章就到这里,感谢各位的点赞、在看。




