oracle数据库基础学习
扫描二维码
随时随地手机看文章
1.内置用户
SYS :超级用户 最高权限用户 sys/oracle AS SYSDBA
SYSTEM :管理员 system/oracle
scott : 测试连接 scott/tiger
hr: 案例拥有者 hr/
简单查询(单表查询)
基本语法:SELECT 目标列 FROM 表名
1)所有列:* select * from employees;
2)部分列,直接写列名,用逗号分割
select employee_id,first_name,salary,department_id from employees;
3)字符串连接:||
select employee_id,first_name||' '||last_name from employees;
4) 使用别名
select employee_id AS 员工号,first_name||' '||last_name AS 员工名 from employees;
语句后的分号表示执行的意思,不是语句本身组成部分
select employee_id "员 工 号" ,first_name||' '||last_name "Name" from employees;
如果别名中包含空格特殊符号或区分大小写,需要用双引号将别名引起来
5)加入常量字符串
select employee_id,'the employee name is :',first_name||' '||last_name name from employees;
6)使用函数
select employee_id,upper(first_name) from employees;
select substr('101**joan**20',1,3) from dual;
// dual :哑表 ,是个虚拟表,用于实现语法完整性
7)表达式
select employee_id,salary,salary*12 yearsal from employees;
8)不重复显示(重复记录显示一次)
select DISTINCT department_id from employees;
有条件查询:
select 目标列
from 表名
where 条件 // 对表中数据进行过滤
运算符号的使用:
1)简单的关系运算符 列名 运算符 值
2)特殊运算符号
between...and : column between x and y : column>=x 而且column<=y
not between...and : column not between x and y : column
in : column in(x,y) : column=x 或者column=y
not in : column not in(x,y) :column<>x 而且 column<>y
like: 模糊查询
not like
column like
column not like
通配符号:
% :代表任意个字符
_ :代表某一个字符
select * from employees where first_name like 'A%'
select * from employees where first_name like '__a%'
注意:如果查询字符串中本身的_或%(不是通配符),则需要用escape定义转义符号,转义符号后面
的_或%为实际意义的符号。
select * from employees where job_id like '%/__l%' escape '/'
is null : column is null
is not null :column is not null
3)符合条件:NOT AND OR
排序
SELECT 目标列
FROM 表
WHERE 条件
ORDER BY column|表达式 ASC|DESC
1)单列排序 order by column asc|desc
select * from employees order by salary;
2) 别名排序 order by 别名 asc|desc
select employee_id,salary*12 allsalary from employees order by allsalary desc;
3) 表达式排序
select employee_id,salary from employees order by salary*12 desc;
4) 基于列的序号排序
select employee_id,salary from employees order by 2;
5)基于非查询列排序
select employee_id,salary from employees order by department_id;
6)多列排序
select employee_id,department_id,salary from employees order department_id desc,employee_id;
空值:(可以理解为无穷大值):升序时在最后,降序时在最前
函数:
单行函数:每次作用于一行的某个列上
多行函数:每次作用于一组行的某个列上
字符函数:
LOWER:将所有字符小写
UPPER:将所有字母大写
INITCAP:将字符中每个单词的第一个字母大写,其他字符小写
CANCAT:实现字符串的连接 ,功能同符号 ||
SUBSTR:求子串 substr(str,x,y):从字符串str的x个字母开始截取长度为y的子串,如果没有y,则截取从x位置开始到最后
LENGTH:返回字符串的长度
INSTR:判断字符串2在字符串1中出现的位置,如果没有返回0
instr(str1,str2,m,n): 返回从str1的m个字符位置开始查找第n次出现的str2的位置,m n默认为1
LTRIM(str1,str2):从str1左侧截取str2,str2默认为空格
RTRIM(str1,str2):从str1右侧截取str2,str2默认为空格
TRIM(leading|training|both str2 from str1)
REPLACE(str1,str2,str3): 将str1中的str2用str3替换
lpad(str1,n,char1):在str1的左侧填充char1,使其达到n个字符长度,默认char1为空格
rpad(str1,n,char1):在str1的右侧填充char1,使其达到n个字符长度,默认char1为空格
数值函数
ROUND(列名|表达式, n):四舍五入函数。
如果n为负数,表示从小数点左侧n进行四舍五入。
round(156.785,2) 156.79
round (156.785,-1):160
TRUNC(列名|表达式,n):截断函数。
如果n为负数,表示对小数点左侧n进行截断。
trunc(156.785,2) 156.78
trunc (156.785,-1):150
MOD(m,n):取余函数。(求模)
mod(5,3) 2
floor(m):小于等于n的最大整数
floor(10.5) 10
ceil(m):大于等于n的最小整数
ceil(10.5) 11
日期函数:
注意: 1)两个日期相减,差为天数;
2)一个日期与一个数字可以进行加或减的运算,但是数字表示天数
SYSDATE:返回系统日期:
显示格式问题:(1)系统默认格式(2)进行格式显示的设置
alter session set nls_language='american'
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'
MONTHS_BETWEEN(d1,d2):返回两个日期间隔的月数
ADD_MONTHS(d,m):在指定日期基础上加上相应的月数,其中m表示月数。
NEXT_DAY(d,m):返回某一日期d的下一个指定工作日或 星期几的日期
m:1-7 或者为 星期几
?
LAST_DAY:返回指定日期当月最后一天的日期
?
ROUND(date[,'fmt'])对日期进行指定格式的四舍五入操作。按照YEAR、MONTH、DAY等进行四舍五入。
?
TRUNC(date[,'fmt'])对日期进行指定格式的截断操作。按照YEAR、MONTH、DAY等进行截断。
?
EXTRACT ([YEAR] [MONTH][DAY][DD] FROM[日期类型表达式]):从日期中抽取部分
‘12-8-9’
1234
转换函数:
to_char(d,format): 将日期按指定格式转换为字符串
select to_char(sysdate,'mm-dd-yyyy') from dual;
format格式:
yyyy 2012
yy 12
rr 12
year
mm 1-12
month january,..../1月/2月
mon 用月份前3个字符表示月份 jan feb
MON JAN
Mon Jan
dd 1-31
d 1-7
ddd 1-365
day monday - sunday
dy mon - sun
DY MON -SUN
WW 1-53:一年中第几周
W 1-5:本月中的第几周
hh/hh12
hh24
mi
ss
to_char(n,format): 将数字按指定格式转换为字符串
to_number(str,format):将指定格式的字符串转换为数字
to_date(str,format):将指定格式的字符串转换为日期
CASE expr
WHEN value1 THEN return_expr1
WHEN value2 THEN return_expr2
WHEN valuen THEN return_exprn
ELSE else_expr
END
CASE
WHEN condition1 THEN return_expr1
WHEN condition2 THEN return_expr2
WHEN conditionn THEN return_exprn
ELSE else_expr
END
多表查询(连接查询)
语法:oracle自身语法
SQL99:标准语法
1)笛卡尔连接(交叉连接):连个表无条件连接,一个表所有行分别与另一个表中所有行进行连接
select 目标列
from 表1,表2,...
select employee_id,first_name,e.department_id,department_name
from employees e ,departments d
2)内连接:根据特定条件进行连接,只有满足条件的数据才发生连接
等值连接:
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 =table2.column2;
select employee_id,first_name,e.department_id,department_name
from employees e ,departments d
where e.department_id=d.department_id and salary>5000
为表起别名,简化,一旦起了表名,只能使用别名而不是使用原名
目标列中的列如果在两个表中都出现了,则需要说明该列的来源表
通常,将过滤条件放在连接条件之后
不等值连接
自身连接:把同一个表虚拟成两个表
SELECT e.employee_id,e.first_name,e.manager_id,m.first_name
FROM employees e,employees m
WHERE e.manager_id=m.employee_id
3)外连接:在内连接的基础上加上某个表中不符合连接条件的记录。
FROM table1,table2
左外连接:在内连接的基础上+左侧表(table1)中不符合连接连接条件的数据
SELECT table1.column, table2.column
FROM table1, table2
WHEREtable1.column = table2.column(+);
右外连接:在内连接的基础上+右侧表(table2)中不符合连接连接条件的数据
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column(+) = table2.column;
全外连接:在内连接的基础上+右侧表(table2)中不符合连接连接条件的数据+
左侧表(table1)中不符合连接连接条件的数据
利用SQL99标准语法实现连接查询
(1)交叉连接:
select 目标列 from table1 CROSS JOIN table2;
SELECT employee_id,department_name FROM employees CROSS JOIN departments
SELECT employee_id,department_name FROM employees,departments
(2) 等值连接:
1)自然连接:两个表基于相同类型的、同名列的等值连接
SELECT 目标列 FROM table1 NATURAL JOIN table2;
SELECT employee_id,first_name,department_id,department_name
FROM employees NATURAL JOIN departments
SELECT employee_id,first_name,e.department_id,department_name
FROM employees e,departments d
WHERE e.department_id=d.department_id AND e.manager_id=d.manager_id
2)如果发生连接的列同名但类型不同,进行等值连接,可以使用USING
SELECT 目标列 FROM table1 JOIN table2 USING(列名)
SELECT employee_id,first_name,department_id,department_name
FROM employees JOIN departments USING(department_id)
SELECT employee_id,first_name,e.department_id,department_name
FROM employees e,departments d
WHERE e.department_id=d.department_id
3)通用
SELECT 目标列
FROM table1 JOIN table2
ON table1.col1=table2.col2 (连接条件)
WHERE 过滤条件
SELECT employee_id,first_name,e.department_id,department_name
FROM employees e JOIN departments d
ON e.department_id=d.department_id
WHERE salary>5000
SELECT employee_id,first_name,e.department_id,department_name
FROM employees e , departments d
WHERE e.department_id=d.department_id AND salary>5000
(3)外连接
SELECT 目标列
FROM table1 LEFT|RIGHT|FULL JOIN table2
ON table1.col1=table2.col2 (连接条件)
WHERE 过滤条件
1)左外连接
SELECT employee_id,first_name,e.department_id,department_name
FROM employees e LEFT JOIN departments d
ON e.department_id=d.department_id
SELECT employee_id,first_name,e.department_id,department_name
FROM employees e , departments d
WHERE e.department_id=d.department_id (+)
2)右外连接
SELECT employee_id,first_name,e.department_id,department_name
FROM employees e RIGHT JOIN departments d
ON e.department_id=d.department_id
SELECT employee_id,first_name,e.department_id,department_name
FROM employees e , departments d
WHERE e.department_id(+)=d.department_id
3)全外连接
SELECT employee_id,first_name,e.department_id,department_name
FROM employees e FULL JOIN departments d
ON e.department_id=d.department_id
分组函数:多行函数 统计函数 聚集函数
SUM(DISTINCT|ALL 表达式或列名):统计非空值的列的和
AVG(DISTINCT|ALL 表达式或列名):求非空值的列平均值
MAX(DISTINCT|ALL 表达式或列名):求非空值的列最大值
MIX(DISTINCT|ALL 表达式或列名):求非空值的列最小值
COUNT(DISTINCT|ALL 表达式或列名):求列值非空的记录的个数
注意:如果某个记录在该列的值为空,则不参与统计
COUNT(*):统计记录个数
分组:
SELECT 目标列或分组函数
FROM 表
WHERE 记录过滤
GROUP BY 列名 //指名分组列
ORDER BY 列名
select department_id,count(*),avg(salary) from employees group by department_id
注意:1) 在目标列中只能出现分组列或分组函数表达式
2) 如果进行了分组,则分组函数作用范围为组,对每个组进行一次运算
3)分组函数只可以出现在:SELECT、HAVING、ORDER BY子句后
1)统计不同职位的员工的人数、平均工资、最高工资
2)统计各个职位在各个部门中的平均工资、人数、最低工资
3)统计各个部门中工资高于5000的员工的人数。
SELECT 目标列或分组函数
FROM 表
WHERE 记录过滤
GROUP BY 列名 //指名分组列
HAVING 条件 //对组进行过滤
ORDER BY 列名
子查询
概念:包含在另一个语句(select、update、insert、create... 、where 、having、from子句)中的select语句
注意事项:
1)先计算子查询,将查询的结果返回给外部语句使用
2)在表达式中,子查询必须放在运算符的右侧
单行单列子查询
单行多列
多行单列 :返回结果为集合
多行多列 :返回结果为集合
多行关系运算符:IN ALL ANY
IN:c in (x,y): c=x or c=y
NOT in : c not in(x,y) : c<>x and c<>y
any : 某一个
=any : c=any(x,y): in
>any: c>any(x,y) :表示大于其中某个值,即大于最小值
SELECT * FROM employees
WHERE salary >ANY(SELECT salary FROM employees WHERE department_id=50)
AND department_id=10
SELECT * FROM employees
WHERE salary>(SELECT min(salary) FROM employees WHERE department_id=50)
AND department_id=10
<any:c<any(x,y):表示小于其中某个值,即小于最大值
all
=all 无意义
>all:比其中所有值都大,即大于最大的
<all :比所有值都小,即小于最小
>=all:等于最大值
<=all:等于最小值
无关子查询:子查询的执行与外部语句无关系
相关子查询:子查询在执行时需要使用外部语句的信息
insert:
1)单行插入
INSERT INTO 表名[(列名1[,列名2,…,列名n])]
VALUES (值1[,值2,…,值n]);
注意:
值与列名顺序是对应关系;
如果插入一个完整记录,且值的顺序与表中列的顺序一致,则可以省略列名
如果某列值为空,则可以使用NULL赋值或者不给该列赋值
字符值和日期值需要用单引号引起来
正常符号: 字母(大小写)、数字(0-9)、_、#、$
2)多行插入
INSERT INTO表名[(列名1[,列名2,…,列名n])] 子查询
将子查询的结果写入表中。
注意: 子查询的结果与表结构上兼容
向部门表中插入一条记录,部门号为800,部门名为‘SALES',其他信息与10号部门相同。
3)数据装载
数据操作过程不写入重做日志文件,所以出现故障无法恢复。
语法:
INSERT /*+APPEND*/INTO 表名[(列名1[,列名2,…,列名n])] 子查询
4)多表插入
update
delete:
单条记录操作
多条记录操作
利用子查询操作
事务控制:
概念:作为整体的一组操作,要么全执行,要么一个也不执行
特性:A(原子性)C(一致性)I(隔离性)D(持久性)
事务控制方式:
1)显式控制: commit、rollback
2)隐式控制: ddl(CREATE、ALTER、DROP、TRUNCATE)、dcl(GRANT、REVOKE)
用户退出(正常退出 commit、非正常退出rollback)
系统崩溃(rollback)
表:
命名规范:
1)以字母开头,后面接字母、数字、_、#、$,总长度不超过30个字符
2)如果包含关键字、空格、区分大小写,则需要用双引号引起来。
直接创建表:
CREATE TABLE [schema.]table(column datatype [DEFAULT expr][, ...]);
使用子查询间接创建表:
CREATE TABLE table[(column, column...)]
AS subquery;
1)如果指定列名,则列名与子查询目标列之间需要对应(个数、顺序)
2)如果不指定列名,会把子查询的列名当作表的列名,此时,子查询的列名必须存在
3)子查询对应表中的约束,除了非空约束,其他约束都不会带入新建的表中。
4)如果子查询有数据,则数据插入新表;如果子查询没有数据,则创建一个空表。
5)不能指定列的数据类型,列的数据类型取决于子查询中的表的相应列。
修改表结构:
ALTER TABLE table_name
ADD (column_name datatype DEFAULT...,....)
如果表中已经有数据,则新填加的列不能有非空的约束。
ALTER TABLE table_name
MODIFY(column_name datatype defult...)
1)如果已经有数据,注意修改后的数据类型长度要满足已有数据的要求
2)如果没有数据,可以修改为非同一系列的数据类型
3)缺省值的修改只影响以后的数据
ALTER TABLE table_name
DROP COLUMN column_name //单列删除
ALTER TABLE table_name
DROP (column1,column2...)//多列删除
1)如果当前列被其他对象引用则不能删除
删除表
drop table table_name [purge][cascade constraints]
表的截断TRUNCATE
truncate table table_name
注意:截断表是清空表中所有数据,与delete相似,与drop完全不同。
与delete相比,truncate由于不写日志文件,所有效率高,但出现故障无法恢复。
约束:
作用:保证数据完整性
类型:
主键约束(primary key): 唯一标识一个记录,取之不重复,不能为空
外键约束(foreign key):一个表中某列取值参照与另一个表的主键列或唯一性约束列的值,或为空
唯一性约束(unique):列值不重复,但可以为空
检查约束(check):限制列的取值范围
非空约束(not null):列值不能为空
约束的创建:
创建表示直接创建约束
创建表后为表添加约束
约束的表示形式:
列级约束:在定义列的同时定义约束
表级约束:在定义完所有列之后,定义约束(非空约束不能使表级约束)
CREATE TABLE [schema.] table(
column datatype [ DEFAULTexpr][column_constraint],
......,
[table_constraint][,...]);
CREATE TABLE student (
sno NUMBER PRIMARY KEY,
sname CHAR(10) UNIQUE,
sex CHAR(2) DEFAULT 'm' CHECK(sex IN ('m','f')),
sage NUMBER CHECK(sage BETWEEN 15 AND 40),
birthdate DATE NOT NULL)
CREATE TABLE course(
cid NUMBER CONSTRAINT p_cid PRIMARY KEY,
cname CHAR(20) CONSTRAINT u_cname UNIQUE
)
CREATE TABLE sc(
sno NUMBER REFERENCES student(sno),
cid NUMBER REFERENCES course(cid),
grade NUMBER CHECK(grade BETWEEN 0 AND 100),
CONSTRAINT p_sc PRIMARY KEY(sno,cid)