暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 19C入门到精通之SQL语言基础及简单查询

ITPro进化论 2023-11-25
448

SQL是structured query language(结构化查询语言)的简称,是用户与数据库交流所需要的标准语言。

1. SQL语言分类

  1. 数据查询语言(DQL):用于检索数据库中的数据,主要是SELECT语句。
  2. 数据操纵语言(DML):用于改变数据库中的数据,包括INSERT、UPDATE和DELETE。
  3. 事务控制语言(TCL):用于维护数据的一致性,包括COMMIT、ROLLBACK和SAVEPOINT。
  4. 数据定义语言(DDL):用于建立、修改和删除数据库对象。
  5. 数据控制语言(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。

可以指定查询数据中日期的显式格式,如下:

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

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

  1. 以特定格式显示日期结果
--将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,0from 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;

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

文章转载自ITPro进化论,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论