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

1-SELECT

原创 光明之子 2023-09-18
299

1.select 语句基本功能

select 语句可以从数据库表中检索信息。
选择:查询符合条件的行,过滤掉不符合条件的行
投影:查询符合条件的列,不显示不符合条件的列
连接:从多个表中查询数据。
连接是关系型数据库的核心,把数据放在不同的表里,通过关联获得完整信息。
表是由行和列组成的,列构成表的结构,行组成表的数据。
select 语句并不改变数据库中的数据,只是将数据从数据库中提取显示出来。

2.select 语句基本语法

[] 代表可选; * 代表所有列
语句:一个语句的结束以;为标志。
子句:一个语句可以由多个子句组成
最基本的 select 语句包含两个子句: select 子句和 from 子句。

3.SQL 语句的书写规范

SQL语句大小写不敏感。
SQL可以写在1行或多行。
关键字不能被缩写也不能分行。
各子句一般要分行写。
使用缩进提高语句的可读性。
SQL语句在SQL Developer中,可以以一个分号(;)终止,当执行多个SQL语句时,结束分号时必须的。
在SQL plus中,用分号结束每条SQL语句。
在 SQL*Plus 中,在 SQL 提示符下输入 SQL 语句, 从第二行起有行号。
通常用分号作为 SQL 语句的终止符。

4.选择所有列(*)

select * from emp;

符号*代表所有列
写*比较方便,但是要注意:
1.如果不需要查询所有列,用*会把所有数据都查出来, 增加 oracle 处理的代价, 性能就会降低。
2.写*时, oracle 需要查询数据字典,转换为具体列名称。
3.sql 开发建议写具体字段名。

user_tables 存储的是当前用户所有表的信息——数据字典表(视图)

select table_name from user_tables;
select * from emp;
select * from dept;

5.选择特定列(column)

select empno,ename from emp;

6.伪列: rownum

select 子句中还可以选择伪列。
伪列从功能上看像是表中的一列,实际上并不存储在实际的表中。
常见伪列: rownum,rowid(对象号,文件号,块号,行号:6-3-6-3),currval,nextval
伪列上不能进行插入和删除操作。

【官方文档:伪列】
SQL Language Reference -> 2 Pseudocolumns
rownum 伪列反映的是每一行在当前查询的结果集中的位置。
select rownum,deptno,dname,loc from dept;

7.描述表的结构 : (desc[ribe])

不知道具体列名时,可使用 describe 命令查看表结构。

desc dept

DESCRIBE :SQL*Plus 命令

【官方文档: SQLPlus 命令】
SQL
Plus User’s Guide and Reference -> 12 SQL*Plus Command Reference

8.列标题的缺省格式

默认标题:大写
ENAME 是字符类型, HIREDATE 是日期类型:左对齐;
EMPNO、 MGR、 SAL 等是数值类型:右对齐。
数据是区分大小写的。

9.格式化列的宽度[column … format]

column hiredate format a10
col mgr for 9999
select * from emp;

10.select 中的数学表达式

在 SELECT 语句中用数学表达式对列值进行计算。

10.1算式表达式:加,减,乘,除

需求:涨工资, 查询每个员工工资增加 300 以后的值

select ename,sal,sal+300 from emp;

10.2表达式的优先级

乘,除优先级大于加,减
括号里的优先级高
需求:查询员工全年的收入(年终奖 100/每月奖励 100)

select ename,sal,12*sal+100,12*(sal+100) from emp;

10.3空值的定义和处理( nvl函数)

NULL是未知的值,不是0,不是空格,包含空值的表达式的值都是空值。
nvl 函数,如果是空值,就转换为 0: nvl(comm,0)

select comm,nvl(comm,0) from emp;
select empno,ename,sal,comm,sal+nvl(comm,0) from emp;

需求:查询员工工资+奖金总收入

select ename,sal,comm,sal+comm from emp;

11.定义列别名

as 可以省略
空格 :列名和别名之间用空格分开
双引号:特殊字符(如空格、 / 等)、别名需要区分大小写时

select empno,ename,sal,comm,sal+nvl(comm,0) new_sal from emp;

需求:查询员工编号、姓名、工资。

select empno,ename,sal from emp;

为了以友好的方式显示,可以定义列的别名。

select empno as ID,ename Name,sal "Salary" from emp;

当别名中有特殊字符(如空格、 / 等)、别名需要区分大小写时,要用双引号。
列的别名不能在数学表达式中运算。

12.字符串、连接符||、引用操作符 q

12.1字符串

字符串可以是select列表中的一个字符,数字,日期
日期和字符只能在单引号中出现。
当 返回一行时,字符串被输出一次。

select 'ename' from emp;

12.2连接符

把列与列,列与字符连接在一起
用 || 表示
用来 合成 列
需求: SMITH is a CLERK

select ename,job,ename||' is a '||job from emp;

需求: SMITH’s job is CLERK

select ename ||''s job is '|| job from emp;

Oracle 使用单引号作为封装或包含其他字符的特殊符号。
需要显示单引号时,通常在字符串中应该出现的单引号前面再加一个单引号进行转义。

select ename ||'''s job is '|| job from emp;

12.3引用操作符q

指定自己的引号分隔符
选择任何分隔符
增加可读性和可用性

select ename||q'<'s job is >'||job from emp;
select ename||q'\'s job is \'||job from emp;
select ename||q'['s job is ]'||job from emp;
select ename||q'{'s job is }'||job from emp;

{} [] \ <> 等符号内部的字符作为普通字符正常显示。

连接运算符在生成批量脚本时非常有用,提高工作效率:
如构造描述 scott 用户所有表结构的 sql 语句

desc emp
select table_name from user_tables;
select 'desc '|| table_name from user_tables;

13.消除重复行(distinct)

需求:查询 emp 表中员工工作在哪几个部门

select * from emp;
select deptno from emp;

使用 distinct 关键字来消除重复行

select distinct deptno from emp;


13.1对多个列去重

select distinct deptno,ename from emp;

select distinct deptno,job from emp;

DISTINCT 关键字可以从结果集中删除重复行, 可以对多个列进行去重
行是唯一还是重复取决于 distinct 关键字之后指定的内容。
distinct 关键字前不能查询其他列
一个 select 子句中不能出现多个 distinct

14.save 保存查询语句

1、执行查询语句

SCOTT@PROD> select ename,deptno,job,sal from emp where empno=7369;
ENAME          DEPTNO JOB              SAL
---------- ---------- --------- ----------
SMITH              20 CLERK            800

2、查看历史命令:list

SCOTT@PROD> list
  1* select ename,deptno,job,sal from emp where empno=7369
SCOTT@PROD> l
  1* select ename,deptno,job,sal from emp where empno=7369
SCOTT@PROD> 


3、保存此 sql 语句到操作系统中 /home/oracle/p1_01.sql

save /home/oracle/p1_01.sql


4、在 sqlplus 中查看保存在操作系统中文件

get /home/oracle/p1_01.sql 
 1* select ename,deptno,job,sal from emp where empno=7369
或
! cat /home/oracle/p1_01.sql
 1* select ename,deptno,job,sal from emp where empno=7369

5、sqlplus 中执行操作系统中的 sql 脚本/home/oracle/p1_01.sql

@/home/oracle/p1_01.sql
ENAME          DEPTNO JOB              SAL
---------- ---------- --------- ----------
SMITH              20 CLERK            800


15.替换命令

SCOTT@PROD> c/7369/7788
SCOTT@PROD> c/ename/empno
SCOTT@PROD> select ename,deptno,job,sal from emp where empno=7369;
ENAME          DEPTNO JOB              SAL
---------- ---------- --------- ----------
SMITH              20 CLERK            800
SCOTT@PROD> c/7369/7788
  1* select ename,deptno,job,sal from emp where empno=7788
SCOTT@PROD> r
  1* select ename,deptno,job,sal from emp where empno=7788

ENAME          DEPTNO JOB              SAL
---------- ---------- --------- ----------
SCOTT              20 ANALYST         3000

SCOTT@PROD> 
SCOTT@PROD> c/ename/empno
  1* select empno,deptno,job,sal from emp where empno=7788
SCOTT@PROD> r
  1* select empno,deptno,job,sal from emp where empno=7788

     EMPNO     DEPTNO JOB              SAL
---------- ---------- --------- ----------
      7788         20 ANALYST         3000

16.总结

select empno as ID,ename Name,comm,(nvl(comm,0)+sal)*12 "Total Salary" 
from emp;
select distinct deptno,empno from emp;
describe dept
column hiredate format a20
select ename ||'''s job is '|| job from emp;


1.描述 scott.emp 表的结构,查询 emp 表中所有数据。

desc emp;
select * from emp;

2.找出下面语句中的错误并修正。

select empno ename,job sal x 12 New Salary from emp;
select empno ename,job,sal*12 "New Salary" from emp;

3.查询 scott.emp 表中,所有员工的姓名、工资、工资与奖金之和,列标题显示为如下格式: NAME SALARY Total_Salary。

select ename as name,sal salary,sal+nvl(comm,0) "Total_Salary" from emp;

4.查看最后一次执行的查询语句,将此语句保存在操作系统中: /home/oracle/les01_01.sql,在 sqlplus

中查看并执行这个脚本。

list
save /home/oracle/les01_01.sql
get /home/oracle/les01_01.sql
@/home/oracle/les01_01.sql

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论