oracle 数据库基础


关键字

DISTINCT

去掉重复记录[z6] 

过滤where

where 将不满足的过滤掉

连接符||

把列与列,列与字符串连接在一起,用“||”表示,可以用来合成。

select last_name || job_id from employees;

条件:将符合的条件选择处理 where

select employee_id ,job_id,last_name fromemployees where department_id = 90;

字符和日期

字符和日期要包含在单引号中。

字符大小写敏感,日期格式敏感。

默认的日期格式是 DD-MON-RR

where解析顺序从右到左

BETWEEN   .. AND...

select last_name ,job_id  from employees  where salary between 3000 and 5000;

IN(set):等值与列表的值

select last_name ,job_id,manager_id  from employees  where manager_id in (100);

LIKE:模糊查询

% 代表零个或多个字符(任意个字符)。

_ 代表一个字符。

IS NULL:空值

逻辑运算

And,Or,Not

order by

使用 ORDER BY 子句排序

ASC(ascend): 升序 [z8] 

DESC[z9] (descend): 降序

Order by 用法[z10] 

ORDER BY 子句在SELECT语句的结尾。

例如:select last_name,job_id,department_id,hire_date from  employees order by hire_date;

按别名;来排序也可以:

select last_name,job_id,department_id,salary* 12 sal,hire_date from  employeesorder by sal;

转小写函数:LOWER

LOWER('HHHHHHHH')

select lower('HHHHHHHH') from dual;

输出结果:

hhhhhh

转大写:UPPER

UPPER('SQLCOURSE')

select UPPER('SQL Course') from dual;

输出结果

SQL COURSE

 

 

 

函数

字符控制函数

CONCAT('Hello', 'World')          HelloWorld      

substr('nihao',3)       [z11] 

SUBSTR[z12] ('HelloWorld',1,5)                  Hello

 

LENGTH('HelloWorld')                        10

LPAD[z13] (salary,10,'*') 

RPAD(salary, 10, '*')

INSTR[z14] ('HelloWorld', 'W')           6

 

TRIM[z15] ('H' FROM 'HelloWorld')          elloWorld

replace[z16] ('abcd', 'b', 'm')                                amcd

 

数字函数

ROUND: 四舍五入

ROUND(45.926,2)                     45.93

TRUNC:    截断

TRUNC(45.926,2)                      45.92

MOD: 求余

MOD(1600,300)                         100

日期和函数:

函数SYSDATE

日期

select last_name,(sysdate-hire_date)/7 fromemployees where department_id =  90;

例子:昨天  今天 明天

select (sysdate-1) 昨天,sysdate 今天,(sysdate+1)明天

 2  from dual;

 

昨天           今天           明天                                             

-------------- ----------------------------                                   

25-8月 -13     26-8月 -13     27-8月 -13

 

日期函数

转换函数

隐式<-à显式

16.1、TO_CHAR 函数对日期的转换

TO_CHAR(date, 'format_model')

必须包含在单引号中而且大小写敏感。

可以包含任意的有效的日期格式。

日期之间用逗号隔开。

 TO_CHAR 函数

对数字的转换

TO_CHAR(number, 'format_model')

 TO_NUMBER 函数

将字符转换成数字:

TO_NUMBER(char[, 'format_model'])

使用 TO_DATE

函数将字符转换成日期:

TO_DATE(char[, 'format_model'])

NVL函数

1、 :将空值转换成一个已知的值

NVL(commission_pct,0)[z17] 

不忽略空值

NVL函数使分组函数无法忽略空值

SELECT COUNT(DISTINCT department_id)

  2  FROM  employees;

 

COUNT(DISTINCTDEPARTMENT_ID)

----------------------------

                          11

忽略空值

select avg(commission_pct) from employees;

 

AVG(COMMISSION_PCT)

-------------------

  0.222857142857143

 

 

NVL2 函数

NVL2 (expr1, expr2,expr3) : expr1不为NULL,返回expr2;为NULL,返回expr3

NULLIF 函数

NULLIF (expr1, expr2) :  相等返回NULL,不等返回expr1

COALESCE 函数

COALESCE NVL相比的优点在于COALESCE可以同时处理交替的多个值。

如果第一个表达式为空,则返回下一个表达式,对其他的参数进行COALESCE

即:找第一个不为空的值。

分组函数(重点)

使用GROUP BY 子句数据分组。使用HAVING 子句过滤分组结果集

组合函数:avg,count,max,min,sum

组合函数语法:

SELECT     [column,] group_function(column),...

FROM                table

[WHERE  condition]

[GROUPBY      column]

[ORDERBY      column

COUNT(DISTINCT expr)

返回 expr非空且不重复的记录总数

SELECT COUNT(DISTINCT department_id)

  2  FROM  employees;

 

COUNT(DISTINCTDEPARTMENT_ID)

----------------------------

                          11

group by:分组数据

SELECT              column, group_function(column)

FROM               table

[WHERE            condition]

[GROUP BY      group_by_expression]

[ORDER BY       column];

可以使用GROUPBY 子句将表中的数据分成若干组

例子[z18] 

包含在 GROUP BY 子句中的列不必包含在SELECT 列表中

group by 增强

多个列分组

过滤分组:HAVING 子句

条件:

1、行已经被分组。

2.      使用了组函数。

3.      满足HAVING子句中条件的分组将被显示。

语法:

SELECT     column,group_function

FROM                table

[WHERE   condition]

[GROUP BY       group_by_expression]

[HAVING  group_condition]

[ORDER BY       column]


 

多表中获得数据

使用外连接可以查询不满足连接条件的数据。

外连接的符号是 (+)

希望:在最后的结果中包含某些不成立的记录

elect d.deptno, d.dname, count(e.empno) 人数 from emp e,dept d

where e.deptno(+)=d.deptno  group by d.deptno,d.dname;

左外连接

where e.deptno=d.deptno不成立的时候,等号左边代表的表任然被包含


右外连接

where e.deptno=d.deptno不成立的时候,等号右边代表的表任然被包含

满外联接

NATURAL JOIN 自然链接

(用比较少)

会以两个表中具有相同名字的列为条件创建等值连接

在表中查询满足等值条件的数据。

如果只是列名相同而数据类型不同,则会产生错误。

 

自连接

使用 USING 子句创建连接(用比较少)

内容:在NATURALJOIN 子句创建等值连接时,可以使用 USING 子句指定等值连接中需要用到的列。

使用 USING 可以在有多个列满足条件时进行选择。

不要给选中的列中加上表名前缀或别名。

NATURAL JOIN USING子句经常同时使用。

使用ON 子句创建连接

自然连接中是以具有相同名字的列为连接条件的。

可以使用ON 子句指定额外的连接条件

这个连接条件是与其它条件分开的。

ON 子句使语句具有更高的易读性

 

使用 ON 子句创建多表连接

SELECT employee_id, city, department_name

   FROM  employees e

    JOIN  departments d

    ON    d.department_id = e.department_id

    JOIN  locations l

    ON    d.location_id = l.location_id;

单函数操作

操作数据对象;接受参数返回一个结果;只对一行进行变换;每行返回一个结果;可以转换数据类型;可以嵌套;参数可以是一列或一个值

 

嵌套函数

条件表达式

SQL 语句中使用IF-THEN-ELSE逻辑

 

 

1、 if语句格式:

 If 条件 then 语句1;

语句2;

End if;

1.1 例子:在键盘上输入都是字符串[z23] 

 

2. IF 条件  THEN  语句序列1;  

   ESLE   语句序列 2;

END   IF;

 

3. IF  条件  THEN 语句;

  ELSIF  语句  THEN  语句;

 ELSE    语句;

 END  IF;

 

 

单表查询

单表查询比较简单这里就不做详细介绍

查询奖金是null的查询语句

--查询奖金为null的员工

1、select * from empwhere comm=null

第一种查出来是null的

2、select * from empwhere comm is null

多表查询

通过表的别名,将同一张表视为多张表

SQL> select d.ename||'的老板是'||b.ename

 2  from emp d,emp b

 3  where d.mgr=b.empno

子查询

什么时候用子查询:在查询是基于未知的值时应使用子查询

注意问题:

1、  括号

2、  合理书写风格

3、  可以在子查询的where,select,having[z26] ,from 后面放置

4、  不可以在group by 后面放置子查询

5、  强调from后面的子查询

6、  主查询和子查询可以不是同一张表,只要子查询返回的结果主查询可以使用即可

7、单行子查询(返回值只有一条)只能使用单行操作

主查询里面可以有多个子查询

 

 

单行子查询

只返回一行。

使用单行比较操作符。

 

多行子查询

In:等于列表中的任何一个

 

Any:集合中任意一个值

All:和子查询返回的所有值比较

 

 

使用等值和不等值连接在SELECT 语句中查询多个表中的数据。

使用自连接

处理数据DML(数据操作语言)

关键字:insert update delete select  增删改查数据库里面的数据

Insert : insert : insert into table (cloum,….)values();

地址符&(增删改查都可以用)

当输入地址符,并带参数的时候会让我们自己在输入

更新update

Update  table set colum = value ………. Where id =?

update emp set sal=700,ename='lisi' where empno=1000

在update中使用子查询

 

删除:delete

delete和truncate区别:

1、delete是DML(可以回滚)语句,truncate是DDL语句(不可以回滚)

         2、delete不回释放空间,truncate会

         3、delete会产生碎片,truncate不会 (碎片会影响查询效率)

         4、delete可以闪回,truncate不可以

         5、.(MYSQL中讲) delete是逐条删除;truncate先摧毁表 再重建

 Oracle 中delete 比truncate 快

格式: Delete  from  table where id =?

6.删除中使用子查询

Oracle 中delete 比truncate 快

事务

由增删改组成,

事务步骤:

1、  起始标志 :DML语句

2、  结束标志:提交-à显示


 

事务是不能跨越(DML和DDL)

回滚存储点[z28] :savepoint a;

Oracle事务隔离级别:3个

串行会影响性能(锁)

Read only oracle事务

DDL(数据定义语言)

是针对数据库表,表结构字段的操作

         关键词:create/alter/drop/truncatetable

           create/drop view/sequence/index/synonym

1、  子查询建表

Create  tabletablename  as select * from table;

 

2、  修改表

2.1追加新的列

ALTER TABLE table

ADD             (column datatype [DEFAULT expr]

             [, column datatype]...);

例子:alter table test1add photo blob;

2.2修改现有的列

ALTER TABLE table

MODIFY       (columndatatype [DEFAULT expr]

             [, column datatype]...);

 

2.3删除一个列

ALTER TABLE table

DROP         column     (column);

例子:alter table test1drop column photo;

2.4 重命名表(改变表的名称)

ALTER TABLE table_namerename column old_column_name

tonew_column_name

例子:alter table test1rename column tname to username;

                  

3、  删除

3.1数据和结构都被删除

3.2所有正在运行的相关事物被提交

3.3所有相关索引被删除

3.4DROP TABLE 语句不能回滚,但是可以闪回

drop table tablename;

集合运算

集合运算关键字:union,union all,INTERSECT

union 去掉重复元素后的所有记录(并集)

显示员工当前和之前的工作情况,每次记录显示一次。

select * from emp where deptno=10

union

    select* from emp where deptno=20;

union All:返回两个集合的所有记录,包括重复的

INTERSECT 运算符返回同时属于两个集合的记录

 

集合注意事项

1. 参与运算的各个集合必须列数相同 且类型一致

 2. 采用第一个集合的表头作为最后的表头

3. 如果排序,必须在每个集合后使用相同的orderby

 

select deptno,job,sum(sal) from emp groupby deptno,job

   union

  select deptno,to_char(null),sum(sal) from emp group by deptno

   union

  select to_number(null),to_char(null),sum(sal) from emp;


你可能感兴趣的:(oracle,数据库)